0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-03-06 14:19:59 -05:00

fees: make the class FeeFilterRounder thread-safe

So that its methods can be called concurrently by different threads on
the same object. Currently it has just one method (`round()`).

Co-authored-by: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com>
This commit is contained in:
Vasil Dimov 2022-02-21 17:03:27 +01:00
parent 2074d7df20
commit e7a5bf6be7
No known key found for this signature in database
GPG key ID: 54DF06F64B55CBBF
2 changed files with 7 additions and 4 deletions

View file

@ -1010,8 +1010,10 @@ FeeFilterRounder::FeeFilterRounder(const CFeeRate& minIncrementalFee)
CAmount FeeFilterRounder::round(CAmount currentMinFee) CAmount FeeFilterRounder::round(CAmount currentMinFee)
{ {
std::set<double>::iterator it = feeset.lower_bound(currentMinFee); std::set<double>::iterator it = feeset.lower_bound(currentMinFee);
if ((it != feeset.begin() && insecure_rand.rand32() % 3 != 0) || it == feeset.end()) { if (it == feeset.end() ||
it--; (it != feeset.begin() &&
WITH_LOCK(m_insecure_rand_mutex, return insecure_rand.rand32()) % 3 != 0)) {
--it;
} }
return static_cast<CAmount>(*it); return static_cast<CAmount>(*it);
} }

View file

@ -299,12 +299,13 @@ public:
/** Create new FeeFilterRounder */ /** Create new FeeFilterRounder */
explicit FeeFilterRounder(const CFeeRate& minIncrementalFee); explicit FeeFilterRounder(const CFeeRate& minIncrementalFee);
/** Quantize a minimum fee for privacy purpose before broadcast. Not thread-safe due to use of FastRandomContext */ /** Quantize a minimum fee for privacy purpose before broadcast. */
CAmount round(CAmount currentMinFee); CAmount round(CAmount currentMinFee);
private: private:
std::set<double> feeset; std::set<double> feeset;
FastRandomContext insecure_rand; Mutex m_insecure_rand_mutex;
FastRandomContext insecure_rand GUARDED_BY(m_insecure_rand_mutex);
}; };
#endif // BITCOIN_POLICY_FEES_H #endif // BITCOIN_POLICY_FEES_H