Commit 47ba04ab by Ian Lance Taylor

Avoid crash when M structure free just before thread exit.

From-SVN: r169121
parent 03986896
...@@ -94,6 +94,13 @@ remove_current_thread (void) ...@@ -94,6 +94,13 @@ remove_current_thread (void)
runtime_MCache_ReleaseAll (mcache); runtime_MCache_ReleaseAll (mcache);
/* As soon as we release this look, a GC could run. Since this
thread is no longer on the list, the GC will not find our M
structure, so it could get freed at any time. That means that
any code from here to thread exit must not assume that the m is
valid. */
m = NULL;
i = pthread_mutex_unlock (&__go_thread_ids_lock); i = pthread_mutex_unlock (&__go_thread_ids_lock);
__go_assert (i == 0); __go_assert (i == 0);
......
...@@ -38,9 +38,11 @@ runtime_lock_full(Lock *l) ...@@ -38,9 +38,11 @@ runtime_lock_full(Lock *l)
void void
runtime_lock(Lock *l) runtime_lock(Lock *l)
{ {
if(m->locks < 0) if(m != nil) {
runtime_throw("lock count"); if(m->locks < 0)
m->locks++; runtime_throw("lock count");
m->locks++;
}
if(runtime_xadd(&l->key, 1) > 1) // someone else has it; wait if(runtime_xadd(&l->key, 1) > 1) // someone else has it; wait
runtime_lock_full(l); runtime_lock_full(l);
...@@ -58,9 +60,11 @@ runtime_unlock_full(Lock *l) ...@@ -58,9 +60,11 @@ runtime_unlock_full(Lock *l)
void void
runtime_unlock(Lock *l) runtime_unlock(Lock *l)
{ {
m->locks--; if(m != nil) {
if(m->locks < 0) m->locks--;
runtime_throw("lock count"); if(m->locks < 0)
runtime_throw("lock count");
}
if(runtime_xadd(&l->key, -1) > 0) // someone else is waiting if(runtime_xadd(&l->key, -1) > 0) // someone else is waiting
runtime_unlock_full(l); runtime_unlock_full(l);
......
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