amiga-libnix2/sources/amiga/misc/AsmFreePooled.c

31 lines
920 B
C

#include "pool.h"
VOID ASM AsmFreePooled(REG(a0,POOL *poolHeader),REG(a1,APTR memory),REG(d0,ULONG memSize),REG(a6,APTR SysBase))
{
if (((struct Library *)SysBase)->lib_Version>=39)
return (FreePooled(poolHeader,memory,memSize));
else if (poolHeader!=NULL && memory!=NULL) {
ULONG size,*puddle=(ULONG *)((struct MinNode *)memory-1)-1;
if (poolHeader->ThreshSize>memSize) {
struct MemHeader *a=(struct MemHeader *)&poolHeader->PuddleList.mlh_Head;
for(;;) {
a=(struct MemHeader *)a->mh_Node.ln_Succ;
if (a->mh_Node.ln_Succ==NULL)
return;
if (a->mh_Node.ln_Type && memory>=a->mh_Lower && memory<a->mh_Upper)
break;
}
Deallocate(a,memory,memSize);
if (a->mh_Free!=poolHeader->PuddleSize)
return;
puddle=(ULONG *)&a->mh_Node;
}
Remove((struct Node *)puddle);
size=*--puddle; FreeMem(puddle,size);
}
}