callmanager.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. "sort"
  5. "sync"
  6. "time"
  7. )
  8. var callmgr *callmanager
  9. const call_timeout = 120
  10. func getCallManager() *callmanager {
  11. if callmgr == nil {
  12. callmgr = new(callmanager)
  13. callmgr.run()
  14. }
  15. return callmgr
  16. }
  17. type callmanager struct {
  18. calllist map[int]int64
  19. lock *sync.RWMutex
  20. }
  21. type roomCall struct {
  22. roomNo int
  23. lastPing int64
  24. }
  25. func (cm *callmanager) run() {
  26. cm.calllist = make(map[int]int64)
  27. cm.lock = &sync.RWMutex{}
  28. go cm.checkTimeout()
  29. }
  30. func (cm *callmanager) checkTimeout() {
  31. time.AfterFunc(20*time.Second, cm.checkTimeout)
  32. now := time.Now().Unix()
  33. var toRemove []int
  34. cm.lock.RLock()
  35. for k, v := range cm.calllist {
  36. if now-v >= call_timeout {
  37. toRemove = append(toRemove, k)
  38. }
  39. }
  40. cm.lock.RUnlock()
  41. if len(toRemove) <= 0 {
  42. return
  43. }
  44. log.Debug("callmanager.checkTimeout removing rooms %v", toRemove)
  45. cm.lock.Lock()
  46. for _, v := range toRemove {
  47. delete(cm.calllist, v)
  48. }
  49. cm.lock.Unlock()
  50. }
  51. func (cm *callmanager) removeRoomCall(roomNo int) {
  52. cm.lock.Lock()
  53. delete(cm.calllist, roomNo)
  54. cm.lock.Unlock()
  55. getSubsManager().publishRoomCallRemoved(roomNo)
  56. }
  57. func (cm *callmanager) addRoomCall(userId, roomNo int) {
  58. // 判断下是否存在,用户是否存在
  59. r := getRoomManager().getRoomInfo(roomNo)
  60. if r == nil {
  61. log.Release("callmanager.addRoomCall room [%d] not exist", roomNo)
  62. return
  63. }
  64. if !r.isUserExist(userId) {
  65. log.Release("callmanager.addRoomCall room [%d] user[%d] not exist", roomNo, userId)
  66. return
  67. }
  68. cm.lock.Lock()
  69. cm.calllist[roomNo] = time.Now().Unix()
  70. cm.lock.Unlock()
  71. getSubsManager().publishRoomCallAdded(roomNo)
  72. }
  73. func (cm *callmanager) getRoomCallList() []int {
  74. var list []roomCall
  75. cm.lock.RLock()
  76. for k, v := range cm.calllist {
  77. list = append(list, roomCall{roomNo: k, lastPing: v})
  78. }
  79. cm.lock.RUnlock()
  80. if len(list) == 0 {
  81. return []int{}
  82. }
  83. sort.Slice(list, func(i, j int) bool {
  84. return list[i].lastPing < list[j].lastPing
  85. })
  86. ret := make([]int, len(list))
  87. for i := 0; i < len(list); i++ {
  88. ret[i] = list[i].roomNo
  89. }
  90. return ret
  91. }