hold lock during map access
Brian Tiger Chow committed
Jan 17, 2015 at 13:41 UTC
fce04f445a83c019f6e5f3d1c3d716bfe8d2027c
1 file changed
+14
-5
p2p/net/mock/mock_peernet.go
+14
-5
@@ -129,12 +129,16 @@ func (pn *peernet) connect(p peer.ID) (*conn, error) {
129
// first, check if we already have live connections
130
pn.RLock()
131
cs, found := pn.connsByPeer[p]
132
- pn.RUnlock()
132
if found && len(cs) > 0 {
134
- for c := range cs {
135
- return c, nil
133
+ var chosen *conn
134
+ for c := range cs { // because cs is a map
135
+ chosen = c // select first
136
+ break
137
}
138
+ pn.RUnlock()
139
+ return chosen, nil
140
}
141
+ pn.RUnlock()
142
143
log.Debugf("%s (newly) dialing %s", pn.peer, p)
144
@@ -267,12 +271,17 @@ func (pn *peernet) ConnsToPeer(p peer.ID) []inet.Conn {
271
func (pn *peernet) ClosePeer(p peer.ID) error {
272
pn.RLock()
273
cs, found := pn.connsByPeer[p]
270
- pn.RUnlock()
274
if !found {
275
+ pn.RUnlock()
276
return nil
277
}
278
279
+ var conns []*conn
280
for c := range cs {
281
+ conns = append(conns, c)
282
+ }
283
+ pn.RUnlock()
284
+ for _, c := range conns {
285
c.Close()
286
}
287
return nil
@@ -319,7 +328,6 @@ func (pn *peernet) NewStream(p peer.ID) (inet.Stream, error) {
328
pn.Unlock()
329
return nil, fmt.Errorf("no connection to peer")
330
}
322
- pn.Unlock()
331
332
// if many conns are found, how do we select? for now, randomly...
333
// this would be an interesting place to test logic that can measure
@@ -332,6 +340,7 @@ func (pn *peernet) NewStream(p peer.ID) (inet.Stream, error) {
340
}
341
n--
342
}
343
+ pn.Unlock()
344
345
return c.NewStream()
346
}