Commit 764bb36e authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: unset m->locks after actual lock unlock

This is needed for preemptive scheduler,
it will preempt only when m->locks==0,
and we do not want to be preempted while
we have not completely unlocked the lock.

R=golang-dev, khr, iant
CC=golang-dev
https://golang.org/cl/9196047
parent e69012ce
......@@ -91,14 +91,14 @@ runtime·unlock(Lock *l)
{
uint32 v;
if(--m->locks < 0)
runtime·throw("runtime·unlock: lock count");
v = runtime·xchg((uint32*)&l->key, MUTEX_UNLOCKED);
if(v == MUTEX_UNLOCKED)
runtime·throw("unlock of unlocked lock");
if(v == MUTEX_SLEEPING)
runtime·futexwakeup((uint32*)&l->key, 1);
if(--m->locks < 0)
runtime·throw("runtime·unlock: lock count");
}
// One-time notifications.
......
......@@ -93,9 +93,6 @@ runtime·unlock(Lock *l)
uintptr v;
M *mp;
if(--m->locks < 0)
runtime·throw("runtime·unlock: lock count");
for(;;) {
v = (uintptr)runtime·atomicloadp((void**)&l->key);
if(v == LOCKED) {
......@@ -112,6 +109,9 @@ runtime·unlock(Lock *l)
}
}
}
if(--m->locks < 0)
runtime·throw("runtime·unlock: lock count");
}
// One-time notifications.
......
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