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