Coverage Report

Created: 2024-04-23 06:19

/src/unrar/suballoc.hpp
Line
Count
Source (jump to first uncovered line)
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
0
  {
26
0
    next=(prev=p)->next;
27
0
    p->next=next->prev=this;
28
0
  }
29
  void remove() 
30
0
  {
31
0
    prev->next=next;
32
0
    next->prev=prev;
33
0
  }
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
4.29k
    ~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
92
    long GetAllocatedMemory() {return(SubAllocatorSize);}
81
82
    byte *pText, *UnitsStart,*HeapEnd,*FakeUnitsStart;
83
};
84
85
86
#endif /* !defined(_SUBALLOC_H_) */