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.h | |
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.h')
-rw-r--r-- | src/tracing/agent.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/tracing/agent.h b/src/tracing/agent.h index e8bf727c50..045aaef85e 100644 --- a/src/tracing/agent.h +++ b/src/tracing/agent.h @@ -5,6 +5,7 @@ #include "uv.h" #include "v8.h" #include "util.h" +#include "node_mutex.h" #include <set> #include <string> @@ -23,6 +24,7 @@ class AsyncTraceWriter { virtual ~AsyncTraceWriter() {} virtual void AppendTraceEvent(TraceObject* trace_event) = 0; virtual void Flush(bool blocking) = 0; + virtual void InitializeOnThread(uv_loop_t* loop) {} }; class TracingController : public v8::platform::tracing::TracingController { @@ -92,13 +94,11 @@ class Agent { TraceConfig* CreateTraceConfig() const; - // TODO(addaleax): This design is broken and inherently thread-unsafe. - inline uv_loop_t* loop() { return &tracing_loop_; } - private: friend class AgentWriterHandle; static void ThreadCb(void* arg); + void InitializeWritersOnThread(); void Start(); void StopTracing(); @@ -120,6 +120,13 @@ class Agent { std::unordered_map<int, std::multiset<std::string>> categories_; std::unordered_map<int, std::unique_ptr<AsyncTraceWriter>> writers_; TracingController* tracing_controller_ = nullptr; + + // Variables related to initializing per-event-loop properties of individual + // writers, such as libuv handles. + Mutex initialize_writer_mutex_; + ConditionVariable initialize_writer_condvar_; + uv_async_t initialize_writer_async_; + std::set<AsyncTraceWriter*> to_be_initialized_; }; void AgentWriterHandle::reset() { |