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