summaryrefslogtreecommitdiff
path: root/src/tracing/agent.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2018-07-18 02:12:14 +0200
committerAnna Henningsen <anna@addaleax.net>2018-08-01 17:16:54 +0200
commit1f5aa5a23c5868eb42b673f3efe65912d445ac18 (patch)
treef76e22d37d384187acadf4a147045b41cdec9401 /src/tracing/agent.cc
parent703c231a027478dd3ae1fe1481e2091e144c6542 (diff)
downloadandroid-node-v8-1f5aa5a23c5868eb42b673f3efe65912d445ac18.tar.gz
android-node-v8-1f5aa5a23c5868eb42b673f3efe65912d445ac18.tar.bz2
android-node-v8-1f5aa5a23c5868eb42b673f3efe65912d445ac18.zip
src: initialize file trace writer on tracing thread
Run the initialization for the file trace writer’s `uv_async_t`s on the same thread as `uv_run()` for their loop to avoid race conditions. PR-URL: https://github.com/nodejs/node/pull/21867 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Eugene Ostroukhov <eostroukhov@google.com> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
Diffstat (limited to 'src/tracing/agent.cc')
-rw-r--r--src/tracing/agent.cc31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/tracing/agent.cc b/src/tracing/agent.cc
index ad842db636..9b435b56d2 100644
--- a/src/tracing/agent.cc
+++ b/src/tracing/agent.cc
@@ -53,9 +53,27 @@ Agent::Agent() {
tracing_controller_->Initialize(nullptr);
CHECK_EQ(uv_loop_init(&tracing_loop_), 0);
+ CHECK_EQ(uv_async_init(&tracing_loop_,
+ &initialize_writer_async_,
+ [](uv_async_t* async) {
+ Agent* agent = ContainerOf(&Agent::initialize_writer_async_, async);
+ agent->InitializeWritersOnThread();
+ }), 0);
+}
+
+void Agent::InitializeWritersOnThread() {
+ Mutex::ScopedLock lock(initialize_writer_mutex_);
+ while (!to_be_initialized_.empty()) {
+ AsyncTraceWriter* head = *to_be_initialized_.begin();
+ head->InitializeOnThread(&tracing_loop_);
+ to_be_initialized_.erase(head);
+ }
+ initialize_writer_condvar_.Broadcast(lock);
}
Agent::~Agent() {
+ uv_close(reinterpret_cast<uv_handle_t*>(&initialize_writer_async_), nullptr);
+ uv_run(&tracing_loop_, UV_RUN_ONCE);
CheckedUvLoopClose(&tracing_loop_);
}
@@ -95,9 +113,18 @@ AgentWriterHandle Agent::AddClient(
ScopedSuspendTracing suspend(tracing_controller_, this);
int id = next_writer_id_++;
+ AsyncTraceWriter* raw = writer.get();
writers_[id] = std::move(writer);
categories_[id] = { use_categories->begin(), use_categories->end() };
+ {
+ Mutex::ScopedLock lock(initialize_writer_mutex_);
+ to_be_initialized_.insert(raw);
+ uv_async_send(&initialize_writer_async_);
+ while (to_be_initialized_.count(raw) > 0)
+ initialize_writer_condvar_.Wait(lock);
+ }
+
return AgentWriterHandle(this, id);
}
@@ -120,6 +147,10 @@ void Agent::StopTracing() {
void Agent::Disconnect(int client) {
if (client == kDefaultHandleId) return;
+ {
+ Mutex::ScopedLock lock(initialize_writer_mutex_);
+ to_be_initialized_.erase(writers_[client].get());
+ }
ScopedSuspendTracing suspend(tracing_controller_, this);
writers_.erase(client);
categories_.erase(client);