summaryrefslogtreecommitdiff
path: root/src/pkg/os/signal/signal.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/os/signal/signal.go')
-rw-r--r--src/pkg/os/signal/signal.go131
1 files changed, 0 insertions, 131 deletions
diff --git a/src/pkg/os/signal/signal.go b/src/pkg/os/signal/signal.go
deleted file mode 100644
index 300427549..000000000
--- a/src/pkg/os/signal/signal.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package signal implements access to incoming signals.
-package signal
-
-// BUG(rsc): This package is not yet implemented on Plan 9.
-
-import (
- "os"
- "sync"
-)
-
-var handlers struct {
- sync.Mutex
- m map[chan<- os.Signal]*handler
- ref [numSig]int64
-}
-
-type handler struct {
- mask [(numSig + 31) / 32]uint32
-}
-
-func (h *handler) want(sig int) bool {
- return (h.mask[sig/32]>>uint(sig&31))&1 != 0
-}
-
-func (h *handler) set(sig int) {
- h.mask[sig/32] |= 1 << uint(sig&31)
-}
-
-// 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.
-//
-// Package signal will not block sending to c: the caller must ensure
-// that c has sufficient buffer space to keep up with the expected
-// signal rate. For a channel used for notification of just one signal value,
-// a buffer of size 1 is sufficient.
-//
-// It is allowed to call Notify multiple times with the same channel:
-// each call expands the set of signals sent to that channel.
-// The only way to remove signals from the set is to call Stop.
-//
-// It is allowed to call Notify multiple times with different channels
-// and the same signals: each channel receives copies of incoming
-// signals independently.
-func Notify(c chan<- os.Signal, sig ...os.Signal) {
- if c == nil {
- panic("os/signal: Notify using nil channel")
- }
-
- handlers.Lock()
- defer handlers.Unlock()
-
- h := handlers.m[c]
- if h == nil {
- if handlers.m == nil {
- handlers.m = make(map[chan<- os.Signal]*handler)
- }
- h = new(handler)
- handlers.m[c] = h
- }
-
- add := func(n int) {
- if n < 0 {
- return
- }
- if !h.want(n) {
- h.set(n)
- if handlers.ref[n] == 0 {
- enableSignal(n)
- }
- handlers.ref[n]++
- }
- }
-
- if len(sig) == 0 {
- for n := 0; n < numSig; n++ {
- add(n)
- }
- } else {
- for _, s := range sig {
- add(signum(s))
- }
- }
-}
-
-// 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.
-func Stop(c chan<- os.Signal) {
- handlers.Lock()
- defer handlers.Unlock()
-
- h := handlers.m[c]
- if h == nil {
- return
- }
- delete(handlers.m, c)
-
- for n := 0; n < numSig; n++ {
- if h.want(n) {
- handlers.ref[n]--
- if handlers.ref[n] == 0 {
- disableSignal(n)
- }
- }
- }
-}
-
-func process(sig os.Signal) {
- n := signum(sig)
- if n < 0 {
- return
- }
-
- handlers.Lock()
- defer handlers.Unlock()
-
- for c, h := range handlers.m {
- if h.want(n) {
- // send but do not block for it
- select {
- case c <- sig:
- default:
- }
- }
- }
-}