Commit e89dba74 authored by Jasmine Chen's avatar Jasmine Chen Committed by Chromium LUCI CQ

VCD: Start tracing in CameraHalDispatcherImpl::Start()

There is a race condition in how we added tracing in
https://crrev.com/c/1158106
TraceLog is added in CameraHalDispatcherImpl constructor. Once TraceLog
is enabled, it calls CameraHalDispatcherImpl::OnTraceLogEnabled.
CameraHalDispatcherImpl then processes the call on its proxy thread.
The issue is the proxy thread may not be started yet at this point, so
CameraHalDispatcherImpl will crash when it tries to post a task onto the
not-yet-started proxy thread.

Bug: None
Test: Build and deploy simplechrome on soraka

Change-Id: If06c18da2aac25aae8ff79d061fd59b3344e9369
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2581125
Commit-Queue: Jasmine Chen <lnishan@google.com>
Commit-Queue: Shik Chen <shik@chromium.org>
Auto-Submit: Jasmine Chen <lnishan@google.com>
Reviewed-by: default avatarShik Chen <shik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835124}
parent 76d5cb69
...@@ -144,6 +144,10 @@ bool CameraHalDispatcherImpl::Start( ...@@ -144,6 +144,10 @@ bool CameraHalDispatcherImpl::Start(
if (!StartThreads()) { if (!StartThreads()) {
return false; return false;
} }
// This event is for adding camera category to categories list.
TRACE_EVENT0("camera", "CameraHalDispatcherImpl");
base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this);
jda_factory_ = std::move(jda_factory); jda_factory_ = std::move(jda_factory);
jea_factory_ = std::move(jea_factory); jea_factory_ = std::move(jea_factory);
base::WaitableEvent started(base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent started(base::WaitableEvent::ResetPolicy::MANUAL,
...@@ -218,11 +222,7 @@ CameraHalDispatcherImpl::CameraHalDispatcherImpl() ...@@ -218,11 +222,7 @@ CameraHalDispatcherImpl::CameraHalDispatcherImpl()
blocking_io_thread_("CameraBlockingIOThread"), blocking_io_thread_("CameraBlockingIOThread"),
camera_hal_server_callbacks_(this), camera_hal_server_callbacks_(this),
active_client_observers_( active_client_observers_(
new base::ObserverListThreadSafe<CameraActiveClientObserver>()) { new base::ObserverListThreadSafe<CameraActiveClientObserver>()) {}
// This event is for adding camera category to categories list.
TRACE_EVENT0("camera", "CameraHalDispatcherImpl");
base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this);
}
CameraHalDispatcherImpl::~CameraHalDispatcherImpl() { CameraHalDispatcherImpl::~CameraHalDispatcherImpl() {
VLOG(1) << "Stopping CameraHalDispatcherImpl..."; VLOG(1) << "Stopping CameraHalDispatcherImpl...";
...@@ -233,7 +233,6 @@ CameraHalDispatcherImpl::~CameraHalDispatcherImpl() { ...@@ -233,7 +233,6 @@ CameraHalDispatcherImpl::~CameraHalDispatcherImpl() {
proxy_thread_.Stop(); proxy_thread_.Stop();
} }
blocking_io_thread_.Stop(); blocking_io_thread_.Stop();
base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
VLOG(1) << "CameraHalDispatcherImpl stopped"; VLOG(1) << "CameraHalDispatcherImpl stopped";
} }
...@@ -595,6 +594,7 @@ void CameraHalDispatcherImpl::OnCameraHalClientConnectionError( ...@@ -595,6 +594,7 @@ void CameraHalDispatcherImpl::OnCameraHalClientConnectionError(
void CameraHalDispatcherImpl::StopOnProxyThread() { void CameraHalDispatcherImpl::StopOnProxyThread() {
DCHECK(proxy_task_runner_->BelongsToCurrentThread()); DCHECK(proxy_task_runner_->BelongsToCurrentThread());
base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
// TODO(crbug.com/1053569): Remove these lines once the issue is solved. // TODO(crbug.com/1053569): Remove these lines once the issue is solved.
base::File::Info info; base::File::Info info;
......
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