func WithSignalCancel()

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
}