From 27d31033ffec50d95239a0667a8a9ea04e20a0b0 Mon Sep 17 00:00:00 2001 From: qydysky Date: Tue, 22 Dec 2020 20:33:33 +0800 Subject: [PATCH] 96 --- msgq/Msgq.go | 31 +++++++++++++++++++++++++++++++ msgq/Msgq_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/msgq/Msgq.go b/msgq/Msgq.go index 413cc41..aaab7b3 100644 --- a/msgq/Msgq.go +++ b/msgq/Msgq.go @@ -74,4 +74,35 @@ func (m *msgq) Sig() (sig uint64) { func (m *msgq) get_sig() (sig uint64) { m.sig += 1 return m.sig +} + +type msgq_tag_data struct { + Tag string + Data interface{} +} + +func (m *msgq) Push_tag(Tag string,Data interface{}) { + m.Push(msgq_tag_data{ + Tag:Tag, + Data:Data, + }) +} + +func (m *msgq) Pull_tag(func_map map[string]func(interface{})(bool)) { + go func(){ + var ( + sig = m.Sig() + data interface{} + ) + for { + data,sig = m.Pull(sig) + if d,ok := data.(msgq_tag_data);!ok { + continue + } else { + if f,ok := func_map[d.Tag];ok{ + if f(d.Data) {break} + } + } + } + }() } \ No newline at end of file diff --git a/msgq/Msgq_test.go b/msgq/Msgq_test.go index c918d23..a753f6d 100644 --- a/msgq/Msgq_test.go +++ b/msgq/Msgq_test.go @@ -105,3 +105,43 @@ func Test_msgq2(t *testing.T) { } t.Log(`fin`) } + +func Test_msgq3(t *testing.T) { + mq := New(5) + + mun_c := make(chan bool,100) + mq.Pull_tag(map[string]func(interface{})(bool){ + `A1`:func(data interface{})(bool){ + if v,ok := data.(string);!ok || v != `a11`{t.Error(`1`)} + mun_c <- true + return false + }, + }) + mq.Pull_tag(map[string]func(interface{})(bool){ + `A1`:func(data interface{})(bool){ + if v,ok := data.(string);!ok || v != `a11`{t.Error(`2`)} + mun_c <- true + return false + }, + }) + mq.Pull_tag(map[string]func(interface{})(bool){ + `A1`:func(data interface{})(bool){ + if v,ok := data.(string);!ok || v != `a11`{t.Error(`3`)} + mun_c <- true + return false + }, + }) + + var fin_turn = 0 + t.Log(`start`) + time.Sleep(time.Second) + for fin_turn < 1000000 { + mq.Push_tag(`A1`,`a11`) + <-mun_c + <-mun_c + <-mun_c + fin_turn += 1 + fmt.Print("\r",fin_turn) + } + t.Log(`fin`) +} -- 2.39.2