Browse Source

EventSwitch is an interface

pull/1842/head
Ethan Buchman 8 years ago
parent
commit
1652dc8b3f
2 changed files with 24 additions and 15 deletions
  1. +23
    -14
      events.go
  2. +1
    -1
      events_test.go

+ 23
- 14
events.go View File

@ -15,7 +15,7 @@ type EventData interface {
// reactors and other modules should export // reactors and other modules should export
// this interface to become eventable // this interface to become eventable
type Eventable interface { type Eventable interface {
SetEventSwitch(evsw *EventSwitch)
SetEventSwitch(evsw EventSwitch)
} }
// an event switch or cache implements fireable // an event switch or cache implements fireable
@ -23,7 +23,16 @@ type Fireable interface {
FireEvent(event string, data EventData) FireEvent(event string, data EventData)
} }
type EventSwitch struct {
type EventSwitch interface {
Service
Fireable
AddListenerForEvent(listenerID, event string, cb EventCallback)
RemoveListenerForEvent(event string, listenerID string)
RemoveListener(listenerID string)
}
type eventSwitch struct {
BaseService BaseService
mtx sync.RWMutex mtx sync.RWMutex
@ -31,26 +40,26 @@ type EventSwitch struct {
listeners map[string]*eventListener listeners map[string]*eventListener
} }
func NewEventSwitch() *EventSwitch {
evsw := &EventSwitch{}
func NewEventSwitch() EventSwitch {
evsw := &eventSwitch{}
evsw.BaseService = *NewBaseService(log, "EventSwitch", evsw) evsw.BaseService = *NewBaseService(log, "EventSwitch", evsw)
return evsw return evsw
} }
func (evsw *EventSwitch) OnStart() error {
func (evsw *eventSwitch) OnStart() error {
evsw.BaseService.OnStart() evsw.BaseService.OnStart()
evsw.eventCells = make(map[string]*eventCell) evsw.eventCells = make(map[string]*eventCell)
evsw.listeners = make(map[string]*eventListener) evsw.listeners = make(map[string]*eventListener)
return nil return nil
} }
func (evsw *EventSwitch) OnStop() {
func (evsw *eventSwitch) OnStop() {
evsw.BaseService.OnStop() evsw.BaseService.OnStop()
evsw.eventCells = nil evsw.eventCells = nil
evsw.listeners = nil evsw.listeners = nil
} }
func (evsw *EventSwitch) AddListenerForEvent(listenerID, event string, cb eventCallback) {
func (evsw *eventSwitch) AddListenerForEvent(listenerID, event string, cb EventCallback) {
// Get/Create eventCell and listener // Get/Create eventCell and listener
evsw.mtx.Lock() evsw.mtx.Lock()
eventCell := evsw.eventCells[event] eventCell := evsw.eventCells[event]
@ -70,7 +79,7 @@ func (evsw *EventSwitch) AddListenerForEvent(listenerID, event string, cb eventC
listener.AddEvent(event) listener.AddEvent(event)
} }
func (evsw *EventSwitch) RemoveListener(listenerID string) {
func (evsw *eventSwitch) RemoveListener(listenerID string) {
// Get and remove listener // Get and remove listener
evsw.mtx.RLock() evsw.mtx.RLock()
listener := evsw.listeners[listenerID] listener := evsw.listeners[listenerID]
@ -90,7 +99,7 @@ func (evsw *EventSwitch) RemoveListener(listenerID string) {
} }
} }
func (evsw *EventSwitch) RemoveListenerForEvent(event string, listenerID string) {
func (evsw *eventSwitch) RemoveListenerForEvent(event string, listenerID string) {
// Get eventCell // Get eventCell
evsw.mtx.Lock() evsw.mtx.Lock()
eventCell := evsw.eventCells[event] eventCell := evsw.eventCells[event]
@ -116,7 +125,7 @@ func (evsw *EventSwitch) RemoveListenerForEvent(event string, listenerID string)
} }
} }
func (evsw *EventSwitch) FireEvent(event string, data EventData) {
func (evsw *eventSwitch) FireEvent(event string, data EventData) {
// Get the eventCell // Get the eventCell
evsw.mtx.RLock() evsw.mtx.RLock()
eventCell := evsw.eventCells[event] eventCell := evsw.eventCells[event]
@ -135,16 +144,16 @@ func (evsw *EventSwitch) FireEvent(event string, data EventData) {
// eventCell handles keeping track of listener callbacks for a given event. // eventCell handles keeping track of listener callbacks for a given event.
type eventCell struct { type eventCell struct {
mtx sync.RWMutex mtx sync.RWMutex
listeners map[string]eventCallback
listeners map[string]EventCallback
} }
func newEventCell() *eventCell { func newEventCell() *eventCell {
return &eventCell{ return &eventCell{
listeners: make(map[string]eventCallback),
listeners: make(map[string]EventCallback),
} }
} }
func (cell *eventCell) AddListener(listenerID string, cb eventCallback) {
func (cell *eventCell) AddListener(listenerID string, cb EventCallback) {
cell.mtx.Lock() cell.mtx.Lock()
cell.listeners[listenerID] = cb cell.listeners[listenerID] = cb
cell.mtx.Unlock() cell.mtx.Unlock()
@ -168,7 +177,7 @@ func (cell *eventCell) FireEvent(data EventData) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
type eventCallback func(data EventData)
type EventCallback func(data EventData)
type eventListener struct { type eventListener struct {
id string id string


+ 1
- 1
events_test.go View File

@ -322,7 +322,7 @@ func sumReceivedNumbers(numbers, doneSum chan uint64) {
// to `offset` + 999. It additionally returns the addition of all integers // to `offset` + 999. It additionally returns the addition of all integers
// sent on `doneChan` for assertion that all events have been sent, and enabling // sent on `doneChan` for assertion that all events have been sent, and enabling
// the test to assert all events have also been received. // the test to assert all events have also been received.
func fireEvents(evsw *EventSwitch, event string, doneChan chan uint64,
func fireEvents(evsw EventSwitch, event string, doneChan chan uint64,
offset uint64) { offset uint64) {
var sentSum uint64 = 0 var sentSum uint64 = 0
for i := offset; i <= offset+uint64(999); i++ { for i := offset; i <= offset+uint64(999); i++ {


Loading…
Cancel
Save