package container import ( "context" "sync" ) // attachContext is the context used for attach calls. type attachContext struct { mu sync.Mutex ctx context.Context cancelFunc context.CancelFunc } // init returns the context for attach calls. It creates a new context // if no context is created yet. func (ac *attachContext) init() context.Context { ac.mu.Lock() defer ac.mu.Unlock() if ac.ctx == nil { ac.ctx, ac.cancelFunc = context.WithCancel(context.Background()) } return ac.ctx } // cancelFunc cancels the attachContext. All attach calls should detach // after this call. func (ac *attachContext) cancel() { ac.mu.Lock() if ac.ctx != nil { ac.cancelFunc() ac.ctx = nil } ac.mu.Unlock() }