| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package handler
- import (
- "bet24.com/log"
- "sort"
- "sync"
- "time"
- )
- var callmgr *callmanager
- const call_timeout = 120
- func getCallManager() *callmanager {
- if callmgr == nil {
- callmgr = new(callmanager)
- callmgr.run()
- }
- return callmgr
- }
- type callmanager struct {
- calllist map[int]int64
- lock *sync.RWMutex
- }
- type roomCall struct {
- roomNo int
- lastPing int64
- }
- func (cm *callmanager) run() {
- cm.calllist = make(map[int]int64)
- cm.lock = &sync.RWMutex{}
- go cm.checkTimeout()
- }
- func (cm *callmanager) checkTimeout() {
- time.AfterFunc(20*time.Second, cm.checkTimeout)
- now := time.Now().Unix()
- var toRemove []int
- cm.lock.RLock()
- for k, v := range cm.calllist {
- if now-v >= call_timeout {
- toRemove = append(toRemove, k)
- }
- }
- cm.lock.RUnlock()
- if len(toRemove) <= 0 {
- return
- }
- log.Debug("callmanager.checkTimeout removing rooms %v", toRemove)
- cm.lock.Lock()
- for _, v := range toRemove {
- delete(cm.calllist, v)
- }
- cm.lock.Unlock()
- }
- func (cm *callmanager) removeRoomCall(roomNo int) {
- cm.lock.Lock()
- delete(cm.calllist, roomNo)
- cm.lock.Unlock()
- getSubsManager().publishRoomCallRemoved(roomNo)
- }
- func (cm *callmanager) addRoomCall(userId, roomNo int) {
- // 判断下是否存在,用户是否存在
- r := getRoomManager().getRoomInfo(roomNo)
- if r == nil {
- log.Release("callmanager.addRoomCall room [%d] not exist", roomNo)
- return
- }
- if !r.isUserExist(userId) {
- log.Release("callmanager.addRoomCall room [%d] user[%d] not exist", roomNo, userId)
- return
- }
- cm.lock.Lock()
- cm.calllist[roomNo] = time.Now().Unix()
- cm.lock.Unlock()
- getSubsManager().publishRoomCallAdded(roomNo)
- }
- func (cm *callmanager) getRoomCallList() []int {
- var list []roomCall
- cm.lock.RLock()
- for k, v := range cm.calllist {
- list = append(list, roomCall{roomNo: k, lastPing: v})
- }
- cm.lock.RUnlock()
- if len(list) == 0 {
- return []int{}
- }
- sort.Slice(list, func(i, j int) bool {
- return list[i].lastPing < list[j].lastPing
- })
- ret := make([]int, len(list))
- for i := 0; i < len(list); i++ {
- ret[i] = list[i].roomNo
- }
- return ret
- }
|