summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-22 02:15:01 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-22 02:15:01 +0000
commit8bca8171903bad890948539156b038a189040df6 (patch)
tree24a07c8f2c70c351413311e83632aaddce690aba /libgo
parent1f9028c4c2fe1fe8aa79d124de073a03d69b272c (diff)
downloadgcc-8bca8171903bad890948539156b038a189040df6.tar.gz
libgo: Adjust deadlock avoidance.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169120 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/go-go.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/libgo/runtime/go-go.c b/libgo/runtime/go-go.c
index 7c5f40de5ef..31462685afb 100644
--- a/libgo/runtime/go-go.c
+++ b/libgo/runtime/go-go.c
@@ -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 ();
}