35 lines
896 B
Go
35 lines
896 B
Go
|
package h2mux
|
||
|
|
||
|
// Signal describes an event that can be waited on for at least one signal.
|
||
|
// Signalling the event while it is in the signalled state is a noop.
|
||
|
// When the waiter wakes up, the signal is set to unsignalled.
|
||
|
// It is a way for any number of writers to inform a reader (without blocking)
|
||
|
// that an event has happened.
|
||
|
type Signal struct {
|
||
|
c chan struct{}
|
||
|
}
|
||
|
|
||
|
// NewSignal creates a new Signal.
|
||
|
func NewSignal() Signal {
|
||
|
return Signal{c: make(chan struct{}, 1)}
|
||
|
}
|
||
|
|
||
|
// Signal signals the event.
|
||
|
func (s Signal) Signal() {
|
||
|
// This channel is buffered, so the nonblocking send will always succeed if the buffer is empty.
|
||
|
select {
|
||
|
case s.c <- struct{}{}:
|
||
|
default:
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Wait for the event to be signalled.
|
||
|
func (s Signal) Wait() {
|
||
|
<-s.c
|
||
|
}
|
||
|
|
||
|
// WaitChannel returns a channel that is readable after Signal is called.
|
||
|
func (s Signal) WaitChannel() <-chan struct{} {
|
||
|
return s.c
|
||
|
}
|