Timer.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package base
  2. import (
  3. "Server-Core/Server/Base/Log"
  4. "sync"
  5. "time"
  6. )
  7. const (
  8. TimerNearShift = 8
  9. TimerNear = 1 << TimerNearShift
  10. TimerNearMask = TimerNear - 1
  11. TimerLevelShift = 6
  12. TimerLevel = 1 << TimerLevelShift
  13. TimerLevelMask = TimerLevel - 1
  14. )
  15. type Timer struct {
  16. near [TimerNear]linkList
  17. t [4][TimerLevel]linkList
  18. lock sync.Locker
  19. time uint32
  20. startTime uint32
  21. current uint64
  22. }
  23. type timerNode struct {
  24. next *timerNode
  25. expire uint32
  26. f func([]interface{})
  27. argv []interface{}
  28. }
  29. type linkList struct {
  30. head timerNode
  31. tail *timerNode
  32. }
  33. func CreateTimer() (timer *Timer) {
  34. timer = new(Timer)
  35. timer.lock = NewSpinLock()
  36. for i := range timer.near {
  37. linkClear(&timer.near[i])
  38. }
  39. for i := range timer.t {
  40. for j := range timer.t[i] {
  41. linkClear(&timer.t[i][j])
  42. }
  43. }
  44. timer.startTime, timer.current = sysTime()
  45. return
  46. }
  47. func (timer *Timer) Run() {
  48. _, cs := sysTime()
  49. if cs < timer.current {
  50. log.Error("time diff error from:%d", timer.current)
  51. } else {
  52. diff := cs - timer.current
  53. timer.current += diff
  54. for i := 0; i < int(diff); i++ {
  55. timer.update()
  56. }
  57. }
  58. }
  59. func (timer *Timer) Add(time int, f func([]interface{}), argv ...interface{}) {
  60. node := new(timerNode)
  61. timer.lock.Lock()
  62. defer timer.lock.Unlock()
  63. node.expire = uint32(time) + timer.time
  64. node.f = f
  65. node.argv = argv
  66. timer.addNode(node)
  67. }
  68. func (timer *Timer) update() {
  69. timer.lock.Lock()
  70. defer timer.lock.Unlock()
  71. timer.execute()
  72. timer.shift()
  73. timer.execute()
  74. }
  75. func (timer *Timer) execute() {
  76. idx := timer.time & TimerNearMask
  77. for timer.near[idx].head.next != nil {
  78. node := linkClear(&timer.near[idx])
  79. timer.lock.Unlock()
  80. dispatch(node)
  81. timer.lock.Lock()
  82. }
  83. }
  84. func (timer *Timer) shift() {
  85. mask := uint32(TimerNear)
  86. timer.time++
  87. ct := timer.time
  88. if ct == 0 {
  89. timer.moveList(3, 0)
  90. } else {
  91. time := ct >> TimerNearShift
  92. for i := 0; (ct & (mask - 1)) == 0; i++ {
  93. idx := time & TimerLevelMask
  94. if idx != 0 {
  95. timer.moveList(i, idx)
  96. break
  97. }
  98. mask <<= TimerLevelShift
  99. time >>= TimerLevelShift
  100. }
  101. }
  102. }
  103. func (timer *Timer) moveList(level int, idx uint32) {
  104. current := linkClear(&timer.t[level][idx])
  105. for current != nil {
  106. next := current.next
  107. timer.addNode(current)
  108. current = next
  109. }
  110. }
  111. func (timer *Timer) addNode(node *timerNode) {
  112. time := node.expire
  113. currentTime := timer.time
  114. if (time | TimerNearMask) == (currentTime | TimerNearMask) {
  115. link(&timer.near[time&TimerNearMask], node)
  116. } else {
  117. var i int
  118. var mask uint32 = TimerNear << TimerLevelShift
  119. for i = 0; i < 3; i++ {
  120. if (time | (mask - 1)) == (currentTime | (mask - 1)) {
  121. break
  122. }
  123. mask <<= TimerLevelShift
  124. }
  125. link(&timer.t[i][((time>>(TimerNearShift+i*TimerLevelShift))&TimerLevelMask)], node)
  126. }
  127. }
  128. func sysTime() (sec uint32, cs uint64) {
  129. t := time.Now()
  130. sec = uint32(t.Unix())
  131. cs = uint64(t.UnixNano() / 10000000)
  132. return
  133. }
  134. func linkClear(list *linkList) (node *timerNode) {
  135. node = list.head.next
  136. list.head.next = nil
  137. list.tail = &list.head
  138. return
  139. }
  140. func link(list *linkList, node *timerNode) {
  141. list.tail.next = node
  142. list.tail = node
  143. node.next = nil
  144. }
  145. func dispatch(node *timerNode) {
  146. for node != nil {
  147. node.f(node.argv)
  148. node = node.next
  149. }
  150. }