map.go 1.1 KB

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