 935645b03a
			
		
	
	935645b03a
	
	
	
		
			
			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)
 | |
| }
 |