summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--Makefile.direct9
-rw-r--r--Makefile.dj6
-rw-r--r--NT_MAKEFILE2
-rw-r--r--NT_STATIC_THREADS_MAKEFILE2
-rw-r--r--NT_X64_STATIC_THREADS_MAKEFILE2
-rw-r--r--NT_X64_THREADS_MAKEFILE2
-rw-r--r--finalized_mlc.c (renamed from disclaim.c)60
-rw-r--r--gc.mak8
-rw-r--r--include/gc_disclaim.h17
-rw-r--r--include/include.am7
-rw-r--r--include/private/gc_priv.h6
-rw-r--r--include/private/thread_local_alloc.h6
-rw-r--r--misc.c15
-rw-r--r--reclaim.c8
-rw-r--r--tests/disclaim_bench.c20
-rw-r--r--tests/disclaim_test.c16
-rw-r--r--thread_local_alloc.c8
-rw-r--r--windows-untested/vc60/gc.dsp4
-rw-r--r--windows-untested/vc70/gc.vcproj3
-rw-r--r--windows-untested/vc71/gc.vcproj3
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 */
diff --git a/gc.mak b/gc.mak
index 6e3f53ef..445a736d 100644
--- 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"\
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)
diff --git a/misc.c b/misc.c
index 10bf1c97..c29d2097 100644
--- a/misc.c
+++ b/misc.c
@@ -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;
diff --git a/reclaim.c b/reclaim.c
index f009c2a3..4b2eda29 100644
--- 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;
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