Commit d5978863 authored by ssid's avatar ssid Committed by Commit Bot

Fix deadlock caused by trace event acquiring lock

EmitTrackDescriptor can send mojo messages. The trace event trying to
check for privacy filtering hits deadlock when mojo call adds trace
event when data source already holds the lock in EmitTrackDescriptor.
Set TLS flag in EmitTrackDescriptor to block trace events.

BUG= 1117513

Change-Id: I8856c181e3da6e6f7bf4ad9c26033977d0701037
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2362447
Commit-Queue: ssid <ssid@chromium.org>
Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799548}
parent 0e2f7cb7
......@@ -1023,11 +1023,11 @@ void TraceEventDataSource::OnMetricsSampleCallback(
const char* histogram_name,
uint64_t name_hash,
base::HistogramBase::Sample sample) {
bool privacy_filtering_enabled =
TraceEventDataSource::GetInstance()->IsPrivacyFilteringEnabled();
TRACE_EVENT_INSTANT(
TRACE_DISABLED_BY_DEFAULT("histogram_samples"), "HistogramSample",
TRACE_EVENT_SCOPE_THREAD, [&](perfetto::EventContext ctx) {
bool privacy_filtering_enabled =
TraceEventDataSource::GetInstance()->IsPrivacyFilteringEnabled();
perfetto::protos::pbzero::ChromeHistogramSample* new_sample =
ctx.event()->set_chrome_histogram_sample();
new_sample->set_name_hash(name_hash);
......@@ -1041,11 +1041,11 @@ void TraceEventDataSource::OnMetricsSampleCallback(
void TraceEventDataSource::OnUserActionSampleCallback(
const std::string& action,
base::TimeTicks action_time) {
bool privacy_filtering_enabled =
TraceEventDataSource::GetInstance()->IsPrivacyFilteringEnabled();
TRACE_EVENT_INSTANT(
TRACE_DISABLED_BY_DEFAULT("user_action_samples"), "UserAction",
TRACE_EVENT_SCOPE_GLOBAL, [&](perfetto::EventContext ctx) {
bool privacy_filtering_enabled =
TraceEventDataSource::GetInstance()->IsPrivacyFilteringEnabled();
perfetto::protos::pbzero::ChromeUserEvent* new_sample =
ctx.event()->set_chrome_user_event();
if (!privacy_filtering_enabled) {
......@@ -1090,6 +1090,10 @@ void TraceEventDataSource::ReturnTraceWriter(
}
void TraceEventDataSource::EmitTrackDescriptor() {
// Prevent reentrancy into tracing code (flushing the trace writer sends a
// mojo message which can result in additional trace events).
AutoThreadLocalBoolean thread_is_in_trace_event(GetThreadIsInTraceEventTLS());
AutoLockWithDeferredTaskPosting lock(lock_);
int process_id = TraceLog::GetInstance()->process_id();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment