Fix mysterious unremovable file part 2 ?
[cacao.git] / src / mm / boehm-gc / doc / gcinterface.html
1 <!DOCTYPE HTML>
2 <HEAD>
3 <TITLE>Garbage Collector Interface</TITLE>
4 </HEAD>
5 <BODY>
6 <H1>C Interface</h1>
7 On many platforms, a single-threaded garbage collector library can be built
8 to act as a plug-in malloc replacement.
9 (Build with <TT>-DREDIRECT_MALLOC=GC_malloc -DIGNORE_FREE</tt>.)
10 This is often the best way to deal with third-party libraries
11 which leak or prematurely free objects.  <TT>-DREDIRECT_MALLOC</tt> is intended
12 primarily as an easy way to adapt old code, not for new development.
13 <P>
14 New code should use the interface discussed below.
15 <P>
16 Code must be linked against the GC library.  On most UNIX platforms,
17 depending on how the collector is built, this will be <TT>gc.a</tt>
18 or <TT>libgc.{a,so}</tt>.
19 <P>
20 The following describes the standard C interface to the garbage collector.
21 It is not a complete definition of the interface.  It describes only the
22 most commonly used functionality, approximately in decreasing order of
23 frequency of use.
24 The full interface is described in
25 <A HREF="http://hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gch.txt">gc.h</a>
26 or <TT>gc.h</tt> in the distribution.
27 <P>
28 Clients should include <TT>gc.h</tt>.
29 <P>
30 In the case of multithreaded code,
31 <TT>gc.h</tt> should be included after the threads header file, and
32 after defining the appropriate <TT>GC_</tt><I>XXXX</i><TT>_THREADS</tt> macro.
33 (For 6.2alpha4 and later, simply defining <TT>GC_THREADS</tt> should suffice.)
34 The header file <TT>gc.h</tt> must be included
35 in files that use either GC or threads primitives, since threads primitives
36 will be redefined to cooperate with the GC on many platforms.
37 <P>
38 Thread users should also be aware that on many platforms objects reachable
39 only from thread-local variables may be prematurely reclaimed.
40 Thus objects pointed to by thread-local variables should also be pointed to
41 by a globally visible data structure.  (This is viewed as a bug, but as
42 one that is exceedingly hard to fix without some libc hooks.)
43 <DL>
44 <DT> <B>void * GC_MALLOC(size_t <I>nbytes</i>)</b>
45 <DD>
46 Allocates and clears <I>nbytes</i> of storage.
47 Requires (amortized) time proportional to <I>nbytes</i>.
48 The resulting object will be automatically deallocated when unreferenced.
49 References from objects allocated with the system malloc are usually not
50 considered by the collector.  (See <TT>GC_MALLOC_UNCOLLECTABLE</tt>, however.)
51 <TT>GC_MALLOC</tt> is a macro which invokes <TT>GC_malloc</tt> by default or,
52 if <TT>GC_DEBUG</tt>
53 is defined before <TT>gc.h</tt> is included, a debugging version that checks
54 occasionally for overwrite errors, and the like.
55 <DT> <B>void * GC_MALLOC_ATOMIC(size_t <I>nbytes</i>)</b>
56 <DD>
57 Allocates <I>nbytes</i> of storage.
58 Requires (amortized) time proportional to <I>nbytes</i>.
59 The resulting object will be automatically deallocated when unreferenced.
60 The client promises that the resulting object will never contain any pointers.
61 The memory is not cleared.
62 This is the preferred way to allocate strings, floating point arrays,
63 bitmaps, etc.
64 More precise information about pointer locations can be communicated to the
65 collector using the interface in
66 <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc_typedh.txt">gc_typed.h</a> in the distribution.
67 <DT> <B>void * GC_MALLOC_UNCOLLECTABLE(size_t <I>nbytes</i>)</b>
68 <DD>
69 Identical to <TT>GC_MALLOC</tt>,
70 except that the resulting object is not automatically
71 deallocated.  Unlike the system-provided malloc, the collector does
72 scan the object for pointers to garbage-collectable memory, even if the
73 block itself does not appear to be reachable.  (Objects allocated in this way
74 are effectively treated as roots by the collector.)
75 <DT> <B> void * GC_REALLOC(void *<I>old</i>, size_t <I>new_size</i>) </b>
76 <DD>
77 Allocate a new object of the indicated size and copy (a prefix of) the
78 old object into the new object.  The old object is reused in place if
79 convenient.  If the original object was allocated with
80 <TT>GC_MALLOC_ATOMIC</tt>,
81 the new object is subject to the same constraints.  If it was allocated
82 as an uncollectable object, then the new object is uncollectable, and
83 the old object (if different) is deallocated.
84 <DT> <B> void GC_FREE(void *<I>dead</i>) </b>
85 <DD>
86 Explicitly deallocate an object.  Typically not useful for small
87 collectable objects.
88 <DT> <B> void * GC_MALLOC_IGNORE_OFF_PAGE(size_t <I>nbytes</i>) </b>
89 <DD>
90 <DT> <B> void * GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE(size_t <I>nbytes</i>) </b>
91 <DD>
92 Analogous to <TT>GC_MALLOC</tt> and <TT>GC_MALLOC_ATOMIC</tt>,
93 except that the client
94 guarantees that as long
95 as the resulting object is of use, a pointer is maintained to someplace
96 inside the first 512 bytes of the object.  This pointer should be declared
97 volatile to avoid interference from compiler optimizations.
98 (Other nonvolatile pointers to the object may exist as well.)
99 This is the
100 preferred way to allocate objects that are likely to be &gt; 100KBytes in size.
101 It greatly reduces the risk that such objects will be accidentally retained
102 when they are no longer needed.  Thus space usage may be significantly reduced.
103 <DT> <B> void GC_INIT(void) </b>
104 <DD>
105 On some platforms, it is necessary to invoke this
106 <I>from the main executable, not from a dynamic library,</i> before
107 the initial invocation of a GC routine.  It is recommended that this be done
108 in portable code, though we try to ensure that it expands to a no-op
109 on as many platforms as possible.
110 <DT> <B> void GC_gcollect(void) </b>
111 <DD>
112 Explicitly force a garbage collection.
113 <DT> <B> void GC_enable_incremental(void) </b>
114 <DD>
115 Cause the garbage collector to perform a small amount of work
116 every few invocations of <TT>GC_MALLOC</tt> or the like, instead of performing
117 an entire collection at once.  This is likely to increase total
118 running time.  It will improve response on a platform that either has
119 suitable support in the garbage collector (Linux and most Unix
120 versions, win32 if the collector was suitably built) or if "stubborn"
121 allocation is used (see
122 <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gch.txt">gc.h</a>).
123 On many platforms this interacts poorly with system calls 
124 that write to the garbage collected heap.
125 <DT> <B> GC_warn_proc GC_set_warn_proc(GC_warn_proc <I>p</i>) </b>
126 <DD>
127 Replace the default procedure used by the collector to print warnings.
128 The collector
129 may otherwise write to sterr, most commonly because GC_malloc was used
130 in a situation in which GC_malloc_ignore_off_page would have been more
131 appropriate.  See <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gch.txt">gc.h</a> for details.
132 <DT> <B> void GC_REGISTER_FINALIZER(...) </b>
133 <DD>
134 Register a function to be called when an object becomes inaccessible.
135 This is often useful as a backup method for releasing system resources
136 (<I>e.g.</i> closing files) when the object referencing them becomes
137 inaccessible.
138 It is not an acceptable method to perform actions that must be performed
139 in a timely fashion.
140 See <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gch.txt">gc.h</a> for details of the interface.
141 See <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/finalization.html">here</a> for a more detailed discussion
142 of the design.
143 <P>
144 Note that an object may become inaccessible before client code is done
145 operating on objects referenced by its fields.
146 Suitable synchronization is usually required.
147 See <A HREF="http://portal.acm.org/citation.cfm?doid=604131.604153">here</a>
148 or <A HREF="http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html">here</a>
149 for details.
150 </dl>
151 <P>
152 If you are concerned with multiprocessor performance and scalability,
153 you should consider enabling and using thread local allocation (<I>e.g.</i>
154 <TT>GC_LOCAL_MALLOC</tt>, see <TT>gc_local_alloc.h</tt>.  If your platform
155 supports it, you should build the collector with parallel marking support
156 (<TT>-DPARALLEL_MARK</tt>, or <TT>--enable-parallel-mark</tt>).
157 <P>
158 If the collector is used in an environment in which pointer location
159 information for heap objects is easily available, this can be passed on
160 to the collector using the interfaces in either <TT>gc_typed.h</tt>
161 or <TT>gc_gcj.h</tt>.
162 <P>
163 The collector distribution also includes a <B>string package</b> that takes
164 advantage of the collector.  For details see
165 <A HREF="http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/cordh.txt">cord.h</a>
166
167 <H1>C++ Interface</h1>
168 Usage of the collector from C++ is complicated by the fact that there
169 are many "standard" ways to allocate memory in C++.  The default ::new
170 operator, default malloc, and default STL allocators allocate memory
171 that is not garbage collected, and is not normally "traced" by the
172 collector.  This means that any pointers in memory allocated by these
173 default allocators will not be seen by the collector.  Garbage-collectable
174 memory referenced only by pointers stored in such default-allocated
175 objects is likely to be reclaimed prematurely by the collector.
176 <P>
177 It is the programmers responsibility to ensure that garbage-collectable
178 memory is referenced by pointers stored in one of
179 <UL>
180 <LI> Program variables
181 <LI> Garbage-collected objects
182 <LI> Uncollected but "traceable" objects
183 </ul>
184 "Traceable" objects are not necessarily reclaimed by the collector,
185 but are scanned for pointers to collectable objects.
186 They are allocated by <TT>GC_MALLOC_UNCOLLECTABLE</tt>, as described
187 above, and through some interfaces described below.
188 <P>
189 (On most platforms, the collector may not trace correctly from in-flight
190 exception objects.  Thus objects thrown as exceptions should only
191 point to otherwise reachable memory.  This is another bug whose
192 proper repair requires platform hooks.)
193 <P>
194 The easiest way to ensure that collectable objects are properly referenced
195 is to allocate only collectable objects.  This requires that every
196 allocation go through one of the following interfaces, each one of
197 which replaces a standard C++ allocation mechanism:
198 <DL>
199 <DT> <B> STL allocators </b>
200 <DD>
201 Users of the <A HREF="http://www.sgi.com/tech/stl">SGI extended STL</a>
202 can include <TT>new_gc_alloc.h</tt> before including
203 STL header files.
204 (<TT>gc_alloc.h</tt> corresponds to now obsolete versions of the
205 SGI STL.)
206 This defines SGI-style allocators
207 <UL>
208 <LI> alloc
209 <LI> single_client_alloc
210 <LI> gc_alloc
211 <LI> single_client_gc_alloc
212 </ul>
213 which may be used either directly to allocate memory or to instantiate
214 container templates.  The first two allocate uncollectable but traced
215 memory, while the second two allocate collectable memory.
216 The single_client versions are not safe for concurrent access by
217 multiple threads, but are faster.
218 <P>
219 For an example, click <A HREF="http://hpl.hp.com/personal/Hans_Boehm/gc/gc_alloc_exC.txt">here</a>.
220 <P>
221 Recent versions of the collector also include a more standard-conforming
222 allocator implementation in <TT>gc_allocator.h</tt>.  It defines
223 <UL>
224 <LI> traceable_allocator
225 <LI> gc_allocator
226 </ul>
227 Again the former allocates uncollectable but traced memory.
228 This should work with any fully standard-conforming C++ compiler.
229 <DT> <B> Class inheritance based interface </b>
230 <DD>
231 Users may include gc_cpp.h and then cause members of classes to
232 be allocated in garbage collectable memory by having those classes
233 inherit from class gc.
234 For details see <A HREF="http://hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc_cpph.txt">gc_cpp.h</a>.
235 <P>
236 Linking against libgccpp in addition to the gc library overrides
237 ::new (and friends) to allocate traceable memory but uncollectable
238 memory, making it safe to refer to collectable objects from the resulting
239 memory.
240 <DT> <B> C interface </b>
241 <DD>
242 It is also possible to use the C interface from 
243 <A HREF="http://hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gch.txt">gc.h</a> directly.
244 On platforms which use malloc to implement ::new, it should usually be possible
245 to use a version of the collector that has been compiled as a malloc
246 replacement.  It is also possible to replace ::new and other allocation
247 functions suitably, as is done by libgccpp.
248 <P>
249 Note that user-implemented small-block allocation often works poorly with
250 an underlying garbage-collected large block allocator, since the collector
251 has to view all objects accessible from the user's free list as reachable.
252 This is likely to cause problems if <TT>GC_MALLOC</tt>
253 is used with something like
254 the original HP version of STL.
255 This approach works well with the SGI versions of the STL only if the
256 <TT>malloc_alloc</tt> allocator is used.
257 </dl>
258 </body>
259 </html>