hub.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package internal
  2. import (
  3. "math/rand"
  4. "one.com/nnet"
  5. "sync"
  6. "time"
  7. )
  8. type Hub struct {
  9. sync.Mutex
  10. conf *nnet.HubConfig
  11. cbSes nnet.ISessionCallback
  12. prot nnet.IProtocol
  13. chQuit chan struct{}
  14. wg *sync.WaitGroup
  15. sess map[uint64]nnet.ISession
  16. }
  17. func newHub(cf *nnet.HubConfig, cb nnet.ISessionCallback, p nnet.IProtocol) *Hub {
  18. return &Hub{
  19. conf: cf,
  20. cbSes: cb,
  21. prot: p,
  22. chQuit: make(chan struct{}),
  23. wg: &sync.WaitGroup{},
  24. sess: make(map[uint64]nnet.ISession),
  25. }
  26. }
  27. func (self *Hub) Wg() *sync.WaitGroup {
  28. return self.wg
  29. }
  30. func (self *Hub) ChQuit() <-chan struct{} {
  31. return self.chQuit
  32. }
  33. func (self *Hub) Conf() *nnet.HubConfig {
  34. return self.conf
  35. }
  36. func (self *Hub) Callback() nnet.ISessionCallback {
  37. return self.cbSes
  38. }
  39. func (self *Hub) Protocol() nnet.IProtocol {
  40. return self.prot
  41. }
  42. func (self *Hub) PutSession(id uint64, ses nnet.ISession) error {
  43. self.Lock()
  44. //@Notice: 顶替
  45. self.sess[id] = ses
  46. self.Unlock()
  47. return nil
  48. }
  49. func (self *Hub) DelSession(id uint64) error {
  50. self.Lock()
  51. defer self.Unlock()
  52. if _, ok := self.sess[id]; !ok {
  53. return nnet.ErrNotExists
  54. }
  55. delete(self.sess, id)
  56. return nil
  57. }
  58. func (self *Hub) PeekSession(id uint64) (nnet.ISession, error) {
  59. self.Lock()
  60. defer self.Unlock()
  61. s, ok := self.sess[id]
  62. if !ok {
  63. return nil, nnet.ErrNotExists
  64. }
  65. delete(self.sess, id)
  66. return s, nil
  67. }
  68. func (self *Hub) GetSession(id uint64) (nnet.ISession, error) {
  69. self.Lock()
  70. defer self.Unlock()
  71. s, ok := self.sess[id]
  72. if !ok {
  73. return nil, nnet.ErrNotExists
  74. }
  75. return s, nil
  76. }
  77. func (self *Hub) GetAllSessions() map[uint64]nnet.ISession {
  78. self.Lock()
  79. defer self.Unlock()
  80. return self.sess
  81. }
  82. var (
  83. s = rand.NewSource(time.Now().UnixNano())
  84. r = rand.New(s)
  85. )
  86. func Intn(a int) int {
  87. return r.Intn(a)
  88. }
  89. func (self *Hub) RandSession() (nnet.ISession, error) {
  90. self.Lock()
  91. defer self.Unlock()
  92. sz := len(self.sess)
  93. sel := Intn(sz)
  94. counter := 0
  95. for _, ses := range self.sess {
  96. if counter == sel {
  97. return ses, nil
  98. }
  99. counter += 1
  100. }
  101. return nil, nnet.ErrNotExists
  102. }
  103. func (self *Hub) GetSessionNum() int {
  104. self.Lock()
  105. defer self.Unlock()
  106. return len(self.sess)
  107. }