37 lines
520 B
Go
37 lines
520 B
Go
package util
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type SyncPoint struct {
|
|
synced bool
|
|
wg sync.WaitGroup
|
|
once sync.Once
|
|
callbackWg sync.WaitGroup
|
|
callback func()
|
|
}
|
|
|
|
func NewSyncPoint(n int, callback func()) *SyncPoint {
|
|
s := &SyncPoint{callback: callback}
|
|
s.wg.Add(n)
|
|
s.callbackWg.Add(1)
|
|
return s
|
|
}
|
|
|
|
func (s *SyncPoint) Sync() {
|
|
if s.synced {
|
|
return
|
|
}
|
|
s.wg.Done()
|
|
s.wg.Wait()
|
|
s.once.Do(s.Call)
|
|
s.callbackWg.Wait()
|
|
}
|
|
|
|
func (s *SyncPoint) Call() {
|
|
s.callback()
|
|
s.synced = true
|
|
s.callbackWg.Done()
|
|
}
|