| 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() |
| } |