summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/sigqueue.goc
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/sigqueue.goc')
-rw-r--r--src/pkg/runtime/sigqueue.goc14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/pkg/runtime/sigqueue.goc b/src/pkg/runtime/sigqueue.goc
index 7e083685d..e08bf98aa 100644
--- a/src/pkg/runtime/sigqueue.goc
+++ b/src/pkg/runtime/sigqueue.goc
@@ -28,6 +28,8 @@ package runtime
#include "runtime.h"
#include "defs_GOOS_GOARCH.h"
#include "os_GOOS.h"
+#include "cgocall.h"
+#include "../../cmd/ld/textflag.h"
static struct {
Note;
@@ -105,9 +107,7 @@ func signal_recv() (m uint32) {
new = HASWAITER;
if(runtime·cas(&sig.state, old, new)) {
if (new == HASWAITER) {
- runtime·entersyscallblock();
- runtime·notesleep(&sig);
- runtime·exitsyscall();
+ runtime·notetsleepg(&sig, -1);
runtime·noteclear(&sig);
}
break;
@@ -155,3 +155,11 @@ func signal_disable(s uint32) {
sig.wanted[s/32] &= ~(1U<<(s&31));
runtime·sigdisable(s);
}
+
+// This runs on a foreign stack, without an m or a g. No stack split.
+#pragma textflag NOSPLIT
+void
+runtime·badsignal(uintptr sig)
+{
+ runtime·cgocallback((void (*)(void))runtime·sigsend, &sig, sizeof(sig));
+}