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 */
|