diff options
author | Ali Ijaz Sheikh <ofrobots@google.com> | 2018-12-26 16:55:36 -0800 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-01-08 00:43:48 +0100 |
commit | f39b3e33719cdb7102e9ae7b67a13de4dd681949 (patch) | |
tree | a0efaf1ea3da35a2b4f2efd38bbea63adf624c23 /src | |
parent | 86ae2c182b425e08e8a98fcd47220d452cc94f53 (diff) | |
download | android-node-v8-f39b3e33719cdb7102e9ae7b67a13de4dd681949.tar.gz android-node-v8-f39b3e33719cdb7102e9ae7b67a13de4dd681949.tar.bz2 android-node-v8-f39b3e33719cdb7102e9ae7b67a13de4dd681949.zip |
src: trace_events: fix race with metadata events
Multiple threads may be concurrently adding to the metadata_events list.
Protect access with a mutex.
Fixes: https://github.com/nodejs/node/issues/24129
PR-URL: https://github.com/nodejs/node/pull/25235
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/tracing/agent.cc | 12 | ||||
-rw-r--r-- | src/tracing/agent.h | 6 |
2 files changed, 13 insertions, 5 deletions
diff --git a/src/tracing/agent.cc b/src/tracing/agent.cc index 103df55da5..3d19c6c758 100644 --- a/src/tracing/agent.cc +++ b/src/tracing/agent.cc @@ -207,9 +207,17 @@ void Agent::AppendTraceEvent(TraceObject* trace_event) { id_writer.second->AppendTraceEvent(trace_event); } +void Agent::AddMetadataEvent(std::unique_ptr<TraceObject> event) { + Mutex::ScopedLock lock(metadata_events_mutex_); + metadata_events_.push_back(std::move(event)); +} + void Agent::Flush(bool blocking) { - for (const auto& event : metadata_events_) - AppendTraceEvent(event.get()); + { + Mutex::ScopedLock lock(metadata_events_mutex_); + for (const auto& event : metadata_events_) + AppendTraceEvent(event.get()); + } for (const auto& id_writer : writers_) id_writer.second->Flush(blocking); diff --git a/src/tracing/agent.h b/src/tracing/agent.h index db5e2a6bfd..62073ba6b2 100644 --- a/src/tracing/agent.h +++ b/src/tracing/agent.h @@ -104,9 +104,7 @@ class Agent { // Writes to all writers registered through AddClient(). void AppendTraceEvent(TraceObject* trace_event); - void AddMetadataEvent(std::unique_ptr<TraceObject> event) { - metadata_events_.push_back(std::move(event)); - } + void AddMetadataEvent(std::unique_ptr<TraceObject> event); // Flushes all writers registered through AddClient(). void Flush(bool blocking); @@ -145,6 +143,8 @@ class Agent { ConditionVariable initialize_writer_condvar_; uv_async_t initialize_writer_async_; std::set<AsyncTraceWriter*> to_be_initialized_; + + Mutex metadata_events_mutex_; std::list<std::unique_ptr<TraceObject>> metadata_events_; }; |