map.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package mux
  2. import (
  3. "sync"
  4. )
  5. type connMap struct {
  6. connMap map[int32]*conn
  7. //closeCh chan struct{}
  8. sync.RWMutex
  9. }
  10. func NewConnMap() *connMap {
  11. connMap := &connMap{
  12. connMap: make(map[int32]*conn),
  13. //closeCh: make(chan struct{}),
  14. }
  15. //go connMap.clean()
  16. return connMap
  17. }
  18. func (s *connMap) Size() (n int) {
  19. s.Lock()
  20. n = len(s.connMap)
  21. s.Unlock()
  22. return
  23. }
  24. func (s *connMap) Get(id int32) (*conn, bool) {
  25. s.Lock()
  26. v, ok := s.connMap[id]
  27. s.Unlock()
  28. if ok && v != nil {
  29. return v, true
  30. }
  31. return nil, false
  32. }
  33. func (s *connMap) Set(id int32, v *conn) {
  34. s.Lock()
  35. s.connMap[id] = v
  36. s.Unlock()
  37. }
  38. func (s *connMap) Close() {
  39. //s.closeCh <- struct{}{} // stop the clean goroutine first
  40. for _, v := range s.connMap {
  41. v.Close() // close all the connections in the mux
  42. }
  43. }
  44. func (s *connMap) Delete(id int32) {
  45. s.Lock()
  46. delete(s.connMap, id)
  47. s.Unlock()
  48. }
  49. //func (s *connMap) clean() {
  50. // ticker := time.NewTimer(time.Minute * 1)
  51. // for {
  52. // select {
  53. // case <-ticker.C:
  54. // s.Lock()
  55. // for _, v := range s.connMap {
  56. // if v.isClose {
  57. // delete(s.connMap, v.connId)
  58. // }
  59. // }
  60. // s.Unlock()
  61. // case <-s.closeCh:
  62. // ticker.Stop()
  63. // return
  64. // }
  65. // }
  66. //}