void* SubAllocator::AllocUnitsRare(int indx) { if ( !GlueCount ) { GlueCount = 255; GlueFreeBlocks(); if ( FreeList[indx].next ) return RemoveNode(indx); } int i=indx; do { if (++i == N_INDEXES) { GlueCount--; i=U2B(Indx2Units[indx]); int j=12*Indx2Units[indx]; if (FakeUnitsStart-pText > j) { FakeUnitsStart-=j; UnitsStart -= i; return(UnitsStart); } return(NULL); } } while ( !FreeList[i].next ); void* RetVal=RemoveNode(i); SplitBlock(RetVal,i,indx); return RetVal; }
static uint32_t _AllocUnits(PPMdSubAllocatorVariantI *self,int index) { if(self->GlueCount==0) { GlueFreeBlocks(self); if(AreBlocksAvailable(&self->BList[index])) return PointerToOffset(self,RemoveBlockAfter(&self->BList[index],self)); } for(int i=index+1;i<N_INDEXES;i++) { if(AreBlocksAvailable(&self->BList[i])) { void *units=RemoveBlockAfter(&self->BList[i],self); SplitBlock(self,units,i,index); return PointerToOffset(self,units); } } self->GlueCount--; int i=I2B(self,index); if(self->UnitsStart-self->pText>i) { self->UnitsStart-=i; return PointerToOffset(self,self->UnitsStart); } return 0; }
static uint32_t _AllocUnits(PPMdSubAllocatorVariantH *self,int index) { if(self->GlueCount==0) { self->GlueCount=255; GlueFreeBlocks(self); if(self->FreeList[index].next) return PointerToOffset(self,RemoveNode(self,index)); } for(int i=index+1;i<N_INDEXES;i++) { if(self->FreeList[i].next) { void *units=RemoveNode(self,i); SplitBlock(self,units,i,index); return PointerToOffset(self,units); } } self->GlueCount--; int i=I2B(self,index); if(self->UnitsStart-self->pText>i) { self->UnitsStart-=i; return PointerToOffset(self,self->UnitsStart); } return 0; }