aboutsummaryrefslogtreecommitdiff
path: root/src/utiltime.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2017-02-11 12:37:05 -0800
committerPieter Wuille <pieter.wuille@gmail.com>2017-04-20 06:25:15 -0700
commit1d31093d4d8501a5dc031413a963707f6cae0e0a (patch)
tree70eaa76b30a28540db0f93eace4e49a742c8ad07 /src/utiltime.cpp
parent321bbc2079e2dc3648ae4eaf845f5b71d30b423a (diff)
downloadbitcoin-1d31093d4d8501a5dc031413a963707f6cae0e0a.tar.xz
fix tsan: utiltime race on nMockTime
Diffstat (limited to 'src/utiltime.cpp')
-rw-r--r--src/utiltime.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/utiltime.cpp b/src/utiltime.cpp
index a9936a645a..510f540b1d 100644
--- a/src/utiltime.cpp
+++ b/src/utiltime.cpp
@@ -9,14 +9,17 @@
#include "utiltime.h"
+#include <atomic>
+
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
-static int64_t nMockTime = 0; //!< For unit testing
+static std::atomic<int64_t> nMockTime(0); //!< For unit testing
int64_t GetTime()
{
- if (nMockTime) return nMockTime;
+ int64_t mocktime = nMockTime.load(std::memory_order_relaxed);
+ if (mocktime) return mocktime;
time_t now = time(NULL);
assert(now > 0);
@@ -25,7 +28,7 @@ int64_t GetTime()
void SetMockTime(int64_t nMockTimeIn)
{
- nMockTime = nMockTimeIn;
+ nMockTime.store(nMockTimeIn, std::memory_order_relaxed);
}
int64_t GetTimeMillis()
@@ -52,7 +55,8 @@ int64_t GetSystemTimeInSeconds()
/** Return a time useful for the debug log */
int64_t GetLogTimeMicros()
{
- if (nMockTime) return nMockTime*1000000;
+ int64_t mocktime = nMockTime.load(std::memory_order_relaxed);
+ if (mocktime) return mocktime*1000000;
return GetTimeMicros();
}