From f545b05aaec2d13e664ce48ce2c258bcfce307c4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 4 Sep 2014 15:53:45 -0400 Subject: runtime: make more functions safe for Go Convert no-op race functions. Everything else is tiny and gets NOSPLITs. After this, all that is left on darwin is sysAlloc, panic, and gothrow (all pending). There may be system-specific calls in other builds. LGTM=iant R=golang-codereviews, iant CC=dvyukov, golang-codereviews, khr, r https://golang.org/cl/140240044 --- src/pkg/runtime/proc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/pkg/runtime/proc.c') diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 45ae1bc2a8..0c72e4bd06 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -2534,6 +2534,7 @@ lockOSThread(void) g->lockedm = g->m; } +#pragma textflag NOSPLIT void runtime·LockOSThread(void) { @@ -2541,6 +2542,7 @@ runtime·LockOSThread(void) lockOSThread(); } +#pragma textflag NOSPLIT void runtime·lockOSThread(void) { @@ -2562,6 +2564,7 @@ unlockOSThread(void) g->lockedm = nil; } +#pragma textflag NOSPLIT void runtime·UnlockOSThread(void) { @@ -2569,15 +2572,28 @@ runtime·UnlockOSThread(void) unlockOSThread(); } +static void badunlockOSThread(void); + +#pragma textflag NOSPLIT void runtime·unlockOSThread(void) { - if(g->m->locked < LockInternal) - runtime·throw("runtime: internal error: misuse of lockOSThread/unlockOSThread"); + void (*fn)(void); + + if(g->m->locked < LockInternal) { + fn = badunlockOSThread; + runtime·onM(&fn); + } g->m->locked -= LockInternal; unlockOSThread(); } +static void +badunlockOSThread(void) +{ + runtime·throw("runtime: internal error: misuse of lockOSThread/unlockOSThread"); +} + bool runtime·lockedOSThread(void) { -- cgit v1.3