From d79fad3e64490ef9be0e5aa5612eae02ae1d2727 Mon Sep 17 00:00:00 2001 From: inhere Date: Thu, 11 Mar 2021 22:09:48 +0800 Subject: [PATCH] up: add lock option for fire event --- all_test.go | 2 ++ manager.go | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/all_test.go b/all_test.go index 9bfa858..0a0cce1 100644 --- a/all_test.go +++ b/all_test.go @@ -206,6 +206,7 @@ func TestMustFire(t *testing.T) { func TestManager_FireEvent(t *testing.T) { em := NewManager("test") + em.EnableLock() e1 := NewBasic("e1", nil) em.AddEvent(e1) @@ -228,6 +229,7 @@ func TestManager_FireEvent(t *testing.T) { func TestManager_FireEvent2(t *testing.T) { buf := new(bytes.Buffer) mgr := NewManager("test") + mgr.DisableLock() evt1 := NewBasic("evt1", nil).Fill(nil, M{"n": "inhere"}) mgr.AddEvent(evt1) diff --git a/manager.go b/manager.go index 41b6151..d316f91 100644 --- a/manager.go +++ b/manager.go @@ -3,6 +3,7 @@ package event import ( "regexp" "strings" + "sync" ) // Wildcard event name @@ -28,6 +29,10 @@ type ManagerFace interface { // Manager event manager definition. for manage events and listeners type Manager struct { + sync.Mutex + // enable lock on fire event. + enableLock bool + // name of the manager name string // pool sync.Pool // is an sample for new BasicEvent @@ -54,6 +59,16 @@ func NewManager(name string) *Manager { return em } +// EnableLock of the manager. +func (em *Manager) EnableLock() { + em.enableLock = true +} + +// DisableLock of the manager. +func (em *Manager) DisableLock() { + em.enableLock = false +} + /************************************************************* * Listener Manage: - register listener *************************************************************/ @@ -157,6 +172,11 @@ func (em *Manager) Fire(name string, params M) (err error, e Event) { } } + if em.enableLock { + em.Lock() + defer em.Unlock() + } + // call listeners use defined Event if e, ok := em.events[name]; ok { if params != nil {