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
{
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.
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) {
}
}
}
+
+ if(--m->locks < 0)
+ runtime·throw("runtime·unlock: lock count");
}
// One-time notifications.