in ctxtool/osctx/osctx.go [47:69]
func WithSignal(parent unison.Canceler, sigs ...os.Signal) (context.Context, context.CancelFunc) {
ctx, cancel := context.WithCancel(ctxtool.FromCanceller(parent))
ch := make(chan os.Signal, 1)
go func() {
defer func() {
signal.Stop(ch)
cancel()
}()
select {
case <-ctx.Done():
return
case <-ch:
cancel()
// force shutdown in case we receive another signal
<-ch
os.Exit(3)
}
}()
signal.Notify(ch, sigs...)
return ctx, cancel
}