mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-23 00:23:36 +01:00
33 lines
645 B
Go
33 lines
645 B
Go
|
package connection
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
// A Cond is a condition variable like sync.Cond, but using a channel so we can use select.
|
||
|
type Cond struct {
|
||
|
once sync.Once
|
||
|
C chan struct{}
|
||
|
}
|
||
|
|
||
|
// NewCond creates a new condition variable.
|
||
|
func NewCond() *Cond {
|
||
|
return &Cond{C: make(chan struct{})}
|
||
|
}
|
||
|
|
||
|
// Do runs f if the condition hasn't been signaled yet. Afterwards it will be signaled.
|
||
|
func (c *Cond) Do(f func()) {
|
||
|
c.once.Do(func() {
|
||
|
f()
|
||
|
close(c.C)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Signal closes the condition variable channel.
|
||
|
func (c *Cond) Signal() {
|
||
|
c.Do(func() {})
|
||
|
}
|
||
|
|
||
|
// Wait waits for the condition variable channel to close.
|
||
|
func (c *Cond) Wait() {
|
||
|
<-c.C
|
||
|
}
|