]> granicus.if.org Git - gc/commitdiff
2010-04-16 Ivan Maidanski <ivmai@mail.ru> (mostly really NIIBE Yutaka)
authorivmai <ivmai>
Fri, 16 Apr 2010 08:45:41 +0000 (08:45 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:53 +0000 (21:06 +0400)
* pthread_support.c (GC_mark_thread_local_free_lists,
GC_check_tls): Mark (and check) only for live threads (in case of
GC_destroy_thread_local() is called already but GC_delete_thread()
is not yet).
* win32_threads.c (GC_mark_thread_local_free_lists, GC_check_tls):
Ditto (matters only if GC_PTHREADS defined).

ChangeLog
pthread_support.c
win32_threads.c

index 39ccf2e49240d66ecce9d0e0fc6967cde0595532..ed86a501b7474b2f6a6f7585f9e1bcf0ca4f84cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2010-04-16  Ivan Maidanski <ivmai@mail.ru> (mostly really NIIBE Yutaka)
+
+       * pthread_support.c (GC_mark_thread_local_free_lists,
+       GC_check_tls): Mark (and check) only for live threads (in case of
+       GC_destroy_thread_local() is called already but GC_delete_thread()
+       is not yet).
+       * win32_threads.c (GC_mark_thread_local_free_lists, GC_check_tls):
+       Ditto (matters only if GC_PTHREADS defined).
+
 2010-04-09  Ivan Maidanski <ivmai@mail.ru>
 
        * NT_MAKEFILE: Remove the comment about DLL and Win32S.
index 627a9927a51c6e583c5bc38e4968c3b8fa777bcf..8048a50c7c3d6599b90808989aa6fedf00ec2081 100644 (file)
@@ -227,7 +227,8 @@ GC_INNER void GC_mark_thread_local_free_lists(void)
 
     for (i = 0; i < THREAD_TABLE_SZ; ++i) {
       for (p = GC_threads[i]; 0 != p; p = p -> next) {
-        GC_mark_thread_local_fls_for(&(p->tlfs));
+        if (!(p -> flags & FINISHED))
+          GC_mark_thread_local_fls_for(&(p->tlfs));
       }
     }
 }
@@ -238,7 +239,7 @@ GC_INNER void GC_mark_thread_local_free_lists(void)
       void GC_check_tsd_marks(tsd *key);
 #   endif
     /* Check that all thread-local free-lists are completely marked.    */
-    /* also check that thread-specific-data structures are marked.      */
+    /* Also check that thread-specific-data structures are marked.      */
     void GC_check_tls(void)
     {
         int i;
@@ -246,7 +247,8 @@ GC_INNER void GC_mark_thread_local_free_lists(void)
 
         for (i = 0; i < THREAD_TABLE_SZ; ++i) {
           for (p = GC_threads[i]; 0 != p; p = p -> next) {
-            GC_check_tls_for(&(p->tlfs));
+            if (!(p -> flags & FINISHED))
+              GC_check_tls_for(&(p->tlfs));
           }
         }
 #       if defined(USE_CUSTOM_SPECIFIC)
index 386358256961b0bc9ab9a56d3cefa13dd8fcb32f..7ad84db6f3a3570f9cd755009545c037a7a9d10f 100644 (file)
@@ -2681,10 +2681,12 @@ GC_INNER void GC_init_parallel(void)
 
     for (i = 0; i < THREAD_TABLE_SZ; ++i) {
       for (p = GC_threads[i]; 0 != p; p = p -> tm.next) {
-#       ifdef DEBUG_THREADS
-          GC_printf("Marking thread locals for 0x%x\n", (int)p -> id);
-#       endif
-        GC_mark_thread_local_fls_for(&(p->tlfs));
+        if (!KNOWN_FINISHED(p)) {
+#         ifdef DEBUG_THREADS
+            GC_printf("Marking thread locals for 0x%x\n", (int)p -> id);
+#         endif
+          GC_mark_thread_local_fls_for(&(p->tlfs));
+        }
       }
     }
   }
@@ -2703,7 +2705,8 @@ GC_INNER void GC_init_parallel(void)
 
         for (i = 0; i < THREAD_TABLE_SZ; ++i) {
           for (p = GC_threads[i]; 0 != p; p = p -> tm.next) {
-            GC_check_tls_for(&(p->tlfs));
+            if (!KNOWN_FINISHED(p))
+              GC_check_tls_for(&(p->tlfs));
           }
         }
 #       if defined(USE_CUSTOM_SPECIFIC)