internal/context/signal_cancel.go (26 lines of code) (raw):

package context import ( "context" "log" "os" "os/signal" ) func WithSignalCancel(ctx context.Context, l *log.Logger, sigs ...os.Signal) ( context.Context, context.CancelFunc) { ctx, cancelFunc := context.WithCancel(ctx) sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, sigs...) go func() { select { case sig := <-sigChan: l.Printf("Cancellation signal (%s) received", sig) cancelFunc() case <-ctx.Done(): } }() f := func() { signal.Stop(sigChan) cancelFunc() } return ctx, f }