github.com/AndrienkoAleksandr/go@v0.0.19/src/os/signal/signal_linux_test.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build linux 6 7 package signal 8 9 import ( 10 "os" 11 "syscall" 12 "testing" 13 "time" 14 ) 15 16 const prSetKeepCaps = 8 17 18 // This test validates that syscall.AllThreadsSyscall() can reliably 19 // reach all 'm' (threads) of the nocgo runtime even when one thread 20 // is blocked waiting to receive signals from the kernel. This monitors 21 // for a regression vs. the fix for #43149. 22 func TestAllThreadsSyscallSignals(t *testing.T) { 23 if _, _, err := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, prSetKeepCaps, 0, 0); err == syscall.ENOTSUP { 24 t.Skip("AllThreadsSyscall disabled with cgo") 25 } 26 27 sig := make(chan os.Signal, 1) 28 Notify(sig, os.Interrupt) 29 30 for i := 0; i <= 100; i++ { 31 if _, _, errno := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0); errno != 0 { 32 t.Fatalf("[%d] failed to set KEEP_CAPS=%d: %v", i, i&1, errno) 33 } 34 } 35 36 select { 37 case <-time.After(10 * time.Millisecond): 38 case <-sig: 39 t.Fatal("unexpected signal") 40 } 41 Stop(sig) 42 }