diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-03-16 07:13:22 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-03-16 11:07:58 +0300 |
commit | aeebfc0852485d5bcac9643185145dde613e49de (patch) | |
tree | 0a191baa6814992a886bbb1f6475afd859bdd3e7 /finalize.c | |
parent | 673f0cf3f25ad914bd273d50d9973f9dc92ff801 (diff) | |
download | bdwgc-aeebfc0852485d5bcac9643185145dde613e49de.tar.gz |
Assert that disappearing links are accessible during registration and GC
* finalize.c [GC_ASSERTIONS] (GC_register_disappearing_link_inner):
Pass *link to GC_noop1().
* finalize.c [!GC_MOVE_DISAPPEARING_LINK_NOT_NEEDED && GC_ASSERTIONS]
(GC_move_disappearing_link_inner): Pass *new_link to GC_noop1().
* finalize.c [GC_ASSERTIONS] (GC_make_disappearing_links_disappear):
Dereference revealed curr_dl->dl_hidden_link (and pass the value to
GC_noop1); add comment.
Diffstat (limited to 'finalize.c')
-rw-r--r-- | finalize.c | 10 |
1 files changed, 10 insertions, 0 deletions
@@ -168,6 +168,9 @@ STATIC int GC_register_disappearing_link_inner( DCL_LOCK_STATE; if (EXPECT(GC_find_leak, FALSE)) return GC_UNIMPLEMENTED; +# ifdef GC_ASSERTIONS + GC_noop1((word)(*link)); /* check accessibility */ +# endif LOCK(); GC_ASSERT(obj != NULL && GC_base_C(obj) == obj); if (EXPECT(NULL == dl_hashtbl -> head, FALSE) @@ -520,6 +523,9 @@ GC_API GC_await_finalize_proc GC_CALL GC_get_await_finalize_proc(void) size_t curr_index, new_index; word curr_hidden_link, new_hidden_link; +# ifdef GC_ASSERTIONS + GC_noop1((word)(*new_link)); +# endif GC_ASSERT(I_HOLD_LOCK()); if (EXPECT(NULL == dl_hashtbl -> head, FALSE)) return GC_NOT_FOUND; @@ -931,6 +937,10 @@ GC_INLINE void GC_make_disappearing_links_disappear( for (curr_dl = dl_hashtbl->head[i]; curr_dl != NULL; curr_dl = next_dl) { next_dl = dl_next(curr_dl); +# ifdef GC_ASSERTIONS + /* Check accessibility of the location pointed by link. */ + GC_noop1(*(word *)GC_REVEAL_POINTER(curr_dl->dl_hidden_link)); +# endif if (is_remove_dangling) { ptr_t real_link = (ptr_t)GC_base(GC_REVEAL_POINTER( curr_dl->dl_hidden_link)); |