in pkg/sigcontext/sigcontext.go [16:49]
func WithSignalCancel(ctx context.Context, sigs ...os.Signal) (context.Context, context.CancelFunc) {
sigctx, ctxcancel := context.WithCancel(ctx)
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, sigs...)
var once sync.Once
cancel := func() {
ctxcancel()
once.Do(func() {
signal.Stop(sigchan)
close(sigchan)
})
}
// Select on the signals coming in. The caller is required to call their
// provided cancel function to release the signal channel and notificant.
go func() {
for {
select {
case <-sigctx.Done():
ctxcancel()
return
case _, ok := <-sigchan:
if !ok {
continue
}
ctxcancel()
}
}
}()
return sigctx, cancel
}