@@ -103,6 +103,42 @@ alias GC gc_t;
103103
104104/* ============================ GC =============================== */
105105
106+ // register GC in C constructor (_STI_)
107+ extern (C ) pragma (crt_constructor) void _d_register_conservative_gc()
108+ {
109+ import gc.registry;
110+ registerGCFactory(" conservative" , &initialize);
111+ }
112+
113+ extern (C ) pragma (crt_constructor) void _d_register_precise_gc()
114+ {
115+ import gc.registry;
116+ registerGCFactory(" precise" , &initialize_precise);
117+ }
118+
119+ private GC initialize ()
120+ {
121+ import core.stdc.string : memcpy;
122+
123+ auto p = cstdlib.malloc(__traits(classInstanceSize, ConservativeGC));
124+
125+ if (! p)
126+ onOutOfMemoryErrorNoGC();
127+
128+ auto init = typeid (ConservativeGC).initializer();
129+ assert (init.length == __traits(classInstanceSize, ConservativeGC));
130+ auto instance = cast (ConservativeGC) memcpy(p, init.ptr, init.length);
131+ instance.__ctor();
132+
133+ return instance;
134+ }
135+
136+ private GC initialize_precise ()
137+ {
138+ ConservativeGC.isPrecise = true ;
139+ return initialize ();
140+ }
141+
106142class ConservativeGC : GC
107143{
108144 // For passing to debug code (not thread safe)
@@ -124,42 +160,6 @@ class ConservativeGC : GC
124160 gcLock.lock();
125161 }
126162
127-
128- static void initialize (ref GC gc)
129- {
130- import core.stdc.string : memcpy;
131-
132- if ((config.gc != " precise" ) && (config.gc != " conservative" ))
133- return ;
134-
135- if (config.gc == " precise" )
136- isPrecise = true ;
137-
138- auto p = cstdlib.malloc(__traits(classInstanceSize,ConservativeGC));
139-
140- if (! p)
141- onOutOfMemoryErrorNoGC();
142-
143- auto init = typeid (ConservativeGC).initializer();
144- assert (init.length == __traits(classInstanceSize, ConservativeGC));
145- auto instance = cast (ConservativeGC) memcpy(p, init.ptr, init.length);
146- instance.__ctor();
147-
148- gc = instance;
149- }
150-
151-
152- static void finalize (ref GC gc)
153- {
154- if ((config.gc != " precise" ) && (config.gc != " conservative" ))
155- return ;
156-
157- auto instance = cast (ConservativeGC) gc;
158- instance.Dtor();
159- cstdlib.free(cast (void * )instance);
160- }
161-
162-
163163 this ()
164164 {
165165 // config is assumed to have already been initialized
@@ -176,7 +176,7 @@ class ConservativeGC : GC
176176 }
177177
178178
179- void Dtor ()
179+ ~this ()
180180 {
181181 version (linux )
182182 {
@@ -190,6 +190,9 @@ class ConservativeGC : GC
190190 cstdlib.free(gcx);
191191 gcx = null ;
192192 }
193+ // TODO: cannot free as memory is overwritten and
194+ // the monitor is still read in rt_finalize (called by destroy)
195+ // cstdlib.free(cast(void*) this);
193196 }
194197
195198
0 commit comments