63 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
The collector supports both incremental collection and threads under
 | 
						|
Solaris 2.  The incremental collector normally retrieves page dirty information
 | 
						|
through the appropriate /proc calls.  But it can also be configured
 | 
						|
(by defining MPROTECT_VDB instead of PROC_VDB in gcconfig.h) to use mprotect
 | 
						|
and signals.  This may result in shorter pause times, but it is no longer
 | 
						|
safe to issue arbitrary system calls that write to the heap.
 | 
						|
 | 
						|
Under other UNIX versions,
 | 
						|
the collector normally obtains memory through sbrk.  There is some reason
 | 
						|
to expect that this is not safe if the client program also calls the system
 | 
						|
malloc, or especially realloc.  The sbrk man page strongly suggests this is
 | 
						|
not safe: "Many library routines use malloc() internally, so use brk()
 | 
						|
and sbrk() only when you know  that malloc() definitely will not be used by
 | 
						|
any library routine."  This doesn't make a lot of sense to me, since there
 | 
						|
seems to be no documentation as to which routines can transitively call malloc.
 | 
						|
Nonetheless, under Solaris2, the collector now (since 4.12) allocates
 | 
						|
memory using mmap by default.  (It defines USE_MMAP in gcconfig.h.)
 | 
						|
You may want to reverse this decisions if you use -DREDIRECT_MALLOC=...
 | 
						|
 | 
						|
 | 
						|
SOLARIS THREADS:
 | 
						|
 | 
						|
The collector must be compiled with -DGC_SOLARIS_THREADS (thr_ functions)
 | 
						|
or -DGC_SOLARIS_PTHREADS (pthread_ functions) to be thread safe.
 | 
						|
It is also essential that gc.h be included in files that call thr_create,
 | 
						|
thr_join, thr_suspend, thr_continue, or dlopen.  Gc.h macro defines
 | 
						|
these to also do GC bookkeeping, etc.  Gc.h must be included with
 | 
						|
one or both of these macros defined, otherwise
 | 
						|
these replacements are not visible.
 | 
						|
A collector built in this way way only be used by programs that are
 | 
						|
linked with the threads library.
 | 
						|
 | 
						|
In this mode, the collector contains various workarounds for older Solaris
 | 
						|
bugs.  Mostly, these should not be noticeable unless you look at system
 | 
						|
call traces.  However, it cannot protect a guard page at the end of
 | 
						|
a thread stack.  If you know that you will only be running Solaris2.5
 | 
						|
or later, it should be possible to fix this by compiling the collector
 | 
						|
with -DSOLARIS23_MPROTECT_BUG_FIXED.
 | 
						|
 | 
						|
Since 5.0 alpha5, dlopen disables collection temporarily,
 | 
						|
unless USE_PROC_FOR_LIBRARIES is defined.  In some unlikely cases, this
 | 
						|
can result in unpleasant heap growth.  But it seems better than the
 | 
						|
race/deadlock issues we had before.
 | 
						|
 | 
						|
If solaris_threads are used on an X86 processor with malloc redirected to
 | 
						|
GC_malloc, it is necessary to call GC_thr_init explicitly before forking the
 | 
						|
first thread.  (This avoids a deadlock arising from calling GC_thr_init
 | 
						|
with the allocation lock held.)
 | 
						|
 | 
						|
It appears that there is a problem in using gc_cpp.h in conjunction with
 | 
						|
Solaris threads and Sun's C++ runtime.  Apparently the overloaded new operator
 | 
						|
is invoked by some iostream initialization code before threads are correctly
 | 
						|
initialized.  As a result, call to thr_self() in garbage collector
 | 
						|
initialization  segfaults.  Currently the only known workaround is to not
 | 
						|
invoke the garbage collector from a user defined global operator new, or to
 | 
						|
have it invoke the garbage-collector's allocators only after main has started.
 | 
						|
(Note that the latter requires a moderately expensive test in operator
 | 
						|
delete.)
 | 
						|
 | 
						|
Hans-J. Boehm
 | 
						|
(The above contains my personal opinions, which are probably not shared
 | 
						|
by anyone else.)
 |