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>
This commit is contained in:
Ali Ijaz Sheikh 2018-12-26 16:55:36 -08:00 committed by Anna Henningsen
parent 86ae2c182b
commit f39b3e3371
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 13 additions and 5 deletions

View File

@ -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) {
{
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);

View File

@ -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_;
};