From 7017bd93d4cc2c6498850a2d54995bdd7c878430 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Sun, 29 Jan 2023 12:00:47 +0300 Subject: Export setter and getter for pointer checking print procedures Direct access to GC_same_obj_print_proc, GC_is_visible_print_proc and GC_is_valid_displacement_print_proc is now deprecated. * include/gc/gc.h (GC_same_obj_print_proc, GC_is_valid_displacement_print_proc, GC_is_visible_print_proc): Move the declaration upper (to be right after GC_get_finalizer_notifier); improve comment; add GC_ATTR_DEPRECATED attribute. * include/gc/gc.h (GC_valid_ptr_print_proc_t, GC_same_obj_print_proc_t): New public type. * include/gc/gc.h (GC_same_obj_print_proc): Use GC_same_obj_print_proc_t type. * ptr_chck.c (GC_same_obj_print_proc): Likewise. * include/gc/gc.h (GC_is_valid_displacement_print_proc, GC_is_visible_print_proc): Use GC_valid_ptr_print_proc_t type. * ptr_chck.c (GC_is_valid_displacement_print_proc, GC_is_visible_print_proc): Likewise. * include/gc/gc.h (GC_set_same_obj_print_proc, GC_get_same_obj_print_proc, GC_set_is_valid_displacement_print_proc, GC_get_is_valid_displacement_print_proc, GC_set_is_visible_print_proc, GC_get_is_visible_print_proc): New public function declaration. * ptr_chck.c (GC_set_same_obj_print_proc, GC_get_same_obj_print_proc, GC_set_is_valid_displacement_print_proc, GC_get_is_valid_displacement_print_proc, GC_set_is_visible_print_proc, GC_get_is_visible_print_proc): New function definition. * tests/gctest.c [!DBG_HDRS_ALL] (set_print_procs): Use GC_set_is_valid_displacement_print_proc() and GC_set_is_visible_print_proc() instead of setting GC_is_valid_displacement_print_proc and GC_set_is_visible_print_proc variables. * tests/gctest.c [GC_PTHREADS] (main): Call GC_get_is_valid_displacement_print_proc(), GC_get_is_visible_print_proc(), GC_get_same_obj_print_proc() and GC_set_same_obj_print_proc(). --- ptr_chck.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 5 deletions(-) (limited to 'ptr_chck.c') diff --git a/ptr_chck.c b/ptr_chck.c index 25ff4713..d83af110 100644 --- a/ptr_chck.c +++ b/ptr_chck.c @@ -24,8 +24,8 @@ STATIC void GC_CALLBACK GC_default_same_obj_print_proc(void * p, void * q) ": %p and %p are not in the same object", p, q); } -void (GC_CALLBACK *GC_same_obj_print_proc) (void *, void *) - = GC_default_same_obj_print_proc; +GC_same_obj_print_proc_t GC_same_obj_print_proc = + GC_default_same_obj_print_proc; GC_API void * GC_CALL GC_same_obj(void *p, void *q) { @@ -96,8 +96,8 @@ STATIC void GC_CALLBACK GC_default_is_valid_displacement_print_proc(void *p) ABORT_ARG1("GC_is_valid_displacement test failed", ": %p not valid", p); } -void (GC_CALLBACK *GC_is_valid_displacement_print_proc)(void *) = - GC_default_is_valid_displacement_print_proc; +GC_valid_ptr_print_proc_t GC_is_valid_displacement_print_proc = + GC_default_is_valid_displacement_print_proc; GC_API void * GC_CALL GC_is_valid_displacement(void *p) { @@ -140,7 +140,7 @@ STATIC void GC_CALLBACK GC_default_is_visible_print_proc(void * p) ABORT_ARG1("GC_is_visible test failed", ": %p not GC-visible", p); } -void (GC_CALLBACK *GC_is_visible_print_proc)(void * p) = +GC_valid_ptr_print_proc_t GC_is_visible_print_proc = GC_default_is_visible_print_proc; #ifndef THREADS @@ -258,3 +258,68 @@ GC_API void * GC_CALL GC_post_incr(void **p, ptrdiff_t how_much) *p = result; return initial; /* original *p */ } + +GC_API void GC_CALL GC_set_same_obj_print_proc(GC_same_obj_print_proc_t fn) +{ + DCL_LOCK_STATE; + + GC_ASSERT(NONNULL_ARG_NOT_NULL(fn)); + LOCK(); + GC_same_obj_print_proc = fn; + UNLOCK(); +} + +GC_API GC_same_obj_print_proc_t GC_CALL GC_get_same_obj_print_proc(void) +{ + GC_same_obj_print_proc_t fn; + DCL_LOCK_STATE; + + LOCK(); + fn = GC_same_obj_print_proc; + UNLOCK(); + return fn; +} + +GC_API void GC_CALL GC_set_is_valid_displacement_print_proc( + GC_valid_ptr_print_proc_t fn) +{ + DCL_LOCK_STATE; + + GC_ASSERT(NONNULL_ARG_NOT_NULL(fn)); + LOCK(); + GC_is_valid_displacement_print_proc = fn; + UNLOCK(); +} + +GC_API GC_valid_ptr_print_proc_t GC_CALL +GC_get_is_valid_displacement_print_proc(void) +{ + GC_valid_ptr_print_proc_t fn; + DCL_LOCK_STATE; + + LOCK(); + fn = GC_is_valid_displacement_print_proc; + UNLOCK(); + return fn; +} + +GC_API void GC_CALL GC_set_is_visible_print_proc(GC_valid_ptr_print_proc_t fn) +{ + DCL_LOCK_STATE; + + GC_ASSERT(NONNULL_ARG_NOT_NULL(fn)); + LOCK(); + GC_is_visible_print_proc = fn; + UNLOCK(); +} + +GC_API GC_valid_ptr_print_proc_t GC_CALL GC_get_is_visible_print_proc(void) +{ + GC_valid_ptr_print_proc_t fn; + DCL_LOCK_STATE; + + LOCK(); + fn = GC_is_visible_print_proc; + UNLOCK(); + return fn; +} -- cgit v1.2.1