| 12345678910111213141516171819202122232425262728293031323334 |
- package chansync
- import (
- "github.com/anacrolix/chansync/events"
- "github.com/anacrolix/sync"
- )
- // Can be used as zero-value. Due to the caller needing to bring their own synchronization, an
- // equivalent to "sync".Cond.Signal is not provided. BroadcastCond is intended to be selected on
- // with other channels.
- type BroadcastCond struct {
- mu sync.Mutex
- ch chan struct{}
- }
- func (me *BroadcastCond) Broadcast() {
- me.mu.Lock()
- defer me.mu.Unlock()
- if me.ch != nil {
- close(me.ch)
- me.ch = nil
- }
- }
- // Should be called before releasing locks on resources that might trigger subsequent Broadcasts.
- // The channel is closed when the condition changes.
- func (me *BroadcastCond) Signaled() events.Signaled {
- me.mu.Lock()
- defer me.mu.Unlock()
- if me.ch == nil {
- me.ch = make(chan struct{})
- }
- return me.ch
- }
|