}
}
+func (m *Msgq) ClearAll() {
+ for m.someNeedRemove.Load() != 0 {
+ time.Sleep(time.Millisecond)
+ runtime.Gosched()
+ }
+
+ m.lock.Lock()
+ defer m.lock.Unlock()
+
+ var removes []*list.Element
+
+ for el := m.funcs.Front(); el != nil; el = el.Next() {
+ m.someNeedRemove.Add(1)
+ removes = append(removes, el)
+ }
+
+ if len(removes) != 0 {
+ m.someNeedRemove.Add(-int32(len(removes)))
+ for i := 0; i < len(removes); i++ {
+ m.funcs.Remove(removes[i])
+ }
+ removes = nil
+ }
+}
+
type Msgq_tag_data struct {
Tag string
Data any
})
}
+func (m *MsgType[T]) ClearAll() {
+ m.m.ClearAll()
+}
+
func (m *MsgType[T]) Pull_tag_only(key string, f func(T) (disable bool)) {
m.m.Register(func(data any) (disable bool) {
if d, ok := data.(Msgq_tag_data); ok && d.Tag == key {
}
}
+func Test_msgq9(t *testing.T) {
+ var mq = NewType[int]()
+ var c = make(chan int, 10)
+ mq.Pull_tag_only(`c`, func(i int) (disable bool) {
+ c <- i
+ return false
+ })
+ mq.PushLock_tag(`c`, 1)
+ mq.ClearAll()
+ mq.PushLock_tag(`c`, 2)
+ if len(c) != 1 || <-c != 1 {
+ t.Fatal()
+ }
+
+ mq.Pull_tag(map[string]func(int) (disable bool){
+ `c`: func(i int) (disable bool) {
+ c <- i
+ return false
+ },
+ `s`: func(_ int) (disable bool) {
+ mq.ClearAll()
+ return false
+ },
+ })
+
+ mq.PushLock_tag(`c`, 1)
+ mq.ClearAll()
+ mq.PushLock_tag(`c`, 2)
+ if len(c) != 1 || <-c != 1 {
+ t.Fatal()
+ }
+}
+
func Test_msgq2(t *testing.T) {
mq := New()