]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix LockOSThread
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 13 Aug 2013 18:37:04 +0000 (22:37 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Tue, 13 Aug 2013 18:37:04 +0000 (22:37 +0400)
Fixes #6100.

R=golang-dev, dave, bradfitz, rsc
CC=golang-dev
https://golang.org/cl/12703045

src/pkg/runtime/proc.c

index bf941548fce51c1ca95b48388e37dd18c8cf04ec..3b907e7fd1531b884926d7c640f3d372494d961a 100644 (file)
@@ -1871,8 +1871,12 @@ runtime·gomaxprocsfunc(int32 n)
        return ret;
 }
 
+// lockOSThread is called by runtime.LockOSThread and runtime.lockOSThread below
+// after they modify m->locked. Do not allow preemption during this call,
+// or else the m might be different in this function than in the caller.
+#pragma textflag NOSPLIT
 static void
-LockOSThread(void)
+lockOSThread(void)
 {
        m->lockedg = g;
        g->lockedm = m;
@@ -1882,18 +1886,23 @@ void
 runtime·LockOSThread(void)
 {
        m->locked |= LockExternal;
-       LockOSThread();
+       lockOSThread();
 }
 
 void
 runtime·lockOSThread(void)
 {
        m->locked += LockInternal;
-       LockOSThread();
+       lockOSThread();
 }
 
+
+// unlockOSThread is called by runtime.UnlockOSThread and runtime.unlockOSThread below
+// after they update m->locked. Do not allow preemption during this call,
+// or else the m might be in different in this function than in the caller.
+#pragma textflag NOSPLIT
 static void
-UnlockOSThread(void)
+unlockOSThread(void)
 {
        if(m->locked != 0)
                return;
@@ -1905,7 +1914,7 @@ void
 runtime·UnlockOSThread(void)
 {
        m->locked &= ~LockExternal;
-       UnlockOSThread();
+       unlockOSThread();
 }
 
 void
@@ -1914,7 +1923,7 @@ runtime·unlockOSThread(void)
        if(m->locked < LockInternal)
                runtime·throw("runtime: internal error: misuse of lockOSThread/unlockOSThread");
        m->locked -= LockInternal;
-       UnlockOSThread();
+       unlockOSThread();
 }
 
 bool