Prevent multiple 'Caught ACCESS_VIOLATION in marker' per collection
authorIvan Maidanski <ivmai@mail.ru>
Thu, 20 Apr 2017 21:22:10 +0000 (00:22 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 20 Apr 2017 21:22:10 +0000 (00:22 +0300)
* mark.c [WRAP_MARK_SOME] (GC_mark_some): Do not call WARN() about
ACCESS_VIOLATION more than once per garbage collection.

mark.c

diff --git a/mark.c b/mark.c
index 4d7670c..52914a7 100644 (file)
--- a/mark.c
+++ b/mark.c
@@ -590,9 +590,16 @@ static void alloc_mark_stack(size_t);
 
 handle_ex:
     /* Exception handler starts here for all cases. */
-      WARN("Caught ACCESS_VIOLATION in marker;"
-           " memory mapping disappeared\n", 0);
-
+      {
+        static word warned_gc_no;
+
+        /* Warn about it at most once per collection. */
+        if (warned_gc_no != GC_gc_no) {
+          warned_gc_no = GC_gc_no;
+          WARN("Caught ACCESS_VIOLATION in marker;"
+               " memory mapping disappeared\n", 0);
+        }
+      }
       /* We have bad roots on the stack.  Discard mark stack.   */
       /* Rescan from marked objects.  Redetermine roots.        */
       GC_invalidate_mark_state();