f5/app.go
aozhiwei 5549c4e7ac 1
2020-10-26 19:02:11 +08:00

151 lines
2.9 KiB
Go

package f5
import (
"flag"
"sync"
"time"
"q5"
)
type App_ struct {
nodeId int
instanceId int
terminated bool
pkgName string
flags map[int32]int32
servicing bool
contextHash map[int32]q5.XParams
loopCond *sync.Cond
imTopNode *IMMsgNode
imBotNode *IMMsgNode
imWorkNode *IMMsgNode
imMsgMutex sync.RWMutex
chGoLoopTimerExit chan int
chGoLoopWait chan int64
nowTime time.Time
imMsgHandlers [1024]func(int16,*q5.XParams)
}
func (this *App_) Init() {
this.nowTime = time.Now()
_Timer = &q5.Timer{}
_Timer.Init(
func (context interface{}) int64 {
return q5.GetTickCount()
},
func (context interface{}, isFirstAdd bool, milliSeconds int32, tick int64) int64 {
nowTime := time.Now().Unix()
todayPassedSeconds := nowTime - q5.GetDaySeconds(nowTime)
expires := (tick - todayPassedSeconds * 1000) + int64(milliSeconds)
if isFirstAdd {
if expires <= tick {
expires += 1000 * 3600 * 24
}
}
return expires
},
nil,
1000 * 60,
5000)
_SysLog = new(SysLog_)
_SysLog.Init()
_TgLog = new(TGLog_)
_TgLog.Init()
flag.IntVar(&this.nodeId, "n", 0, "node id")
flag.IntVar(&this.instanceId, "i", 0, "instance id")
flag.Parse()
this.loopCond = sync.NewCond(new(sync.Mutex))
this.chGoLoopTimerExit = make(chan int)
this.chGoLoopWait = make(chan int64)
go this.goLoopTimer()
}
func (this *App_) UnInit() {
this.chGoLoopTimerExit <- 1
_Timer.UnInit()
_Timer = nil
}
func (this *App_) Run() {
for !this.terminated {
this.nowTime = time.Now()
_Timer.Update()
this.schedule()
}
}
func (this *App_) NewUuid() int64 {
return 0
}
func (this *App_) GetInstanceId() uint32 {
return uint32(this.instanceId)
}
func (this *App_) GetNodeId() uint32 {
return uint32(this.nodeId)
}
func (this *App_) GetPkgName() string {
return this.pkgName
}
func (this *App_) SetPkgName(pkgName string) {
this.pkgName = pkgName
}
func (this *App_) HasFlag(flag int32) bool {
_, ok := this.flags[flag]
return ok
}
func (this *App_) AddIMMsg(msgId int16, params *q5.XParams) {
p := new(IMMsgNode)
p.msgId = msgId
p.params = params
this.imMsgMutex.Lock()
if this.imBotNode != nil {
this.imBotNode.next = p
this.imBotNode = p
} else {
this.imTopNode = p
this.imBotNode = p
}
this.imMsgMutex.Unlock()
this.loopCond.Broadcast()
}
func (this *App_) RegisterIMMsgHandle(msgId int16, handle func(int16,*q5.XParams)) {
this.imMsgHandlers[msgId] = handle
}
func (this *App_) goLoopTimer() {
var waitMs int64 = 1000 * 10
for {
select {
case <-this.chGoLoopTimerExit:
return
case waitMs = <-this.chGoLoopWait:
if waitMs < 1 {
waitMs = 1
}
case <-time.After(time.Millisecond * time.Duration(waitMs)):
waitMs = 1000 * 10
this.loopCond.Broadcast()
}
}
}
func (this *App_) schedule() {
this.chGoLoopWait <- Timer().GetIdleTime()
this.loopCond.L.Lock()
this.loopCond.Wait()
this.loopCond.L.Unlock()
}
func (this *App_) NowUnix() int64 {
return this.nowTime.Unix()
}