summaryrefslogtreecommitdiff
path: root/libgo/go/os/signal/signal.go
blob: 666c03e73c4ff87b5900353ffd315cbda8d597af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Copyright 2009 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 operating system-independent signal handling.
package signal

import (
	"runtime"
	"strconv"
)

// A Signal can represent any operating system signal.
type Signal interface {
	String() string
}

type UnixSignal int32

func (sig UnixSignal) String() string {
	s := runtime.Signame(int32(sig))
	if len(s) > 0 {
		return s
	}
	return "Signal " + strconv.Itoa(int(sig))
}

// Incoming is the global signal channel.
// All signals received by the program will be delivered to this channel.
var Incoming <-chan Signal

func process(ch chan<- Signal) {
	for {
		var mask uint32 = runtime.Sigrecv()
		for sig := uint(0); sig < 32; sig++ {
			if mask&(1<<sig) != 0 {
				ch <- UnixSignal(sig)
			}
		}
	}
}

func init() {
	runtime.Siginit()
	ch := make(chan Signal) // Done here so Incoming can have type <-chan Signal
	Incoming = ch
	go process(ch)
}