bzr branch
http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk
121.1.3
by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set. |
1 |
#include "mm.h" |
2 |
||
3 |
static sboolean _s_mm_initialized = FALSE; |
|
4 |
static SMMType _s_mm_type = S_MM_TYPE_NONE; |
|
5 |
||
6 |
void
|
|
7 |
s_mm_init (SMMType type) { |
|
8 |
if (!_s_mm_initialized) { |
|
9 |
_s_mm_initialized = TRUE; |
|
10 |
#if USE_GC |
|
11 |
_s_mm_type = type; |
|
12 |
#else |
|
13 |
_s_mm_type = S_MM_TYPE_LIBC; |
|
14 |
#endif |
|
15 |
} |
|
16 |
}
|
|
17 |
||
18 |
schar * |
|
19 |
s_mm_type_get_name (SMMType type) { |
|
20 |
return SMMTypeName[type]; |
|
21 |
}
|
|
22 |
||
23 |
void
|
|
24 |
s_mm_cleanup () { |
|
25 |
/* Nothing... yet. */ |
|
26 |
}
|
|
27 |
||
28 |
SMMType
|
|
29 |
s_mm_get_type () { |
|
30 |
return _s_mm_type; |
|
31 |
}
|
|
32 |
||
33 |
spointer
|
|
34 |
s_malloc (size_t size) { |
|
35 |
#if USE_GC |
|
36 |
if (_s_mm_type == S_MM_TYPE_GC) { |
|
37 |
return GC_MALLOC (size); |
|
38 |
} |
|
39 |
#endif |
|
40 |
return malloc (size); |
|
41 |
}
|
|
42 |
||
43 |
void
|
|
44 |
s_free (spointer pointer) { |
|
45 |
#if USE_GC |
|
46 |
if (_s_mm_type == S_MM_TYPE_GC) { |
|
47 |
/* Because libgc handles the freeing of these things, we just set it to |
|
48 |
* NULL and be done with it.
|
|
49 |
*
|
|
50 |
* This also means that we can used this as a normal free and not have to
|
|
51 |
* deal with setting it to NULL.
|
|
52 |
*/
|
|
53 |
pointer = NULL; |
|
54 |
return; |
|
55 |
} |
|
56 |
#endif |
|
57 |
free (pointer); |
|
58 |
}
|
|
59 |
||
60 |
spointer
|
|
61 |
s_realloc (spointer pointer, size_t size) { |
|
62 |
#if USE_GC |
|
63 |
if (_s_mm_type == S_MM_TYPE_GC) { |
|
64 |
return GC_REALLOC (pointer, size); |
|
65 |
} |
|
66 |
#endif |
|
67 |
return realloc (pointer, size); |
|
68 |
}
|
|
69 |
||
70 |
spointer
|
|
71 |
s_calloc (size_t num, size_t size) { |
|
72 |
#if USE_GC |
|
73 |
if (_s_mm_type == S_MM_TYPE_GC) { |
|
74 |
/* This should work. */ |
|
75 |
spointer ret_val = GC_MALLOC (num * size); |
|
76 |
return ret_val; |
|
77 |
} |
|
78 |
#endif |
|
79 |
return calloc (num, size); |
|
80 |
}
|