2 docCopyright("Steve Dekorte", 2002)
3 docLicense("BSD revised")
11 static long allocs
= 0;
12 static long reallocs
= 0;
13 static long allocatedBytes
= 0;
14 static long maxAllocatedBytes
= 0;
15 static long frees
= 0;
22 long allocatedBytes = 0;
23 long maxAllocatedBytes = 0;
27 Allocator *Allocator_new(void)
29 Allocator *self = calloc(1, sizeof(Allocator));
33 void Allocator_free(Allocator *self)
38 size_t Allocator_allocs(Allocator *self)
43 size_t Allocator_frees(Allocator *self)
48 size_t Allocator_allocatedBytes(Allocator *self)
50 return self->allocatedBytes;
53 size_t Allocator_maxAllocatedBytes(Allocator *self)
55 return self->maxAllocatedBytes;
58 void Allocator_resetMaxAllocatedBytes(Allocator *self)
60 self->maxAllocatedBytes = self->allocatedBytes;
63 void Allocator_show(Allocator *self)
65 printf("allocs %i\n", self->allocs);
66 printf("reallocs %i\n", self->reallocs);
67 printf("frees %i\n", self->frees);
68 printf("allocsMinusfrees %i\n", self->allocs - self->frees);
69 printf("allocatedBytes %i\n", self->allocatedBytes);
70 printf("maxAllocatedBytes %i\n", self->maxAllocatedBytes);
71 //printf("allocs %i bytes %i\n", self->allocs, self->allocatedBytes);
74 static Allocator *_globalAllocator;
76 Allocator *globalAllocator(void)
78 if(!_globalAllocator) Allocator_new();
79 return _globalAllocator;
83 // -------------------------------------------------------
85 typedef struct MemoryBlock MemoryBlock
;
95 char padding
[40 - (sizeof(size_t) + sizeof(size_t) + sizeof(char *) + sizeof(int) + sizeof(void *) + sizeof(void *))];
98 MemoryBlock
*PtrToMemoryBlock(void *ptr
)
100 return (MemoryBlock
*)(((char *)ptr
) - sizeof(MemoryBlock
));
103 void *MemoryBlockToPtr(MemoryBlock
*self
)
105 return (void *)(((char *)self
) + sizeof(MemoryBlock
));
108 static MemoryBlock
*_baseblock
= NULL
;
110 inline MemoryBlock
*baseblock(void)
112 if(!_baseblock
) _baseblock
= calloc(1, sizeof(MemoryBlock
));
116 void MemoryBlock_remove(MemoryBlock
*self
)
118 if (self
->next
) self
->next
->prev
= self
->prev
;
119 if (self
->prev
) self
->prev
->next
= self
->next
;
122 void MemoryBlock_insertAfter_(MemoryBlock
*self
, MemoryBlock
*other
)
124 self
->next
= other
->next
;
127 if (self
->next
) self
->next
->prev
= self
;
130 MemoryBlock
*MemoryBlock_newWithSize_file_line_(size_t size
, char *file
, int line
)
132 MemoryBlock
*self
= calloc(1, sizeof(MemoryBlock
) + size
);
134 self
->allocNum
= allocs
;
137 MemoryBlock_insertAfter_(self
, baseblock());
140 allocatedBytes
+= size
;
141 if (allocatedBytes
> maxAllocatedBytes
) maxAllocatedBytes
= allocatedBytes
;
145 MemoryBlock
*MemoryBlock_reallocToSize_(MemoryBlock
*self
, size_t size
)
147 MemoryBlock
*prev
= self
->prev
;
148 MemoryBlock_remove(self
);
149 allocatedBytes
-= self
->size
;
150 allocatedBytes
+= size
;
152 self
= realloc(self
, sizeof(MemoryBlock
) + size
);
154 MemoryBlock_insertAfter_(self
, prev
);
158 void MemoryBlock_free(MemoryBlock
*self
)
160 MemoryBlock_remove(self
);
161 allocatedBytes
-= self
->size
;
166 size_t MemoryBlock_size(MemoryBlock
*self
)
171 void MemoryBlock_show(MemoryBlock
*self
)
173 char *file
= strrchr(self
->file
, '/');
174 file
= file
? file
+ 1 : self
->file
;
175 //printf(" MemoryBlock %p:\n", (void *)self);
176 //printf("\tsize %i\n", self->size);
177 //printf("\tfile %s\n", file);
178 //printf("\tline %i\n", self->line);
179 printf("\t%i %p %s:%i\t\t%i bytes\n", self
->allocNum
, MemoryBlockToPtr(self
), file
, self
->line
, self
->size
);
182 // ----------------------------------------------------------------------------
184 void *io_real_malloc(size_t size
, char *file
, int line
)
186 MemoryBlock
*m
= MemoryBlock_newWithSize_file_line_(size
, file
, line
);
187 return MemoryBlockToPtr(m
);
190 void *io_real_calloc(size_t count
, size_t size
, char *file
, int line
)
192 return io_real_malloc(count
* size
, file
, line
);
195 void *io_real_realloc(void *ptr
, size_t size
, char *file
, int line
)
199 MemoryBlock
*m
= MemoryBlock_reallocToSize_(PtrToMemoryBlock(ptr
), size
);
200 return MemoryBlockToPtr(m
);
203 return io_real_malloc(size
, file
, line
);
206 void io_free(void *ptr
)
208 MemoryBlock_free(PtrToMemoryBlock(ptr
));
211 // --------------------------------------------------------------------------
213 void io_show_mem(char *s
)
215 printf("\n--- %s ---\n", s
? s
: "");
216 printf("allocs %i\n", allocs
);
217 printf("reallocs %i\n", reallocs
);
218 printf("frees %i\n", frees
);
219 printf("allocsMinusfrees %i\n", allocs
- frees
);
220 printf("allocatedBytes %i\n", allocatedBytes
);
221 printf("maxAllocatedBytes %i\n", maxAllocatedBytes
);
222 //printf("allocs %i bytes %i\n", allocs, allocatedBytes);
226 size_t io_maxAllocatedBytes(void)
228 return maxAllocatedBytes
;
231 void io_resetMaxAllocatedBytes(void)
233 maxAllocatedBytes
= allocatedBytes
;
236 size_t io_frees(void)
241 size_t io_allocatedBytes(void)
243 return allocatedBytes
;
246 size_t io_allocs(void)
251 void io_showUnfreed(void)
253 MemoryBlock
*m
= baseblock()->next
;
265 printf("\n %i bytes in %i blocks\n", (int)sum
, n
);
270 void *cpalloc(const void *p
, size_t size
)
272 void *n
= io_malloc(size
);
273 if(p
) memcpy(n
, p
, size
);
277 void *io_freerealloc(void *p
, size_t size
)
279 return realloc(p
, size
);
281 void *n = io_malloc(size);