aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/proc.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-09-04 15:53:45 -0400
committerRuss Cox <rsc@golang.org>2014-09-04 15:53:45 -0400
commitf545b05aaec2d13e664ce48ce2c258bcfce307c4 (patch)
treeb3765343ac5e3089a6bca40974cb6d46d78da013 /src/pkg/runtime/proc.c
parentc08d8834ddf8d69daba989a4ee0b5e144fce973d (diff)
downloadgo-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.c20
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)
{