37 lines
493 B
Go
37 lines
493 B
Go
package missinggo
|
|
|
|
import "sync"
|
|
|
|
type ChanCond struct {
|
|
mu sync.Mutex
|
|
ch chan struct{}
|
|
}
|
|
|
|
func (me *ChanCond) Wait() <-chan struct{} {
|
|
me.mu.Lock()
|
|
defer me.mu.Unlock()
|
|
if me.ch == nil {
|
|
me.ch = make(chan struct{})
|
|
}
|
|
return me.ch
|
|
}
|
|
|
|
func (me *ChanCond) Signal() {
|
|
me.mu.Lock()
|
|
defer me.mu.Unlock()
|
|
select {
|
|
case me.ch <- struct{}{}:
|
|
default:
|
|
}
|
|
}
|
|
|
|
func (me *ChanCond) Broadcast() {
|
|
me.mu.Lock()
|
|
defer me.mu.Unlock()
|
|
if me.ch == nil {
|
|
return
|
|
}
|
|
close(me.ch)
|
|
me.ch = nil
|
|
}
|