comparison dmd/mem.c @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children 35d93ce68cf4
comparison
equal deleted inserted replaced
0:a9e71648e74d 1:c53b6e3fe49a
1
2 /* Copyright (c) 2000 Digital Mars */
3 /* All Rights Reserved */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #include "gc.h"
10
11 #include "mem.h"
12
13 /* This implementation of the storage allocator uses the standard C allocation package.
14 */
15
16 Mem mem;
17
18 void Mem::init()
19 {
20 GC_init();
21 }
22
23 char *Mem::strdup(const char *s)
24 {
25 char *p;
26
27 if (s)
28 {
29 p = GC_strdup(s);
30 if (p)
31 return p;
32 error();
33 }
34 return NULL;
35 }
36
37 void *Mem::malloc(size_t size)
38 { void *p;
39
40 if (!size)
41 p = NULL;
42 else
43 {
44 p = GC_malloc(size);
45 if (!p)
46 error();
47 }
48 return p;
49 }
50
51 void *Mem::calloc(size_t size, size_t n)
52 { void *p;
53
54 if (!size || !n)
55 p = NULL;
56 else
57 {
58 p = GC_malloc(size * n);
59 if (!p)
60 error();
61 memset(p, 0, size * n);
62 }
63 return p;
64 }
65
66 void *Mem::realloc(void *p, size_t size)
67 {
68 if (!size)
69 { if (p)
70 { GC_free(p);
71 p = NULL;
72 }
73 }
74 else if (!p)
75 {
76 p = GC_malloc(size);
77 if (!p)
78 error();
79 }
80 else
81 {
82 p = GC_realloc(p, size);
83 if (!p)
84 error();
85 }
86 return p;
87 }
88
89 void Mem::free(void *p)
90 {
91 if (p)
92 GC_free(p);
93 }
94
95 void *Mem::mallocdup(void *o, size_t size)
96 { void *p;
97
98 if (!size)
99 p = NULL;
100 else
101 {
102 p = GC_malloc(size);
103 if (!p)
104 error();
105 else
106 memcpy(p,o,size);
107 }
108 return p;
109 }
110
111 void Mem::error()
112 {
113 printf("Error: out of memory\n");
114 exit(EXIT_FAILURE);
115 }
116
117 void Mem::fullcollect()
118 {
119 GC_gcollect();
120 }
121
122 void Mem::mark(void *pointer)
123 {
124 (void) pointer; // necessary for VC /W4
125 }
126
127 /* =================================================== */
128
129 void * operator new(size_t m_size)
130 {
131 void *p = GC_malloc(m_size);
132 if (p)
133 return p;
134 printf("Error: out of memory\n");
135 exit(EXIT_FAILURE);
136 return p;
137 }
138
139 void operator delete(void *p)
140 {
141 GC_free(p);
142 }
143
144