diff options
Diffstat (limited to 'llgo/third_party/gofrontend/libgo/go/os/signal/signal.go')
| -rw-r--r-- | llgo/third_party/gofrontend/libgo/go/os/signal/signal.go | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/llgo/third_party/gofrontend/libgo/go/os/signal/signal.go b/llgo/third_party/gofrontend/libgo/go/os/signal/signal.go index 30042754953..1625786d490 100644 --- a/llgo/third_party/gofrontend/libgo/go/os/signal/signal.go +++ b/llgo/third_party/gofrontend/libgo/go/os/signal/signal.go @@ -5,8 +5,6 @@ // Package signal implements access to incoming signals. package signal -// BUG(rsc): This package is not yet implemented on Plan 9. - import ( "os" "sync" @@ -30,9 +28,55 @@ func (h *handler) set(sig int) { h.mask[sig/32] |= 1 << uint(sig&31) } +func (h *handler) clear(sig int) { + h.mask[sig/32] &^= 1 << uint(sig&31) +} + +// Stop relaying the signals, sigs, to any channels previously registered to +// receive them and either reset the signal handlers to their original values +// (action=disableSignal) or ignore the signals (action=ignoreSignal). +func cancel(sigs []os.Signal, action func(int)) { + handlers.Lock() + defer handlers.Unlock() + + remove := func(n int) { + var zerohandler handler + + for c, h := range handlers.m { + if h.want(n) { + handlers.ref[n]-- + h.clear(n) + if h.mask == zerohandler.mask { + delete(handlers.m, c) + } + } + } + + action(n) + } + + if len(sigs) == 0 { + for n := 0; n < numSig; n++ { + remove(n) + } + } else { + for _, s := range sigs { + remove(signum(s)) + } + } +} + +// Ignore causes the provided signals to be ignored. If they are received by +// the program, nothing will happen. Ignore undoes the effect of any prior +// calls to Notify for the provided signals. +// If no signals are provided, all incoming signals will be ignored. +func Ignore(sig ...os.Signal) { + cancel(sig, ignoreSignal) +} + // Notify causes package signal to relay incoming signals to c. -// If no signals are listed, all incoming signals will be relayed to c. -// Otherwise, just the listed signals will. +// If no signals are provided, all incoming signals will be relayed to c. +// Otherwise, just the provided signals will. // // Package signal will not block sending to c: the caller must ensure // that c has sufficient buffer space to keep up with the expected @@ -87,6 +131,13 @@ func Notify(c chan<- os.Signal, sig ...os.Signal) { } } +// Reset undoes the effect of any prior calls to Notify for the provided +// signals. +// If no signals are provided, all signal handlers will be reset. +func Reset(sig ...os.Signal) { + cancel(sig, disableSignal) +} + // Stop causes package signal to stop relaying incoming signals to c. // It undoes the effect of all prior calls to Notify using c. // When Stop returns, it is guaranteed that c will receive no more signals. |

