From ee52bf609bac45b3c251858a69071262f46ee89c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 10 Jun 2021 12:37:34 -0700 Subject: libgo: update to Go1.16.5 release Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/326772 --- libgo/go/os/signal/signal_test.go | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'libgo/go/os') diff --git a/libgo/go/os/signal/signal_test.go b/libgo/go/os/signal/signal_test.go index db94756..1f89780 100644 --- a/libgo/go/os/signal/signal_test.go +++ b/libgo/go/os/signal/signal_test.go @@ -15,6 +15,7 @@ import ( "os" "os/exec" "runtime" + "runtime/trace" "strconv" "sync" "syscall" @@ -853,3 +854,44 @@ func TestNotifyContextStringer(t *testing.T) { t.Errorf("c.String() = %q, want %q", got, want) } } + +// #44193 test signal handling while stopping and starting the world. +func TestSignalTrace(t *testing.T) { + done := make(chan struct{}) + quit := make(chan struct{}) + c := make(chan os.Signal, 1) + Notify(c, syscall.SIGHUP) + + // Source and sink for signals busy loop unsynchronized with + // trace starts and stops. We are ultimately validating that + // signals and runtime.(stop|start)TheWorldGC are compatible. + go func() { + defer close(done) + defer Stop(c) + pid := syscall.Getpid() + for { + select { + case <-quit: + return + default: + syscall.Kill(pid, syscall.SIGHUP) + } + waitSig(t, c, syscall.SIGHUP) + } + }() + + for i := 0; i < 100; i++ { + buf := new(bytes.Buffer) + if err := trace.Start(buf); err != nil { + t.Fatalf("[%d] failed to start tracing: %v", i, err) + } + time.After(1 * time.Microsecond) + trace.Stop() + size := buf.Len() + if size == 0 { + t.Fatalf("[%d] trace is empty", i) + } + } + close(quit) + <-done +} -- cgit v1.1