]> granicus.if.org Git - gc/commitdiff
Set GC_collecting hint for GC_collect_a_little_inner calls (pthreads)
authorIvan Maidanski <ivmai@mail.ru>
Wed, 25 Sep 2019 08:28:41 +0000 (11:28 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 25 Sep 2019 08:28:41 +0000 (11:28 +0300)
* alloc.c (GC_try_to_collect_inner, GC_collect_a_little): Wrap
GC_collect_a_little_inner() call into ENTER/EXIT_GC().
* gc_dlopen.c [!USE_PROC_FOR_LIBRARIES] (disable_gc_for_dlopen):
Likewise.
* malloc.c (GC_alloc_large): Likewise.

alloc.c
gc_dlopen.c
malloc.c

diff --git a/alloc.c b/alloc.c
index 5e3816e94faf46f5dbd28f222c4b2a7e61e1221c..75e71cfbbbdba27faeb273c05dcf6a61f5bb3714 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -534,7 +534,9 @@ GC_INNER GC_bool GC_try_to_collect_inner(GC_stop_func stop_func)
               /* TODO: Notify GC_EVENT_ABANDON */
               return(FALSE);
             }
+            ENTER_GC();
             GC_collect_a_little_inner(1);
+            EXIT_GC();
         }
     }
     GC_notify_full_gc();
@@ -719,7 +721,9 @@ GC_API int GC_CALL GC_collect_a_little(void)
     DCL_LOCK_STATE;
 
     LOCK();
+    ENTER_GC();
     GC_collect_a_little_inner(1);
+    EXIT_GC();
     result = (int)GC_collection_in_progress();
     UNLOCK();
     if (!result && GC_debugging_started) GC_print_all_smashed();
index 0da82278600480c90f0d3d607909fab1543f86dc..13991bae6db88da2f97d7da720da5bd4598523dc 100644 (file)
@@ -46,7 +46,9 @@
     DCL_LOCK_STATE;
     LOCK();
     while (GC_incremental && GC_collection_in_progress()) {
+      ENTER_GC();
       GC_collect_a_little_inner(1000);
+      EXIT_GC();
     }
     ++GC_dont_gc;
     UNLOCK();
index 7e35ee8b08cd40fa2f525d7486c77fea5c06cd53..c2e879524f6a5ea7388769d385a9693dfc187e62 100644 (file)
--- a/malloc.c
+++ b/malloc.c
@@ -52,8 +52,11 @@ GC_INNER ptr_t GC_alloc_large(size_t lb, int k, unsigned flags)
       LOCK();
     }
     /* Do our share of marking work */
-        if (GC_incremental && !GC_dont_gc)
+        if (GC_incremental && !GC_dont_gc) {
+            ENTER_GC();
             GC_collect_a_little_inner((int)n_blocks);
+            EXIT_GC();
+        }
     h = GC_allochblk(lb, k, flags);
 #   ifdef USE_MUNMAP
         if (0 == h) {