-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathpeers.go
72 lines (59 loc) · 1.36 KB
/
peers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package go2p
import (
"sync"
)
// DefaultPeerStore is a basic implementation of a PeerStore
// It limits simultaneously connected peers to a configured capacity
type peers struct {
peers []*Peer
mutex *sync.Mutex
}
// NewDefaultPeerStore creates a new basic PeerStore that limits
// simultaneously connected peers by the provided capacity
func newPeers() *peers {
p := new(peers)
p.peers = make([]*Peer, 0)
p.mutex = new(sync.Mutex)
return p
}
// AddPeer adds the given peer to the store
func (p *peers) add(peer *Peer) {
p.mutex.Lock()
defer p.mutex.Unlock()
p.peers = append(p.peers, peer)
}
// RemovePeer will remove the given peer from the store
func (p *peers) rm(peer *Peer) {
p.mutex.Lock()
defer p.mutex.Unlock()
peerIdx := -1
for i, p := range p.peers {
if p == peer {
peerIdx = i
break
}
}
if peerIdx != -1 {
p.peers = append(p.peers[:peerIdx], p.peers[peerIdx+1:]...)
}
}
// IteratePeer will call the given handler for each peer
func (p *peers) iteratePeer(handler func(peer *Peer)) {
p.mutex.Lock()
peersCopy := make([]*Peer, len(p.peers))
copy(peersCopy, p.peers)
p.mutex.Unlock()
for _, p := range peersCopy {
handler(p)
}
}
func (p *peers) lock(addr string, handler func(peer *Peer)) {
p.mutex.Lock()
defer p.mutex.Unlock()
for _, p := range p.peers {
if p.io.adapter.RemoteAddress() == addr {
handler(p)
return
}
}
}