From 0c4d1053dfe7e9ff2b2e936b9a4a09c35969504c Mon Sep 17 00:00:00 2001 From: Igor Canadi Date: Wed, 28 Jan 2015 13:42:40 -0800 Subject: [PATCH] Fix data race #5 Summary: TSAN complained that these are non-atomic reads and writes from different threads. Test Plan: TSAN no longer complains Reviewers: yhchiang, rven, sdong Reviewed By: sdong Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D32409 --- util/thread_status_util_debug.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/util/thread_status_util_debug.cc b/util/thread_status_util_debug.cc index 5378acaf8..5a86af26a 100644 --- a/util/thread_status_util_debug.cc +++ b/util/thread_status_util_debug.cc @@ -3,6 +3,8 @@ // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. +#include + #include "rocksdb/env.h" #include "util/thread_status_updater.h" #include "util/thread_status_util.h" @@ -11,30 +13,29 @@ namespace rocksdb { #ifndef NDEBUG // the delay for debugging purpose. -static int operations_delay[ThreadStatus::NUM_OP_TYPES] ={0}; -static int states_delay[ThreadStatus::NUM_STATE_TYPES] = {0}; +static std::atomic operations_delay[ThreadStatus::NUM_OP_TYPES]; +static std::atomic states_delay[ThreadStatus::NUM_STATE_TYPES]; void ThreadStatusUtil::TEST_SetStateDelay( const ThreadStatus::StateType state, int micro) { - states_delay[state] = micro; + states_delay[state].store(micro, std::memory_order_relaxed); } void ThreadStatusUtil::TEST_StateDelay( const ThreadStatus::StateType state) { Env::Default()->SleepForMicroseconds( - states_delay[state]); + states_delay[state].load(std::memory_order_relaxed)); } void ThreadStatusUtil::TEST_SetOperationDelay( const ThreadStatus::OperationType operation, int micro) { - operations_delay[operation] = micro; + operations_delay[operation].store(micro, std::memory_order_relaxed); } - void ThreadStatusUtil::TEST_OperationDelay( const ThreadStatus::OperationType operation) { Env::Default()->SleepForMicroseconds( - operations_delay[operation]); + operations_delay[operation].load(std::memory_order_relaxed)); } #endif // !NDEBUG