summaryrefslogtreecommitdiff
path: root/src/tracing/agent.h
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.h
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.h')
-rw-r--r--src/tracing/agent.h13
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() {