PatchSet 7208 
Date: 2006/04/03 19:59:32
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
merged in boehm-gc 6.7

2006-04-03  Dalibor Topic  <[EMAIL PROTECTED]>

        * THIRDPARTY: Updated to boehm-gc 6.7

        * kaffe/kaffevm/boehm-gc/boehm/ : Updated to boehm-gc 6.7.
        All regression tests pass now with boehm-gc/jit3/pthreads
        on x86-linux.

Members: 
        ChangeLog:1.4715->1.4716 
        THIRDPARTY:1.43->1.44 
        kaffe/kaffevm/boehm-gc/boehm/Makefile.am:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/Makefile.direct:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/Makefile.in:1.11->1.12 
        kaffe/kaffevm/boehm-gc/boehm/allchblk.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/alloc.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/configure:1.13->1.14 
        kaffe/kaffevm/boehm-gc/boehm/configure.in:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/dyn_load.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/headers.c:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/malloc.c:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/mark.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/misc.c:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/os_dep.c:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c:1.5->1.6 
        kaffe/kaffevm/boehm-gc/boehm/pthread_support.c:1.5->1.6 
        kaffe/kaffevm/boehm-gc/boehm/threadlibs.c:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/version.h:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/doc/README:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/doc/README.changes:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/include/gc.h:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/include/gc_config_macros.h:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/include/gc_cpp.h:1.3->1.4 
        kaffe/kaffevm/boehm-gc/boehm/include/gc_pthread_redirects.h:1.1->1.2 
        kaffe/kaffevm/boehm-gc/boehm/include/leak_detector.h:1.1->1.2 
        kaffe/kaffevm/boehm-gc/boehm/include/private/gc_locks.h:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/include/private/gc_pmark.h:1.2->1.3 
        kaffe/kaffevm/boehm-gc/boehm/include/private/gc_priv.h:1.4->1.5 
        kaffe/kaffevm/boehm-gc/boehm/include/private/gcconfig.h:1.4->1.5 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4715 kaffe/ChangeLog:1.4716
--- kaffe/ChangeLog:1.4715      Mon Apr  3 00:50:23 2006
+++ kaffe/ChangeLog     Mon Apr  3 19:59:32 2006
@@ -1,3 +1,11 @@
+2006-04-03  Dalibor Topic  <[EMAIL PROTECTED]>
+
+       * THIRDPARTY: Updated to boehm-gc 6.7
+
+       * kaffe/kaffevm/boehm-gc/boehm/ : Updated to boehm-gc 6.7.
+       All regression tests pass now with boehm-gc/jit3/pthreads 
+       on x86-linux.
+
 2006-04-02  Dalibor Topic  <[EMAIL PROTECTED]>
 
        * libraries/javalib/vmspecific/java/lang/reflect/Array.java,
Index: kaffe/THIRDPARTY
diff -u kaffe/THIRDPARTY:1.43 kaffe/THIRDPARTY:1.44
--- kaffe/THIRDPARTY:1.43       Wed Feb  8 02:05:55 2006
+++ kaffe/THIRDPARTY    Mon Apr  3 19:59:39 2006
@@ -603,13 +603,10 @@
 
 * Boem-Weiser garbage collector.
 
-Merged in the Boehm-Weiser garbage collector from
-http://www.hpl.hp.com/personal/Hans_Boehm/gc/. 
-
 Copyright (c) 1988, 1989 Hans-J. Boehm, Alan J. Demers
 Copyright (c) 1991-1996 by Xerox Corporation.  All rights reserved.
 Copyright (c) 1996-1999 by Silicon Graphics.  All rights reserved.
-Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved.
+Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P.
 
 The file linux_threads.c is also
 Copyright (c) 1998 by Fergus Henderson.  All rights reserved.
@@ -636,8 +633,7 @@
 collector.  (If you are concerned about such things, I recommend you look
 at the notice in config.guess or ltmain.sh.)
 
-This is version 6.3alpha1 of a conservative garbage collector for C and C++.
-
+This is version 6.7 of a conservative garbage collector for C and C++.
 
 * gnu.getopt
 
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.am
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.am:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.am:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.am:1.4  Fri Dec 23 11:42:00 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.am      Mon Apr  3 19:59:42 2006
@@ -95,7 +95,7 @@
 test_cpp_SOURCES = tests/test_cpp.cc
 test_cpp_LDADD = ./libgc.la ./libgccpp.la $(THREADDLLIBS) $(UNWINDLIBS) 
$(EXTRA_TEST_LIBS)
 
-TESTS = gctest $(extra_checks)
+TESTS = $(check_PROGRAMS)
 
 ## FIXME: relies on internal code generated by automake.
 all_objs = @addobjs@ $(libgc_la_OBJECTS)
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.direct
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.direct:1.3 
kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.direct:1.4
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.direct:1.3      Fri Dec 23 
11:42:00 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.direct  Mon Apr  3 19:59:43 2006
@@ -144,9 +144,9 @@
 # -DJAVA_FINALIZATION makes it somewhat safer to finalize objects out of
 #   order by specifying a nonstandard finalization mark procedure  (see
 #   finalize.c).  Objects reachable from finalizable objects will be marked
-#   in a sepearte postpass, and hence their memory won't be reclaimed.
+#   in a separate postpass, and hence their memory won't be reclaimed.
 #   Not recommended unless you are implementing a language that specifies
-#   these semantics.  Since 5.0, determines only only the initial value
+#   these semantics.  Since 5.0, determines only the initial value
 #   of GC_java_finalization variable.
 # -DFINALIZE_ON_DEMAND causes finalizers to be run only in response
 #   to explicit GC_invoke_finalizers() calls.
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.in
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.in:1.11 
kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.in:1.12
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.in:1.11 Fri Dec 23 18:00:45 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/Makefile.in      Mon Apr  3 19:59:43 2006
@@ -357,7 +357,7 @@
 gctest_LDADD = ./libgc.la $(THREADDLLIBS) $(UNWINDLIBS) $(EXTRA_TEST_LIBS)
 test_cpp_SOURCES = tests/test_cpp.cc
 test_cpp_LDADD = ./libgc.la ./libgccpp.la $(THREADDLLIBS) $(UNWINDLIBS) 
$(EXTRA_TEST_LIBS)
-TESTS = gctest $(extra_checks)
+TESTS = $(check_PROGRAMS)
 all_objs = @addobjs@ $(libgc_la_OBJECTS)
 @[EMAIL PROTECTED] = -Wp,-P -x assembler-with-cpp
 @[EMAIL PROTECTED] = 
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/allchblk.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/allchblk.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/allchblk.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/allchblk.c:1.4   Fri Dec 23 11:42:00 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/allchblk.c       Mon Apr  3 19:59:43 2006
@@ -529,7 +529,7 @@
                                /* free blocks in GC_add_to_fl.         */
 #     endif
 #   ifdef USE_MUNMAP
-      hhdr -> hb_last_reclaimed = GC_gc_no;
+      hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
 #   endif
     hhdr -> hb_sz = h_size;
     GC_add_to_fl(h, hhdr);
@@ -793,7 +793,7 @@
     GC_remove_counts(hbp, (word)size);
     hhdr->hb_sz = size;
 #   ifdef USE_MUNMAP
-      hhdr -> hb_last_reclaimed = GC_gc_no;
+      hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
 #   endif
     
     /* Check for duplicate deallocation in the easy case */
@@ -821,7 +821,7 @@
          GC_remove_from_fl(prevhdr, FL_UNKNOWN);
          prevhdr -> hb_sz += hhdr -> hb_sz;
 #        ifdef USE_MUNMAP
-           prevhdr -> hb_last_reclaimed = GC_gc_no;
+           prevhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
 #        endif
          GC_remove_header(hbp);
          hbp = prev;
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/alloc.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/alloc.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/alloc.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/alloc.c:1.4      Fri Dec 23 11:42:00 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/alloc.c  Mon Apr  3 19:59:43 2006
@@ -206,7 +206,7 @@
        /* had been reallocated this round. Finalization is user        */
        /* visible progress.  And if we don't count this, we have       */
        /* stability problems for programs that finalize all objects.   */
-    if ((GC_words_wasted >> 3) < result)
+    if ((signed_word)(GC_words_wasted >> 3) < result)
         result += GC_words_wasted;
        /* This doesn't reflect useful work.  But if there is lots of   */
        /* new fragmentation, the same is probably true of the heap,    */
@@ -402,7 +402,7 @@
 /*
  * Perform n units of garbage collection work.  A unit is intended to touch
  * roughly GC_RATE pages.  Every once in a while, we do more than that.
- * This needa to be a fairly large number with our current incremental
+ * This needs to be a fairly large number with our current incremental
  * GC strategy, since otherwise we allocate too much during GC, and the
  * cleanup gets expensive.
  */
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/configure
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/configure:1.13 
kaffe/kaffe/kaffevm/boehm-gc/boehm/configure:1.14
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/configure:1.13   Thu Mar 23 23:25:04 2006
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/configure        Mon Apr  3 19:59:43 2006
@@ -1,7 +1,7 @@
 #! /bin/sh
 # From configure.ac Revision: 1.5 .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for gc 6.6.
+# Generated by GNU Autoconf 2.59 for gc 6.7.
 #
 # Report bugs to <[EMAIL PROTECTED]>.
 #
@@ -429,8 +429,8 @@
 # Identity of this package.
 PACKAGE_NAME='gc'
 PACKAGE_TARNAME='gc'
-PACKAGE_VERSION='6.6'
-PACKAGE_STRING='gc 6.6'
+PACKAGE_VERSION='6.7'
+PACKAGE_STRING='gc 6.7'
 PACKAGE_BUGREPORT='[EMAIL PROTECTED]'
 
 ac_unique_file="gcj_mlc.c"
@@ -956,7 +956,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gc 6.6 to adapt to many kinds of systems.
+\`configure' configures gc 6.7 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1023,7 +1023,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gc 6.6:";;
+     short | recursive ) echo "Configuration of gc 6.7:";;
    esac
   cat <<\_ACEOF
 
@@ -1167,7 +1167,7 @@
 test -n "$ac_init_help" && exit 0
 if $ac_init_version; then
   cat <<\_ACEOF
-gc configure 6.6
+gc configure 6.7
 generated by GNU Autoconf 2.59
 
 Copyright (C) 2003 Free Software Foundation, Inc.
@@ -1181,7 +1181,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gc $as_me 6.6, which was
+It was created by gc $as_me 6.7, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
@@ -1953,7 +1953,7 @@
 
 # Define the identity of the package.
  PACKAGE='gc'
- VERSION='6.6'
+ VERSION='6.7'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4051,6 +4051,23 @@
        INCLUDES="$INCLUDES -pthread"
        THREADDLLIBS=-pthread
        ;;
+     *-*-netbsd*)
+       { echo "$as_me:$LINENO: WARNING: \"Only on NetBSD 2.0 or later.\"" >&5
+echo "$as_me: WARNING: \"Only on NetBSD 2.0 or later.\"" >&2;}
+       cat >>confdefs.h <<\_ACEOF
+#define GC_NETBSD_THREADS 1
+_ACEOF
+
+       cat >>confdefs.h <<\_ACEOF
+#define _REENTRANT 1
+_ACEOF
+
+       cat >>confdefs.h <<\_ACEOF
+#define _PTHREADS 1
+_ACEOF
+
+       THREADDLLIBS="-lpthread -lrt"
+       ;;
      *-*-solaris*)
        cat >>confdefs.h <<\_ACEOF
 #define GC_SOLARIS_THREADS 1
@@ -10300,7 +10317,7 @@
 } >&5
 cat >&5 <<_CSEOF
 
-This file was extended by gc $as_me 6.6, which was
+This file was extended by gc $as_me 6.7, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10358,7 +10375,7 @@
 
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-gc config.status 6.6
+gc config.status 6.7
 configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/configure.in
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/configure.in:1.2 
kaffe/kaffe/kaffevm/boehm-gc/boehm/configure.in:1.3
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/configure.in:1.2 Fri Dec 23 11:42:01 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/configure.in     Mon Apr  3 19:59:43 2006
@@ -17,12 +17,12 @@
 # Initialization
 # ==============
 
-AC_INIT(gc,6.6,[EMAIL PROTECTED]) 
+AC_INIT(gc,6.7,[EMAIL PROTECTED]) 
     ## version must conform to [0-9]+[.][0-9]+(alpha[0-9]+)?
 AC_CONFIG_SRCDIR(gcj_mlc.c)
 AC_CANONICAL_TARGET 
 AC_PREREQ(2.53)
-AC_REVISION($Revision: 1.2 $)
+AC_REVISION($Revision: 1.3 $)
 GC_SET_VERSION
 AM_INIT_AUTOMAKE
 
@@ -110,6 +110,13 @@
        INCLUDES="$INCLUDES -pthread"
        THREADDLLIBS=-pthread
        ;;
+     *-*-netbsd*)
+       AC_MSG_WARN("Only on NetBSD 2.0 or later.")
+       AC_DEFINE(GC_NETBSD_THREADS)
+       AC_DEFINE(_REENTRANT)
+       AC_DEFINE(_PTHREADS)
+       THREADDLLIBS="-lpthread -lrt"
+       ;;
      *-*-solaris*)
        AC_DEFINE(GC_SOLARIS_THREADS)
        AC_DEFINE(GC_SOLARIS_PTHREADS)
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c:1.4  Fri Dec 23 
11:42:01 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/darwin_stop_world.c      Mon Apr  3 
19:59:43 2006
@@ -1,5 +1,7 @@
 #include "private/pthread_support.h"
 
+/* This probably needs more porting work to ppc64. */
+
 # if defined(GC_DARWIN_THREADS)
 
 /* From "Inside Mac OS X - Mach-O Runtime Architecture" published by Apple
@@ -36,7 +38,7 @@
 #   if CPP_WORDSZ == 32
       __asm__ volatile("lwz    %0,0(r1)" : "=r" (frame));
 #   else
-      __asm__ volatile("ldz    %0,0(r1)" : "=r" (frame));
+      __asm__ volatile("ld     %0,0(r1)" : "=r" (frame));
 #   endif
 # endif
   } else {
@@ -73,7 +75,13 @@
   GC_thread p;
   pthread_t me;
   ptr_t lo, hi;
+#if defined(POWERPC)
   ppc_thread_state_t state;
+#elif defined(I386)
+  i386_thread_state_t state;
+#else
+# error FIXME for non-x86 || ppc architectures
+#endif
   mach_msg_type_number_t thread_state_count = MACHINE_THREAD_STATE_COUNT;
   
   me = pthread_self();
@@ -93,6 +101,17 @@
                             &thread_state_count);
        if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
        
+#if defined(I386)
+       lo = state.esp;
+
+       GC_push_one(state.eax); 
+       GC_push_one(state.ebx); 
+       GC_push_one(state.ecx); 
+       GC_push_one(state.edx); 
+       GC_push_one(state.edi); 
+       GC_push_one(state.esi); 
+       GC_push_one(state.ebp); 
+#elif defined(POWERPC)
        lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE);
         
        GC_push_one(state.r0); 
@@ -126,6 +145,9 @@
        GC_push_one(state.r29); 
        GC_push_one(state.r30); 
        GC_push_one(state.r31);
+#else
+# error FIXME for non-x86 || ppc architectures
+#endif
       } /* p != me */
       if(p->flags & MAIN_THREAD)
        hi = GC_stackbottom;
@@ -247,6 +269,7 @@
 #     endif
       GC_push_all_stack(lo, hi); 
     } /* for(p=GC_threads[i]...) */
+    vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) * 
listcount);
 }
 #endif /* !DARWIN_DONT_PARSE_STACK */
 
@@ -390,6 +413,7 @@
        changes = result;
        prev_list = act_list;
        prevcount = listcount;
+        vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) 
* listcount);
       } while (changes);
       
  
@@ -461,6 +485,7 @@
        }
       }
     }
+    vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) * 
listcount);
 #   if DEBUG_THREADS
      GC_printf0("World started\n");
 #   endif
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c:1.2 
kaffe/kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c:1.3
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c:1.2    Mon Aug  2 10:44:57 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/dbg_mlc.c        Mon Apr  3 19:59:43 2006
@@ -14,6 +14,8 @@
  * modified is included with the above copyright notice.
  */
 
+#include <errno.h>
+#include <string.h>
 #include "private/dbg_mlc.h"
 
 void GC_default_print_heap_obj_proc();
@@ -711,6 +713,26 @@
     }
     ADD_CALL_CHAIN(result, ra);
     return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+# ifdef __STDC__
+    char *GC_debug_strdup(const char *str, GC_EXTRA_PARAMS)
+#else
+    char *GC_debug_strdup(str, s, i)
+    char *str;
+    char *s;
+    int i;
+#endif
+{
+    char *copy;
+    if (str == NULL) return NULL;
+    copy = GC_debug_malloc_atomic(strlen(str) + 1, OPT_RA s, i);
+    if (copy == NULL) {
+      errno = ENOMEM;
+      return NULL;
+    }
+    strcpy(copy, str);
+    return copy;
 }
 
 # ifdef __STDC__
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/dyn_load.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/dyn_load.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/dyn_load.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/dyn_load.c:1.4   Fri Dec 23 11:42:01 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/dyn_load.c       Mon Apr  3 19:59:43 2006
@@ -776,8 +776,8 @@
   /* this automatically, and rely largely on user input.       */
   /* We expect that any mapping with type MEM_MAPPED (which    */
   /* apparently excludes library data sections) can be safely  */
-  /* ignored.  But we're too chicken to do that in this        */
-  /* version.                                                  */
+  /* ignored.  But we're too completely remove this code in    */
+  /* this version.                                             */
   /* Based on a very limited sample, it appears that:          */
   /*   - Frame buffer mappings appear as mappings of large     */
   /*     length, usually a bit less than a power of two.       */
@@ -844,6 +844,9 @@
   }
 # endif /* DEBUG_VIRTUALQUERY */
 
+  extern GC_bool GC_wnt;  /* Is Windows NT derivative.         */
+                         /* Defined and set in os_dep.c.       */
+
   void GC_register_dynamic_libraries()
   {
     MEMORY_BASIC_INFORMATION buf;
@@ -885,7 +888,12 @@
                 * !is_frame_buffer(p, buf.RegionSize, buf.Type)
                 * instead of just checking for MEM_IMAGE.
                 * If something breaks, change it back. */
-               && buf.Type == MEM_IMAGE) {  
+               /* There is some evidence that we cannot always
+                * ignore MEM_PRIVATE sections under Windows ME
+                * and predecessors.  Hence we now also check for
+                * that case.   */
+               && (buf.Type == MEM_IMAGE ||
+                   !GC_wnt && buf.Type == MEM_PRIVATE)) {  
 #              ifdef DEBUG_VIRTUALQUERY
                  GC_dump_meminfo(&buf);
 #              endif
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/headers.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/headers.c:1.2 
kaffe/kaffe/kaffevm/boehm-gc/boehm/headers.c:1.3
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/headers.c:1.2    Mon Aug  2 10:44:57 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/headers.c        Mon Apr  3 19:59:44 2006
@@ -210,7 +210,7 @@
     result = alloc_hdr();
     SET_HDR(h, result);
 #   ifdef USE_MUNMAP
-       result -> hb_last_reclaimed = GC_gc_no;
+       result -> hb_last_reclaimed = (unsigned short)GC_gc_no;
 #   endif
     return(result);
 }
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/malloc.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/malloc.c:1.2 
kaffe/kaffe/kaffevm/boehm-gc/boehm/malloc.c:1.3
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/malloc.c:1.2     Mon Aug  2 10:44:57 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/malloc.c Mon Apr  3 19:59:44 2006
@@ -15,6 +15,8 @@
 /* Boehm, February 7, 1996 4:32 pm PST */
  
 #include <stdio.h>
+#include <string.h>
+#include <errno.h>
 #include "private/gc_priv.h"
 
 extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */
@@ -271,6 +273,26 @@
    }
 }
 
+/* provide a version of strdup() that uses the collector to allocate the
+   copy of the string */
+# ifdef __STDC__
+    char *GC_strdup(const char *s)
+# else
+    char *GC_strdup(s)
+    char *s;
+#endif
+{
+  char *copy;
+
+  if (s == NULL) return NULL;
+  if ((copy = GC_malloc_atomic(strlen(s) + 1)) == NULL) {
+    errno = ENOMEM;
+    return NULL;
+  }
+  strcpy(copy, s);
+  return copy;
+}
+
 /* Allocate lb bytes of composite (pointerful) data */
 # ifdef __STDC__
     GC_PTR GC_malloc(size_t lb)
@@ -370,6 +392,10 @@
   {
     size_t len = strlen(s) + 1;
     char * result = ((char *)REDIRECT_MALLOC(len+1));
+    if (result == 0) {
+      errno = ENOMEM;
+      return 0;
+    }
     BCOPY(s, result, len+1);
     return result;
   }
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/mark.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/mark.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/mark.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/mark.c:1.4       Fri Dec 23 11:42:01 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/mark.c   Mon Apr  3 19:59:44 2006
@@ -1486,7 +1486,6 @@
 ptr_t cold_gc_frame;
 {
   if (!NEED_FIXUP_POINTER && GC_all_interior_pointers) {
-#   define EAGER_BYTES 1024
     /* Push the hot end of the stack eagerly, so that register values   */
     /* saved inside GC frames are marked before they disappear.                
*/
     /* The rest of the marking can be deferred until later.            */
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/misc.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/misc.c:1.3 
kaffe/kaffe/kaffevm/boehm-gc/boehm/misc.c:1.4
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/misc.c:1.3       Fri May  6 17:02:54 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/misc.c   Mon Apr  3 19:59:44 2006
@@ -34,6 +34,10 @@
 # include <tchar.h>
 #endif
 
+#ifdef NONSTOP
+# include <floss.h>
+#endif
+
 # ifdef THREADS
 #   ifdef PCR
 #     include "il/PCR_IL.h"
@@ -477,10 +481,11 @@
 #if defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS)
     if (!GC_is_initialized) {
       BOOL (WINAPI *pfn) (LPCRITICAL_SECTION, DWORD) = NULL;
-      HMODULE hK32 = GetModuleHandle("kernel32.dll");
+      HMODULE hK32 = GetModuleHandleA("kernel32.dll");
       if (hK32)
-          (FARPROC) pfn = GetProcAddress(hK32,
-                         "InitializeCriticalSectionAndSpinCount");
+         pfn = (BOOL (WINAPI *) (LPCRITICAL_SECTION, DWORD))
+               GetProcAddress (hK32,
+                               "InitializeCriticalSectionAndSpinCount");
       if (pfn)
           pfn(&GC_allocate_ml, 4000);
       else
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/os_dep.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/os_dep.c:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/os_dep.c:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/os_dep.c:1.4     Fri Dec 23 11:42:01 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/os_dep.c Mon Apr  3 19:59:44 2006
@@ -1181,12 +1181,15 @@
        /* This used to be set for gcc, to avoid dealing with           */
        /* the structured exception handling issues.  But we now have   */
        /* assembly code to do that right.                              */
+  GC_bool GC_wnt = FALSE;
+        /* This is a Windows NT derivative, i.e. NT, W2K, XP or later.  */
   
   void GC_init_win32()
   {
     /* if we're running under win32s, assume that no DLLs will be loaded */
     DWORD v = GetVersion();
-    GC_no_win32_dlls |= ((v & 0x80000000) && (v & 0xff) <= 3);
+    GC_wnt = !(v & 0x80000000);
+    GC_no_win32_dlls |= ((!GC_wnt) && (v & 0xff) <= 3);
   }
 
   /* Return the smallest address a such that VirtualQuery              */
@@ -1498,7 +1501,7 @@
 
 # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \
        && !defined(MSWIN32) && !defined(MSWINCE) \
-       && !defined(MACOS) && !defined(DOS4GW)
+       && !defined(MACOS) && !defined(DOS4GW) && !defined(NONSTOP)
 
 # ifdef SUNOS4
     extern caddr_t sbrk();
@@ -3799,8 +3802,12 @@
         mach_msg_type_number_t exc_state_count = PPC_EXCEPTION_STATE64_COUNT;
         ppc_exception_state64_t exc_state;
 #     endif
+#   elif defined(I386)
+        thread_state_flavor_t flavor = i386_EXCEPTION_STATE;
+        mach_msg_type_number_t exc_state_count = i386_EXCEPTION_STATE_COUNT;
+        i386_exception_state_t exc_state;
 #   else
-#      error FIXME for non-ppc darwin
+#      error FIXME for non-ppc/x86 darwin
 #   endif
 
     
@@ -3830,7 +3837,13 @@
     }
     
     /* This is the address that caused the fault */
+#if defined(POWERPC)
     addr = (char*) exc_state.dar;
+#elif defined (I386)
+    addr = (char*) exc_state.faultvaddr;
+#else
+#   error FIXME for non POWERPC/I386
+#endif
         
     if((HDR(addr)) == 0) {
         /* Ugh... just like the SIGBUS problem above, it seems we get a bogus 
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s:1.3 
kaffe/kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s:1.4
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s:1.3    Fri Dec 
23 11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/powerpc_darwin_mach_dep.s        Mon Apr 
 3 19:59:44 2006
@@ -1,10 +1,21 @@
+#if defined(__ppc64__)
+#define MODE_CHOICE(x, y) y
+#else
+#define MODE_CHOICE(x, y) x
+#endif
+
+#define lgu     MODE_CHOICE(lwzu, ldu)
+
+#define g_long  MODE_CHOICE(long, quad)         /* usage is ".g_long" */
+
+#define LOG2_GPR_BYTES  MODE_CHOICE(2,3)        /* log2(GPR_BYTES) */
 
 ; GC_push_regs function. Under some optimization levels GCC will clobber
 ; some of the non-volatile registers before we get a chance to save them
 ; therefore, this cannot be inline asm.
 
 .text
-       .align 2
+       .align LOG2_GPR_BYTES
        .globl _GC_push_regs
 _GC_push_regs:
     
@@ -65,7 +76,7 @@
 
 .data
 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
-       .align 2
+       .align LOG2_GPR_BYTES
 L_GC_push_one$stub:
        .indirect_symbol _GC_push_one
        mflr r0
@@ -74,12 +85,11 @@
        mflr r11
        addis r11,r11,ha16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)
        mtlr r0
-       lwzu r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11)
+       lgu r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11)
        mtctr r12
        bctr
 .data
 .lazy_symbol_pointer
 L_GC_push_one$lazy_ptr:
        .indirect_symbol _GC_push_one
-       .long dyld_stub_binding_helper
-
+       .g_long dyld_stub_binding_helper
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c:1.5 
kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c:1.6
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c:1.5 Fri Dec 23 
11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_stop_world.c     Mon Apr  3 
19:59:44 2006
@@ -107,7 +107,7 @@
  */
 
 #ifndef SIG_THR_RESTART
-#  if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS)
+#  if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) || 
defined(GC_NETBSD_THREADS)
 #    ifdef _SIGRTMIN
 #      define SIG_THR_RESTART _SIGRTMIN + 5
 #    else
@@ -120,6 +120,13 @@
 
 sem_t GC_suspend_ack_sem;
 
+#ifdef GC_NETBSD_THREADS
+# define GC_NETBSD_THREADS_WORKAROUND
+  /* It seems to be necessary to wait until threads have restarted.    */
+  /* But it is unclear why that is the case.                           */
+  sem_t GC_restart_ack_sem;
+#endif
+
 void GC_suspend_handler_inner(ptr_t sig_arg);
 
 #if defined(IA64) || defined(HP_PA)
@@ -227,6 +234,10 @@
 
     if (sig != SIG_THR_RESTART) ABORT("Bad signal in suspend_handler");
 
+#ifdef GC_NETBSD_THREADS_WORKAROUND
+    sem_post(&GC_restart_ack_sem);
+#endif
+
     /*
     ** Note: even if we don't do anything useful here,
     ** it would still be necessary to have a signal handler,
@@ -303,6 +314,8 @@
                (unsigned long) bs_lo, (unsigned long) bs_hi);
 #        endif
           if (pthread_equal(p -> id, me)) {
+           /* FIXME:  This may add an unbounded number of entries,     */
+           /* and hence overflow the mark stack, which is bad.         */
            GC_push_all_eager(bs_lo, bs_hi);
          } else {
            GC_push_all_stack(bs_lo, bs_hi);
@@ -439,6 +452,9 @@
     register GC_thread p;
     register int n_live_threads = 0;
     register int result;
+#ifdef GC_NETBSD_THREADS_WORKAROUND
+    int code;
+#endif
 
 #   if DEBUG_THREADS
       GC_printf0("World starting\n");
@@ -468,6 +484,14 @@
         }
       }
     }
+#ifdef GC_NETBSD_THREADS_WORKAROUND
+    for (i = 0; i < n_live_threads; i++)
+       while (0 != (code = sem_wait(&GC_restart_ack_sem)))
+           if (errno != EINTR) {
+               GC_err_printf1("sem_wait() returned %ld\n", (unsigned 
long)code);
+               ABORT("sem_wait() for restart handler failed");
+           }
+#endif
     #if DEBUG_THREADS
       GC_printf0("World started\n");
     #endif
@@ -478,6 +502,10 @@
     
     if (sem_init(&GC_suspend_ack_sem, 0, 0) != 0)
         ABORT("sem_init failed");
+#ifdef GC_NETBSD_THREADS_WORKAROUND
+    if (sem_init(&GC_restart_ack_sem, 0, 0) != 0)
+       ABORT("sem_init failed");
+#endif
 
     act.sa_flags = SA_RESTART;
     if (sigfillset(&act.sa_mask) != 0) {
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_support.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_support.c:1.5 
kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_support.c:1.6
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_support.c:1.5    Fri Dec 23 
11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/pthread_support.c        Mon Apr  3 
19:59:44 2006
@@ -67,7 +67,8 @@
 # endif
 
 # if (defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) || \
-      defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) \
+      defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS) || \
+      defined(GC_NETBSD_THREADS))                             \
       && !defined(USE_PTHREAD_SPECIFIC)
 #   define USE_PTHREAD_SPECIFIC
 # endif
@@ -120,7 +121,10 @@
 # include <sys/sysctl.h>
 #endif /* GC_DARWIN_THREADS */
 
-
+#if defined(GC_NETBSD_THREADS)
+# include <sys/param.h>
+# include <sys/sysctl.h>
+#endif /* GC_NETBSD_THREADS */
 
 #if defined(GC_DGUX386_THREADS)
 # include <sys/dg_sys_info.h>
@@ -836,6 +840,18 @@
 }
 #endif /* GC_DGUX386_THREADS */
 
+#if defined(GC_NETBSD_THREADS)
+static int get_ncpu(void)
+{
+    int mib[] = {CTL_HW,HW_NCPU};
+    int res;
+    size_t len = sizeof(res);
+
+    sysctl(mib, sizeof(mib)/sizeof(int), &res, &len, NULL, 0);
+    return res;
+}
+#endif /* GC_NETBSD_THREADS */
+
 /* We hold the allocation lock.        */
 void GC_thr_init()
 {
@@ -880,6 +896,9 @@
 #       if defined(GC_IRIX_THREADS)
          GC_nprocs = sysconf(_SC_NPROC_ONLN);
          if (GC_nprocs <= 0) GC_nprocs = 1;
+#       endif
+#       if defined(GC_NETBSD_THREADS)
+         GC_nprocs = get_ncpu();
 #       endif
 #       if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
          int ncpus = 1;
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/threadlibs.c
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/threadlibs.c:1.3 
kaffe/kaffe/kaffevm/boehm-gc/boehm/threadlibs.c:1.4
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/threadlibs.c:1.3 Fri May  6 17:02:55 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/threadlibs.c     Mon Apr  3 19:59:44 2006
@@ -22,6 +22,10 @@
           printf("-pthread\n");
 #       endif
 #   endif
+#   if defined(GC_NETBSD_THREADS)
+         printf("-lpthread -lrt\n");
+#   endif
+
 #   if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS)
        printf("-lpthread -lrt\n");
 #   endif
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/version.h
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/version.h:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/version.h:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/version.h:1.4    Fri Dec 23 11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/version.h        Mon Apr  3 19:59:44 2006
@@ -2,7 +2,7 @@
 /* Eventually this one may become unnecessary.  For now we need        */
 /* it to keep the old-style build process working.             */
 #define GC_TMP_VERSION_MAJOR 6
-#define GC_TMP_VERSION_MINOR 6
+#define GC_TMP_VERSION_MINOR 7
 #define GC_TMP_ALPHA_VERSION GC_NOT_ALPHA
 
 #ifndef GC_NOT_ALPHA
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README:1.4   Fri Dec 23 11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README       Mon Apr  3 19:59:44 2006
@@ -28,7 +28,7 @@
 collector.  (If you are concerned about such things, I recommend you look
 at the notice in config.guess or ltmain.sh.)
 
-This is version 6.6 of a conservative garbage collector for C and C++.
+This is version 6.7 of a conservative garbage collector for C and C++.
 
 You might find a more recent version of this at
 
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README.changes
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README.changes:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README.changes:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README.changes:1.4   Fri Dec 23 
11:42:02 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/README.changes       Mon Apr  3 
19:59:45 2006
@@ -2245,6 +2245,45 @@
    to Ben Hutchings for the observation and patch.)
  - Move up struct callinfo declaration to make gcc 4.0.2. happy.
 
+Since 6.6:
+ - Add "int" to Solaris "end" and "etext" declaration in gc.h.  Declared
+   the symbols with underscores and as arrays, since that's what's actually
+   used.  Perhaps this could all just be removed?  (Thanks to John Bowman.)
+ - Fixed ARM GC_test_and_set code.  (Thanks to Kazu Hirata and Paul Brook.)
+ - Added casts for assignments to hb_last_reclaimed, which truncate the
+   value.  Added a cast to GC_adj_words_allocd.  Use GetModuleHandleA
+   when retrieving a handle to kernel32.dll under win32.  (Thanks to the
+   Visual Prolog developers.)
+ - Added Tandem S-Series support.  (Thanks to Craig McDaniel.  A modified
+   version of his patch was applied, and hence breakage is probably not
+   his fault.)
+ - Remove spurious gc:: qualifier for operator delete[] in gc_cpp.h.
+   (Thanks to Hanno Boeck.)
+ - Changed a test for LINUX in config_macros.h to one for __linux__.
+ - Fix ppc 64 test_and_set code by removing it.  (Thanks to Christian
+   Thalinger.)
+ - Add prototypes for GC_finalizer_notifier and GC_thr_init.  (Thanks to
+   David Ayers.)
+ - Use ld instead of nonexistent ldz instruction in Darwin FindTopOfStack.
+   (Thanks to Andreas Tobler.)
+ - Add support for Darwin/X86.  (Thanks to Geoff Norton and the Mono
+   developers.)
+ - Merge in some recent gcc fixes.  Add ppc64 asm code.  (Thanks to Bryce
+   McKinley and other gcj developers.)
+ - Scan MEM_PRIVATE sections under Windows ME and predecessors.
+ - Interior pointers with some largish offsets into large objects could
+   be ignored, if GC_all_interior_pointers was set.  (Oddly this worked
+   correctly for stack references if it was not set.  Otherwise it failed
+   for both stack and heap references.)  Thanks to Andrew McKinlay for the
+   critical test case.
+ - Integrated Tatsuya Bizenn's NETBSD threads support, with some
+   minimally tested changes.
+ - Added GC_strdup and friends to make leak detection work correctly
+   for strdup clients.  (Thanks to Jon Moore.)  Fixed the existing strdup
+   with malloc redirection to handle a null malloc return correctly.
+ - Fix Makefile.am, so it handles exe extensions under Cygwin correctly
+   for gctest.
+
 To do:
  - The USE_MUNMAP code should really use a separate data structure
    indexed by physical page to keep track of time since last use of
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html:1.2 
kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html:1.3
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html:1.2 Mon Aug  2 
10:45:00 2004
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/doc/gcinterface.html     Mon Apr  3 
19:59:45 2006
@@ -34,6 +34,12 @@
 The header file <TT>gc.h</tt> must be included
 in files that use either GC or threads primitives, since threads primitives
 will be redefined to cooperate with the GC on many platforms.
+<P>
+Thread users should also be aware that on many platforms objects reachable
+only from thread-local variables may be prematurely reclaimed.
+Thus objects pointed to by thread-local variables should also be pointed to
+by a globally visible data structure.  (This is viewed as a bug, but as
+one that is exceedingly hard to fix without some libc hooks.)
 <DL>
 <DT> <B>void * GC_MALLOC(size_t <I>nbytes</i>)</b>
 <DD>
@@ -179,6 +185,11 @@
 but are scanned for pointers to collectable objects.
 They are allocated by <TT>GC_MALLOC_UNCOLLECTABLE</tt>, as described
 above, and through some interfaces described below.
+<P>
+(On most platforms, the collector may not trace correctly from in-flight
+exception objects.  Thus objects thrown as exceptions should only
+point to otherwise reachable memory.  This is another bug whose
+proper repair requires platform hooks.)
 <P>
 The easiest way to ensure that collectable objects are properly referenced
 is to allocate only collectable objects.  This requires that every
Index: kaffe/kaffe/kaffevm/boehm-gc/boehm/include/gc.h
diff -u kaffe/kaffe/kaffevm/boehm-gc/boehm/include/gc.h:1.4 
kaffe/kaffe/kaffevm/boehm-gc/boehm/include/gc.h:1.5
--- kaffe/kaffe/kaffevm/boehm-gc/boehm/include/gc.h:1.4 Fri Dec 23 11:42:03 2005
+++ kaffe/kaffe/kaffevm/boehm-gc/boehm/include/gc.h     Mon Apr  3 19:59:45 2006
@@ -129,7 +129,7 @@
                        /* ordered finalization.  Default value is      */
                        /* determined by JAVA_FINALIZATION macro.       */
 
-GC_API void (* GC_finalizer_notifier)();
+GC_API void (* GC_finalizer_notifier) GC_PROTO((void));
                        /* Invoked by the collector when there are      */
                        /* objects to be finalized.  Invoked at most    */
                        /* once per GC cycle.  Never invoked unless     */
@@ -267,6 +267,7 @@
  */
 GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes));
 GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes));
+GC_API char *GC_strdup GC_PROTO((const char *str));
 GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes));
 GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes));
 
@@ -523,6 +524,8 @@
        GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
 GC_API GC_PTR GC_debug_malloc_atomic
        GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));

*** Patch too long, truncated ***

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to