| 12345678910111213141516171819202122232425262728293031323334 |
- package signal
- import "sync"
- // Notifier is a utility for notifying changes. The change producer may notify changes multiple time, and the consumer may get notified asynchronously.
- type Notifier struct {
- sync.Mutex
- waiters []chan struct{}
- }
- // NewNotifier creates a new Notifier.
- func NewNotifier() *Notifier {
- return &Notifier{}
- }
- // Signal signals a change, usually by producer. This method never blocks.
- func (n *Notifier) Signal() {
- n.Lock()
- for _, w := range n.waiters {
- close(w)
- }
- n.waiters = make([]chan struct{}, 0, 8)
- n.Unlock()
- }
- // Wait returns a channel for waiting for changes. The returned channel never gets closed.
- func (n *Notifier) Wait() <-chan struct{} {
- n.Lock()
- defer n.Unlock()
- w := make(chan struct{})
- n.waiters = append(n.waiters, w)
- return w
- }
|