|
@@ -55,6 +55,7 @@ type Service struct {
|
|
triesRegister int
|
|
triesRegister int
|
|
tickTimer *time.Timer
|
|
tickTimer *time.Timer
|
|
tickTree *btree.BTree
|
|
tickTree *btree.BTree
|
|
|
|
+ tickLocker sync.RWMutex
|
|
deferHandles []handleEntry
|
|
deferHandles []handleEntry
|
|
environment string
|
|
environment string
|
|
readyFlag int32
|
|
readyFlag int32
|
|
@@ -81,14 +82,18 @@ func (svr *Service) worker() {
|
|
for {
|
|
for {
|
|
select {
|
|
select {
|
|
case <-svr.tickTimer.C:
|
|
case <-svr.tickTimer.C:
|
|
|
|
+ svr.tickLocker.RLock()
|
|
node := svr.tickTree.Min()
|
|
node := svr.tickTree.Min()
|
|
|
|
+ svr.tickLocker.RUnlock()
|
|
if node == nil {
|
|
if node == nil {
|
|
svr.tickTimer.Reset(math.MaxInt64)
|
|
svr.tickTimer.Reset(math.MaxInt64)
|
|
break
|
|
break
|
|
}
|
|
}
|
|
tick := node.(*tickPtr)
|
|
tick := node.(*tickPtr)
|
|
if tick.next.Before(time.Now()) {
|
|
if tick.next.Before(time.Now()) {
|
|
|
|
+ svr.tickLocker.Lock()
|
|
svr.tickTree.Delete(node)
|
|
svr.tickTree.Delete(node)
|
|
|
|
+ svr.tickLocker.Unlock()
|
|
if atomic.CompareAndSwapInt32(&tick.running, 0, 1) {
|
|
if atomic.CompareAndSwapInt32(&tick.running, 0, 1) {
|
|
svr.async(func() {
|
|
svr.async(func() {
|
|
if !tick.options.Canceled {
|
|
if !tick.options.Canceled {
|
|
@@ -96,7 +101,9 @@ func (svr *Service) worker() {
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
+ svr.tickLocker.RLock()
|
|
next := svr.tickTree.Min()
|
|
next := svr.tickTree.Min()
|
|
|
|
+ svr.tickLocker.RUnlock()
|
|
if next == nil {
|
|
if next == nil {
|
|
svr.tickTimer.Reset(math.MaxInt64)
|
|
svr.tickTimer.Reset(math.MaxInt64)
|
|
} else {
|
|
} else {
|
|
@@ -137,7 +144,9 @@ func (svr *Service) DeferTick(duration time.Duration, callback HandleTickerFunc,
|
|
tick.options.Context = svr.ctx
|
|
tick.options.Context = svr.ctx
|
|
}
|
|
}
|
|
svr.tickTimer.Reset(0)
|
|
svr.tickTimer.Reset(0)
|
|
|
|
+ svr.tickLocker.Lock()
|
|
svr.tickTree.ReplaceOrInsert(tick)
|
|
svr.tickTree.ReplaceOrInsert(tick)
|
|
|
|
+ svr.tickLocker.Unlock()
|
|
return tick.sequence
|
|
return tick.sequence
|
|
}
|
|
}
|
|
|
|
|
|
@@ -468,7 +477,9 @@ func (svr *Service) destroy() (err error) {
|
|
}
|
|
}
|
|
svr.tickTimer.Stop()
|
|
svr.tickTimer.Stop()
|
|
for svr.tickTree.Len() > 0 {
|
|
for svr.tickTree.Len() > 0 {
|
|
|
|
+ svr.tickLocker.Lock()
|
|
node := svr.tickTree.DeleteMin()
|
|
node := svr.tickTree.DeleteMin()
|
|
|
|
+ svr.tickLocker.Unlock()
|
|
if node == nil {
|
|
if node == nil {
|
|
break
|
|
break
|
|
}
|
|
}
|