File: BI_UpdateBuffs.c

package info (click to toggle)
blacs-mpi 1.1-28.2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 2,320 kB
  • ctags: 2,031
  • sloc: fortran: 14,968; ansic: 12,353; makefile: 531; sh: 1
file content (57 lines) | stat: -rw-r--r-- 1,362 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "Bdef.h"

void BI_UpdateBuffs(BLACBUFF *Newbp)
{
   int BI_BuffIsFree(BLACBUFF *, int);
   BLACBUFF *bp, *bp2;
   extern BLACBUFF *BI_ReadyB, *BI_ActiveQ;

   if (Newbp)
   {
      if (BI_ActiveQ == NULL) BI_ActiveQ = Newbp->prev = Newbp;
      else
      {
	 BI_ActiveQ->prev->next = Newbp;
	 Newbp->prev = BI_ActiveQ->prev;
	 BI_ActiveQ->prev = Newbp;
      }
      Newbp->next = NULL;
      if (Newbp == BI_ReadyB) BI_ReadyB = NULL;
   }
/*
 * See if any active buffers are ready for reuse.
 */
   for (bp=BI_ActiveQ; bp != NULL; bp = bp2)
   {
      bp2 = bp->next;
      if ( BI_BuffIsFree(bp, 0) )  /* if all of buff's Aops are done */
      {
/*
 *       Remove bp from BI_ActiveQ -- update pointers
 */
	 if (bp->next) bp->next->prev = bp->prev;
	 else BI_ActiveQ->prev = bp->prev;
	 if (bp != BI_ActiveQ) bp->prev->next = bp->next;
	 else BI_ActiveQ = BI_ActiveQ->next;

/*
 *       If no ready buffer, inactive buff becomes ready
 */
	 if (BI_ReadyB == NULL) BI_ReadyB = bp;
/*
 *       If inactive buff bigger than present ready buff, release ready,
 *       and inactive buff becomes ready
 */
	 else if (BI_ReadyB->Len < bp->Len)
	 {
	    free(BI_ReadyB);
	    BI_ReadyB = bp;
	 }
/*
 *       If ready buffer exists and is bigger than inactive buff,
 *       free inactive buff
 */
	 else free(bp);
      }
   }
}  /* end BI_UpdateBuffs */