diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2012-11-07 21:00:36 +0400 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2012-11-07 21:00:36 +0400 |
commit | 0d19cbbfacdf118b10604ea4bd9fbd1250654f5c (patch) | |
tree | 473760e30c93528338148ced262d89843299c405 /dbg_mlc.c | |
parent | 2d4cdb8f442e49f7d8b559f2a18d7c08887bbb45 (diff) | |
download | bdwgc-0d19cbbfacdf118b10604ea4bd9fbd1250654f5c.tar.gz |
Fix debug_register_displacement calls from GC_debug_generic_malloc_inner
(fix commit 38965f2)
* dbg_mlc.c (GC_start_debugging_inner): New static routine (move code
from old GC_start_debugging except for GC_register_displacement call
and add assertion on the lock).
* dbg_mlc.c (GC_start_debugging): Invoke GC_start_debugging_inner
holding the lock.
* dbg_mlc.c (GC_debug_register_displacement): Optimize speed (lock
once and use _inner variant of GC_register_displacement).
* dbg_mlc.c (GC_debug_generic_malloc_inner,
GC_debug_generic_malloc_inner_ignore_off_page): Invoke
GC_start_debugging_inner instead of GC_start_debugging (since the lock
is already acquired).
Diffstat (limited to 'dbg_mlc.c')
-rw-r--r-- | dbg_mlc.c | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -436,8 +436,9 @@ STATIC void GC_debug_print_heap_obj_proc(ptr_t p) STATIC void GC_do_nothing(void) {} #endif -GC_INNER void GC_start_debugging(void) +STATIC void GC_start_debugging_inner(void) { + GC_ASSERT(I_HOLD_LOCK()); # ifndef SHORT_DBG_HDRS GC_check_heap = GC_check_heap_proc; GC_print_all_smashed = GC_print_all_smashed_proc; @@ -447,15 +448,28 @@ GC_INNER void GC_start_debugging(void) # endif GC_print_heap_obj = GC_debug_print_heap_obj_proc; GC_debugging_started = TRUE; - GC_register_displacement((word)sizeof(oh)); + GC_register_displacement_inner((word)sizeof(oh)); +} + +GC_INNER void GC_start_debugging(void) +{ + DCL_LOCK_STATE; + + LOCK(); + GC_start_debugging_inner(); + UNLOCK(); } size_t GC_debug_header_size = sizeof(oh); GC_API void GC_CALL GC_debug_register_displacement(size_t offset) { - GC_register_displacement(offset); - GC_register_displacement((word)sizeof(oh) + offset); + DCL_LOCK_STATE; + + LOCK(); + GC_register_displacement_inner(offset); + GC_register_displacement_inner((word)sizeof(oh) + offset); + UNLOCK(); } GC_API void * GC_CALL GC_debug_malloc(size_t lb, GC_EXTRA_PARAMS) @@ -534,7 +548,7 @@ GC_API void * GC_CALL GC_debug_malloc_atomic_ignore_off_page(size_t lb, return(0); } if (!GC_debugging_started) { - GC_start_debugging(); + GC_start_debugging_inner(); } ADD_CALL_CHAIN(result, GC_RETURN_ADDR); return (GC_store_debug_info_inner(result, (word)lb, "INTERNAL", 0)); @@ -552,7 +566,7 @@ GC_API void * GC_CALL GC_debug_malloc_atomic_ignore_off_page(size_t lb, return(0); } if (!GC_debugging_started) { - GC_start_debugging(); + GC_start_debugging_inner(); } ADD_CALL_CHAIN(result, GC_RETURN_ADDR); return (GC_store_debug_info_inner(result, (word)lb, "INTERNAL", 0)); |