Skip to content

Commit 479c584

Browse files
committed
rpc/blockchain.cpp: thread safety annotations for latestblock
1 parent 8b5af3d commit 479c584

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

src/rpc/blockchain.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct CUpdatedBlock
5151

5252
static Mutex cs_blockchange;
5353
static std::condition_variable cond_blockchange;
54-
static CUpdatedBlock latestblock;
54+
static CUpdatedBlock latestblock GUARDED_BY(cs_blockchange);
5555

5656
CTxMemPool& EnsureMemPool()
5757
{
@@ -208,7 +208,7 @@ static UniValue getbestblockhash(const JSONRPCRequest& request)
208208
void RPCNotifyBlockChange(bool ibd, const CBlockIndex * pindex)
209209
{
210210
if(pindex) {
211-
std::lock_guard<std::mutex> lock(cs_blockchange);
211+
LOCK(cs_blockchange);
212212
latestblock.hash = pindex->GetBlockHash();
213213
latestblock.height = pindex->nHeight;
214214
}
@@ -243,9 +243,9 @@ static UniValue waitfornewblock(const JSONRPCRequest& request)
243243
WAIT_LOCK(cs_blockchange, lock);
244244
block = latestblock;
245245
if(timeout)
246-
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&block]{return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
246+
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&block]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
247247
else
248-
cond_blockchange.wait(lock, [&block]{return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
248+
cond_blockchange.wait(lock, [&block]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height != block.height || latestblock.hash != block.hash || !IsRPCRunning(); });
249249
block = latestblock;
250250
}
251251
UniValue ret(UniValue::VOBJ);
@@ -285,9 +285,9 @@ static UniValue waitforblock(const JSONRPCRequest& request)
285285
{
286286
WAIT_LOCK(cs_blockchange, lock);
287287
if(timeout)
288-
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&hash]{return latestblock.hash == hash || !IsRPCRunning();});
288+
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&hash]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.hash == hash || !IsRPCRunning();});
289289
else
290-
cond_blockchange.wait(lock, [&hash]{return latestblock.hash == hash || !IsRPCRunning(); });
290+
cond_blockchange.wait(lock, [&hash]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.hash == hash || !IsRPCRunning(); });
291291
block = latestblock;
292292
}
293293

@@ -329,9 +329,9 @@ static UniValue waitforblockheight(const JSONRPCRequest& request)
329329
{
330330
WAIT_LOCK(cs_blockchange, lock);
331331
if(timeout)
332-
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&height]{return latestblock.height >= height || !IsRPCRunning();});
332+
cond_blockchange.wait_for(lock, std::chrono::milliseconds(timeout), [&height]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height >= height || !IsRPCRunning();});
333333
else
334-
cond_blockchange.wait(lock, [&height]{return latestblock.height >= height || !IsRPCRunning(); });
334+
cond_blockchange.wait(lock, [&height]() EXCLUSIVE_LOCKS_REQUIRED(cs_blockchange) {return latestblock.height >= height || !IsRPCRunning(); });
335335
block = latestblock;
336336
}
337337
UniValue ret(UniValue::VOBJ);

0 commit comments

Comments
 (0)