map.go 965 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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) Get(id int32) (*conn, bool) {
  20. s.Lock()
  21. defer s.Unlock()
  22. if v, ok := s.connMap[id]; ok && v != nil {
  23. return v, true
  24. }
  25. return nil, false
  26. }
  27. func (s *connMap) Set(id int32, v *conn) {
  28. s.Lock()
  29. defer s.Unlock()
  30. s.connMap[id] = v
  31. }
  32. func (s *connMap) Close() {
  33. s.Lock()
  34. defer s.Unlock()
  35. for _, v := range s.connMap {
  36. v.isClose = true
  37. }
  38. s.closeCh <- struct{}{}
  39. }
  40. func (s *connMap) clean() {
  41. ticker := time.NewTimer(time.Minute * 1)
  42. for {
  43. select {
  44. case <-ticker.C:
  45. s.Lock()
  46. for _, v := range s.connMap {
  47. if v.isClose {
  48. delete(s.connMap, v.connId)
  49. }
  50. }
  51. s.Unlock()
  52. case <-s.closeCh:
  53. ticker.Stop()
  54. return
  55. }
  56. }
  57. }