unix_task_runner: Annotate race condition reported by TSAN
`created_thread_id_` should be written by one thread only, but can be
read by multiple threads, so let's make it atomic.
The unittest is updated to cover the race under TSAN.
Change-Id: I5b2fcd7f148897409838ec823a695cf2c8f5f755
diff --git a/include/perfetto/ext/base/unix_task_runner.h b/include/perfetto/ext/base/unix_task_runner.h
index 8d1ab6d..ecde733 100644
--- a/include/perfetto/ext/base/unix_task_runner.h
+++ b/include/perfetto/ext/base/unix_task_runner.h
@@ -90,7 +90,7 @@
void RunFileDescriptorWatch(PlatformHandle);
ThreadChecker thread_checker_;
- PlatformThreadId created_thread_id_ = GetThreadId();
+ std::atomic<PlatformThreadId> created_thread_id_ = GetThreadId();
EventFd event_;
diff --git a/src/base/task_runner_unittest.cc b/src/base/task_runner_unittest.cc
index 934b8c0..810ebc6 100644
--- a/src/base/task_runner_unittest.cc
+++ b/src/base/task_runner_unittest.cc
@@ -343,6 +343,8 @@
});
second_tr.Run();
});
+ main_tr.PostTask([&]() { main_tr.Quit(); });
+ main_tr.Run();
thread.join();
}
diff --git a/src/base/unix_task_runner.cc b/src/base/unix_task_runner.cc
index 9fc8f3c..ba2828f 100644
--- a/src/base/unix_task_runner.cc
+++ b/src/base/unix_task_runner.cc
@@ -52,7 +52,7 @@
void UnixTaskRunner::Run() {
PERFETTO_DCHECK_THREAD(thread_checker_);
- created_thread_id_ = GetThreadId();
+ created_thread_id_.store(GetThreadId(), std::memory_order_relaxed);
quit_ = false;
for (;;) {
int poll_timeout_ms;
@@ -299,7 +299,7 @@
}
bool UnixTaskRunner::RunsTasksOnCurrentThread() const {
- return GetThreadId() == created_thread_id_;
+ return GetThreadId() == created_thread_id_.load(std::memory_order_relaxed);
}
} // namespace base