"Fossies" - the Fresh Open Source Software Archive

Member "unrar/suballoc.hpp" (4 May 2022, 2342 Bytes) of package /linux/misc/unrarsrc-6.1.7.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "suballoc.hpp" see the Fossies "Dox" file reference documentation.

    1 /****************************************************************************
    2  *  This file is part of PPMd project                                       *
    3  *  Written and distributed to public domain by Dmitry Shkarin 1997,        *
    4  *  1999-2000                                                               *
    5  *  Contents: interface to memory allocation routines                       *
    6  ****************************************************************************/
    7 #if !defined(_SUBALLOC_H_)
    8 #define _SUBALLOC_H_
    9 
   10 #if defined(__GNUC__) && defined(ALLOW_MISALIGNED)
   11 #define RARPPM_PACK_ATTR __attribute__ ((packed))
   12 #else
   13 #define RARPPM_PACK_ATTR
   14 #endif /* defined(__GNUC__) */
   15 
   16 #ifdef ALLOW_MISALIGNED
   17 #pragma pack(1)
   18 #endif
   19 
   20 struct RARPPM_MEM_BLK 
   21 {
   22   ushort Stamp, NU;
   23   RARPPM_MEM_BLK* next, * prev;
   24   void insertAt(RARPPM_MEM_BLK* p) 
   25   {
   26     next=(prev=p)->next;
   27     p->next=next->prev=this;
   28   }
   29   void remove() 
   30   {
   31     prev->next=next;
   32     next->prev=prev;
   33   }
   34 } RARPPM_PACK_ATTR;
   35 
   36 #ifdef ALLOW_MISALIGNED
   37 #ifdef _AIX
   38 #pragma pack(pop)
   39 #else
   40 #pragma pack()
   41 #endif
   42 #endif
   43 
   44 
   45 class SubAllocator
   46 {
   47   private:
   48     static const int N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4;
   49     static const int N_INDEXES=N1+N2+N3+N4;
   50 
   51     struct RAR_NODE
   52     {
   53       RAR_NODE* next;
   54     };
   55 
   56     inline void InsertNode(void* p,int indx);
   57     inline void* RemoveNode(int indx);
   58     inline uint U2B(int NU);
   59     inline void SplitBlock(void* pv,int OldIndx,int NewIndx);
   60     inline void GlueFreeBlocks();
   61     void* AllocUnitsRare(int indx);
   62     inline RARPPM_MEM_BLK* MBPtr(RARPPM_MEM_BLK *BasePtr,int Items);
   63 
   64     long SubAllocatorSize;
   65     byte Indx2Units[N_INDEXES], Units2Indx[128], GlueCount;
   66     byte *HeapStart,*LoUnit, *HiUnit;
   67     struct RAR_NODE FreeList[N_INDEXES];
   68   public:
   69     SubAllocator();
   70     ~SubAllocator() {StopSubAllocator();}
   71     void Clean();
   72     bool StartSubAllocator(int SASize);
   73     void StopSubAllocator();
   74     void  InitSubAllocator();
   75     inline void* AllocContext();
   76     inline void* AllocUnits(int NU);
   77     inline void* ExpandUnits(void* ptr,int OldNU);
   78     inline void* ShrinkUnits(void* ptr,int OldNU,int NewNU);
   79     inline void  FreeUnits(void* ptr,int OldNU);
   80     long GetAllocatedMemory() {return(SubAllocatorSize);}
   81 
   82     byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart;
   83 };
   84 
   85 
   86 #endif /* !defined(_SUBALLOC_H_) */