go/mqtt/internal/background.go (33 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. package internal import ( "context" "sync" ) // Background is an abstraction the concept of a long-running backround process, // which contexts may need to tie to. type Background struct { err error done chan struct{} close func() } func NewBackground(err error) *Background { done := make(chan struct{}) return &Background{err, done, sync.OnceFunc(func() { close(done) })} } func (b *Background) With( ctx context.Context, ) (context.Context, context.CancelFunc) { c, cancel := context.WithCancelCause(ctx) go func() { select { case <-b.done: cancel(b.err) case <-c.Done(): } }() return c, func() { cancel(context.Canceled) } } func (b *Background) Close() { b.close() } func (b *Background) Done() <-chan struct{} { return b.done }