aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/proc.c
diff options
context:
space:
mode:
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)
{