OSDN Git Service

libgo: Adjust deadlock avoidance.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2011 02:15:01 +0000 (02:15 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2011 02:15:01 +0000 (02:15 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169120 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/go-go.c

index 7c5f40d..3146268 100644 (file)
@@ -297,6 +297,15 @@ gc_stop_handler (int sig __attribute__ ((unused)))
 {
   struct M *pm = m;
 
+  if (__sync_bool_compare_and_swap (&pm->holds_finlock, 1, 1))
+    {
+      /* We can't interrupt the thread while it holds the finalizer
+        lock.  Otherwise we can get into a deadlock when mark calls
+        runtime_walkfintab.  */
+      __sync_bool_compare_and_swap (&pm->gcing_for_finlock, 0, 1);
+      return;
+    }
+
   if (__sync_bool_compare_and_swap (&pm->mallocing, 1, 1))
     {
       /* m->mallocing was already non-zero.  We can't interrupt the
@@ -315,15 +324,6 @@ gc_stop_handler (int sig __attribute__ ((unused)))
       return;
     }
 
-  if (__sync_bool_compare_and_swap (&pm->holds_finlock, 1, 1))
-    {
-      /* Similarly, we can't interrupt the thread while it holds the
-        finalizer lock.  Otherwise we can get into a deadlock when
-        mark calls runtime_walkfintab.  */
-      __sync_bool_compare_and_swap (&pm->gcing_for_finlock, 0, 1);
-      return;
-    }
-
   stop_for_gc ();
 }