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  }