From cce112465ff6e995e53bcc6e077e897e5823d4fe Mon Sep 17 00:00:00 2001 From: Alex Bramley Date: Wed, 27 Jul 2011 17:49:34 +0100 Subject: [PATCH] Make Handler an interface type; make dispatcher private; correctly unbox ev. --- event/registry.go | 57 +++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/event/registry.go b/event/registry.go index 5a2ad6b..fd86889 100644 --- a/event/registry.go +++ b/event/registry.go @@ -8,24 +8,37 @@ import ( ) type HandlerID uint32 -type Handler struct { - Run func(...interface{}) - ID HandlerID -} - var hidCounter uint32 = 0 func NewHandlerID() HandlerID { return HandlerID(atomic.AddUint32(&hidCounter, 1)) } -func NewHandler(h func(...interface{})) *Handler { - return &Handler{h, NewHandlerID()} +type Handler interface { + Run(...interface{}) + Id() HandlerID +} + +type basicHandler struct { + fn func(...interface{}) + id HandlerID +} + +func (h *basicHandler) Run(ev ...interface{}) { + h.fn(ev...) +} + +func (h *basicHandler) Id() HandlerID { + return h.id +} + +func NewHandler(h func(...interface{})) Handler { + return &basicHandler{h, NewHandlerID()} } type EventRegistry interface { - AddHandler(name string, h *Handler) - DelHandler(h *Handler) + AddHandler(name string, h Handler) + DelHandler(h Handler) Dispatch(name string, ev ...interface{}) ClearEvents(name string) } @@ -34,7 +47,7 @@ type registry struct { // Event registry as a lockable map of linked-lists sync.RWMutex events map[string]*list.List - Dispatcher func(r *registry, name string, ev ...interface{}) + dispatcher func(r *registry, name string, ev ...interface{}) } func NewRegistry() *registry { @@ -43,7 +56,7 @@ func NewRegistry() *registry { return r } -func (r *registry) AddHandler(name string, h *Handler) { +func (r *registry) AddHandler(name string, h Handler) { name = strings.ToLower(name) r.Lock() defer r.Unlock() @@ -52,20 +65,20 @@ func (r *registry) AddHandler(name string, h *Handler) { } for e := r.events[name].Front(); e != nil; e = e.Next() { // Check we're not adding a duplicate handler to this event - if e.Value.(*Handler).ID == h.ID { + if e.Value.(Handler).Id() == h.Id() { return } } r.events[name].PushBack(h) } -func (r *registry) DelHandler(h *Handler) { +func (r *registry) DelHandler(h Handler) { // This is a bit brute-force. Don't add too many handlers! r.Lock() defer r.Unlock() for _, l := range r.events { for e := l.Front(); e != nil; e = e.Next() { - if e.Value.(*Handler).ID == h.ID { + if e.Value.(Handler).Id() == h.Id() { l.Remove(e) } } @@ -73,15 +86,15 @@ func (r *registry) DelHandler(h *Handler) { } func (r *registry) Dispatch(name string, ev ...interface{}) { - r.Dispatcher(r, name, ev) + r.dispatcher(r, name, ev...) } func (r *registry) Parallel() { - r.Dispatcher = (*registry).parallelDispatch + r.dispatcher = (*registry).parallelDispatch } func (r *registry) Serial() { - r.Dispatcher = (*registry).serialDispatch + r.dispatcher = (*registry).serialDispatch } func (r *registry) parallelDispatch(name string, ev ...interface{}) { @@ -90,8 +103,8 @@ func (r *registry) parallelDispatch(name string, ev ...interface{}) { defer r.RUnlock() if l, ok := r.events[name]; ok { for e := l.Front(); e != nil; e = e.Next() { - h := e.Value.(*Handler) - go h.Run(ev) + h := e.Value.(Handler) + go h.Run(ev...) } } } @@ -101,13 +114,13 @@ func (r *registry) serialDispatch(name string, ev ...interface{}) { r.RLock() defer r.RUnlock() if l, ok := r.events[name]; ok { - hlist := make([]*Handler, 0, l.Len()) + hlist := make([]Handler, 0, l.Len()) for e := l.Front(); e != nil; e = e.Next() { - hlist = append(hlist, e.Value.(*Handler)) + hlist = append(hlist, e.Value.(Handler)) } go func() { for _, h := range hlist { - h.Run(ev) + h.Run(ev...) } }() }