...
Source file
src/runtime/sigqueue_plan9.go
Documentation: runtime
1
2
3
4
5
6
7 package runtime
8
9 import _ "unsafe"
10
11 const qsize = 64
12
13 var sig struct {
14 q noteQueue
15 inuse bool
16
17 lock mutex
18 note note
19 sleeping bool
20 }
21
22 type noteData struct {
23 s [_ERRMAX]byte
24 n int
25 }
26
27 type noteQueue struct {
28 lock mutex
29 data [qsize]noteData
30 ri int
31 wi int
32 full bool
33 }
34
35
36 func (q *noteQueue) push(item *byte) bool {
37 lock(&q.lock)
38 if q.full {
39 unlock(&q.lock)
40 return false
41 }
42 s := gostringnocopy(item)
43 copy(q.data[q.wi].s[:], s)
44 q.data[q.wi].n = len(s)
45 q.wi++
46 if q.wi == qsize {
47 q.wi = 0
48 }
49 if q.wi == q.ri {
50 q.full = true
51 }
52 unlock(&q.lock)
53 return true
54 }
55
56 func (q *noteQueue) pop() string {
57 lock(&q.lock)
58 q.full = false
59 if q.ri == q.wi {
60 unlock(&q.lock)
61 return ""
62 }
63 note := &q.data[q.ri]
64 item := string(note.s[:note.n])
65 q.ri++
66 if q.ri == qsize {
67 q.ri = 0
68 }
69 unlock(&q.lock)
70 return item
71 }
72
73
74
75 func sendNote(s *byte) bool {
76 if !sig.inuse {
77 return false
78 }
79
80
81 if !sig.q.push(s) {
82 return false
83 }
84
85 lock(&sig.lock)
86 if sig.sleeping {
87 sig.sleeping = false
88 notewakeup(&sig.note)
89 }
90 unlock(&sig.lock)
91
92 return true
93 }
94
95
96
97
98
99 func signal_recv() string {
100 for {
101 note := sig.q.pop()
102 if note != "" {
103 return note
104 }
105
106 lock(&sig.lock)
107 sig.sleeping = true
108 noteclear(&sig.note)
109 unlock(&sig.lock)
110 notetsleepg(&sig.note, -1)
111 }
112 }
113
114
115
116
117
118
119
120
121
122
123 func signalWaitUntilIdle() {
124 for {
125 lock(&sig.lock)
126 sleeping := sig.sleeping
127 unlock(&sig.lock)
128 if sleeping {
129 return
130 }
131 Gosched()
132 }
133 }
134
135
136
137
138 func signal_enable(s uint32) {
139 if !sig.inuse {
140
141 sig.inuse = true
142 noteclear(&sig.note)
143 }
144 }
145
146
147
148
149 func signal_disable(s uint32) {
150 }
151
152
153
154
155 func signal_ignore(s uint32) {
156 }
157
158
159 func signal_ignored(s uint32) bool {
160 return false
161 }
162
View as plain text