aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnthony Towns <aj@erisian.com.au>2021-02-01 01:35:08 +1000
committerAnthony Towns <aj@erisian.com.au>2021-02-26 23:55:10 +1000
commit38a11c355acfc15134c682571b3d92f66b0e7c3c (patch)
tree05fb4cb6b122f806b6a5a9cd81c75f4989b32f9d /src
parent81dd57e5b1ab1afa7e59468e30ef41bd34f0c8d7 (diff)
downloadbitcoin-38a11c355acfc15134c682571b3d92f66b0e7c3c.tar.xz
txorphanage: Add lock annotations
EraseOrphansFor was called both with and without g_cs_orphans held, correct that so that it's always called with it already held. LimitOrphanTxSize was always called with g_cs_orphans held, so add annotations and don't lock it a second time.
Diffstat (limited to 'src')
-rw-r--r--src/net_processing.cpp2
-rw-r--r--src/txorphanage.cpp5
-rw-r--r--src/txorphanage.h4
3 files changed, 6 insertions, 5 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index d842dca95b..01effa9245 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -1003,7 +1003,7 @@ void PeerManagerImpl::FinalizeNode(const CNode& node, bool& fUpdateConnectionTim
for (const QueuedBlock& entry : state->vBlocksInFlight) {
mapBlocksInFlight.erase(entry.hash);
}
- EraseOrphansFor(nodeid);
+ WITH_LOCK(g_cs_orphans, EraseOrphansFor(nodeid));
m_txrequest.DisconnectedPeer(nodeid);
nPreferredDownload -= state->fPreferredDownload;
nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);
diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp
index d418ed9323..c883aaa57f 100644
--- a/src/txorphanage.cpp
+++ b/src/txorphanage.cpp
@@ -55,7 +55,8 @@ int EraseOrphanTx(const uint256& txid)
void EraseOrphansFor(NodeId peer)
{
- LOCK(g_cs_orphans);
+ AssertLockHeld(g_cs_orphans);
+
int nErased = 0;
std::map<uint256, COrphanTx>::iterator iter = mapOrphanTransactions.begin();
while (iter != mapOrphanTransactions.end())
@@ -71,7 +72,7 @@ void EraseOrphansFor(NodeId peer)
unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
{
- LOCK(g_cs_orphans);
+ AssertLockHeld(g_cs_orphans);
unsigned int nEvicted = 0;
static int64_t nNextSweep;
diff --git a/src/txorphanage.h b/src/txorphanage.h
index 343f12c9c5..d8dfaec8a0 100644
--- a/src/txorphanage.h
+++ b/src/txorphanage.h
@@ -24,8 +24,8 @@ struct COrphanTx {
};
int EraseOrphanTx(const uint256& txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
-void EraseOrphansFor(NodeId peer);
-unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans);
+void EraseOrphansFor(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
+unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
/** Map from txid to orphan transaction record. Limited by
* -maxorphantx/DEFAULT_MAX_ORPHAN_TRANSACTIONS */