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