Commit 4961483e authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: fix LockOSThread

Fixes #6100.

R=golang-dev, dave, bradfitz, rsc
CC=golang-dev
https://golang.org/cl/12703045
parent f9066fe1
......@@ -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
......
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