binding.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package client
  2. import (
  3. "net"
  4. "sync"
  5. "sync/atomic"
  6. "time"
  7. )
  8. // Chanel number:
  9. // 0x4000 through 0x7FFF: These values are the allowed channel
  10. // numbers (16,383 possible values).
  11. const (
  12. minChannelNumber uint16 = 0x4000
  13. maxChannelNumber uint16 = 0x7fff
  14. )
  15. type bindingState int32
  16. const (
  17. bindingStateIdle bindingState = iota
  18. bindingStateRequest
  19. bindingStateReady
  20. bindingStateRefresh
  21. bindingStateFailed
  22. )
  23. type binding struct {
  24. number uint16 // read-only
  25. st bindingState // thread-safe (atomic op)
  26. addr net.Addr // read-only
  27. mgr *bindingManager // read-only
  28. muBind sync.Mutex // thread-safe, for ChannelBind ops
  29. _refreshedAt time.Time // protected by mutex
  30. mutex sync.RWMutex // thread-safe
  31. }
  32. func (b *binding) setState(state bindingState) {
  33. atomic.StoreInt32((*int32)(&b.st), int32(state))
  34. }
  35. func (b *binding) state() bindingState {
  36. return bindingState(atomic.LoadInt32((*int32)(&b.st)))
  37. }
  38. func (b *binding) setRefreshedAt(at time.Time) {
  39. b.mutex.Lock()
  40. defer b.mutex.Unlock()
  41. b._refreshedAt = at
  42. }
  43. func (b *binding) refreshedAt() time.Time {
  44. b.mutex.RLock()
  45. defer b.mutex.RUnlock()
  46. return b._refreshedAt
  47. }
  48. // Thread-safe binding map
  49. type bindingManager struct {
  50. chanMap map[uint16]*binding
  51. addrMap map[string]*binding
  52. next uint16
  53. mutex sync.RWMutex
  54. }
  55. func newBindingManager() *bindingManager {
  56. return &bindingManager{
  57. chanMap: map[uint16]*binding{},
  58. addrMap: map[string]*binding{},
  59. next: minChannelNumber,
  60. }
  61. }
  62. func (mgr *bindingManager) assignChannelNumber() uint16 {
  63. n := mgr.next
  64. if mgr.next == maxChannelNumber {
  65. mgr.next = minChannelNumber
  66. } else {
  67. mgr.next++
  68. }
  69. return n
  70. }
  71. func (mgr *bindingManager) create(addr net.Addr) *binding {
  72. mgr.mutex.Lock()
  73. defer mgr.mutex.Unlock()
  74. b := &binding{
  75. number: mgr.assignChannelNumber(),
  76. addr: addr,
  77. mgr: mgr,
  78. _refreshedAt: time.Now(),
  79. }
  80. mgr.chanMap[b.number] = b
  81. mgr.addrMap[b.addr.String()] = b
  82. return b
  83. }
  84. func (mgr *bindingManager) findByAddr(addr net.Addr) (*binding, bool) {
  85. mgr.mutex.RLock()
  86. defer mgr.mutex.RUnlock()
  87. b, ok := mgr.addrMap[addr.String()]
  88. return b, ok
  89. }
  90. func (mgr *bindingManager) findByNumber(number uint16) (*binding, bool) {
  91. mgr.mutex.RLock()
  92. defer mgr.mutex.RUnlock()
  93. b, ok := mgr.chanMap[number]
  94. return b, ok
  95. }
  96. func (mgr *bindingManager) deleteByAddr(addr net.Addr) bool {
  97. mgr.mutex.Lock()
  98. defer mgr.mutex.Unlock()
  99. b, ok := mgr.addrMap[addr.String()]
  100. if !ok {
  101. return false
  102. }
  103. delete(mgr.addrMap, addr.String())
  104. delete(mgr.chanMap, b.number)
  105. return true
  106. }
  107. func (mgr *bindingManager) deleteByNumber(number uint16) bool {
  108. mgr.mutex.Lock()
  109. defer mgr.mutex.Unlock()
  110. b, ok := mgr.chanMap[number]
  111. if !ok {
  112. return false
  113. }
  114. delete(mgr.addrMap, b.addr.String())
  115. delete(mgr.chanMap, number)
  116. return true
  117. }
  118. func (mgr *bindingManager) size() int {
  119. mgr.mutex.RLock()
  120. defer mgr.mutex.RUnlock()
  121. return len(mgr.chanMap)
  122. }