~ubuntu-branches/ubuntu/hardy/libgc/hardy-updates

« back to all changes in this revision

Viewing changes to doc/README.darwin

  • Committer: Bazaar Package Importer
  • Author(s): Ryan Murray
  • Date: 2005-02-03 00:50:53 UTC
  • mto: (3.1.1 etch) (1.2.4 upstream)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20050203005053-9c0v9r2qcm2g1cfp
Tags: upstream-6.4
ImportĀ upstreamĀ versionĀ 6.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Darwin/MacOSX Support - December 16, 2003
 
2
=========================================
 
3
 
 
4
Important Usage Notes
 
5
=====================
 
6
 
 
7
GC_init() MUST be called before calling any other GC functions. This 
 
8
is necessary to properly register segments in dynamic libraries. This
 
9
call is required even if you code does not use dynamic libraries as the
 
10
dyld code handles registering all data segments.
 
11
 
 
12
When your use of the garbage collector is confined to dylibs and you
 
13
cannot call GC_init() before your libraries' static initializers have
 
14
run and perhaps called GC_malloc(), create an initialization routine
 
15
for each library to call GC_init():
 
16
 
 
17
#include <gc/gc.h>
 
18
extern "C" void my_library_init() { GC_init(); }
 
19
 
 
20
Compile this code into a my_library_init.o, and link it into your
 
21
dylib. When you link the dylib, pass the -init argument with
 
22
_my_library_init (e.g. gcc -dynamiclib -o my_library.dylib a.o b.o c.o
 
23
my_library_init.o -init _my_library_init). This causes
 
24
my_library_init() to be called before any static initializers, and
 
25
will initialize the garbage collector properly. 
 
26
 
 
27
Note: It doesn't hurt to call GC_init() more than once, so it's best,
 
28
if you have an application or set of libraries that all use the
 
29
garbage collector, to create an initialization routine for each of
 
30
them that calls GC_init(). Better safe than sorry. 
 
31
 
 
32
The incremental collector is still a bit flaky on darwin. It seems to 
 
33
work reliably with workarounds for a few possible bugs in place however
 
34
these workaround may not work correctly in all cases. There may also
 
35
be additional problems that I have not found. 
 
36
 
 
37
Thread-local GC allocation will not work with threads that are not
 
38
created using the GC-provided override of pthread_create(). Threads
 
39
created without the GC-provided pthread_create() do not have the
 
40
necessary data structures in the GC to store this data. 
 
41
 
 
42
 
 
43
Implementation Information
 
44
==========================
 
45
Darwin/MacOSX support is nearly complete. Thread support is reliable on 
 
46
Darwin 6.x (MacOSX 10.2) and there have been reports of success on older
 
47
Darwin versions (MacOSX 10.1). Shared library support had also been
 
48
added and the gc can be run from a shared library. There is currently only
 
49
support for Darwin/PPC although adding x86 support should be trivial.
 
50
 
 
51
Thread support is implemented in terms of mach thread_suspend and
 
52
thread_resume calls. These provide a very clean interface to thread
 
53
suspension. This implementation doesn't rely on pthread_kill so the
 
54
code works on Darwin < 6.0 (MacOSX 10.1). All the code to stop and
 
55
start the world is located in darwin_stop_world.c.
 
56
 
 
57
Since not all uses of the GC enable clients to override pthread_create()
 
58
before threads have been created, the code for stopping the world has
 
59
been rewritten to look for threads using Mach kernel calls. Each
 
60
thread identified in this way is suspended and resumed as above. In
 
61
addition, since Mach kernel threads do not contain pointers to their
 
62
stacks, a stack-walking function has been written to find the stack
 
63
limits. Given an initial stack pointer (for the current thread, a
 
64
pointer to a stack-allocated local variable will do; for a non-active
 
65
thread, we grab the value of register 1 (on PowerPC)), it
 
66
will walk the PPC Mach-O-ABI compliant stack chain until it reaches the
 
67
top of the stack. This appears to work correctly for GCC-compiled C,
 
68
C++, Objective-C, and Objective-C++ code, as well as for Java
 
69
programs that use JNI. If you run code that does not follow the stack
 
70
layout or stack pointer conventions laid out in the PPC Mach-O ABI,
 
71
then this will likely crash the garbage collector. 
 
72
 
 
73
The original incremental collector support unfortunatelly no longer works
 
74
on recent Darwin versions. It also relied on some undocumented kernel
 
75
structures. Mach, however, does have a very clean interface to exception
 
76
handing. The current implementation uses Mach's exception handling. 
 
77
 
 
78
Much thanks goes to Andrew Stone, Dietmar Planitzer, Andrew Begel, 
 
79
Jeff Sturm, and Jesse Rosenstock for all their work on the 
 
80
Darwin/OS X port.
 
81
 
 
82
-Brian Alliet
 
83
brian@brianweb.net
 
84
 
 
85
 
 
86
Older Information (Most of this no longer applies to the current code)
 
87
======================================================================
 
88
 
 
89
While the GC should work on MacOS X Server, MacOS X and Darwin, I only tested
 
90
it on MacOS X Server.
 
91
I've added a PPC assembly version of GC_push_regs(), thus the setjmp() hack is
 
92
no longer necessary. Incremental collection is supported via mprotect/signal.
 
93
The current solution isn't really optimal because the signal handler must decode
 
94
the faulting PPC machine instruction in order to find the correct heap address.
 
95
Further, it must poke around in the register state which the kernel saved away
 
96
in some obscure register state structure before it calls the signal handler -
 
97
needless to say the layout of this structure is no where documented.
 
98
Threads and dynamic libraries are not yet supported (adding dynamic library
 
99
support via the low-level dyld API shouldn't be that hard).
 
100
 
 
101
The original MacOS X port was brought to you by Andrew Stone.
 
102
 
 
103
 
 
104
June, 1 2000
 
105
 
 
106
Dietmar Planitzer
 
107
dave.pl@ping.at
 
108
 
 
109
Note from Andrew Begel:
 
110
 
 
111
One more fix to enable gc.a to link successfully into a shared library for
 
112
MacOS X. You have to add -fno-common to the CFLAGS in the Makefile. MacOSX
 
113
disallows common symbols in anything that eventually finds its way into a
 
114
shared library. (I don't completely understand why, but -fno-common seems to
 
115
work and doesn't mess up the garbage collector's functionality).
 
116
 
 
117
Feb 26, 2003
 
118
 
 
119
Jeff Sturm and Jesse Rosenstock provided a patch that adds thread support.
 
120
GC_MACOSX_THREADS should be defined in the build and in clients.  Real
 
121
dynamic library support is still missing, i.e. dynamic library data segments
 
122
are still not scanned.  Code that stores pointers to the garbage collected
 
123
heap in statically allocated variables should not reside in a dynamic
 
124
library.  This still doesn't appear to be 100% reliable.  
 
125
 
 
126
Mar 10, 2003
 
127
Brian Alliet contributed dynamic library support for MacOSX.  It could also
 
128
use more testing.