summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorZach Saw <zach.saw@gmail.com>2012-11-20 09:46:33 +1100
committerZach Saw <zach.saw@gmail.com>2012-11-20 09:46:33 +1100
commit4ed40ef35b13e8c38bd5aff584ac89e2e8c5ee14 (patch)
treed420a0601a2d5b03434267eb0d2ced5df9f7163e /finalize.c
parent4b32351b4cf42052fba46e9c99d0011720ec17a6 (diff)
downloadbdwgc-4ed40ef35b13e8c38bd5aff584ac89e2e8c5ee14.tar.gz
Added GC_LONG_REFS_NOT_NEEDED ifdefs to exclude long link
functionality and other minor changes. * finalize.c (GC_push_finalizer_structures, GC_register_long_link, GC_unregister_long_link, GC_move_long_link, GC_finalize): GC_LONG_REFS_NOT_NEEDED ifdefs to exclude long link functionality. * finalize.c (GC_dump_finalization_links, GC_register_disappearing_link_inner, GC_move_disappearing_link_inner): Changed from GC_INLINE to STATIC function declaration. * include/gc.h: use 2 spaces as a sentence delimiter in comment added in previous commit.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c94
1 files changed, 62 insertions, 32 deletions
diff --git a/finalize.c b/finalize.c
index 6d5f26e2..bd03b888 100644
--- a/finalize.c
+++ b/finalize.c
@@ -48,8 +48,11 @@ STATIC struct dl_hashtbl_s {
struct disappearing_link **head;
signed_word log_size;
word entries;
-} GC_dl_hashtbl = { /* head */ NULL, /* log_size */ -1, /* entries */ 0},
- GC_ll_hashtbl = { /* head */ NULL, /* log_size */ -1, /* entries */ 0};
+} GC_dl_hashtbl = { /* head */ NULL, /* log_size */ -1, /* entries */ 0}
+#ifndef GC_LONG_REFS_NOT_NEEDED
+ , GC_ll_hashtbl = { /* head */ NULL, /* log_size */ -1, /* entries */ 0}
+#endif /* !GC_LONG_REFS_NOT_NEEDED */
+;
STATIC struct finalizable_object {
struct hash_chain_entry prolog;
@@ -73,14 +76,17 @@ static signed_word log_fo_table_size = -1;
GC_INNER void GC_push_finalizer_structures(void)
{
GC_ASSERT((word)&GC_dl_hashtbl.head % sizeof(word) == 0);
- GC_ASSERT((word)&GC_ll_hashtbl.head % sizeof(word) == 0);
GC_ASSERT((word)&GC_fo_head % sizeof(word) == 0);
GC_ASSERT((word)&GC_finalize_now % sizeof(word) == 0);
- GC_push_all((ptr_t)(&GC_dl_hashtbl.head),
- (ptr_t)(&GC_dl_hashtbl.head) + sizeof(word));
+#ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_ASSERT((word)&GC_ll_hashtbl.head % sizeof(word) == 0);
GC_push_all((ptr_t)(&GC_ll_hashtbl.head),
(ptr_t)(&GC_ll_hashtbl.head) + sizeof(word));
+#endif /* !GC_LONG_REFS_NOT_NEEDED */
+
+ GC_push_all((ptr_t)(&GC_dl_hashtbl.head),
+ (ptr_t)(&GC_dl_hashtbl.head) + sizeof(word));
GC_push_all((ptr_t)(&GC_fo_head), (ptr_t)(&GC_fo_head) + sizeof(word));
GC_push_all((ptr_t)(&GC_finalize_now),
(ptr_t)(&GC_finalize_now) + sizeof(word));
@@ -138,7 +144,7 @@ GC_API int GC_CALL GC_register_disappearing_link(void * * link)
return(GC_general_register_disappearing_link(link, base));
}
-GC_INLINE int GC_register_disappearing_link_inner(
+STATIC int GC_register_disappearing_link_inner(
struct dl_hashtbl_s *dl_hashtbl, void **link,
const void *obj)
{
@@ -210,13 +216,6 @@ GC_API int GC_CALL GC_general_register_disappearing_link(void * * link,
return GC_register_disappearing_link_inner(&GC_dl_hashtbl, link, obj);
}
-GC_API int GC_CALL GC_register_long_link(void * * link, const void * obj)
-{
- if (((word)link & (ALIGNMENT-1)) != 0 || NULL == link)
- ABORT("Bad arg to GC_register_long_link");
- return GC_register_disappearing_link_inner(&GC_ll_hashtbl, link, obj);
-}
-
#ifdef DBG_HDRS_ALL
# define FREE_DL_ENTRY(curr_dl) dl_set_next(curr_dl, NULL)
#else
@@ -264,6 +263,14 @@ GC_API int GC_CALL GC_unregister_disappearing_link(void * * link)
return 1;
}
+#ifndef GC_LONG_REFS_NOT_NEEDED
+GC_API int GC_CALL GC_register_long_link(void * * link, const void * obj)
+{
+ if (((word)link & (ALIGNMENT-1)) != 0 || NULL == link)
+ ABORT("Bad arg to GC_register_long_link");
+ return GC_register_disappearing_link_inner(&GC_ll_hashtbl, link, obj);
+}
+
GC_API int GC_CALL GC_unregister_long_link(void * * link)
{
struct disappearing_link *curr_dl;
@@ -278,10 +285,11 @@ GC_API int GC_CALL GC_unregister_long_link(void * * link)
FREE_DL_ENTRY(curr_dl);
return 1;
}
+#endif /* !GC_LONG_REFS_NOT_NEEDED */
#ifndef GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED
/* Moves a link. Assume the lock is held. */
- GC_INLINE int GC_move_disappearing_link_inner(
+ STATIC int GC_move_disappearing_link_inner(
struct dl_hashtbl_s *dl_hashtbl,
void **link, void **new_link)
{
@@ -348,21 +356,24 @@ GC_API int GC_CALL GC_unregister_long_link(void * * link)
return result;
}
- GC_API int GC_CALL GC_move_long_link(void **link, void **new_link)
- {
- int result;
- DCL_LOCK_STATE;
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_API int GC_CALL GC_move_long_link(void **link, void **new_link)
+ {
+ int result;
+ DCL_LOCK_STATE;
- if (((word)new_link & (ALIGNMENT-1)) != 0 || new_link == NULL)
- ABORT("Bad new_link arg to GC_move_disappearing_link");
- if (((word)link & (ALIGNMENT-1)) != 0)
- return GC_NOT_FOUND; /* Nothing to do. */
+ if (((word)new_link & (ALIGNMENT-1)) != 0 || new_link == NULL)
+ ABORT("Bad new_link arg to GC_move_disappearing_link");
+ if (((word)link & (ALIGNMENT-1)) != 0)
+ return GC_NOT_FOUND; /* Nothing to do. */
+
+ LOCK();
+ result = GC_move_disappearing_link_inner(&GC_ll_hashtbl, link, new_link);
+ UNLOCK();
+ return result;
+ }
+# endif /* !GC_LONG_REFS_NOT_NEEDED */
- LOCK();
- result = GC_move_disappearing_link_inner(&GC_ll_hashtbl, link, new_link);
- UNLOCK();
- return result;
- }
#endif /* !GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED */
/* Possible finalization_marker procedures. Note that mark stack */
@@ -580,7 +591,7 @@ GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj,
}
#ifndef NO_DEBUGGING
- GC_INLINE void GC_dump_finalization_links(struct dl_hashtbl_s* dl_hashtbl)
+ STATIC void GC_dump_finalization_links(struct dl_hashtbl_s* dl_hashtbl)
{
struct disappearing_link * curr_dl;
ptr_t real_ptr, real_link;
@@ -607,8 +618,10 @@ GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj,
GC_printf("Disappearing short links:\n");
GC_dump_finalization_links(&GC_dl_hashtbl);
+#ifndef GC_LONG_REFS_NOT_NEEDED
GC_printf("Disappearing long links:\n");
GC_dump_finalization_links(&GC_ll_hashtbl);
+#endif /* !GC_LONG_REFS_NOT_NEEDED */
GC_printf("Finalizers:\n");
for (i = 0; i < fo_size; i++) {
for (curr_fo = GC_fo_head[i]; curr_fo != 0;
@@ -729,7 +742,9 @@ GC_INNER void GC_finalize(void)
# ifndef SMALL_CONFIG
/* Save current GC_[dl/ll]_entries value for stats printing */
GC_old_dl_entries = GC_dl_hashtbl.entries;
- GC_old_ll_entries = GC_ll_hashtbl.entries;
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_old_ll_entries = GC_ll_hashtbl.entries;
+# endif /* !GC_LONG_REFS_NOT_NEEDED */
# endif
GC_make_disappearing_links_disappear(&GC_dl_hashtbl);
@@ -841,10 +856,12 @@ GC_INNER void GC_finalize(void)
}
}
- GC_make_disappearing_links_disappear(&GC_ll_hashtbl);
-
GC_remove_dangling_disappearing_links(&GC_dl_hashtbl);
- GC_remove_dangling_disappearing_links(&GC_ll_hashtbl);
+
+# ifndef GC_LONG_REFS_NOT_NEEDED
+ GC_make_disappearing_links_disappear(&GC_ll_hashtbl);
+ GC_remove_dangling_disappearing_links(&GC_ll_hashtbl);
+# endif /* !GC_LONG_REFS_NOT_NEEDED */
if (GC_fail_count) {
/* Don't prevent running finalizers if there has been an allocation */
@@ -1069,6 +1086,7 @@ GC_INNER void GC_notify_or_invoke_finalizers(void)
struct finalizable_object *fo = GC_finalize_now;
unsigned long ready = 0;
+# ifndef GC_LONG_REFS_NOT_NEEDED
GC_log_printf(
"%lu finalization table entries; "
"%lu short/%lu long disappearing links alive\n",
@@ -1081,6 +1099,18 @@ GC_INNER void GC_notify_or_invoke_finalizers(void)
ready,
(long)GC_old_dl_entries - (long)GC_dl_hashtbl.entries,
(long)GC_old_ll_entries - (long)GC_ll_hashtbl.entries);
+# else /* GC_LONG_REFS_NOT_NEEDED */
+ GC_log_printf(
+ "%lu finalization table entries; "
+ "%lu disappearing links alive\n",
+ (unsigned long)GC_fo_entries,
+ (unsigned long)GC_dl_hashtbl.entries);
+ for (; 0 != fo; fo = fo_next(fo)) ++ready;
+ GC_log_printf("%lu objects are ready for finalization; "
+ "%ld links cleared\n",
+ ready,
+ (long)GC_old_dl_entries - (long)GC_dl_hashtbl.entries);
+# endif /* !GC_LONG_REFS_NOT_NEEDED */
}
#endif /* !SMALL_CONFIG */