summaryrefslogtreecommitdiff
path: root/libgo/go/os/signal/signal.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/os/signal/signal.go')
-rw-r--r--libgo/go/os/signal/signal.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/libgo/go/os/signal/signal.go b/libgo/go/os/signal/signal.go
index a0eba0d50fb..136dd9cc97f 100644
--- a/libgo/go/os/signal/signal.go
+++ b/libgo/go/os/signal/signal.go
@@ -92,6 +92,15 @@ func Ignored(sig os.Signal) bool {
return sn >= 0 && signalIgnored(sn)
}
+var (
+ // watchSignalLoopOnce guards calling the conditionally
+ // initialized watchSignalLoop. If watchSignalLoop is non-nil,
+ // it will be run in a goroutine lazily once Notify is invoked.
+ // See Issue 21576.
+ watchSignalLoopOnce sync.Once
+ watchSignalLoop func()
+)
+
// Notify causes package signal to relay incoming signals to c.
// If no signals are provided, all incoming signals will be relayed to c.
// Otherwise, just the provided signals will.
@@ -113,6 +122,12 @@ func Notify(c chan<- os.Signal, sig ...os.Signal) {
panic("os/signal: Notify using nil channel")
}
+ watchSignalLoopOnce.Do(func() {
+ if watchSignalLoop != nil {
+ go watchSignalLoop()
+ }
+ })
+
handlers.Lock()
defer handlers.Unlock()