diff options
author | Anna Henningsen <anna@addaleax.net> | 2018-07-18 02:12:14 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2018-08-01 17:16:54 +0200 |
commit | 1f5aa5a23c5868eb42b673f3efe65912d445ac18 (patch) | |
tree | f76e22d37d384187acadf4a147045b41cdec9401 /src/tracing/agent.cc | |
parent | 703c231a027478dd3ae1fe1481e2091e144c6542 (diff) | |
download | android-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.cc | 31 |
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); |