libclamunrar/suballoc.hpp
01eebc13
 /****************************************************************************
  *  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);
ab504f13
     long GetAllocatedMemory() {return(SubAllocatorSize);}
01eebc13
 
     byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart;
 };
 
 
 #endif /* !defined(_SUBALLOC_H_) */