-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpeer.go
69 lines (53 loc) · 1023 Bytes
/
peer.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
package main
import (
"net/rpc"
"sync"
)
type Peer struct {
ID string
RPCClient *rpc.Client
}
type Peers struct {
*sync.RWMutex
peerByID map[string]*Peer
}
func NewPeers() *Peers {
return &Peers{
RWMutex: &sync.RWMutex{},
peerByID: make(map[string]*Peer),
}
}
func (p *Peers) Add(ID string, client *rpc.Client) {
p.Lock()
defer p.Unlock()
p.peerByID[ID] = &Peer{ID: ID, RPCClient: client}
}
func (p *Peers) Delete(ID string) {
p.Lock()
defer p.Unlock()
delete(p.peerByID, ID)
}
func (p *Peers) Get(ID string) *Peer {
p.RLock()
defer p.RUnlock()
val := p.peerByID[ID]
return val
}
func (p *Peers) ToIDs() []string {
p.RLock()
defer p.RUnlock()
peerIDs := make([]string, 0, len(p.peerByID))
for _, peer := range p.peerByID {
peerIDs = append(peerIDs, peer.ID)
}
return peerIDs
}
func (p *Peers) ToList() []Peer {
p.RLock()
defer p.RUnlock()
peers := make([]Peer, 0, len(p.peerByID))
for _, peer := range p.peerByID {
peers = append(peers, *peer)
}
return peers
}