1
This commit is contained in:
parent
3e730f5d26
commit
924eed81d1
50
listhead.go
Normal file
50
listhead.go
Normal file
@ -0,0 +1,50 @@
|
||||
package q5
|
||||
|
||||
type ListHead struct {
|
||||
next *ListHead
|
||||
prev *ListHead
|
||||
data interface{}
|
||||
}
|
||||
|
||||
func (this *ListHead) Init() {
|
||||
this.next = this
|
||||
this.prev = this
|
||||
this.data = nil
|
||||
}
|
||||
|
||||
func (this *ListHead) Del() {
|
||||
this.next.prev = this.prev
|
||||
this.prev.next = this.next
|
||||
this.Init()
|
||||
}
|
||||
|
||||
func (this *ListHead) AddTail(pnew *ListHead) {
|
||||
tmp_prev := this.prev
|
||||
this.prev = pnew
|
||||
pnew.next = this
|
||||
pnew.prev = tmp_prev
|
||||
tmp_prev.next = pnew
|
||||
}
|
||||
|
||||
func (this *ListHead) FirstEntry() interface{} {
|
||||
return this.next.data
|
||||
}
|
||||
|
||||
func (this *ListHead) Replace(pnew *ListHead) {
|
||||
pnew.next = this.next
|
||||
pnew.next.prev = pnew
|
||||
pnew.prev = this.prev
|
||||
pnew.data = this.data
|
||||
}
|
||||
|
||||
func (this *ListHead) ReplaceInit(pnew *ListHead) {
|
||||
this.Replace(pnew)
|
||||
this.Init()
|
||||
}
|
||||
|
||||
func (this *ListHead) Empty() bool {
|
||||
return this.next == this
|
||||
}
|
||||
|
||||
func (this *ListHead) DelInit() {
|
||||
}
|
171
timer.go
Normal file
171
timer.go
Normal file
@ -0,0 +1,171 @@
|
||||
package q5
|
||||
|
||||
const CONFIG_BASE_SMALL = false
|
||||
const TVN_BITS = 6
|
||||
const TVR_BITS = 8
|
||||
const TVN_SIZE = 1 << TVN_BITS
|
||||
const TVR_SIZE = 1 << TVR_BITS
|
||||
const TVN_MASK = TVN_SIZE - 1
|
||||
const TVR_MASK = TVR_SIZE - 1
|
||||
|
||||
const (
|
||||
DEADLINE_TIMER = 0
|
||||
REPEAT_TIMER = iota
|
||||
FIXED_TIMER = iota
|
||||
)
|
||||
|
||||
type Timer struct {
|
||||
freeTimerNum int32
|
||||
freeTimer ListHead
|
||||
runningTimer *TimerList
|
||||
timerTick int64
|
||||
getTickCount func () int64
|
||||
content interface{}
|
||||
gcTime int32
|
||||
cacheTimerNum int32
|
||||
tv1 [TVR_SIZE]ListHead
|
||||
tv2 [TVN_SIZE]ListHead
|
||||
tv3 [TVN_SIZE]ListHead
|
||||
tv4 [TVN_SIZE]ListHead
|
||||
tv5 [TVN_SIZE]ListHead
|
||||
workList ListHead
|
||||
cascadeList ListHead
|
||||
}
|
||||
|
||||
func (this *Timer) Init(
|
||||
getTickCount func () int64,
|
||||
content interface{},
|
||||
gcTime int32,
|
||||
cacheTimerNum int32) {
|
||||
this.getTickCount = getTickCount
|
||||
this.content = content
|
||||
this.gcTime = gcTime
|
||||
this.cacheTimerNum = cacheTimerNum
|
||||
}
|
||||
|
||||
func (this *Timer) UnInit() {
|
||||
this.clear()
|
||||
}
|
||||
|
||||
func (this *Timer) clear() {
|
||||
|
||||
}
|
||||
|
||||
func (this *Timer) Update() {
|
||||
for this.getTickCount() >= this.timerTick {
|
||||
index := uint32(this.timerTick & TVR_MASK)
|
||||
|
||||
if index == 0 &&
|
||||
this.cascade(&this.tv2, this.getTimerIndex(index)) == 0 &&
|
||||
this.cascade(&this.tv3, this.getTimerIndex(index)) == 0 &&
|
||||
this.cascade(&this.tv4, this.getTimerIndex(index)) == 0 {
|
||||
this.cascade(&this.tv5, this.getTimerIndex(index))
|
||||
}
|
||||
this.timerTick += 1
|
||||
this.tv1[index].ReplaceInit(&this.workList)
|
||||
for !this.workList.Empty() {
|
||||
timer_list := this.workList.FirstEntry().(*TimerList)
|
||||
this.runningTimer = timer_list
|
||||
if timer_list.timerFunc != nil {
|
||||
timer_list.timerFunc(&timer_list.params)
|
||||
}
|
||||
if timer_list.timerAfterFunc != nil {
|
||||
timer_list.timerAfterFunc(&timer_list.params)
|
||||
}
|
||||
if this.runningTimer != nil {
|
||||
switch this.runningTimer.timerType {
|
||||
case REPEAT_TIMER, FIXED_TIMER:
|
||||
if timer_list.timerType == FIXED_TIMER {
|
||||
timer_list.fixedTimierExecuteTimes += 1
|
||||
}
|
||||
this.ModifyTimer(timer_list, timer_list.milliSeconds)
|
||||
case DEADLINE_TIMER:
|
||||
this.detachTimer(timer_list)
|
||||
if timer_list.attachEntry.Empty() {
|
||||
timer_list.attachEntry.DelInit()
|
||||
}
|
||||
this.addToFreeList(timer_list)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.runningTimer = nil
|
||||
}
|
||||
|
||||
func (this *Timer) AddDeadLineTimer(
|
||||
milli_seconds int32,
|
||||
init_func func (params* XParams),
|
||||
timer_func func (params* XParams)) ITimerList {
|
||||
return this.AddDeadLineTimerEx(milli_seconds, init_func, timer_func, nil)
|
||||
}
|
||||
|
||||
func (this *Timer) AddDeadLineTimerEx(
|
||||
milli_seconds int32,
|
||||
init_func func (params* XParams),
|
||||
timer_func func (params* XParams),
|
||||
install_func func (timer_list ITimerList, params* XParams)) ITimerList {
|
||||
if init_func != nil {
|
||||
init_func(new(XParams))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Timer) ModifyTimer(timerList *TimerList, milli_seconds int32) {
|
||||
|
||||
}
|
||||
|
||||
func (this *Timer) detachTimer(timerList *TimerList) {
|
||||
|
||||
}
|
||||
|
||||
func (this *Timer) addToFreeList(timerList *TimerList) {
|
||||
|
||||
}
|
||||
|
||||
func (this *Timer) cascade(tv *[TVN_SIZE]ListHead, index uint32) uint32 {
|
||||
tv[index].ReplaceInit(&this.cascadeList)
|
||||
|
||||
if !this.cascadeList.Empty() {
|
||||
pos := this.cascadeList.next
|
||||
next := pos.next
|
||||
for pos != &this.cascadeList {
|
||||
this.internalAddTimer(pos.data.(*TimerList))
|
||||
pos = next
|
||||
next = pos.next
|
||||
}
|
||||
}
|
||||
this.cascadeList.Init()
|
||||
return index
|
||||
}
|
||||
|
||||
func (this *Timer) internalAddTimer(timer_list *TimerList) {
|
||||
expires := timer_list.expires
|
||||
idx := expires - this.timerTick
|
||||
var vec *ListHead
|
||||
var index uint32
|
||||
|
||||
if idx < 0 {
|
||||
index = (uint32)(this.timerTick & TVR_MASK)
|
||||
vec = &this.tv1[index]
|
||||
} else if idx < TVR_SIZE {
|
||||
index = (uint32)(expires & TVR_MASK)
|
||||
vec = &this.tv1[index]
|
||||
} else if idx < (1 << (TVR_BITS + TVN_BITS)) {
|
||||
index = (uint32)(expires & TVR_MASK)
|
||||
vec = &this.tv2[index]
|
||||
} else if idx < (1 << (TVR_BITS + 2 * TVN_BITS)) {
|
||||
index = (uint32)(expires & TVR_MASK)
|
||||
vec = &this.tv3[index]
|
||||
} else if idx < (1 << (TVR_BITS + 3 * TVN_BITS)) {
|
||||
index = (uint32)(expires & TVR_MASK)
|
||||
vec = &this.tv4[index]
|
||||
} else {
|
||||
index = (uint32)(expires & TVR_MASK)
|
||||
vec = &this.tv5[index]
|
||||
}
|
||||
vec.AddTail(&timer_list.entry)
|
||||
}
|
||||
|
||||
func (this *Timer) getTimerIndex(index uint32) uint32 {
|
||||
return (uint32)((this.timerTick >> (TVR_BITS + index * TVN_BITS)) & TVN_MASK);
|
||||
}
|
33
timerlist.go
Normal file
33
timerlist.go
Normal file
@ -0,0 +1,33 @@
|
||||
package q5
|
||||
|
||||
type ITimerList interface {
|
||||
SetTimerAfterFunc(timer_after_func func(params *XParams))
|
||||
}
|
||||
|
||||
type TimerList struct {
|
||||
entry ListHead
|
||||
attachEntry ListHead
|
||||
timerType int8
|
||||
milliSeconds int32
|
||||
expires int64
|
||||
fixedTimierExecuteTimes int32
|
||||
|
||||
timerFunc func (params *XParams)
|
||||
timerAfterFunc func (params *XParams)
|
||||
params XParams
|
||||
}
|
||||
|
||||
func (this *TimerList) InitTimerList(
|
||||
timer *Timer,
|
||||
timerType int8,
|
||||
millSeconds int32,
|
||||
params XParams,
|
||||
timerFunc func (params *XParams),
|
||||
timerAfterFunc func (params *XParams)) {
|
||||
this.timerType = timerType
|
||||
this.milliSeconds = millSeconds
|
||||
this.fixedTimierExecuteTimes = 0
|
||||
this.timerFunc = timerFunc
|
||||
this.timerAfterFunc = timerAfterFunc
|
||||
this.params = params
|
||||
}
|
16
xobject.go
Normal file
16
xobject.go
Normal file
@ -0,0 +1,16 @@
|
||||
package q5
|
||||
|
||||
const (
|
||||
XOT_SIMPLE = 0
|
||||
XOT_ARRAY = iota
|
||||
XOT_OBJECT = iota
|
||||
)
|
||||
|
||||
type XObject struct {
|
||||
_type int8
|
||||
_val interface{}
|
||||
}
|
||||
|
||||
func (this *XObject) AsXValue() *XValue {
|
||||
return nil
|
||||
}
|
12
xparams.go
Normal file
12
xparams.go
Normal file
@ -0,0 +1,12 @@
|
||||
package q5
|
||||
|
||||
type XParams struct {
|
||||
Sender XValue
|
||||
Param1 XValue
|
||||
Param2 XValue
|
||||
Param3 XValue
|
||||
}
|
||||
|
||||
func (this *XParams) SetInt32(val int32) *XParams {
|
||||
return this
|
||||
}
|
85
xvalue.go
Normal file
85
xvalue.go
Normal file
@ -0,0 +1,85 @@
|
||||
package q5
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
XVT_INT = 0
|
||||
XVT_FLOAT = iota
|
||||
XVT_STRING = iota
|
||||
XVT_BYTES = iota
|
||||
XVT_USERDATA = iota
|
||||
)
|
||||
|
||||
type XValue struct
|
||||
{
|
||||
_type int8
|
||||
_val interface{}
|
||||
}
|
||||
|
||||
func (this *XValue) GetType() int8 {
|
||||
return this._type
|
||||
}
|
||||
|
||||
func (this *XValue) SetInt64(val int64) *XValue {
|
||||
val_copy := val
|
||||
this._type = XVT_INT
|
||||
this._val = &val_copy
|
||||
return this
|
||||
}
|
||||
|
||||
func (this *XValue) SetFloat64(val float64) *XValue {
|
||||
val_copy := val
|
||||
this._type = XVT_FLOAT
|
||||
this._val = &val_copy
|
||||
return this
|
||||
}
|
||||
|
||||
func (this *XValue) SetString(val string) *XValue {
|
||||
val_copy := "" + val
|
||||
this._type = XVT_STRING
|
||||
this._val = &val_copy
|
||||
return this
|
||||
}
|
||||
|
||||
func (this *XValue) SetBytes(val []byte) *XValue {
|
||||
val_copy := val
|
||||
this._type = XVT_FLOAT
|
||||
this._val = &val_copy
|
||||
return this
|
||||
}
|
||||
|
||||
func (this *XValue) SetUserData(val interface{}) *XValue {
|
||||
val_copy := val
|
||||
this._type = XVT_FLOAT
|
||||
this._val = &val_copy
|
||||
return this
|
||||
}
|
||||
|
||||
func (this *XValue) GetInt64() int64 {
|
||||
switch this._type {
|
||||
case XVT_INT:
|
||||
return *(this._val.(*int64))
|
||||
case XVT_FLOAT:
|
||||
return int64(*(this._val.(*float64)))
|
||||
case XVT_STRING, XVT_BYTES, XVT_USERDATA:
|
||||
val, err := strconv.ParseInt(this.GetString(), 10, 64)
|
||||
if err == nil {
|
||||
return val
|
||||
} else {
|
||||
val, err := strconv.ParseFloat(this.GetString(), 64)
|
||||
if err == nil {
|
||||
return int64(val)
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (this *XValue) GetString() string {
|
||||
return ""
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user