WIP
This commit is contained in:
54
peer/relayhandler.go
Normal file
54
peer/relayhandler.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package peer
|
||||
|
||||
import (
|
||||
"log"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
type relayHandler struct {
|
||||
lock sync.Mutex
|
||||
relays map[byte]*Remote
|
||||
relay atomic.Pointer[Remote]
|
||||
}
|
||||
|
||||
func newRelayHandler() *relayHandler {
|
||||
return &relayHandler{
|
||||
relays: make(map[byte]*Remote, 256),
|
||||
}
|
||||
}
|
||||
|
||||
func (h *relayHandler) Add(r *Remote) {
|
||||
h.lock.Lock()
|
||||
defer h.lock.Unlock()
|
||||
|
||||
h.relays[r.RemotePeerIP] = r
|
||||
|
||||
if h.relay.Load() == nil {
|
||||
log.Printf("Setting Relay: %v", r.conf().Peer.Name)
|
||||
h.relay.Store(r)
|
||||
}
|
||||
}
|
||||
|
||||
func (h *relayHandler) Remove(r *Remote) {
|
||||
h.lock.Lock()
|
||||
defer h.lock.Unlock()
|
||||
|
||||
log.Printf("Removing relay %d...", r.RemotePeerIP)
|
||||
delete(h.relays, r.RemotePeerIP)
|
||||
|
||||
if h.relay.Load() == r {
|
||||
// Remove current relay.
|
||||
h.relay.Store(nil)
|
||||
|
||||
// Find new relay.
|
||||
for _, r := range h.relays {
|
||||
h.relay.Store(r)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (h *relayHandler) Load() *Remote {
|
||||
return h.relay.Load()
|
||||
}
|
||||
Reference in New Issue
Block a user