summaryrefslogtreecommitdiff
path: root/dbg_mlc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2012-11-07 21:00:36 +0400
committerIvan Maidanski <ivmai@mail.ru>2012-11-07 21:00:36 +0400
commit0d19cbbfacdf118b10604ea4bd9fbd1250654f5c (patch)
tree473760e30c93528338148ced262d89843299c405 /dbg_mlc.c
parent2d4cdb8f442e49f7d8b559f2a18d7c08887bbb45 (diff)
downloadbdwgc-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.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/dbg_mlc.c b/dbg_mlc.c
index d98195bb..8ce3387c 100644
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -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));