diff options
| author | Russ Cox <rsc@golang.org> | 2014-09-04 15:53:45 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2014-09-04 15:53:45 -0400 |
| commit | f545b05aaec2d13e664ce48ce2c258bcfce307c4 (patch) | |
| tree | b3765343ac5e3089a6bca40974cb6d46d78da013 /src/pkg/runtime/proc.c | |
| parent | c08d8834ddf8d69daba989a4ee0b5e144fce973d (diff) | |
| download | go-f545b05aaec2d13e664ce48ce2c258bcfce307c4.tar.xz | |
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
Diffstat (limited to 'src/pkg/runtime/proc.c')
| -rw-r--r-- | src/pkg/runtime/proc.c | 20 |
1 files changed, 18 insertions, 2 deletions
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) { |
