From a2ffd334e3f694c2eb9c5f6cc4cf343a50b755db Mon Sep 17 00:00:00 2001 From: qydysky <32743305+qydysky@users.noreply.github.com> Date: Thu, 23 Feb 2023 21:22:09 +0800 Subject: [PATCH] improve --- msgq/Msgq.go | 42 +++++++++++++++++++++++++++++++++++------- msgq/Msgq_test.go | 15 +++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/msgq/Msgq.go b/msgq/Msgq.go index 368ebf5..debdc5d 100644 --- a/msgq/Msgq.go +++ b/msgq/Msgq.go @@ -11,7 +11,7 @@ import ( type Msgq struct { funcs *list.List someNeedRemove atomic.Int32 - sync.RWMutex + lock sync.RWMutex } type FuncMap map[string]func(any) (disable bool) @@ -23,9 +23,9 @@ func New() *Msgq { } func (m *Msgq) Register(f func(any) (disable bool)) { - m.Lock() + m.lock.Lock() m.funcs.PushBack(f) - m.Unlock() + m.lock.Unlock() } func (m *Msgq) Push(msg any) { @@ -36,22 +36,22 @@ func (m *Msgq) Push(msg any) { var removes []*list.Element - m.RLock() + m.lock.RLock() for el := m.funcs.Front(); el != nil; el = el.Next() { if disable := el.Value.(func(any) bool)(msg); disable { m.someNeedRemove.Add(1) removes = append(removes, el) } } - m.RUnlock() + m.lock.RUnlock() if len(removes) != 0 { - m.Lock() + m.lock.Lock() m.someNeedRemove.Add(-int32(len(removes))) for i := 0; i < len(removes); i++ { m.funcs.Remove(removes[i]) } - m.Unlock() + m.lock.Unlock() removes = nil } } @@ -78,3 +78,31 @@ func (m *Msgq) Pull_tag(func_map map[string]func(any) (disable bool)) { return false }) } + +type MsgType[T any] struct { + m *Msgq +} + +func (m *MsgType[T]) Push_tag(Tag string, Data T) { + if m.m == nil { + m.m = New() + } + m.m.Push(Msgq_tag_data{ + Tag: Tag, + Data: Data, + }) +} + +func (m *MsgType[T]) Pull_tag(func_map map[string]func(T) (disable bool)) { + if m.m == nil { + m.m = New() + } + m.m.Register(func(data any) (disable bool) { + if d, ok := data.(Msgq_tag_data); ok { + if f, ok := func_map[d.Tag]; ok { + return f(d.Data.(T)) + } + } + return false + }) +} diff --git a/msgq/Msgq_test.go b/msgq/Msgq_test.go index 8548baa..9c90a46 100644 --- a/msgq/Msgq_test.go +++ b/msgq/Msgq_test.go @@ -333,6 +333,21 @@ func Test_msgq5(t *testing.T) { t.Log(`fin`) } +func Test_msgq6(t *testing.T) { + msg := MsgType[int]{} + msg.Pull_tag(map[string]func(int) (disable bool){ + `1`: func(b int) (disable bool) { + if b != 0 { + t.Fatal() + } + t.Log(b) + return false + }, + }) + msg.Push_tag(`1`, 0) + time.Sleep(time.Second) +} + // func Test_msgq6(t *testing.T) { // mq := New() // go mq.Pull_tag(map[string]func(interface{}) bool{ -- 2.39.2