diff options
author | Cory Fields <cory-nospam-@coryfields.com> | 2017-02-06 02:34:57 -0500 |
---|---|---|
committer | Matt Corallo <git@bluematt.me> | 2017-02-10 11:32:39 -0500 |
commit | 321d0fc6b6624c65508f8b9059418cb936f0bbbe (patch) | |
tree | 57a99a1ede16e5449db2d230ddbc7a3b561547be /src/net.h | |
parent | 2447c1024e6069bfe62ddff65c4e1aaf28f32b38 (diff) |
net: fix a few races. Credit @TheBlueMatt
These are (afaik) all long-standing races or concurrent accesses. Going
forward, we can clean these up so that they're not all individual atomic
accesses.
- Reintroduce cs_vRecv to guard receive-specific vars
- Lock vRecv/vSend for CNodeStats
- Make some vars atomic.
- Only set the connection time in CNode's constructor so that it doesn't change
Diffstat (limited to 'src/net.h')
-rw-r--r-- | src/net.h | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -573,6 +573,7 @@ public: std::deque<std::vector<unsigned char>> vSendMsg; CCriticalSection cs_vSend; CCriticalSection cs_hSocket; + CCriticalSection cs_vRecv; CCriticalSection cs_vProcessMsg; std::list<CNetMessage> vProcessMsg; @@ -584,10 +585,10 @@ public: uint64_t nRecvBytes; std::atomic<int> nRecvVersion; - int64_t nLastSend; - int64_t nLastRecv; + std::atomic<int64_t> nLastSend; + std::atomic<int64_t> nLastRecv; int64_t nTimeConnected; - int64_t nTimeOffset; + std::atomic<int64_t> nTimeOffset; const CAddress addr; std::string addrName; CService addrLocal; @@ -614,7 +615,7 @@ public: CSemaphoreGrant grantOutbound; CCriticalSection cs_filter; CBloomFilter* pfilter; - int nRefCount; + std::atomic<int> nRefCount; const NodeId id; const uint64_t nKeyedNetGroup; @@ -665,15 +666,15 @@ public: // Ping time measurement: // The pong reply we're expecting, or 0 if no pong expected. - uint64_t nPingNonceSent; + std::atomic<uint64_t> nPingNonceSent; // Time (in usec) the last ping was sent, or 0 if no ping was ever sent. - int64_t nPingUsecStart; + std::atomic<int64_t> nPingUsecStart; // Last measured round-trip time. - int64_t nPingUsecTime; + std::atomic<int64_t> nPingUsecTime; // Best measured round-trip time. - int64_t nMinPingUsecTime; + std::atomic<int64_t> nMinPingUsecTime; // Whether a ping is requested. - bool fPingQueued; + std::atomic<bool> fPingQueued; // Minimum fee rate with which to filter inv's to this node CAmount minFeeFilter; CCriticalSection cs_feeFilter; |