Mercurial > projects > ldc
comparison lphobos/gc/gc.d @ 131:5825d48b27d1 trunk
[svn r135] * Merged DMD 1.025 *
* Fixed a minor linking order mishap *
* Added an command line option -annotate *
* Fixed some problems with running optimizations *
* Added std.stdio and dependencies to lphobos (still not 100% working, but compiles and links) *
* Fixed problems with passing aggregate types to variadic functions *
* Added initial code towards full GC support, currently based on malloc and friends, not all the runtime calls the GC yet for memory *
* Fixed problems with resolving nested function context pointers for some heavily nested cases *
* Redid function argument passing + other minor code cleanups, still lots to do on this end... *
author | lindquist |
---|---|
date | Fri, 04 Jan 2008 01:38:42 +0100 |
parents | |
children | 373489eeaf90 |
comparison
equal
deleted
inserted
replaced
130:a7dfa0ed966c | 131:5825d48b27d1 |
---|---|
1 /** | |
2 * Part of the D programming language runtime library. | |
3 */ | |
4 | |
5 /* | |
6 * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com | |
7 * Written by Walter Bright | |
8 * | |
9 * This software is provided 'as-is', without any express or implied | |
10 * warranty. In no event will the authors be held liable for any damages | |
11 * arising from the use of this software. | |
12 * | |
13 * Permission is granted to anyone to use this software for any purpose, | |
14 * including commercial applications, and to alter it and redistribute it | |
15 * freely, subject to the following restrictions: | |
16 * | |
17 * o The origin of this software must not be misrepresented; you must not | |
18 * claim that you wrote the original software. If you use this software | |
19 * in a product, an acknowledgment in the product documentation would be | |
20 * appreciated but is not required. | |
21 * o Altered source versions must be plainly marked as such, and must not | |
22 * be misrepresented as being the original software. | |
23 * o This notice may not be removed or altered from any source | |
24 * distribution. | |
25 */ | |
26 | |
27 | |
28 // Storage allocation | |
29 | |
30 module std.gc; | |
31 | |
32 //debug = PRINTF; | |
33 | |
34 public import std.c.stdarg; | |
35 public import std.c.stdlib; | |
36 public import std.c.string; | |
37 public import gcx; | |
38 public import std.outofmemory; | |
39 public import gcstats; | |
40 public import std.thread; | |
41 | |
42 version=GCCLASS; | |
43 | |
44 version (GCCLASS) | |
45 alias GC gc_t; | |
46 else | |
47 alias GC* gc_t; | |
48 | |
49 gc_t _gc; | |
50 | |
51 void addRoot(void *p) { _gc.addRoot(p); } | |
52 void removeRoot(void *p) { _gc.removeRoot(p); } | |
53 void addRange(void *pbot, void *ptop) { _gc.addRange(pbot, ptop); } | |
54 void removeRange(void *pbot) { _gc.removeRange(pbot); } | |
55 void fullCollect() { _gc.fullCollect(); } | |
56 void fullCollectNoStack() { _gc.fullCollectNoStack(); } | |
57 void genCollect() { _gc.genCollect(); } | |
58 void minimize() { _gc.minimize(); } | |
59 void disable() { _gc.disable(); } | |
60 void enable() { _gc.enable(); } | |
61 void getStats(out GCStats stats) { _gc.getStats(stats); } | |
62 void hasPointers(void* p) { _gc.hasPointers(p); } | |
63 void hasNoPointers(void* p) { _gc.hasNoPointers(p); } | |
64 void setV1_0() { _gc.setV1_0(); } | |
65 | |
66 void[] malloc(size_t nbytes) | |
67 { | |
68 void* p = _gc.malloc(nbytes); | |
69 return p[0 .. nbytes]; | |
70 } | |
71 | |
72 void[] realloc(void* p, size_t nbytes) | |
73 { | |
74 void* q = _gc.realloc(p, nbytes); | |
75 return q[0 .. nbytes]; | |
76 } | |
77 | |
78 size_t extend(void* p, size_t minbytes, size_t maxbytes) | |
79 { | |
80 return _gc.extend(p, minbytes, maxbytes); | |
81 } | |
82 | |
83 size_t capacity(void* p) | |
84 { | |
85 return _gc.capacity(p); | |
86 } | |
87 | |
88 void setTypeInfo(TypeInfo ti, void* p) | |
89 { | |
90 if (ti.flags() & 1) | |
91 hasNoPointers(p); | |
92 else | |
93 hasPointers(p); | |
94 } | |
95 | |
96 void* getGCHandle() | |
97 { | |
98 return cast(void*)_gc; | |
99 } | |
100 | |
101 void setGCHandle(void* p) | |
102 { | |
103 void* oldp = getGCHandle(); | |
104 gc_t g = cast(gc_t)p; | |
105 if (g.gcversion != gcx.GCVERSION) | |
106 throw new Error("incompatible gc versions"); | |
107 | |
108 // Add our static data to the new gc | |
109 GC.scanStaticData(g); | |
110 | |
111 _gc = g; | |
112 // return oldp; | |
113 } | |
114 | |
115 void endGCHandle() | |
116 { | |
117 GC.unscanStaticData(_gc); | |
118 } | |
119 | |
120 extern (C) | |
121 { | |
122 | |
123 void _d_monitorrelease(Object h); | |
124 | |
125 | |
126 void gc_init() | |
127 { | |
128 version (GCCLASS) | |
129 { void* p; | |
130 ClassInfo ci = GC.classinfo; | |
131 | |
132 p = std.c.stdlib.malloc(ci.init.length); | |
133 (cast(byte*)p)[0 .. ci.init.length] = ci.init[]; | |
134 _gc = cast(GC)p; | |
135 } | |
136 else | |
137 { | |
138 _gc = cast(GC *) std.c.stdlib.calloc(1, GC.sizeof); | |
139 } | |
140 _gc.initialize(); | |
141 GC.scanStaticData(_gc); | |
142 std.thread.Thread.thread_init(); | |
143 } | |
144 | |
145 void gc_term() | |
146 { | |
147 _gc.fullCollectNoStack(); | |
148 _gc.Dtor(); | |
149 } | |
150 | |
151 } |