EventSwitch is an interface
This commit is contained in:
parent
48fa21511b
commit
1652dc8b3f
37
events.go
37
events.go
|
@ -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 {
|
func NewEventSwitch() EventSwitch {
|
||||||
evsw := &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
|
||||||
|
|
|
@ -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…
Reference in New Issue