diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | Makefile.direct | 9 | ||||
-rw-r--r-- | Makefile.dj | 6 | ||||
-rw-r--r-- | NT_MAKEFILE | 2 | ||||
-rw-r--r-- | NT_STATIC_THREADS_MAKEFILE | 2 | ||||
-rw-r--r-- | NT_X64_STATIC_THREADS_MAKEFILE | 2 | ||||
-rw-r--r-- | NT_X64_THREADS_MAKEFILE | 2 | ||||
-rw-r--r-- | finalized_mlc.c (renamed from disclaim.c) | 60 | ||||
-rw-r--r-- | gc.mak | 8 | ||||
-rw-r--r-- | include/gc_disclaim.h | 17 | ||||
-rw-r--r-- | include/include.am | 7 | ||||
-rw-r--r-- | include/private/gc_priv.h | 6 | ||||
-rw-r--r-- | include/private/thread_local_alloc.h | 6 | ||||
-rw-r--r-- | misc.c | 15 | ||||
-rw-r--r-- | reclaim.c | 8 | ||||
-rw-r--r-- | tests/disclaim_bench.c | 20 | ||||
-rw-r--r-- | tests/disclaim_test.c | 16 | ||||
-rw-r--r-- | thread_local_alloc.c | 8 | ||||
-rw-r--r-- | windows-untested/vc60/gc.dsp | 4 | ||||
-rw-r--r-- | windows-untested/vc70/gc.vcproj | 3 | ||||
-rw-r--r-- | windows-untested/vc71/gc.vcproj | 3 |
21 files changed, 109 insertions, 97 deletions
diff --git a/Makefile.am b/Makefile.am index aac9d235..31f097f3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/Makefile.direct b/Makefile.direct index 0cf9426c..c8371584 100644 --- a/Makefile.direct +++ b/Makefile.direct @@ -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 \ diff --git a/Makefile.dj b/Makefile.dj index 4fcf9a5f..754b6444 100644 --- a/Makefile.dj +++ b/Makefile.dj @@ -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 \ diff --git a/NT_MAKEFILE b/NT_MAKEFILE index a0ba4bc0..38f7275e 100644 --- a/NT_MAKEFILE +++ b/NT_MAKEFILE @@ -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) diff --git a/NT_STATIC_THREADS_MAKEFILE b/NT_STATIC_THREADS_MAKEFILE index 0907a8de..ffff3cf2 100644 --- a/NT_STATIC_THREADS_MAKEFILE +++ b/NT_STATIC_THREADS_MAKEFILE @@ -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) diff --git a/NT_X64_STATIC_THREADS_MAKEFILE b/NT_X64_STATIC_THREADS_MAKEFILE index 70dbd600..045c3eeb 100644 --- a/NT_X64_STATIC_THREADS_MAKEFILE +++ b/NT_X64_STATIC_THREADS_MAKEFILE @@ -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) diff --git a/NT_X64_THREADS_MAKEFILE b/NT_X64_THREADS_MAKEFILE index 49be4dad..967b18ff 100644 --- a/NT_X64_THREADS_MAKEFILE +++ b/NT_X64_THREADS_MAKEFILE @@ -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 diff --git a/disclaim.c b/finalized_mlc.c index 1a639133..41ca9cdb 100644 --- a/disclaim.c +++ b/finalized_mlc.c @@ -12,41 +12,22 @@ * */ -// 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 */ @@ -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"\ diff --git a/include/gc_disclaim.h b/include/gc_disclaim.h index d179c008..098a73ed 100644 --- a/include/gc_disclaim.h +++ b/include/gc_disclaim.h @@ -12,29 +12,28 @@ * */ -// 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; }; diff --git a/include/include.am b/include/include.am index fa40630e..50ac3ad8 100644 --- a/include/include.am +++ b/include/include.am @@ -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 += \ diff --git a/include/private/gc_priv.h b/include/private/gc_priv.h index 0f3fb3fa..fce894ac 100644 --- a/include/private/gc_priv.h +++ b/include/private/gc_priv.h @@ -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. */ diff --git a/include/private/thread_local_alloc.h b/include/private/thread_local_alloc.h index ad790a28..809fff55 100644 --- a/include/private/thread_local_alloc.h +++ b/include/private/thread_local_alloc.h @@ -74,6 +74,9 @@ typedef struct thread_local_freelists { /* 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 */ /* size. */ @@ -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) @@ -15,6 +15,10 @@ #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; @@ -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; diff --git a/tests/disclaim_bench.c b/tests/disclaim_bench.c index ea7ca094..2bdcaac8 100644 --- a/tests/disclaim_bench.c +++ b/tests/disclaim_bench.c @@ -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; } diff --git a/tests/disclaim_test.c b/tests/disclaim_test.c index 00fad7c6..4bd4a1d2 100644 --- a/tests/disclaim_test.c +++ b/tests/disclaim_test.c @@ -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"); diff --git a/thread_local_alloc.c b/thread_local_alloc.c index 57b34443..c5e8f66d 100644 --- a/thread_local_alloc.c +++ b/thread_local_alloc.c @@ -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 */ diff --git a/windows-untested/vc60/gc.dsp b/windows-untested/vc60/gc.dsp index b27867a8..9237e20e 100644 --- a/windows-untested/vc60/gc.dsp +++ b/windows-untested/vc60/gc.dsp @@ -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 diff --git a/windows-untested/vc70/gc.vcproj b/windows-untested/vc70/gc.vcproj index ea2b5d9e..d1e36f4f 100644 --- a/windows-untested/vc70/gc.vcproj +++ b/windows-untested/vc70/gc.vcproj @@ -271,6 +271,9 @@ RelativePath="..\..\include\gc_mark.h"> </File> <File + RelativePath="..\..\include\gc_disclaim.h"> + </File> + <File RelativePath="..\..\include\private\gc_pmark.h"> </File> <File diff --git a/windows-untested/vc71/gc.vcproj b/windows-untested/vc71/gc.vcproj index dc61c6e8..6598990b 100644 --- a/windows-untested/vc71/gc.vcproj +++ b/windows-untested/vc71/gc.vcproj @@ -753,6 +753,9 @@ RelativePath="..\..\include\gc_mark.h"> </File> <File + RelativePath="..\..\include\gc_disclaim.h"> + </File> + <File RelativePath="..\..\include\private\gc_pmark.h"> </File> <File |