diff options
author | Andrey Petrov <andrey.petrov@shazow.net> | 2018-06-07 22:42:40 +0800 |
---|---|---|
committer | Andrey Petrov <andrey.petrov@shazow.net> | 2018-06-22 00:22:47 +0800 |
commit | dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93 (patch) | |
tree | f1baf018b3cfd106719ea530043f4c746122a33c /p2p/peer.go | |
parent | 399aa710d514561be571dc180aa4afe9fcc2138d (diff) | |
download | dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar.gz dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar.bz2 dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar.lz dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar.xz dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.tar.zst dexon-dcca66bce8ec79bcf0e06c32f57d0011f8d9fa93.zip |
p2p: Cache inbound flag on Peer.isInbound to avoid a race
Diffstat (limited to 'p2p/peer.go')
-rw-r--r-- | p2p/peer.go | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/p2p/peer.go b/p2p/peer.go index c3907349f..ff8602602 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -95,10 +95,11 @@ type PeerEvent struct { // Peer represents a connected remote node. type Peer struct { - rw *conn - running map[string]*protoRW - log log.Logger - created mclock.AbsTime + rw *conn + isInbound bool // Cached from rw.flags to avoid a race condition + running map[string]*protoRW + log log.Logger + created mclock.AbsTime wg sync.WaitGroup protoErr chan error @@ -160,19 +161,20 @@ func (p *Peer) String() string { // Inbound returns true if the peer is an inbound connection func (p *Peer) Inbound() bool { - return p.rw.flags&inboundConn != 0 + return p.isInbound } func newPeer(conn *conn, protocols []Protocol) *Peer { protomap := matchProtocols(protocols, conn.caps, conn) p := &Peer{ - rw: conn, - running: protomap, - created: mclock.Now(), - disc: make(chan DiscReason), - protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop - closed: make(chan struct{}), - log: log.New("id", conn.id, "conn", conn.flags), + rw: conn, + isInbound: conn.is(inboundConn), + running: protomap, + created: mclock.Now(), + disc: make(chan DiscReason), + protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop + closed: make(chan struct{}), + log: log.New("id", conn.id, "conn", conn.flags), } return p } |