diff options
author | Andrey Petrov <andrey.petrov@shazow.net> | 2018-06-08 09:50:08 +0800 |
---|---|---|
committer | Andrey Petrov <andrey.petrov@shazow.net> | 2018-06-22 00:22:47 +0800 |
commit | 6209545083f656f2dccbe4561644a757ff6443b5 (patch) | |
tree | 5ce7677791bcce83e57f70836a3c5d6004bc036c /p2p/server.go | |
parent | 193a402cc08e69f8c6b92106e8e81104d260d26c (diff) | |
download | dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar.gz dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar.bz2 dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar.lz dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar.xz dexon-6209545083f656f2dccbe4561644a757ff6443b5.tar.zst dexon-6209545083f656f2dccbe4561644a757ff6443b5.zip |
p2p: Wrap conn.flags ops with atomic.Load/Store
Diffstat (limited to 'p2p/server.go')
-rw-r--r-- | p2p/server.go | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/p2p/server.go b/p2p/server.go index 39ff2f51e..d2cb94925 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -23,6 +23,7 @@ import ( "fmt" "net" "sync" + "sync/atomic" "time" "github.com/ethereum/go-ethereum/common" @@ -187,7 +188,7 @@ type peerDrop struct { requested bool // true if signaled by the peer } -type connFlag int +type connFlag int32 const ( dynDialedConn connFlag = 1 << iota @@ -252,7 +253,18 @@ func (f connFlag) String() string { } func (c *conn) is(f connFlag) bool { - return c.flags&f != 0 + flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) + return flags&f != 0 +} + +func (c *conn) set(f connFlag, val bool) { + flags := connFlag(atomic.LoadInt32((*int32)(&c.flags))) + if val { + flags |= f + } else { + flags &= ^f + } + atomic.StoreInt32((*int32)(&c.flags), int32(flags)) } // Peers returns all connected peers. @@ -632,7 +644,7 @@ running: trusted[n.ID] = true // Mark any already-connected peer as trusted if p, ok := peers[n.ID]; ok { - p.rw.flags |= trustedConn + p.rw.set(trustedConn, true) } case n := <-srv.removetrusted: // This channel is used by RemoveTrustedPeer to remove an enode @@ -643,7 +655,7 @@ running: } // Unmark any already-connected peer as trusted if p, ok := peers[n.ID]; ok { - p.rw.flags &= ^trustedConn + p.rw.set(trustedConn, false) } case op := <-srv.peerOp: // This channel is used by Peers and PeerCount. |