]> granicus.if.org Git - gc/commitdiff
Fix issues proposed in Ivan's previous commit, etc.
authorPetter Urkedal <paurkedal@gmail.com>
Tue, 13 Sep 2011 21:28:27 +0000 (23:28 +0200)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 30 Sep 2011 13:35:19 +0000 (17:35 +0400)
* disclaim.c -> {finalized_mlc.c, misc.c}: Move low-level code to misc.c and
the finalized object-kind to finalized_mlc.c.
* Makefile.am: Update accordingly.
* reclaim.c: Condition #include "gc_disclaim.h" and remove "register".
* include/gc_disclaim.h, include/private/gc_priv.h, finalized_mlc.c, misc.c:
Add GC_API, GC_CALL, and GC_CALLBACK.  Use typedefs for function pointers.
* tests/disclaim_test.c, tests/disclaim_bench.c: Fix portability and other
issues.

* include/gc_disclaim.h: Forward declare ...
* finalized_mlc.c: ... and export GC_finalized_objfreelist.
* thread_local_alloc.c (GC_destroy_thread_local): Return finalized
freelists though the same global.
* include/private/thread_local_alloc.h: Tweak (move array above comment).

* Makefile.dj, NT_MAKEFILE, NT_STATIC_THREADS_MAKEFILE,
NT_X64_STATIC_THREADS_MAKEFILE, NT_X64_THREADS_MAKEFILE, gc.mak,
windows-untested/vc60/gc.dsp, windows-untested/vc70/gc.vcproj,
windows-untested/vc71/gc.vcproj: Add include/gc_disclaim.h to various build
systems.  (Untested.)

21 files changed:
Makefile.am
Makefile.direct
Makefile.dj
NT_MAKEFILE
NT_STATIC_THREADS_MAKEFILE
NT_X64_STATIC_THREADS_MAKEFILE
NT_X64_THREADS_MAKEFILE
finalized_mlc.c [moved from disclaim.c with 70% similarity]
gc.mak
include/gc_disclaim.h
include/include.am
include/private/gc_priv.h
include/private/thread_local_alloc.h
misc.c
reclaim.c
tests/disclaim_bench.c
tests/disclaim_test.c
thread_local_alloc.c
windows-untested/vc60/gc.dsp
windows-untested/vc70/gc.vcproj
windows-untested/vc71/gc.vcproj

index aac9d235287cf20a06b7f5bfe6cdf7c6be4da654..31f097f34dea6689455f09f90bd0aab6fd2a4943 100644 (file)
@@ -73,7 +73,7 @@ libgc_la_SOURCES += win32_threads.c
 endif
 
 if ENABLE_DISCLAIM
-libgc_la_SOURCES += disclaim.c
+libgc_la_SOURCES += finalized_mlc.c
 endif
 
 if USE_INTERNAL_LIBATOMIC_OPS
index 0cf9426c904749c654f1af5b5d7c6532ae1543fc..c8371584a51a18ec8a1821f9ee9ba8620a71d694 100644 (file)
@@ -74,14 +74,16 @@ OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o \
   headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o  \
   malloc.o stubborn.o checksums.o pthread_support.o pthread_stop_world.o \
   darwin_stop_world.o typd_mlc.o ptr_chck.o mallocx.o gcj_mlc.o specific.o \
-  gc_dlopen.o backgraph.o win32_threads.o pthread_start.o thread_local_alloc.o
+  gc_dlopen.o backgraph.o win32_threads.o pthread_start.o thread_local_alloc.o \
+  finalized_mlc.o
 
 CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c \
   headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c \
   new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c \
   checksums.c pthread_support.c pthread_stop_world.c darwin_stop_world.c \
   typd_mlc.c ptr_chck.c mallocx.c gcj_mlc.c specific.c gc_dlopen.c \
-  backgraph.c win32_threads.c pthread_start.c thread_local_alloc.c
+  backgraph.c win32_threads.c pthread_start.c thread_local_alloc.c \
+  finalized_mlc.c
 
 CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/tests/de.c \
   cord/tests/cordtest.c include/cord.h include/ec.h \
@@ -94,7 +96,8 @@ SRCS= $(CSRCS) \
   include/gc.h include/gc_typed.h include/gc_tiny_fl.h \
   include/gc_version.h include/private/gc_hdrs.h include/private/gc_priv.h \
   include/private/gcconfig.h include/private/gc_pmark.h \
-  include/gc_inline.h include/gc_mark.h tools/threadlibs.c \
+  include/gc_inline.h include/gc_mark.h include/gc_disclaim.h \
+  tools/threadlibs.c \
   tools/if_mach.c tools/if_not_there.c gc_cpp.cc include/gc_cpp.h \
   tools/gcname.c include/weakpointer.h include/private/gc_locks.h \
   include/new_gc_alloc.h include/gc_allocator.h \
index 4fcf9a5fff2a8f02a7990d29bcde0badb1a1e9f8..754b6444ec0095b6c99ee44465b7d3ce58e77bd6 100644 (file)
@@ -37,9 +37,9 @@ AR= ar
 RANLIB= ranlib
 
 
-OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o specific.o
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o specific.o finalized_mlc.o
 
-CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c specific.c
+CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c specific.c finalized_mlc.c
 
 CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/tests/de.c \
     cord/tests/cordtest.c include/cord.h include/ec.h \
@@ -51,7 +51,7 @@ CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o
 SRCS= $(CSRCS) \
     src/sparc_mach_dep.S include/gc.h include/gc_version.h include/gc_typed.h \
     include/private/gc_hdrs.h include/private/gc_priv.h \
-    include/private/gcconfig.h include/private/gc_mark.h \
+    include/private/gcconfig.h include/private/gc_mark.h include/gc_disclaim.h \
     include/gc_inline.h gc.man tools/threadlibs.c \
     tools/if_mach.c tools/if_not_there.c gc_cpp.cc include/gc_cpp.h \
     include/weakpointer.h include/private/gc_locks.h \
index a0ba4bc0664c157fb2f47eec31c6aa0db588d7f9..38f7275edfc0aed30a4751a6a3faccfc21c2681b 100644 (file)
@@ -20,7 +20,7 @@ all: gctest.exe cord\de.exe test_cpp.exe
 .cpp.obj:
        $(cc) $(cdebug) $(cflags) $(cvars) -Iinclude -DALL_INTERIOR_POINTERS -DGC_NOT_DLL -D_CRT_SECURE_NO_DEPRECATE $*.cpp /Fo$*.obj
 
-$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\private\msvc_dbg.h
+$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\gc_disclaim.h include\private\msvc_dbg.h
 
 gc.lib: $(OBJS)
        lib /MACHINE:i386 /out:gc.lib $(OBJS)
index 0907a8de6ad81ccecc647f0c26c95cd0d51496b5..ffff3cf26e7fa70d5cf177092e21fb1b2243adc7 100644 (file)
@@ -27,7 +27,7 @@ all: gctest.exe cord\de.exe test_cpp.exe
 .cpp.obj:
        $(cc) $(cdebug) $(cflags) $(cvarsmt) -Iinclude -I$(AO_INCLUDE_DIR) -DALL_INTERIOR_POINTERS -DGC_NOT_DLL -DGC_THREADS -DTHREAD_LOCAL_ALLOC -D_CRT_SECURE_NO_DEPRECATE $*.cpp /Fo$*.obj
 
-$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\private\msvc_dbg.h
+$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\gc_disclaim.h include\private\msvc_dbg.h
 
 gc.lib: $(OBJS)
        lib /MACHINE:i386 /out:gc.lib $(OBJS)
index 70dbd600cdf392f86e274a10bf898d1b6bec9c16..045c3eebe714fabd8d4f8f0268b65f3ff9edf231 100644 (file)
@@ -30,7 +30,7 @@ all: gctest.exe cord\de.exe test_cpp.exe
 .cpp.obj:
        $(cc) $(cdebug) $(cflags) $(cvarsmt) -Iinclude -I$(AO_INCLUDE_DIR) -DALL_INTERIOR_POINTERS -DGC_NOT_DLL -DGC_THREADS -DTHREAD_LOCAL_ALLOC -D_CRT_SECURE_NO_DEPRECATE $*.cpp /Fo$*.obj
 
-$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\private\msvc_dbg.h
+$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\gc_disclaim.h include\private\msvc_dbg.h
 
 gc.lib: $(OBJS)
        lib /MACHINE:X64 /out:gc.lib $(OBJS)
index 49be4dad4ab912ae32775bb13f3d0b3060cee39c..967b18ff0faee30d040f225ade83c22fdcdde02e 100644 (file)
@@ -37,7 +37,7 @@ all: gc64.dll gctest.exe cord\de.exe test_cpp.exe
 .cpp.obj:
        $(cc) $(cdebug) $(cflags) $(cvarsmt) -Iinclude -I$(AO_INCLUDE_DIR) -DALL_INTERIOR_POINTERS -DALL_INTERIOR_POINTERS -DGC_DLL -DGC_THREADS -D_CRT_SECURE_NO_DEPRECATE $*.cpp /Fo$*.obj
 
-$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\private\msvc_dbg.h
+$(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h include\gc_disclaim.h include\private\msvc_dbg.h
 
 
 LINK64=link.exe
similarity index 70%
rename from disclaim.c
rename to finalized_mlc.c
index 1a6391335c867cfbbf01af5f8a1038146e3dbdb0..41ca9cdbe4baa392e8f6bf5d5854e141639e4cdd 100644 (file)
  *
  */
 
-// FIXME: Move this code to another existing file (which is appropriate),
-// and remove this file (adding a new file is a bit complex due to numerous
-// scripts present).
-
 #include "private/gc_priv.h"
 
-// FIXME: add #ifdef ENABLE_DISCLAIM
+#ifdef ENABLE_DISCLAIM
 
-#include "private/thread_local_alloc.h"
-         // FIXME: we can include it only if THREAD_LOCAL_ALLOC.
+#ifdef THREAD_LOCAL_ALLOC
+#  include "private/thread_local_alloc.h"
+#endif
 
 #include "gc_disclaim.h"
 
-/* Low level interface for reclaim callbacks. */
-
-// FIXME: Use declared type for proc.
-// FIXME: Use GC_API and GC_CALL.
-void GC_register_disclaim_proc(int kind,
-                               int (*proc)(void *obj, void *cd), void *cd,
-                               int mark_unconditionally)
-{
-    GC_obj_kinds[kind].ok_disclaim_proc = proc;
-    GC_obj_kinds[kind].ok_disclaim_cd = cd;
-    GC_obj_kinds[kind].ok_mark_unconditionally = mark_unconditionally;
-}
-
-/* High level interface for finalization. */
-
 STATIC int GC_finalized_kind;
 
-STATIC ptr_t * GC_finalized_objfreelist = 0;
-STATIC ptr_t * GC_finalized_debugobjfreelist = 0;
+ptr_t * GC_finalized_objfreelist = NULL;
 
 
-STATIC int GC_finalized_disclaim(void *obj, void *cd) // FIXME: Add CALLBACK
+STATIC int GC_CALLBACK GC_finalized_disclaim(void *obj, void *cd)
 {
     struct GC_finalizer_closure *fc = *(void **)obj;
     if (((word)fc & 1) != 0) {
@@ -65,18 +46,17 @@ STATIC int GC_finalized_disclaim(void *obj, void *cd) // FIXME: Add CALLBACK
 
 static int done_init = 0;
 
-// FIXME: GC_API
-void GC_init_finalized_malloc(void)
+GC_API void GC_CALL GC_init_finalized_malloc(void)
 {
     DCL_LOCK_STATE;
 
-    if (done_init) // FIXME: Is race possible here?
-        return;
     GC_init(); // FIXME: Portable client should always do GC_INIT() itself
 
     LOCK();
-    if (done_init)
-        goto done; // FIXME: avoid "goto" if possible
+    if (done_init) {
+        UNLOCK();
+        return;
+    }
     done_init = 1;
 
     GC_finalized_objfreelist = (ptr_t *)GC_new_free_list_inner();
@@ -86,18 +66,15 @@ void GC_init_finalized_malloc(void)
                           TRUE, TRUE);
     GC_register_disclaim_proc(GC_finalized_kind, GC_finalized_disclaim, 0, 1);
 
-done:
     UNLOCK();
 }
 
-void * GC_clear_stack(); // FIXME: remove as declared in gc_priv.h
-
 #ifdef THREAD_LOCAL_ALLOC
   STATIC void * GC_core_finalized_malloc(size_t lb,
                                          struct GC_finalizer_closure *fclos)
 #else
-// FIXME: add GC_API, GC_CALL
-  void * GC_finalized_malloc(size_t lb, struct GC_finalizer_closure *fclos)
+  GC_API void * GC_CALL GC_finalized_malloc(size_t lb,
+                                            struct GC_finalizer_closure *fclos)
 #endif
 {
     register ptr_t op;
@@ -105,9 +82,7 @@ void * GC_clear_stack(); // FIXME: remove as declared in gc_priv.h
     DCL_LOCK_STATE;
 
     lb += sizeof(void *);
-    if (!done_init) // FIXME: Probably GC_ASSERT is adequate here?
-        ABORT("You must call GC_init_finalize_malloc before using "
-              "GC_malloc_with_finalizer.");
+    GC_ASSERT(done_init);
     if (EXPECT(SMALL_OBJ(lb), 1)) {
         register word lg;
         lg = GC_size_map[lb];
@@ -130,9 +105,8 @@ void * GC_clear_stack(); // FIXME: remove as declared in gc_priv.h
 }
 
 #ifdef THREAD_LOCAL_ALLOC
-  // FIXME: GC_API, GC_CALL
-  void * GC_finalized_malloc(size_t client_lb,
-                             struct GC_finalizer_closure *fclos)
+  GC_API void * GC_CALL GC_finalized_malloc(size_t client_lb,
+                                            struct GC_finalizer_closure *fclos)
   {
     size_t lb = client_lb + sizeof(void *);
     size_t lg = ROUNDED_UP_GRANULES(lb);
@@ -169,3 +143,5 @@ void * GC_clear_stack(); // FIXME: remove as declared in gc_priv.h
     return (void **)result + 1;
   }
 #endif /* THREAD_LOCAL_ALLOC */
+
+#endif /* ENABLE_DISCLAIM */
diff --git a/gc.mak b/gc.mak
index 6e3f53eff745d0c9902b3eccb0fe7f8860d5fe34..445a736d78ec5922d967d0eff53ed7dba9d4aa4a 100644 (file)
--- a/gc.mak
+++ b/gc.mak
@@ -1385,6 +1385,7 @@ DEP_CPP_MARK_C=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
@@ -1407,6 +1408,7 @@ DEP_CPP_MARK_C=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
@@ -1533,6 +1535,7 @@ DEP_CPP_FINAL=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
@@ -1555,6 +1558,7 @@ DEP_CPP_FINAL=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
@@ -1681,6 +1685,7 @@ DEP_CPP_TYPD_=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        ".\include\gc_typed.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
@@ -1704,6 +1709,7 @@ DEP_CPP_TYPD_=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        ".\include\gc_typed.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
@@ -1735,6 +1741,7 @@ DEP_CPP_PTR_C=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
@@ -1757,6 +1764,7 @@ DEP_CPP_PTR_C=\
        ".\include\private\gc_hdrs.h"\
        ".\include\private\gc_pmark.h"\
        ".\include\gc_mark.h"\
+       ".\include\gc_disclaim.h"\
        ".\include\private\gc_priv.h"\
        {$(INCLUDE)}"\sys\TYPES.H"\
 
index d179c0084bd3aa2ef67bee1901d694597f736708..098a73ed5f00ae47b0f8a53ef255d5071ee776fa 100644 (file)
  *
  */
 
-// FIXME: Add this file to that many scripts we have (see, e.g., gc_mark.h
-// as a reference).
-
 #ifndef GC_DISCLAIM_H
 #define GC_DISCLAIM_H
 
 #include "gc.h"
 
+/* Type of a disclaim call-back, always stored along with closure data  */
+/* passed as the second argument.                                       */
+typedef int (GC_CALLBACK * GC_disclaim_proc)(void *obj, void *cd);
+
 /* Register "proc" to be called on each object of "kind" ready to be    */
 /* reclaimed.  If "proc" returns non-zero, the collector will not       */
 /* reclaim the object on this GC cycle.  Objects reachable from "proc"  */
 /* will be protected from collection if "mark_from_all" is non-zero,    */
 /* but at the expense that long chains of objects will take many cycles */
 /* to reclaim.                                                          */
-// FIXME: declare type for callback, use GC_CALBACK
-// FIXME: comment out all parameter names
-void GC_register_disclaim_proc(int kind,
-                               int (*proc)(void *obj, void *cd), void *cd,
-                               int mark_from_all);
+GC_API void GC_register_disclaim_proc(int /* kind */,
+                                      GC_disclaim_proc /*proc*/, void * /*cd*/,
+                                      int /* mark_from_all */);
 
 /* The finalizer closure used by GC_finalized_malloc.                   */
 struct GC_finalizer_closure {
-    void (*proc)(void *obj, void *cd); // FIXME: use typedef
+    GC_finalization_proc proc;
     void *cd;
 };
 
index fa40630ec785de75b3eb06cb54abd9e194129bf0..50ac3ad88a84f55e0c826363e80179e288d6c709 100644 (file)
@@ -17,6 +17,7 @@ pkginclude_HEADERS += \
         include/gc_typed.h \
         include/gc_inline.h \
         include/gc_mark.h \
+        include/gc_disclaim.h \
         include/gc_cpp.h \
         include/weakpointer.h \
         include/new_gc_alloc.h \
@@ -29,12 +30,6 @@ pkginclude_HEADERS += \
         include/gc_tiny_fl.h \
         include/gc_version.h
 
-if ENABLE_DISCLAIM
-# FIXME: all include headers must be in pkginclude_HEADERS inconditionally
-pkginclude_HEADERS += include/gc_disclaim.h
-endif
-EXTRA_DIST += include/gc_disclaim.h
-
 # headers which are not installed
 #
 dist_noinst_HEADERS += \
index 0f3fb3fa04ded61c5c73be98f3755a7934ae5d11..fce894ac3eb745da683a421895ee81158a8febb9 100644 (file)
@@ -1237,7 +1237,7 @@ GC_EXTERN struct obj_kind {
                         /* Mark from all, including unmarked, objects   */
                         /* in block.  Used to protect objects reachable */
                         /* from reclaim notifiers.                      */
-     int (*ok_disclaim_proc)(void *obj, void *cd); // FIXME: GC_CALLBACK
+     int (GC_CALLBACK *ok_disclaim_proc)(void *obj, void *cd);
      void *ok_disclaim_cd;
                         /* The disclaim procedure is called before obj  */
                         /* is reclaimed, but must also tolerate being   */
@@ -2053,6 +2053,10 @@ GC_EXTERN signed_word GC_bytes_found;
   GC_EXTERN ptr_t * GC_gcjobjfreelist;
 #endif
 
+#ifdef ENABLE_DISCLAIM
+  GC_EXTERN ptr_t * GC_finalized_objfreelist;
+#endif
+
 #if defined(GWW_VDB) && defined(MPROTECT_VDB)
   GC_INNER GC_bool GC_gww_dirty_init(void);
   /* Defined in os_dep.c.  Returns TRUE if GetWriteWatch is available.  */
index ad790a2821672f37285460fe5f10aeb720e9fe93..809fff559df9a2625c66a574030d17e34a5edce7 100644 (file)
@@ -73,6 +73,9 @@ typedef struct thread_local_freelists {
 #   define ERROR_FL ((void *)(word)-1)
         /* Value used for gcj_freelist[-1]; allocation is       */
         /* erroneous.                                           */
+# endif
+# ifdef ENABLE_DISCLAIM
+    void * finalized_freelists[TINY_FREELISTS];
 # endif
   /* Free lists contain either a pointer or a small count       */
   /* reflecting the number of granules allocated at that        */
@@ -88,9 +91,6 @@ typedef struct thread_local_freelists {
 # define DIRECT_GRANULES (HBLKSIZE/GRANULE_BYTES)
         /* Don't use local free lists for up to this much       */
         /* allocation.                                          */
-# ifdef ENABLE_DISCLAIM
-    void * finalized_freelists[TINY_FREELISTS];
-# endif
 } *GC_tlfs;
 
 #if defined(USE_PTHREAD_SPECIFIC)
diff --git a/misc.c b/misc.c
index 10bf1c97bc57ea8c74ab790063c064b303c1e361..c29d2097558be3b571a360246d3616a4dc73ba82 100644 (file)
--- a/misc.c
+++ b/misc.c
 
 #include "private/gc_pmark.h"
 
+#ifdef ENABLE_DISCLAIM
+#  include "gc_disclaim.h"
+#endif
+
 #include <stdio.h>
 #include <limits.h>
 #include <stdarg.h>
@@ -1514,6 +1518,17 @@ GC_API unsigned GC_CALL GC_new_proc(GC_mark_proc proc)
     return result;
 }
 
+#ifdef ENABLE_DISCLAIM
+GC_API void GC_CALL GC_register_disclaim_proc(int kind,
+                                              GC_disclaim_proc proc, void *cd,
+                                              int mark_unconditionally)
+{
+    GC_obj_kinds[kind].ok_disclaim_proc = proc;
+    GC_obj_kinds[kind].ok_disclaim_cd = cd;
+    GC_obj_kinds[kind].ok_mark_unconditionally = mark_unconditionally;
+}
+#endif
+
 GC_API void * GC_CALL GC_call_with_stack_base(GC_stack_base_func fn, void *arg)
 {
     int dummy;
index f009c2a3df1966829c0fbe1598cedb901c1c9ffa..4b2eda295413568a347d505220452e7a14ec4d4a 100644 (file)
--- a/reclaim.c
+++ b/reclaim.c
@@ -16,7 +16,9 @@
 
 #include "private/gc_priv.h"
 
-#include "gc_disclaim.h" // FIXME: add ifdef
+#ifdef ENABLE_DISCLAIM
+#  include "gc_disclaim.h"
+#endif
 
 #include <stdio.h>
 
@@ -218,8 +220,8 @@ STATIC ptr_t GC_reclaim_uninit(struct hblk *hbp, hdr *hhdr, size_t sz,
   STATIC ptr_t GC_disclaim_and_reclaim(struct hblk *hbp, hdr *hhdr, size_t sz,
                                        ptr_t list, signed_word *count)
   {
-    register int bit_no = 0; // FIXME: remove register
-    register word *p, *q, *plim;
+    int bit_no = 0;
+    word *p, *q, *plim;
     signed_word n_bytes_found = 0;
     struct obj_kind *ok = &GC_obj_kinds[hhdr->hb_obj_kind];
     int (*proc)(void *, void *) = ok -> ok_disclaim_proc;
index ea7ca094dfe5b0ecc5e7249c51f0211717148380..2bdcaac8e93c73beb4fc67d2420f9259736462c9 100644 (file)
@@ -84,18 +84,15 @@ int main(int argc, char **argv)
     GC_INIT();
     GC_init_finalized_malloc();
 
-    /* Seed with time for distict usage patterns over repeated runs. */
-    srand48(time(NULL)); // FIXME: not available on some targets
-
     keep_arr = GC_MALLOC(sizeof(void *)*KEEP_CNT);
 
     if (argc == 1) {
         char *buf = GC_MALLOC(strlen(argv[0]) + 3);
         printf("\t\t\tfin. ratio       time/s    time/fin.\n");
+        fflush(stdout);
         for (i = 0; i < 3; ++i) {
             int st;
-            sprintf(buf, "%s %d", argv[0], i); // FIXME: Use snprintf
-                                    //FIXME: snprintf not available on WinCE
+            sprintf(buf, "%s %d", argv[0], i);
             st = system(buf); // FIXME: is this available on all targets?
             if (st != 0)
                 return st;
@@ -113,22 +110,21 @@ int main(int argc, char **argv)
     model = atoi(argv[1]);
     if (model < 0 || model > 2)
         exit(2);
-    t = -clock(); // FIXME: not available on some targets?
-                  // FIXME: don't use '-' on probably unsigned type
+    t = -(double)clock();
     for (i = 0; i < ALLOC_CNT; ++i) {
-        int k = lrand48() % KEEP_CNT; // FIXME: not available on some targets
+        int k = rand() % KEEP_CNT;
         keep_arr[k] = testobj_new(model);
     }
 
     GC_gcollect();
 
-    t += clock(); // FIXME: not available on some targets?
-    t /= CLOCKS_PER_SEC; // FIXME: not available on some targets
+    t += clock();
+    t /= CLOCKS_PER_SEC;
     if (model < 2)
         printf("%20s: %12.4lf %12lg %12lg\n", model_str[model],
                free_count/(double)ALLOC_CNT, t, t/free_count);
     else
-        printf("%20s:            0 %12lg          N/A\n", // FIXME: Use \t
-               model_str[model], t);
+        printf("%20s: %12.4lf %12lg %12s\n",
+               model_str[model], 0.0, t, "N/A");
     return 0;
 }
index 00fad7c6d6604d9a57df14ed87c647a0260ebd2d..4bd4a1d2cf665a3da2ad7cfc17e922099eaac845 100644 (file)
@@ -32,8 +32,7 @@ struct pair_s {
     pair_t cdr;
 };
 
-void
-pair_dct(void *obj, void *cd)
+void pair_dct(void *obj, void *cd)
 {
     pair_t p = obj;
     int checksum;
@@ -144,9 +143,7 @@ int main(void)
 #if THREAD_CNT > 1
     printf("Threaded disclaim test.\n");
     for (i = 0; i < THREAD_CNT; ++i) {
-        // FIXME: this is not available on Win32 without pthreads
-        // FIXME: Should GC_ suffix be used?
-        int err = pthread_create(&th[i], NULL, test, NULL);
+        int err = GC_pthread_create(&th[i], NULL, test, NULL);
         if (err) {
             fprintf(stderr, "Failed to create thread # %d: %s\n", i,
                     strerror(err));
@@ -154,9 +151,12 @@ int main(void)
         }
     }
     for (i = 0; i < THREAD_CNT; ++i) {
-        // FIXME: Should GC_ suffix be used?
-        // FIXME: Check error code.
-        pthread_join(th[i], NULL);
+        int err = GC_pthread_join(th[i], NULL);
+        if (err) {
+            fprintf(stderr, "Failed to join thread # %d: %s\n", i,
+                    strerror(err));
+            exit(69);
+        }
     }
 #else
     printf("Unthreaded disclaim test.\n");
index 57b344439627bd06ecebe451de08dd69272dd7be..c5e8f66d11299480f75997b11db12fccdcb570a6 100644 (file)
@@ -129,6 +129,10 @@ GC_INNER void GC_destroy_thread_local(GC_tlfs p)
 #   ifdef GC_GCJ_SUPPORT
         return_freelists(p -> gcj_freelists, (void **)GC_gcjobjfreelist);
 #   endif
+#   ifdef ENABLE_DISCLAIM
+        return_freelists(p -> finalized_freelists,
+                         (void **)GC_finalized_objfreelist);
+#   endif
 }
 
 #ifdef GC_ASSERTIONS
@@ -290,7 +294,7 @@ GC_INNER void GC_mark_thread_local_fls_for(GC_tlfs p)
         q = p -> finalized_freelists[j];
         if ((word)q > HBLKSIZE)
           GC_set_fl_marks(q);
-#     endif
+#     endif /* ENABLE_DISCLAIM */
     }
 }
 
@@ -314,7 +318,7 @@ GC_INNER void GC_mark_thread_local_fls_for(GC_tlfs p)
             q = p -> finalized_freelists[j];
             if ((word)q > HBLKSIZE)
               GC_check_fl_marks(q);
-#         endif
+#         endif /* ENABLE_DISCLAIM */
         }
     }
 #endif /* GC_ASSERTIONS */
index b27867a8953a5d9fc5c75b26c771b6185195d579..9237e20ed7b6a99ed66f755d680363ad8e6bec43 100644 (file)
@@ -253,6 +253,10 @@ SOURCE=..\..\include\gc_mark.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\gc_disclaim.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\private\gc_pmark.h
 # End Source File
 # Begin Source File
index ea2b5d9eb8e96cb10c9bc6918eee0db16b981bfa..d1e36f4ffa19a5f934752e3ead395d528f3d5052 100644 (file)
             <File
                 RelativePath="..\..\include\gc_mark.h">
             </File>
+            <File
+                RelativePath="..\..\include\gc_disclaim.h">
+            </File>
             <File
                 RelativePath="..\..\include\private\gc_pmark.h">
             </File>
index dc61c6e8f6413c052e9c81cbb094e9e759e0c194..6598990bf374b07b3d18c7e9645d3bc99535b80a 100644 (file)
             <File
                 RelativePath="..\..\include\gc_mark.h">
             </File>
+            <File
+                RelativePath="..\..\include\gc_disclaim.h">
+            </File>
             <File
                 RelativePath="..\..\include\private\gc_pmark.h">
             </File>