mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 03:50:27 +08:00
libgo: Adjust deadlock avoidance.
From-SVN: r169120
This commit is contained in:
parent
2e8e58aa8a
commit
039868965d
@ -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 ();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user