// WithProcessClosing returns a context.Context derived from ctx that // is cancelled as p is Closing (after: <-p.Closing()). It is simply: // // func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Context { // ctx, cancel := context.WithCancel(ctx) // go func() { // <-p.Closing() // cancel() // }() // return ctx // } // func WithProcessClosing(ctx context.Context, p goprocess.Process) context.Context { ctx, cancel := context.WithCancel(ctx) go func() { <-p.Closing() cancel() }() return ctx }
// CloseAfterContext schedules the process to close after the given // context is done. It is the equivalent of: // // func CloseAfterContext(p goprocess.Process, ctx context.Context) { // go func() { // <-ctx.Done() // p.Close() // }() // } // func CloseAfterContext(p goprocess.Process, ctx context.Context) { if p == nil { panic("nil Process") } if ctx == nil { panic("nil Context") } // context.Background(). if ctx.Done() is nil, it will never be done. // we check for this to avoid wasting a goroutine forever. if ctx.Done() == nil { return } go func() { <-ctx.Done() p.Close() }() }
// WaitForContext makes p WaitFor ctx. When Closing, p waits for // ctx.Done(), before being Closed(). It is simply: // // p.WaitFor(goprocess.WithContext(ctx)) // func WaitForContext(ctx context.Context, p goprocess.Process) { p.WaitFor(WithContext(ctx)) }