goserver_sync/core/timer/timer.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() {}