import (
"sync"
+ "time"
"container/list"
)
})
if m.data_list.Len() > m.max_data_mun {m.data_list.Remove(m.data_list.Front())}
for len(m.wait_push) == 0 {m.wait_push <- true}
- <- m.wait_push
+ select {
+ case <- m.wait_push:
+ case <- time.After(time.Millisecond):
+ }
}
func (m *msgq) Pull(old_sig uint64) (data interface{},sig uint64) {
- if old_sig == m.Sig() || m.data_list.Len() == 0 {<- m.wait_push}
+ for old_sig == m.Sig() {
+ select {
+ case <- m.wait_push:
+ case <- time.After(time.Millisecond):
+ }
+ }
m.RLock()
defer m.RUnlock()
+
for el := m.data_list.Front();el != nil;el = el.Next() {
if old_sig < el.Value.(msgq_item).sig {
data = el.Value.(msgq_item).data
func (m *msgq) Sig() (sig uint64) {
if el := m.data_list.Back();el == nil {
- sig = m.get_sig()
+ sig = 0
} else {
sig = el.Value.(msgq_item).sig
}
mq := New(5)
- mun := 1000000
+ mun := 100000
mun_c := make(chan bool,mun)
mun_s := make(chan bool,mun)
mun_c <- true
}
}()
+ go func(){
+ var (
+ sig = mq.Sig()
+ data interface{}
+ )
+ for {
+ data,sig = mq.Pull(sig)
+ if data.(test_item).data != `aa1` {t.Error(`3`)}
+ mun_c <- true
+ }
+ }()
var fin_turn = 0
t.Log(`start`)
time.Sleep(time.Second)
- for fin_turn < 10000 {
+ for fin_turn < 1000000 {
mq.Push(test_item{
data:`aa1`,
})
<-mun_c
<-mun_c
+ <-mun_c
fin_turn += 1
fmt.Print("\r",fin_turn)
}