Commit 03986896 by Ian Lance Taylor

libgo: Adjust deadlock avoidance.

From-SVN: r169120
parent 2e8e58aa
......@@ -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 ();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment