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

63 lines
1.9 KiB
C

#include "pool.h"
APTR ASM AsmAllocPooled(REG(a0,POOL *poolHeader),REG(d0,ULONG memSize),REG(a6,APTR SysBase))
{
if (((struct Library *)SysBase)->lib_Version>=39)
return (AllocPooled(poolHeader,memSize));
else {
ULONG *puddle=NULL;
if (poolHeader!=NULL && memSize!=0) {
ULONG *p,size;
if (poolHeader->ThreshSize>memSize) {
struct MemHeader *a=(struct MemHeader *)poolHeader->PuddleList.mlh_Head;
for(;;) {
if (a->mh_Node.ln_Succ!=NULL) {
if (a->mh_Node.ln_Type && (puddle=(ULONG *)Allocate(a,memSize))!=NULL)
break;
a=(struct MemHeader *)a->mh_Node.ln_Succ; continue;
}
size=poolHeader->PuddleSize+sizeof(struct MemHeader)+2*sizeof(ULONG);
if ((puddle=(ULONG *)AllocMem(size,poolHeader->MemoryFlags))==NULL)
goto out; /* why is gcc so dumb ??? */
*puddle++=size;
a=(struct MemHeader *)puddle;
a->mh_Node.ln_Type=NT_MEMORY;
a->mh_Lower=a->mh_First=(struct MemChunk *)((UBYTE *)a+sizeof(struct MemHeader)+sizeof(UBYTE *));
a->mh_First->mc_Next=NULL;
a->mh_Free=a->mh_First->mc_Bytes=poolHeader->PuddleSize;
a->mh_Upper=(char *)a->mh_First+a->mh_Free;
AddHead((struct List *)&poolHeader->PuddleList,&a->mh_Node);
puddle=(ULONG *)Allocate(a,memSize);
break;
}
if (poolHeader->MemoryFlags&MEMF_CLEAR) {
p=puddle; memSize+=7; memSize>>=3;
do { *p++=0; *p++=0; } while(--memSize);
}
}
else {
size=memSize+sizeof(struct MinNode)+2*sizeof(ULONG);
if ((puddle=(ULONG *)AllocMem(size,poolHeader->MemoryFlags))!=NULL) {
*puddle++=size;
AddTail((struct List *)&poolHeader->PuddleList,(struct Node *)puddle);
puddle=(ULONG *)((struct MinNode *)puddle+1);
*puddle++=0;
}
}
}
out:
return puddle;
}
}