xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/libdruntime/gc/gcinterface.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1*627f7eb2Smrg /**
2*627f7eb2Smrg  * Contains the internal GC interface.
3*627f7eb2Smrg  *
4*627f7eb2Smrg  * Copyright: Copyright Digital Mars 2016.
5*627f7eb2Smrg  * License:   $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6*627f7eb2Smrg  * Authors:   Walter Bright, Sean Kelly, Jeremy DeHaan
7*627f7eb2Smrg  */
8*627f7eb2Smrg 
9*627f7eb2Smrg  /*          Copyright Digital Mars 2016.
10*627f7eb2Smrg  * Distributed under the Boost Software License, Version 1.0.
11*627f7eb2Smrg  *    (See accompanying file LICENSE or copy at
12*627f7eb2Smrg  *          http://www.boost.org/LICENSE_1_0.txt)
13*627f7eb2Smrg  */
14*627f7eb2Smrg module gc.gcinterface;
15*627f7eb2Smrg 
16*627f7eb2Smrg static import core.memory;
17*627f7eb2Smrg alias BlkAttr = core.memory.GC.BlkAttr;
18*627f7eb2Smrg alias BlkInfo = core.memory.GC.BlkInfo;
19*627f7eb2Smrg 
20*627f7eb2Smrg alias RootIterator = int delegate(scope int delegate(ref Root) nothrow dg);
21*627f7eb2Smrg alias RangeIterator = int delegate(scope int delegate(ref Range) nothrow dg);
22*627f7eb2Smrg 
23*627f7eb2Smrg 
24*627f7eb2Smrg struct Root
25*627f7eb2Smrg {
26*627f7eb2Smrg     void* proot;
27*627f7eb2Smrg     alias proot this;
28*627f7eb2Smrg }
29*627f7eb2Smrg 
30*627f7eb2Smrg struct Range
31*627f7eb2Smrg {
32*627f7eb2Smrg     void* pbot;
33*627f7eb2Smrg     void* ptop;
34*627f7eb2Smrg     TypeInfo ti; // should be tail const, but doesn't exist for references
35*627f7eb2Smrg     alias pbot this; // only consider pbot for relative ordering (opCmp)
36*627f7eb2Smrg }
37*627f7eb2Smrg 
38*627f7eb2Smrg interface GC
39*627f7eb2Smrg {
40*627f7eb2Smrg 
41*627f7eb2Smrg     /*
42*627f7eb2Smrg      *
43*627f7eb2Smrg      */
44*627f7eb2Smrg     void Dtor();
45*627f7eb2Smrg 
46*627f7eb2Smrg     /**
47*627f7eb2Smrg      *
48*627f7eb2Smrg      */
49*627f7eb2Smrg     void enable();
50*627f7eb2Smrg 
51*627f7eb2Smrg     /**
52*627f7eb2Smrg      *
53*627f7eb2Smrg      */
54*627f7eb2Smrg     void disable();
55*627f7eb2Smrg 
56*627f7eb2Smrg     /**
57*627f7eb2Smrg      *
58*627f7eb2Smrg      */
59*627f7eb2Smrg     void collect() nothrow;
60*627f7eb2Smrg 
61*627f7eb2Smrg     /**
62*627f7eb2Smrg      *
63*627f7eb2Smrg      */
64*627f7eb2Smrg     void collectNoStack() nothrow;
65*627f7eb2Smrg 
66*627f7eb2Smrg     /**
67*627f7eb2Smrg      * minimize free space usage
68*627f7eb2Smrg      */
69*627f7eb2Smrg     void minimize() nothrow;
70*627f7eb2Smrg 
71*627f7eb2Smrg     /**
72*627f7eb2Smrg      *
73*627f7eb2Smrg      */
74*627f7eb2Smrg     uint getAttr(void* p) nothrow;
75*627f7eb2Smrg 
76*627f7eb2Smrg     /**
77*627f7eb2Smrg      *
78*627f7eb2Smrg      */
79*627f7eb2Smrg     uint setAttr(void* p, uint mask) nothrow;
80*627f7eb2Smrg 
81*627f7eb2Smrg     /**
82*627f7eb2Smrg      *
83*627f7eb2Smrg      */
84*627f7eb2Smrg     uint clrAttr(void* p, uint mask) nothrow;
85*627f7eb2Smrg 
86*627f7eb2Smrg     /**
87*627f7eb2Smrg      *
88*627f7eb2Smrg      */
89*627f7eb2Smrg     void* malloc(size_t size, uint bits, const TypeInfo ti) nothrow;
90*627f7eb2Smrg 
91*627f7eb2Smrg     /*
92*627f7eb2Smrg      *
93*627f7eb2Smrg      */
94*627f7eb2Smrg     BlkInfo qalloc(size_t size, uint bits, const TypeInfo ti) nothrow;
95*627f7eb2Smrg 
96*627f7eb2Smrg     /*
97*627f7eb2Smrg      *
98*627f7eb2Smrg      */
99*627f7eb2Smrg     void* calloc(size_t size, uint bits, const TypeInfo ti) nothrow;
100*627f7eb2Smrg 
101*627f7eb2Smrg     /*
102*627f7eb2Smrg      *
103*627f7eb2Smrg      */
104*627f7eb2Smrg     void* realloc(void* p, size_t size, uint bits, const TypeInfo ti) nothrow;
105*627f7eb2Smrg 
106*627f7eb2Smrg     /**
107*627f7eb2Smrg      * Attempt to in-place enlarge the memory block pointed to by p by at least
108*627f7eb2Smrg      * minsize bytes, up to a maximum of maxsize additional bytes.
109*627f7eb2Smrg      * This does not attempt to move the memory block (like realloc() does).
110*627f7eb2Smrg      *
111*627f7eb2Smrg      * Returns:
112*627f7eb2Smrg      *  0 if could not extend p,
113*627f7eb2Smrg      *  total size of entire memory block if successful.
114*627f7eb2Smrg      */
115*627f7eb2Smrg     size_t extend(void* p, size_t minsize, size_t maxsize, const TypeInfo ti) nothrow;
116*627f7eb2Smrg 
117*627f7eb2Smrg     /**
118*627f7eb2Smrg      *
119*627f7eb2Smrg      */
120*627f7eb2Smrg     size_t reserve(size_t size) nothrow;
121*627f7eb2Smrg 
122*627f7eb2Smrg     /**
123*627f7eb2Smrg      *
124*627f7eb2Smrg      */
125*627f7eb2Smrg     void free(void* p) nothrow;
126*627f7eb2Smrg 
127*627f7eb2Smrg     /**
128*627f7eb2Smrg      * Determine the base address of the block containing p.  If p is not a gc
129*627f7eb2Smrg      * allocated pointer, return null.
130*627f7eb2Smrg      */
131*627f7eb2Smrg     void* addrOf(void* p) nothrow;
132*627f7eb2Smrg 
133*627f7eb2Smrg     /**
134*627f7eb2Smrg      * Determine the allocated size of pointer p.  If p is an interior pointer
135*627f7eb2Smrg      * or not a gc allocated pointer, return 0.
136*627f7eb2Smrg      */
137*627f7eb2Smrg     size_t sizeOf(void* p) nothrow;
138*627f7eb2Smrg 
139*627f7eb2Smrg     /**
140*627f7eb2Smrg      * Determine the base address of the block containing p.  If p is not a gc
141*627f7eb2Smrg      * allocated pointer, return null.
142*627f7eb2Smrg      */
143*627f7eb2Smrg     BlkInfo query(void* p) nothrow;
144*627f7eb2Smrg 
145*627f7eb2Smrg     /**
146*627f7eb2Smrg      * Retrieve statistics about garbage collection.
147*627f7eb2Smrg      * Useful for debugging and tuning.
148*627f7eb2Smrg      */
149*627f7eb2Smrg     core.memory.GC.Stats stats() nothrow;
150*627f7eb2Smrg 
151*627f7eb2Smrg     /**
152*627f7eb2Smrg      * add p to list of roots
153*627f7eb2Smrg      */
154*627f7eb2Smrg     void addRoot(void* p) nothrow @nogc;
155*627f7eb2Smrg 
156*627f7eb2Smrg     /**
157*627f7eb2Smrg      * remove p from list of roots
158*627f7eb2Smrg      */
159*627f7eb2Smrg     void removeRoot(void* p) nothrow @nogc;
160*627f7eb2Smrg 
161*627f7eb2Smrg     /**
162*627f7eb2Smrg      *
163*627f7eb2Smrg      */
164*627f7eb2Smrg     @property RootIterator rootIter() @nogc;
165*627f7eb2Smrg 
166*627f7eb2Smrg     /**
167*627f7eb2Smrg      * add range to scan for roots
168*627f7eb2Smrg      */
169*627f7eb2Smrg     void addRange(void* p, size_t sz, const TypeInfo ti) nothrow @nogc;
170*627f7eb2Smrg 
171*627f7eb2Smrg     /**
172*627f7eb2Smrg      * remove range
173*627f7eb2Smrg      */
174*627f7eb2Smrg     void removeRange(void* p) nothrow @nogc;
175*627f7eb2Smrg 
176*627f7eb2Smrg     /**
177*627f7eb2Smrg      *
178*627f7eb2Smrg      */
179*627f7eb2Smrg     @property RangeIterator rangeIter() @nogc;
180*627f7eb2Smrg 
181*627f7eb2Smrg     /**
182*627f7eb2Smrg      * run finalizers
183*627f7eb2Smrg      */
184*627f7eb2Smrg     void runFinalizers(in void[] segment) nothrow;
185*627f7eb2Smrg 
186*627f7eb2Smrg     /*
187*627f7eb2Smrg      *
188*627f7eb2Smrg      */
189*627f7eb2Smrg     bool inFinalizer() nothrow;
190*627f7eb2Smrg }
191