-
Notifications
You must be signed in to change notification settings - Fork 0
/
minialloc.c
36 lines (32 loc) · 752 Bytes
/
minialloc.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <glib.h>
#include "minialloc.h"
#define BLOCKSIZE (1<<24)
static gpointer data;
static gpointer free;
static gsize remaining;
static void newdata(gpointer olddata) {
data = g_malloc(BLOCKSIZE);
*((gpointer *)data) = olddata;
free = data + sizeof(gpointer);
remaining = BLOCKSIZE - sizeof(gpointer);
}
gpointer minialloc(gsize size) {
g_assert(size <= BLOCKSIZE);
if ((data == NULL) || (size > remaining)) {
newdata(data);
}
gpointer rval = free;
free += size;
remaining -= size;
return rval;
}
void minialloc_free_all() {
int n = 0;
while (data != NULL) {
gpointer p = *((gpointer*)data);
g_free(data);
data = p;
n++;
}
// g_message("Freed %d blocks of %d bytes", n, BLOCKSIZE);
}