diff options
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) { |
