/**************************************************************************** * This file is part of PPMd project * * Written and distributed to public domain by Dmitry Shkarin 1997, * * 1999-2000 * * Contents: interface to memory allocation routines * ****************************************************************************/ #if !defined(_SUBALLOC_H_) #define _SUBALLOC_H_ #if defined(__GNUC__) && defined(ALLOW_MISALIGNED) #define RARPPM_PACK_ATTR __attribute__ ((packed)) #else #define RARPPM_PACK_ATTR #endif /* defined(__GNUC__) */ #ifdef ALLOW_MISALIGNED #pragma pack(1) #endif struct RARPPM_MEM_BLK { ushort Stamp, NU; RARPPM_MEM_BLK* next, * prev; void insertAt(RARPPM_MEM_BLK* p) { next=(prev=p)->next; p->next=next->prev=this; } void remove() { prev->next=next; next->prev=prev; } } RARPPM_PACK_ATTR; #ifdef ALLOW_MISALIGNED #ifdef _AIX #pragma pack(pop) #else #pragma pack() #endif #endif class SubAllocator { private: static const int N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4; static const int N_INDEXES=N1+N2+N3+N4; struct RAR_NODE { RAR_NODE* next; }; inline void InsertNode(void* p,int indx); inline void* RemoveNode(int indx); inline uint U2B(int NU); inline void SplitBlock(void* pv,int OldIndx,int NewIndx); inline void GlueFreeBlocks(); void* AllocUnitsRare(int indx); inline RARPPM_MEM_BLK* MBPtr(RARPPM_MEM_BLK *BasePtr,int Items); long SubAllocatorSize; byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount; byte *HeapStart,*LoUnit, *HiUnit; struct RAR_NODE FreeList[N_INDEXES]; public: SubAllocator(); ~SubAllocator() {StopSubAllocator();} void Clean(); bool StartSubAllocator(int SASize); void StopSubAllocator(); void InitSubAllocator(); inline void* AllocContext(); inline void* AllocUnits(int NU); inline void* ExpandUnits(void* ptr,int OldNU); inline void* ShrinkUnits(void* ptr,int OldNU,int NewNU); inline void FreeUnits(void* ptr,int OldNU); long GetAllocatedMemory() {return(SubAllocatorSize);} byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart; }; #endif /* !defined(_SUBALLOC_H_) */