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