@@ -202,7 +202,10 @@ func sigenable(sig uint32) {
202
202
enableSigChan <- sig
203
203
<- maskUpdatedChan
204
204
if atomic .Cas (& handlingSig [sig ], 0 , 1 ) {
205
- atomic .Storeuintptr (& fwdSig [sig ], getsig (sig ))
205
+ h := getsig (sig )
206
+ if h != _SIG_IGN {
207
+ atomic .Storeuintptr (& fwdSig [sig ], h )
208
+ }
206
209
setsig (sig , abi .FuncPCABIInternal (sighandler ))
207
210
}
208
211
}
@@ -211,14 +214,14 @@ func sigenable(sig uint32) {
211
214
// sigdisable disables the Go signal handler for the signal sig.
212
215
// It is only called while holding the os/signal.handlers lock,
213
216
// via os/signal.disableSignal and signal_disable.
214
- func sigdisable (sig uint32 ) {
217
+ func sigdisable (sig uint32 ) bool {
215
218
if sig >= uint32 (len (sigtable )) {
216
- return
219
+ return false
217
220
}
218
221
219
222
// SIGPROF is handled specially for profiling.
220
223
if sig == _SIGPROF {
221
- return
224
+ return false
222
225
}
223
226
224
227
t := & sigtable [sig ]
@@ -230,11 +233,23 @@ func sigdisable(sig uint32) {
230
233
// If initsig does not install a signal handler for a
231
234
// signal, then to go back to the state before Notify
232
235
// we should remove the one we installed.
233
- if ! sigInstallGoHandler (sig ) {
236
+ if sigInstallGoHandler (sig ) {
237
+ if atomic .Cas (& handlingSig [sig ], 0 , 1 ) {
238
+ h := getsig (sig )
239
+ if h != _SIG_IGN && h != _SIG_DFL {
240
+ atomic .Storeuintptr (& fwdSig [sig ], h )
241
+ }
242
+ setsig (sig , abi .FuncPCABIInternal (sighandler ))
243
+ }
244
+ return false
245
+ } else {
234
246
atomic .Store (& handlingSig [sig ], 0 )
235
- setsig (sig , atomic .Loaduintptr (& fwdSig [sig ]))
247
+ fs := atomic .Loaduintptr (& fwdSig [sig ])
248
+ setsig (sig , fs )
249
+ return fs == _SIG_IGN
236
250
}
237
251
}
252
+ return false
238
253
}
239
254
240
255
// sigignore ignores the signal sig.
0 commit comments