| version 1.1, 1999/12/03 07:39:09 | 
version 1.3, 2000/12/01 09:26:10 | 
 | 
 | 
|  Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers | 
 Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers | 
|  Copyright (c) 1991-1996 by Xerox Corporation.  All rights reserved. | 
 Copyright (c) 1991-1996 by Xerox Corporation.  All rights reserved. | 
|  Copyright (c) 1996-1998 by Silicon Graphics.  All rights reserved. | 
 Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved. | 
|   | 
 Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. | 
|   | 
  | 
|  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED | 
 THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED | 
|  OR IMPLIED.  ANY USE IS AT YOUR OWN RISK. | 
 OR IMPLIED.  ANY USE IS AT YOUR OWN RISK. | 
| Line 11  Permission to modify the code and to distribute modifi | 
 
  | 
| Line 12  Permission to modify the code and to distribute modifi | 
 
 
 | 
|  provided the above notices are retained, and a notice that the code was | 
 provided the above notices are retained, and a notice that the code was | 
|  modified is included with the above copyright notice. | 
 modified is included with the above copyright notice. | 
|   | 
  | 
|  This is version 5.0alpha2 of a conservative garbage collector for C and C++. | 
 This is version 5.3 of a conservative garbage collector for C and C++. | 
|   | 
  | 
|  You might find a more recent version of this at | 
 You might find a more recent version of this at | 
|   | 
  | 
|  http://reality.sgi.com/boehm/gc.html | 
 http://www.hpl.hp.com/personal/Hans_Boehm/gc | 
|   | 
  | 
|  HISTORY - | 
 HISTORY - | 
|   | 
  | 
|    Early versions of this collector were developed as a part of research | 
   Early versions of this collector were developed as a part of research | 
|  projects supported in part by the National Science Foundation | 
 projects supported in part by the National Science Foundation | 
|  and the Defense Advance Research Projects Agency. | 
 and the Defense Advance Research Projects Agency. | 
|  Much of the code was rewritten by Hans-J. Boehm at Xerox PARC | 
 Much of the code was rewritten by Hans-J. Boehm (boehm@acm.org) at Xerox PARC, | 
|  and is now maintained by him at SGI (boehm@sgi.com or boehm@acm.org). | 
 SGI, and HP Labs. | 
|   | 
  | 
|  Some other contributors: | 
 Some other contributors: | 
|   | 
  | 
| Line 475  intended to run with malloc/free (e.g. code with extre | 
 
  | 
| Line 476  intended to run with malloc/free (e.g. code with extre | 
 
 
 | 
|  portability constraints).  To do so define FIND_LEAK in Makefile | 
 portability constraints).  To do so define FIND_LEAK in Makefile | 
|  This will cause the collector to invoke the report_leak | 
 This will cause the collector to invoke the report_leak | 
|  routine defined near the top of reclaim.c whenever an inaccessible | 
 routine defined near the top of reclaim.c whenever an inaccessible | 
|  object is found that has not been explicitly freed.  The collector will | 
 object is found that has not been explicitly freed.  Such objects will | 
|  no longer reclaim inaccessible memory; in this form it is purely a | 
 also be automatically reclaimed. | 
|  debugging tool. | 
  | 
|    Productive use of this facility normally involves redefining report_leak | 
   Productive use of this facility normally involves redefining report_leak | 
|  to do something more intelligent.  This typically requires annotating | 
 to do something more intelligent.  This typically requires annotating | 
|  objects with additional information (e.g. creation time stack trace) that | 
 objects with additional information (e.g. creation time stack trace) that | 
 | 
 | 
|   | 
  | 
|  Since 5.0alpha1 | 
 Since 5.0alpha1 | 
|   - Fixed bugs introduced in alpha1 (OpenBSD & large block initialization). | 
  - Fixed bugs introduced in alpha1 (OpenBSD & large block initialization). | 
|   | 
  | 
|   - Added -DKEEP_BACK_PTRS and backptr.h interface.  (The implementation | 
  - Added -DKEEP_BACK_PTRS and backptr.h interface.  (The implementation | 
|     idea came from Al Demers.) | 
    idea came from Al Demers.) | 
|   | 
  | 
|   | 
 Since 5.0alpha2 | 
|   | 
  - Added some highly incomplete code to support a copied young generation. | 
|   | 
    Comments on nursery.h are appreciated. | 
|   | 
  - Changed -DFIND_LEAK, -DJAVA_FINALIZATION, and -DFINALIZE_ON_DEMAND, | 
|   | 
    so the same effect could be obtained with a runtime switch.   This is | 
|   | 
    a step towards standardizing on a single dynamic GC library. | 
|   | 
  - Significantly changed the way leak detection is handled, as a consequence | 
|   | 
    of the above. | 
|   | 
  | 
|   | 
 Since 5.0 alpha3 | 
|   | 
  - Added protection fault handling patch for Linux/M68K from Fergus | 
|   | 
    Henderson and Roman Hodek. | 
|   | 
  - Removed the tests for SGI_SOURCE in new_gc_alloc.h.  This was causing that | 
|   | 
    interface to fail on nonSGI platforms. | 
|   | 
  - Changed the Linux stack finding code to use /proc, after changing it | 
|   | 
    to use HEURISTIC1.  (Thanks to David Mossberger for pointing out the | 
|   | 
    /proc hook.) | 
|   | 
  - Added HP/UX incremental GC support and HP/UX 11 thread support. | 
|   | 
    Thread support is currently still flakey. | 
|   | 
  - Added basic Linux/IA64 support. | 
|   | 
  - Integrated Anthony Green's PicoJava support. | 
|   | 
  - Integrated Scott Ananian's StrongARM/NetBSD support. | 
|   | 
  - Fixed some fairly serious performance bugs in the incremental | 
|   | 
    collector.  These have probably been there essentially forever. | 
|   | 
    (Mark bits were sometimes set before scanning dirty pages. | 
|   | 
    The reclaim phase unnecessarily dirtied full small object pages.) | 
|   | 
  - Changed the reclaim phase to ignore nearly full pages to avoid | 
|   | 
    touching them. | 
|   | 
  - Limited GC_black_list_spacing to roughly the heap growth increment. | 
|   | 
  - Changed full collection triggering heuristic to decrease full GC | 
|   | 
    frequency by default, but to explicitly trigger full GCs during | 
|   | 
    heap growth.  This doesn't always improve things, but on average it's | 
|   | 
    probably a win. | 
|   | 
  - GC_debug_free(0, ...) failed.  Thanks to Fergus Henderson for the | 
|   | 
    bug report and fix. | 
|   | 
  | 
|   | 
 Since 5.0 alpha4 | 
|   | 
  - GC_malloc_explicitly_typed and friends sometimes failed to | 
|   | 
    initialize first word. | 
|   | 
  - Added allocation routines and support in the marker for mark descriptors | 
|   | 
    in a type structure referenced by the first word of an object.  This was | 
|   | 
    introduced to support gcj, but hopefully in a way that makes it | 
|   | 
    generically useful. | 
|   | 
  - Added GC_requested_heapsize, and inhibited collections in nonincremental | 
|   | 
    mode if the actual used heap size is less than what was explicitly | 
|   | 
    requested. | 
|   | 
  - The Solaris pthreads version of GC_pthread_create didn't handle a NULL | 
|   | 
    attribute pointer.  Solaris thread support used the wrong default thread | 
|   | 
    stack size.  (Thanks to Melissa O'Neill for the patch.) | 
|   | 
  - Changed PUSH_CONTENTS macro to no longer modify first parameter. | 
|   | 
    This usually doesn't matter, but it was certainly an accident waiting | 
|   | 
    to happen ... | 
|   | 
  - Added GC_register_finalizer_no_order and friends to gc.h.  They're | 
|   | 
    needed by Java implementations. | 
|   | 
  - Integrated a fix for a win32 deadlock resulting from clock() calling | 
|   | 
    malloc.  (Thanks to Chris Dodd.) | 
|   | 
  - Integrated Hiroshi Kawashima's port to Linux/MIPS.  This was designed | 
|   | 
    for a handheld platform, and may or may not be sufficient for other | 
|   | 
    machines. | 
|   | 
  - Fixed a va_arg problem with the %c specifier in cordprnt.c.  It appears | 
|   | 
    that this was always broken, but recent versions of gcc are the first to | 
|   | 
    report the (statically detectable) bug. | 
|   | 
  - Added an attempt at a more general solution to dlopen races/deadlocks. | 
|   | 
    GC_dlopen now temporarily disables collection.  Still not ideal, but ... | 
|   | 
  - Added -DUSE_I686_PREFETCH, -DUSE_3DNOW_PREFETCH, and support for IA64 | 
|   | 
    prefetch instructions.  May improve performance measurably, but I'm not | 
|   | 
    sure the code will run correctly on processors that don't support the | 
|   | 
    instruction.  Won't build except with very recent gcc. | 
|   | 
  - Added caching for header lookups in the marker.  This seems to result | 
|   | 
    in a barely measurable performance gain.  Added support for interleaved | 
|   | 
    lookups of two pointers, but unconfigured that since the performance | 
|   | 
    gain is currently near zero, and it adds to code size. | 
|   | 
  - Changed Linux DATA_START definition to check both data_start and | 
|   | 
    __data_start, since nothing else seems to be portable. | 
|   | 
  - Added -DUSE_LD_WRAP to optionally take advantage of the GNU ld function | 
|   | 
    wrapping mechanism.  Probably currently useful only on Linux. | 
|   | 
  - Moved some variables for the scratch allocator into GC_arrays, on | 
|   | 
    Martin Hirzel's suggestion. | 
|   | 
  - Fixed a win32 threads bug that caused the collector to not look for | 
|   | 
    interior pointers from one of the thread stacks without | 
|   | 
    ALL_INTERIOR_POINTERS.  (Thanks to Jeff Sturm.) | 
|   | 
  - Added Mingw32 support.  (Thanks again to Jeff Sturm for the patch.) | 
|   | 
  - Changed the alpha port to use the generic register scanning code instead | 
|   | 
    of alpha_mach_dep.s.  Alpha_mach_dep.s doesn't look for pointers in fp | 
|   | 
    registers, but gcc sometimes spills pointers there.  (Thanks to Manuel | 
|   | 
    Serrano for helping me debug this by email.)  Changed the IA64 code to | 
|   | 
    do something similar for similar reasons. | 
|   | 
  | 
|   | 
 Since 5.0alpha6: | 
|   | 
  - -DREDIRECT_MALLOC was broken in alpha6. Fixed. | 
|   | 
  - Cleaned up gc_ccp.h slightly, thus also causing the HP C++ compiler to | 
|   | 
    accept it. | 
|   | 
  - Removed accidental reference to dbg_mlc.c, which caused dbg_mlc.o to be | 
|   | 
    linked into every executable. | 
|   | 
  - Added PREFETCH to bitmap marker.  Changed it to use the header cache. | 
|   | 
  - GC_push_marked sometimes pushed one object too many, resulting in a | 
|   | 
    segmentation fault in GC_mark_from_mark_stack.  This was probably an old | 
|   | 
    bug.  It finally showed up in gctest on win32. | 
|   | 
  - Gc_priv.h erroneously #defined GC_incremental to be TRUE instead of FALSE | 
|   | 
    when SMALL_CONFIG was defined.  This was no doubt a major performance bug for | 
|   | 
    the default win32 configuration. | 
|   | 
  - Removed -DSMALL_CONFIG from NT_MAKEFILE.  It seemed like an anchronism now | 
|   | 
    that the average PC has 64MB or so. | 
|   | 
  - Integrated Bryce McKinley's patches for linux threads and dynamic loading | 
|   | 
    from the libgcj tree.  Turned on dynamic loading support for Linux/PPC. | 
|   | 
  - Changed the stack finding code to use environ on HP/UX.  (Thanks | 
|   | 
    to Gustavo Rodriguez-Rivera for the suggestion.)  This should probably | 
|   | 
    be done on other platforms, too.  Since I can't test those, that'll | 
|   | 
    wait until after 5.0. | 
|   | 
  | 
|   | 
 Since 5.0alpha7: | 
|   | 
  - Fixed threadlibs.c for linux threads.  -DUSE_LD_WRAP was broken and | 
|   | 
    -ldl was omitted.  Fixed Linux stack finding code to handle | 
|   | 
    -DUSE_LD_WRAP correctly. | 
|   | 
  - Added MSWIN32 exception handler around marker, so that the collector | 
|   | 
    can recover from root segments that are unmapped during the collection. | 
|   | 
    This caused occasional failures under Windows 98, and may also be | 
|   | 
    an issue under Windows NT/2000. | 
|   | 
  | 
|   | 
 Since 5.0 | 
|   | 
  - Fixed a gc.h header bug which showed up under Irix.  (Thanks to | 
|   | 
    Dan Sullivan.) | 
|   | 
  - Fixed a typo in GC_double_descr in typd_mlc.c not getting traced correctly. | 
|   | 
    This probably could result in objects described by array descriptors not | 
|   | 
    getting traced correctly.  (Thanks to Ben Hutchings for pointing this out.) | 
|   | 
  - The block nearly full tests in reclaim.c were not correct for 64 bit | 
|   | 
    environments.  This could result in unnecessary heap growth under unlikely | 
|   | 
    conditions. | 
|   | 
  - Removed use of CLEAR_DOUBLE from generic reclaim code, since odd sizes | 
|   | 
    could occur. | 
|   | 
  | 
|   | 
 Since 5.1 | 
|   | 
  - dyn_load.c declared GC_scratch_last_end_ptr as an extern even if it | 
|   | 
    was defined as a macro.  This prevented the collector from building on | 
|   | 
    Irix. | 
|   | 
  - We quietly assumed that indirect mark descriptors were never 0. | 
|   | 
    Our own typed allocation interface violated that.  This could result | 
|   | 
    in segmentation faults in the marker with typed allocation. | 
|   | 
  - Fixed a _DUSE_MUNMAP bug in the heap block allocation code. | 
|   | 
    (Thanks to Ben Hutchings for the patch.) | 
|   | 
  - Taught the collector about VC++ handling array operator new. | 
|   | 
    (Thanks again to Ben Hutchings for the patch.) | 
|   | 
  - The two copies of gc_hdrs.h had diverged.  Made one a link to the other | 
|   | 
    again. | 
|   | 
  | 
|   | 
 Since 5.2 | 
|   | 
  - Fixed _end declaration for OSF1. | 
|   | 
  - There were lots of spurious leak reports in leak detection mode, caused | 
|   | 
    by the fact that some pages were not being swept, and hence unmarked | 
|   | 
    objects weren't making it onto free lists.  (This bug dated back to 5.0.) | 
|   | 
  - Fixed a typo in the liblinuxgc.so Makefile rule. | 
|   | 
  - Added the GetExitCodeThread to Win32 GC_stop_world to (mostly) work | 
|   | 
    around a Windows 95 GetOpenFileName problem.  (Thanks to Jacob Navia.) | 
|   | 
  | 
|  To do: | 
 To do: | 
|   | 
  - Integrate Linux/SPARC fixes. | 
|   - Very large root set sizes (> 16 MB or so) could cause the collector | 
  - Very large root set sizes (> 16 MB or so) could cause the collector | 
|     to abort with an unexpected mark stack overflow.  (Thanks again to | 
    to abort with an unexpected mark stack overflow.  (Thanks again to | 
|     Peter Chubb.)  NOT YET FIXED.  Workaround is to increase the initial | 
    Peter Chubb.)  NOT YET FIXED.  Workaround is to increase the initial | 
 | 
 | 
|     be possible to conditionally intercept mmap and use GC_exclude_static_roots. | 
    be possible to conditionally intercept mmap and use GC_exclude_static_roots. | 
|     The real fix is to walk rld data structures, which looks possible. | 
    The real fix is to walk rld data structures, which looks possible. | 
|   - Integrate MIT and DEC pthreads ports. | 
  - Integrate MIT and DEC pthreads ports. | 
|   - Deal with very uneven black-listing distributions.  If all the black listed | 
  - Incremental collector should handle large objects better.  Currently, | 
|     blocks reside in the newly allocated heap section, the heuristic for | 
    it looks like the whole object is treated as dirty if any part of it | 
|     temporarily ignoring black-listing fails, and the heap grows too much. | 
    is. | 
|     (This was observed in only one case, and could be worked around, but ...) | 
  - Cord/cordprnt.c doesn't build on a few platforms (notably PowerPC), since | 
|   - Some platform specific updates are waiting for 4.15alpha1. | 
    we make some unwarranted assumptions about how varargs are handled.  This | 
|   | 
    currently makes the cord-aware versions of printf unusable on some platforms. | 
|   | 
    Fixing this is unfortunately not trivial. |