84 lines
1.4 KiB
Go
84 lines
1.4 KiB
Go
package timer
|
|
|
|
import (
|
|
"container/heap"
|
|
"time"
|
|
|
|
"mongo.games.com/goserver/core"
|
|
"mongo.games.com/goserver/core/basic"
|
|
"mongo.games.com/goserver/core/logger"
|
|
)
|
|
|
|
var (
|
|
TimerHandleGenerator uint32 = 1
|
|
InvalidTimerHandle TimerHandle = 0
|
|
TimerModule *TimerMgr = NewTimerMgr()
|
|
)
|
|
|
|
type TimerMgr struct {
|
|
*basic.Object
|
|
tq *TimerQueue
|
|
}
|
|
|
|
func NewTimerMgr() *TimerMgr {
|
|
tm := &TimerMgr{
|
|
tq: NewTimerQueue(),
|
|
}
|
|
|
|
return tm
|
|
}
|
|
|
|
func (tm *TimerMgr) Start() {
|
|
logger.Logger.Trace("Timer Start")
|
|
defer logger.Logger.Trace("Timer Start [ok]")
|
|
|
|
tm.Object = basic.NewObject(core.ObjId_TimerId,
|
|
"timer",
|
|
Config.Options,
|
|
tm)
|
|
tm.UserData = tm
|
|
|
|
core.LaunchChild(TimerModule.Object)
|
|
}
|
|
|
|
func (tm *TimerMgr) TimerCount() int {
|
|
return tm.tq.Len()
|
|
}
|
|
|
|
func (tm *TimerMgr) OnTick() {
|
|
nowTime := time.Now()
|
|
for {
|
|
if tm.tq.Len() > 0 {
|
|
t := heap.Pop(tm.tq)
|
|
if te, ok := t.(*TimerEntity); ok {
|
|
if !te.stoped && te.next.Before(nowTime) {
|
|
if te.times > 0 {
|
|
te.times--
|
|
}
|
|
//Avoid async stop timer failed
|
|
if te.times != 0 {
|
|
te.next = te.next.Add(te.interval)
|
|
heap.Push(tm.tq, te)
|
|
}
|
|
if !SendTimeout(te) {
|
|
if v, ok := tm.tq.ref[te.h]; ok {
|
|
heap.Remove(tm.tq, v)
|
|
}
|
|
}
|
|
} else {
|
|
if !te.stoped {
|
|
heap.Push(tm.tq, te)
|
|
}
|
|
return
|
|
}
|
|
}
|
|
} else {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (tm *TimerMgr) OnStart() {}
|
|
|
|
func (tm *TimerMgr) OnStop() {}
|