From 4961483e7d8e0edf5211ab9f92aa010a6f74b59d Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Tue, 13 Aug 2013 22:37:04 +0400 Subject: [PATCH] runtime: fix LockOSThread Fixes #6100. R=golang-dev, dave, bradfitz, rsc CC=golang-dev https://golang.org/cl/12703045 --- src/pkg/runtime/proc.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index bf941548fc..3b907e7fd1 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -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 -- 2.48.1