@cryptotaxi247 / kubo / commits / fce04f445

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 }