From: Dmitriy Vyukov Date: Wed, 15 May 2013 12:48:41 +0000 (+0400) Subject: runtime: unset m->locks after actual lock unlock X-Git-Tag: go1.2rc2~1505 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=764bb36ea2be3fd9c04a0a485524a75241c21b8a;p=gostls13.git 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 --- diff --git a/src/pkg/runtime/lock_futex.c b/src/pkg/runtime/lock_futex.c index 3c2ef4ede0..d20b63c329 100644 --- a/src/pkg/runtime/lock_futex.c +++ b/src/pkg/runtime/lock_futex.c @@ -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. diff --git a/src/pkg/runtime/lock_sema.c b/src/pkg/runtime/lock_sema.c index ec4b15a98a..80674e8a5e 100644 --- a/src/pkg/runtime/lock_sema.c +++ b/src/pkg/runtime/lock_sema.c @@ -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.