]> granicus.if.org Git - gc/commitdiff
Fix data race during apply_to_each_object(reset_back_edge)
authorIvan Maidanski <ivmai@mail.ru>
Tue, 10 Apr 2018 08:07:08 +0000 (11:07 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 18 Apr 2018 08:02:13 +0000 (11:02 +0300)
(back-port of commit 144 from 'release-7_4')

Issue #144 (bdwgc).

* backgraph.c [MAKE_BACK_GRAPH] (GC_print_back_graph_stats): Add
assertion that the allocation lock is held; store GC_deepest_obj to
obj local variable (while holding the lock); place UNLOCK/LOCK around
GC_print_heap_obj() call; pass obj to GC_print_heap_obj(); replace
GC_printf() to GC_err_printf() call to print the header for
GC_print_heap_obj().
* finalize.c [MAKE_BACK_GRAPH] (GC_notify_or_invoke_finalizers): Remove
UNLOCK/LOCK around GC_print_back_graph_stats() call.

backgraph.c
finalize.c

index aaeeb39c00475e443eaa996fd8b9e97539f37b67..96fa7ffa719179718ae792b23f9425cb5a18f49b 100644 (file)
@@ -464,13 +464,19 @@ GC_INNER void GC_traverse_back_graph(void)
 
 void GC_print_back_graph_stats(void)
 {
-  GC_printf("Maximum backwards height of reachable objects at GC %lu is %ld\n",
+  GC_ASSERT(I_HOLD_LOCK());
+  GC_printf("Maximum backwards height of reachable objects at GC %lu is %lu\n",
             (unsigned long) GC_gc_no, (unsigned long)GC_max_height);
   if (GC_max_height > GC_max_max_height) {
+    ptr_t obj = GC_deepest_obj;
+
     GC_max_max_height = GC_max_height;
-    GC_printf("The following unreachable object is last in a longest chain "
-              "of unreachable objects:\n");
-    GC_print_heap_obj(GC_deepest_obj);
+    UNLOCK();
+    GC_err_printf(
+            "The following unreachable object is last in a longest chain "
+            "of unreachable objects:\n");
+    GC_print_heap_obj(obj);
+    LOCK();
   }
   if (GC_print_stats) {
     GC_log_printf("Needed max total of %d back-edge structs\n",
index 857b76b4904860015b2056bffd49d8f233329950..cda1ef2f84111780ab840db62b99b789bd84cd23 100644 (file)
@@ -875,9 +875,7 @@ GC_INNER void GC_notify_or_invoke_finalizers(void)
 #       endif
 #       ifdef MAKE_BACK_GRAPH
           if (GC_print_back_height) {
-            UNLOCK();
             GC_print_back_graph_stats();
-            LOCK();
           }
 #       endif
       }