Forgot to remove #if 0's
[cacao.git] / mm / boehm.c
1 /* mm/boehm.c - interface for boehm gc
2
3    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5    M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6    P. Tomsich, J. Wenninger
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Stefan Ring
28
29    $Id: boehm.c 838 2004-01-05 00:27:00Z twisti $
30
31 */
32
33
34 #include "main.h"
35 #include "boehm.h"
36 #include "global.h"
37 #include "native.h"
38 #include "asmpart.h"
39 #include "threads/thread.h"
40 #include "toolbox/loging.h"
41
42 /* this is temporary workaround */
43 #if defined(__X86_64__)
44 #define GC_DEBUG
45 #endif
46
47 #include "gc.h"
48
49
50 static void *stackcall_twoargs(struct otherstackcall *p)
51 {
52         return (*p->p2)(p->p, p->l);
53 }
54
55
56 static void *stackcall_malloc(void *p, u4 bytelength)
57 {
58         return GC_MALLOC(bytelength);
59 }
60
61
62 static void *stackcall_malloc_atomic(void *p, u4 bytelength)
63 {
64         return GC_MALLOC_ATOMIC(bytelength);
65 }
66
67
68 static void *stackcall_malloc_uncollectable(void *p, u4 bytelength)
69 {
70         return GC_MALLOC_UNCOLLECTABLE(bytelength);
71 }
72
73
74 static void *stackcall_realloc(void *p, u4 bytelength)
75 {
76         return GC_REALLOC(p, bytelength);
77 }
78
79 static void *stackcall_free(void *p, u4 bytelength)
80 {
81         GC_FREE(p);
82         return NULL;
83 }
84
85
86 #ifdef USE_THREADS
87 #define MAINTHREADCALL(r,m,pp,ll) \
88         if (currentThread == NULL || currentThread == mainThread) { \
89                 r = m(pp, ll); \
90         } else { \
91                 struct otherstackcall sc; \
92                 sc.p2 = m; \
93                 sc.p = pp; \
94                 sc.l = ll; \
95                 r = (*asm_switchstackandcall)(CONTEXT(mainThread).usedStackTop, \
96                                 stackcall_twoargs, \
97                                 (void**)&(CONTEXT(currentThread).usedStackTop), &sc); \
98         }
99 #else
100 #define MAINTHREADCALL(r,m,pp,ll) \
101         { r = m(pp, ll); }
102 #endif
103
104
105 void *heap_alloc_uncollectable(u4 bytelength)
106 {
107         void *result;
108         MAINTHREADCALL(result, stackcall_malloc_uncollectable, NULL, bytelength);
109         return result;
110 }
111
112
113 void runboehmfinalizer(void *o, void *p)
114 {
115         java_objectheader *ob = (java_objectheader *) o;
116         asm_calljavafunction(ob->vftbl->class->finalizer, ob, NULL, NULL, NULL);
117         
118         /* if we had an exception in the finalizer, ignore it */
119         exceptionptr = NULL;
120 }
121
122
123 void *heap_allocate(u4 bytelength, bool references, methodinfo *finalizer)
124 {
125         void *result;
126
127         if (references) {
128                 MAINTHREADCALL(result, stackcall_malloc, NULL, bytelength);
129
130         } else {
131                 MAINTHREADCALL(result, stackcall_malloc_atomic, NULL, bytelength);
132         }
133
134         if (finalizer)
135                 GC_REGISTER_FINALIZER(result, runboehmfinalizer, 0, 0, 0);
136
137         return (u1*) result;
138 }
139
140
141 void *heap_reallocate(void *p, u4 bytelength)
142 {
143         void *result;
144
145         MAINTHREADCALL(result, stackcall_realloc, p, bytelength);
146
147         return result;
148 }
149
150 void heap_free(void *p)
151 {
152         void *result;
153
154         MAINTHREADCALL(result, stackcall_free, p, 0);
155 }
156
157
158 void heap_init(u4 size, u4 startsize, void **stackbottom)
159 {
160         GC_INIT();
161 }
162
163
164 void heap_close()
165 {
166 }
167
168
169 void gc_init()
170 {
171 }
172
173
174 void gc_call()
175 {
176         if (collectverbose)
177                 dolog("Garbage Collection:  previous/now = %d / %d ",
178                           0, 0);
179
180         GC_gcollect();
181 }
182
183
184 /*
185  * These are local overrides for various environment variables in Emacs.
186  * Please do not remove this and leave it at the end of the file, where
187  * Emacs will automagically detect them.
188  * ---------------------------------------------------------------------
189  * Local variables:
190  * mode: c
191  * indent-tabs-mode: t
192  * c-basic-offset: 4
193  * tab-width: 4
194  * End:
195  */