Avoid crash when M structure free just before thread exit.

From-SVN: r169121
This commit is contained in:
Ian Lance Taylor 2011-01-22 02:59:24 +00:00
parent 039868965d
commit 47ba04ab54
2 changed files with 17 additions and 6 deletions

View File

@ -94,6 +94,13 @@ remove_current_thread (void)
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);
__go_assert (i == 0);

View File

@ -38,9 +38,11 @@ runtime_lock_full(Lock *l)
void
runtime_lock(Lock *l)
{
if(m->locks < 0)
runtime_throw("lock count");
m->locks++;
if(m != nil) {
if(m->locks < 0)
runtime_throw("lock count");
m->locks++;
}
if(runtime_xadd(&l->key, 1) > 1) // someone else has it; wait
runtime_lock_full(l);
@ -58,9 +60,11 @@ runtime_unlock_full(Lock *l)
void
runtime_unlock(Lock *l)
{
m->locks--;
if(m->locks < 0)
runtime_throw("lock count");
if(m != nil) {
m->locks--;
if(m->locks < 0)
runtime_throw("lock count");
}
if(runtime_xadd(&l->key, -1) > 0) // someone else is waiting
runtime_unlock_full(l);