pkg/util/disposer.go (26 lines of code) (raw):

package util import "sync" type Disposer struct { disposables []func() lock *sync.Mutex } func NewDisposer() *Disposer { return &Disposer{lock: &sync.Mutex{}} } func (t *Disposer) Dispose() { t.lock.Lock() defer t.lock.Unlock() disposables := t.disposables if disposables == nil { return } t.disposables = nil for _, closeListener := range disposables { closeListener() } } func (t *Disposer) Add(disposable func()) { t.lock.Lock() defer t.lock.Unlock() t.disposables = append(t.disposables, disposable) }