github.com/nektos/act@v0.2.83/pkg/common/context.go (about) 1 package common 2 3 import ( 4 "context" 5 "os" 6 "os/signal" 7 "syscall" 8 ) 9 10 func createGracefulJobCancellationContext() (context.Context, func(), chan os.Signal) { 11 ctx := context.Background() 12 ctx, forceCancel := context.WithCancel(ctx) 13 cancelCtx, cancel := context.WithCancel(ctx) 14 ctx = WithJobCancelContext(ctx, cancelCtx) 15 16 // trap Ctrl+C and call cancel on the context 17 c := make(chan os.Signal, 1) 18 signal.Notify(c, os.Interrupt, syscall.SIGTERM) 19 go func() { 20 select { 21 case sig := <-c: 22 if sig == os.Interrupt { 23 cancel() 24 select { 25 case <-c: 26 forceCancel() 27 case <-ctx.Done(): 28 } 29 } else { 30 forceCancel() 31 } 32 case <-ctx.Done(): 33 } 34 }() 35 return ctx, func() { 36 signal.Stop(c) 37 forceCancel() 38 cancel() 39 }, c 40 } 41 42 func CreateGracefulJobCancellationContext() (context.Context, func()) { 43 ctx, cancel, _ := createGracefulJobCancellationContext() 44 return ctx, cancel 45 }