diff options
| author | Cory Fields <[email protected]> | 2017-02-06 02:34:57 -0500 |
|---|---|---|
| committer | Matt Corallo <[email protected]> | 2017-02-10 11:32:39 -0500 |
| commit | 321d0fc6b6624c65508f8b9059418cb936f0bbbe (patch) | |
| tree | 57a99a1ede16e5449db2d230ddbc7a3b561547be /src/net.h | |
| parent | Merge #9698: net: fix socket close race (diff) | |
| download | discoin-321d0fc6b6624c65508f8b9059418cb936f0bbbe.tar.xz discoin-321d0fc6b6624c65508f8b9059418cb936f0bbbe.zip | |
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; |