Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: update events package to include emitter and use envelope proto Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: add events service Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: enable events service and update ctr events to use events service Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> event listeners Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: helper func for emitting in services Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: improved cli for containers and tasks Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> create event envelope with poster Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: introspect event data to use for type url Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: use pb encoding; add event types Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: instrument content and snapshot services with events Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: instrument image service with events Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: instrument namespace service with events Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: add namespace support Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: only send events from namespace requested from client Signed-off-by: Evan Hazlett <ejhazlett@gmail.com> events: switch to go-events for broadcasting Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package events
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// Channel provides a sink that can be listened on. The writer and channel
 | 
						|
// listener must operate in separate goroutines.
 | 
						|
//
 | 
						|
// Consumers should listen on Channel.C until Closed is closed.
 | 
						|
type Channel struct {
 | 
						|
	C chan Event
 | 
						|
 | 
						|
	closed chan struct{}
 | 
						|
	once   sync.Once
 | 
						|
}
 | 
						|
 | 
						|
// NewChannel returns a channel. If buffer is zero, the channel is
 | 
						|
// unbuffered.
 | 
						|
func NewChannel(buffer int) *Channel {
 | 
						|
	return &Channel{
 | 
						|
		C:      make(chan Event, buffer),
 | 
						|
		closed: make(chan struct{}),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Done returns a channel that will always proceed once the sink is closed.
 | 
						|
func (ch *Channel) Done() chan struct{} {
 | 
						|
	return ch.closed
 | 
						|
}
 | 
						|
 | 
						|
// Write the event to the channel. Must be called in a separate goroutine from
 | 
						|
// the listener.
 | 
						|
func (ch *Channel) Write(event Event) error {
 | 
						|
	select {
 | 
						|
	case ch.C <- event:
 | 
						|
		return nil
 | 
						|
	case <-ch.closed:
 | 
						|
		return ErrSinkClosed
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Close the channel sink.
 | 
						|
func (ch *Channel) Close() error {
 | 
						|
	ch.once.Do(func() {
 | 
						|
		close(ch.closed)
 | 
						|
	})
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (ch *Channel) String() string {
 | 
						|
	// Serialize a copy of the Channel that doesn't contain the sync.Once,
 | 
						|
	// to avoid a data race.
 | 
						|
	ch2 := map[string]interface{}{
 | 
						|
		"C":      ch.C,
 | 
						|
		"closed": ch.closed,
 | 
						|
	}
 | 
						|
	return fmt.Sprint(ch2)
 | 
						|
}
 |