converger: Wait till the timer exits
Wait till the timer loop exits, otherwise we might race and panic if ConvergedTimer gets called after we've asked for an exit, but before it does.
This commit is contained in:
@@ -81,6 +81,7 @@ type convergerUID struct {
|
|||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
timer chan struct{}
|
timer chan struct{}
|
||||||
running bool // is the above timer running?
|
running bool // is the above timer running?
|
||||||
|
wg sync.WaitGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConverger builds a new converger struct
|
// NewConverger builds a new converger struct
|
||||||
@@ -335,7 +336,9 @@ func (obj *convergerUID) StartTimer() (func() error, error) {
|
|||||||
return obj.StopTimer, fmt.Errorf("Timer already started!")
|
return obj.StopTimer, fmt.Errorf("Timer already started!")
|
||||||
}
|
}
|
||||||
obj.mutex.Unlock()
|
obj.mutex.Unlock()
|
||||||
|
obj.wg.Add(1)
|
||||||
go func() {
|
go func() {
|
||||||
|
defer obj.wg.Done()
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case _, ok := <-obj.timer: // reset signal channel
|
case _, ok := <-obj.timer: // reset signal channel
|
||||||
@@ -377,6 +380,7 @@ func (obj *convergerUID) StopTimer() error {
|
|||||||
return fmt.Errorf("Timer isn't running!")
|
return fmt.Errorf("Timer isn't running!")
|
||||||
}
|
}
|
||||||
close(obj.timer)
|
close(obj.timer)
|
||||||
|
obj.wg.Wait()
|
||||||
obj.running = false
|
obj.running = false
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user