type FuncMap map[string]func(any) (disable bool)
-func New() *Msgq {
- m := new(Msgq)
- m.funcs = list.New()
- return m
-}
-
// to[0]:timeout to wait to[1]:timeout to run
-func NewTo(to ...time.Duration) *Msgq {
+func New(to ...time.Duration) *Msgq {
m := new(Msgq)
m.funcs = list.New()
m.to = to
}
func (m *Msgq) Push(msg any) {
+ defer m.removeDisable()
ul := m.lock.RLock(m.to...)
+ defer ul()
for el := m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.someNeedRemove.Load() {
- m.removeDisable()
- }
}
func (m *Msgq) PushLock(msg any) {
+ defer m.removeDisable()
ul := m.lock.Lock(m.to...)
+ defer ul()
for el := m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.someNeedRemove.Load() {
- m.removeDisable()
- }
}
func (m *Msgq) ClearAll() {
}
func (m *Msgq) removeDisable() {
+ if !m.someNeedRemove.CompareAndSwap(true, false) {
+ return
+ }
+
ul := m.lock.Lock(m.to...)
defer ul()
- m.someNeedRemove.Store(false)
for el := m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
if mi.disable.Load() && mi.running.Load() == 0 {
Data: Data,
})
*/
+ defer m.removeDisable()
ul := m.lock.RLock(m.to...)
+ defer ul()
for el := m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.someNeedRemove.Load() {
- m.removeDisable()
- }
}
}
Data: Data,
})
*/
+ defer m.removeDisable()
ul := m.lock.Lock(m.to...)
+ defer ul()
for el := m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.someNeedRemove.Load() {
- m.removeDisable()
- }
}
}
Data *T
}
-func NewType[T any]() *MsgType[T] {
- return &MsgType[T]{m: New()}
-}
-
// to[0]:timeout to wait to[1]:timeout to run
-func NewTypeTo[T any](to ...time.Duration) *MsgType[T] {
- return &MsgType[T]{m: NewTo(to...)}
+func NewType[T any](to ...time.Duration) *MsgType[T] {
+ return &MsgType[T]{m: New(to...)}
}
func (m *MsgType[T]) ClearAll() {
Data: Data,
})
*/
+ defer m.m.removeDisable()
ul := m.m.lock.RLock(m.m.to...)
+ defer ul()
for el := m.m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.m.someNeedRemove.Load() {
- m.m.removeDisable()
- }
}
}
Data: Data,
})
*/
+ defer m.m.removeDisable()
ul := m.m.lock.Lock(m.m.to...)
+ defer ul()
for el := m.m.funcs.Front(); el != nil; el = el.Next() {
mi := el.Value.(*msgqItem)
}
mi.running.Add(-1)
}
-
- ul()
- if m.m.someNeedRemove.Load() {
- m.m.removeDisable()
- }
}
}
}
func Test_RemoveInPush(t *testing.T) {
- mq := NewTo(time.Second, time.Second*3)
+ mq := New(time.Second, time.Second*3)
mq.Pull_tag(FuncMap{
`r1`: func(a any) (disable bool) {
mq.ClearAll()
}
func Test_3(t *testing.T) {
- mq := NewTo(time.Millisecond*5, time.Millisecond*10)
+ mq := New(time.Millisecond*5, time.Millisecond*10)
go mq.Push_tag(`sss`, nil)
mq.Pull_tag(FuncMap{
`test`: func(a any) (disable bool) {