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