87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
/****************************************************************************
|
|
* 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_) */
|