map.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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) Delete(id int32) {
  41. s.Lock()
  42. defer s.Unlock()
  43. delete(s.connMap, id)
  44. }
  45. func (s *connMap) clean() {
  46. ticker := time.NewTimer(time.Minute * 1)
  47. for {
  48. select {
  49. case <-ticker.C:
  50. s.Lock()
  51. for _, v := range s.connMap {
  52. if v.isClose {
  53. delete(s.connMap, v.connId)
  54. }
  55. }
  56. s.Unlock()
  57. case <-s.closeCh:
  58. ticker.Stop()
  59. return
  60. }
  61. }
  62. }