Debug swcsa
[SXSI/TextCollection.git] / lzindex / heap.c
1
2   // Heap of fixed size objects, fast to alloc and especially to totally free
3
4 #include "heap.h"
5
6 #define BLK 2048
7
8 #ifdef MEMCTRL
9 extern int account,currmem,newmem,maxmem;
10 #endif
11
12         // Creates a heap of elements of size siz
13
14 heap createHeap (uint siz)
15
16    { heap H;
17      H = malloc (sizeof(struct sheap));
18      H->siz = siz;
19      H->cap = BLK/siz; if (H->cap == 0) H->cap = 1;
20      H->blocks = NULL;
21      H->free = NULL;
22      H->first = H->cap;
23 #ifdef MEMCTRL
24      H->totsize = 0;
25 #endif
26      return H;
27    }
28
29         // Gets a new element from H
30
31 void *mallocHeap (heap H)
32
33    { void *elem;
34      void **b;
35 #ifdef MEMCTRL
36      H->totsize++;
37      newmem = currmem+H->siz;
38      if (newmem > maxmem) maxmem = newmem;
39      if (currmem/1024 != newmem/1024)
40         printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
41      currmem = newmem;
42 #endif
43      if (H->free)
44         { elem = (void*)H->free;
45           H->free = *H->free;
46           return elem;
47         }
48      if (H->first != H->cap)
49         { elem = (void*)(((uint)(H->blocks+1)) + H->first * H->siz);
50           H->first++;
51           return elem;
52         }
53 #ifdef MEMCTRL
54      account = 0;
55 #endif
56      b = malloc (sizeof(void*) + H->cap * H->siz);
57 #ifdef MEMCTRL
58      account = 1;
59 #endif
60      b[0] = H->blocks;
61      H->blocks = b;
62      elem = (void*)(H->blocks+1);
63      H->first = 1;
64      return elem;
65    }
66
67         // Frees ptr from heap H
68
69 void freeHeap (heap H, void *ptr)
70
71    { void **p;
72      if (!ptr) return;
73 #ifdef MEMCTRL
74      H->totsize--;
75      newmem = currmem-H->siz;
76      if (currmem/1024 != newmem/1024)
77         printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
78      currmem = newmem;
79 #endif
80      p = (void**)ptr;
81      *p = H->free;
82      H->free = p;
83    }
84
85         // Frees everything in heap H
86
87 void destroyHeap (heap H)
88
89    { void **b;
90 #ifdef MEMCTRL
91      account = 0;
92 #endif
93      while ((b = H->blocks) != NULL)
94         { H->blocks = b[0];
95           free (b);
96         }
97 #ifdef MEMCTRL
98      account = 1;
99      newmem = currmem-H->totsize*H->siz;
100      if (currmem/1024 != newmem/1024)
101         printf ("Memory: %i Kb, maximum: %i Kb\n",newmem/1024,maxmem/1024);
102      currmem = newmem;
103 #endif
104      free (H);
105    }