From 3a3edb8fc045d7a7de9f0f212dd28938fb04dc53 Mon Sep 17 00:00:00 2001 From: leongross Date: Tue, 8 Oct 2024 15:47:33 +0200 Subject: [PATCH] signals: improve waitForEvents Signed-off-by: leongross --- src/runtime/runtime_unix.go | 54 ++++++++++++++++++++++++++++++++-- src/runtime/signal.c | 58 +++++++++++++++++++++++++++++++++---- 2 files changed, 104 insertions(+), 8 deletions(-) diff --git a/src/runtime/runtime_unix.go b/src/runtime/runtime_unix.go index 7b7a51f2ad..47e42a702f 100644 --- a/src/runtime/runtime_unix.go +++ b/src/runtime/runtime_unix.go @@ -17,6 +17,11 @@ func usleep(usec uint) int //export pause func pause() int32 +// int sigsuspend(const sigset_t *mask); +// +//export sigsuspend +func sigsuspend(sigset_t unsafe.Pointer) int32 + // void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); // Note: off_t is defined as int64 because: // - musl (used on Linux) always defines it as int64 @@ -341,6 +346,12 @@ var hasSignals uint32 // signals into this value. var receivedSignals uint32 +// Bitmap keeping track of enabled signals. +var activeSignals uint32 + +// Bitmap keeping track of masked/disabled signals. +var maskedSignals uint32 + //go:linkname signal_enable os/signal.signal_enable func signal_enable(s uint32) { if s >= 32 { @@ -349,6 +360,10 @@ func signal_enable(s uint32) { runtimePanicAt(returnAddress(0), "unsupported signal number") } atomic.StoreUint32(&hasSignals, 1) + + // update the enabled signals bitmap + val := atomic.LoadUint32(&activeSignals) + atomic.CompareAndSwapUint32(&receivedSignals, val, val|(1<