unix: add PthreadSigmask for Linux
Add a syscall wrapper for SYS_RT_SIGPROCMASK and export it as
PthreadSigmask. The latter is defined by POSIX and can therefore
be implemented by Darwin, etc. later on.
Follow the approach used by Signalfd of passing _C__NSIG/8 as
sigsetsize. This avoids exporting _C__NSIG and allows the syscall
to work with the current definition of Sigset_t, which doesn't
match the kernel definition of Sigset_t.
Updates golang/go#55349
Change-Id: I49dc93366a7d316d820b0c25ecdef2ebb584634b
Reviewed-on: https://go-review.googlesource.com/c/sys/+/435095
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go
index 4714691..583ff00 100644
--- a/unix/syscall_linux.go
+++ b/unix/syscall_linux.go
@@ -2368,6 +2368,16 @@
return prev, nil
}
+//sysnb rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) (err error) = SYS_RT_SIGPROCMASK
+
+func PthreadSigmask(how int, set, oldset *Sigset_t) error {
+ if oldset != nil {
+ // Explicitly clear in case Sigset_t is larger than _C__NSIG.
+ *oldset = Sigset_t{}
+ }
+ return rtSigprocmask(how, set, oldset, _C__NSIG/8)
+}
+
/*
* Unimplemented
*/
@@ -2426,7 +2436,6 @@
// RestartSyscall
// RtSigaction
// RtSigpending
-// RtSigprocmask
// RtSigqueueinfo
// RtSigreturn
// RtSigsuspend
diff --git a/unix/zsyscall_linux.go b/unix/zsyscall_linux.go
index bc4a275..293cf36 100644
--- a/unix/zsyscall_linux.go
+++ b/unix/zsyscall_linux.go
@@ -2151,3 +2151,13 @@
}
return
}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func rtSigprocmask(how int, set *Sigset_t, oldset *Sigset_t, sigsetsize uintptr) (err error) {
+ _, _, e1 := RawSyscall6(SYS_RT_SIGPROCMASK, uintptr(how), uintptr(unsafe.Pointer(set)), uintptr(unsafe.Pointer(oldset)), uintptr(sigsetsize), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}