From the v0.9.3 miner.cpp source (https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/miner.cpp#L598-L604):
if (GetTimeMillis() - nHPSTimerStart > 4000)
{
static CCriticalSection cs;
{
LOCK(cs);
if (GetTimeMillis() - nHPSTimerStart > 4000)
{
....
Why is the same if statement "if (GetTimeMillis() - nHPSTimerStart > 4000)
" executed twice? GetTimeMillis() can only go up, so it seems like if the first one is true, then the second statement can only ever evaluate to true as well, and is useless. I'm assuming this is not entirely correct, though, and am also assuming it has something to do with the CCriticalSelection
, but would like to understand the nature of it better.
Thanks!
#bitcoin-dev
to double-check.nHPSTimerStart
?if
checks if we should bother to do the potentially expensive lock. If yes, then we lock and now thatnHPSTimerStart
is guaranteed not to change we can safely execute theif
again.