Index: ui/ozone/platform/drm/host/drm_display_host_manager.cc |
diff --git a/ui/ozone/platform/drm/host/drm_display_host_manager.cc b/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
index 2feb1f4bae102cf2ac87b537968f936f19efce58..d22752717435b5d761cab96499d904cfab44477c 100644 |
--- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
+++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc |
@@ -48,14 +48,6 @@ void OpenDeviceOnWorkerThread( |
FROM_HERE, base::Bind(callback, path, base::Passed(handle.Pass()))); |
} |
-void CloseDeviceOnWorkerThread( |
- scoped_ptr<DrmDeviceHandle> handle, |
- const scoped_refptr<base::TaskRunner>& reply_runner, |
- const base::Closure& callback) { |
- handle.reset(); |
- reply_runner->PostTask(FROM_HERE, callback); |
-} |
- |
base::FilePath GetPrimaryDisplayCardPath() { |
struct drm_mode_card_res res; |
for (int i = 0; /* end on first card# that does not exist */; i++) { |
@@ -111,39 +103,29 @@ DrmDisplayHostManager::DrmDisplayHostManager(DrmGpuPlatformSupportHost* proxy, |
// synchronously since the GPU process will need it to initialize the |
// graphics state. |
base::ThreadRestrictions::ScopedAllowIO allow_io; |
- scoped_ptr<DrmDeviceHandle> handle(new DrmDeviceHandle()); |
- if (!handle->Initialize(primary_graphics_card_path_)) { |
+ primary_drm_device_handle_.reset(new DrmDeviceHandle()); |
+ if (!primary_drm_device_handle_->Initialize(primary_graphics_card_path_)) { |
LOG(FATAL) << "Failed to open primary graphics card"; |
return; |
} |
- drm_devices_.add(primary_graphics_card_path_, handle.Pass()); |
+ drm_devices_.insert(primary_graphics_card_path_); |
} |
device_manager_->AddObserver(this); |
proxy_->RegisterHandler(this); |
- DrmDeviceHandle* handle = drm_devices_.get(primary_graphics_card_path_); |
ScopedVector<HardwareDisplayControllerInfo> display_infos = |
- GetAvailableDisplayControllerInfos(handle->fd()); |
+ GetAvailableDisplayControllerInfos(primary_drm_device_handle_->fd()); |
has_dummy_display_ = !display_infos.empty(); |
for (size_t i = 0; i < display_infos.size(); ++i) { |
displays_.push_back(new DisplaySnapshotProxy(CreateDisplaySnapshotParams( |
- display_infos[i], handle->fd(), i, gfx::Point()))); |
+ display_infos[i], primary_drm_device_handle_->fd(), i, gfx::Point()))); |
} |
} |
DrmDisplayHostManager::~DrmDisplayHostManager() { |
device_manager_->RemoveObserver(this); |
proxy_->UnregisterHandler(this); |
- |
- for (auto it = drm_devices_.begin(); it != drm_devices_.end(); ++it) { |
- base::WorkerPool::PostTask(FROM_HERE, |
- base::Bind(&CloseDeviceOnWorkerThread, |
- base::Passed(drm_devices_.take(it)), |
- base::ThreadTaskRunnerHandle::Get(), |
- base::Bind(&base::DoNothing)), |
- false /* task_is_slow */); |
- } |
} |
DisplaySnapshot* DrmDisplayHostManager::GetDisplay(int64_t display_id) { |
@@ -268,16 +250,11 @@ void DrmDisplayHostManager::ProcessEvent() { |
<< "Removing primary graphics card"; |
auto it = drm_devices_.find(event.path); |
if (it != drm_devices_.end()) { |
- task_pending_ = base::WorkerPool::PostTask( |
+ task_pending_ = base::ThreadTaskRunnerHandle::Get()->PostTask( |
FROM_HERE, |
- base::Bind( |
- &CloseDeviceOnWorkerThread, |
- base::Passed(drm_devices_.take_and_erase(it)), |
- base::ThreadTaskRunnerHandle::Get(), |
- base::Bind(&DrmDisplayHostManager::OnRemoveGraphicsDevice, |
- weak_ptr_factory_.GetWeakPtr(), event.path)), |
- false /* task_is_slow */); |
- return; |
+ base::Bind(&DrmDisplayHostManager::OnRemoveGraphicsDevice, |
+ weak_ptr_factory_.GetWeakPtr(), event.path)); |
+ drm_devices_.erase(it); |
} |
break; |
} |
@@ -288,10 +265,9 @@ void DrmDisplayHostManager::OnAddGraphicsDevice( |
const base::FilePath& path, |
scoped_ptr<DrmDeviceHandle> handle) { |
if (handle->IsValid()) { |
- base::ScopedFD file = handle->Duplicate(); |
- drm_devices_.add(path, handle.Pass()); |
+ drm_devices_.insert(path); |
proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
- path, base::FileDescriptor(file.Pass()))); |
+ path, base::FileDescriptor(handle->PassFD()))); |
NotifyDisplayDelegate(); |
} |
@@ -316,19 +292,20 @@ void DrmDisplayHostManager::OnChannelEstablished( |
int host_id, |
scoped_refptr<base::SingleThreadTaskRunner> send_runner, |
const base::Callback<void(IPC::Message*)>& send_callback) { |
- auto it = drm_devices_.find(primary_graphics_card_path_); |
- DCHECK(it != drm_devices_.end()); |
+ drm_devices_.clear(); |
+ drm_devices_.insert(primary_graphics_card_path_); |
+ scoped_ptr<DrmDeviceHandle> handle = primary_drm_device_handle_.Pass(); |
+ if (!handle) { |
+ base::ThreadRestrictions::ScopedAllowIO allow_io; |
+ handle.reset(new DrmDeviceHandle()); |
+ if (!handle->Initialize(primary_graphics_card_path_)) |
+ LOG(FATAL) << "Failed to open primary graphics card"; |
+ } |
+ |
// Send the primary device first since this is used to initialize graphics |
// state. |
proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
- it->first, base::FileDescriptor(it->second->Duplicate()))); |
- |
- for (auto pair : drm_devices_) { |
- if (pair.second->IsValid() && pair.first != primary_graphics_card_path_) { |
- proxy_->Send(new OzoneGpuMsg_AddGraphicsDevice( |
- pair.first, base::FileDescriptor(pair.second->Duplicate()))); |
- } |
- } |
+ primary_graphics_card_path_, base::FileDescriptor(handle->PassFD()))); |
device_manager_->ScanDevices(this); |
NotifyDisplayDelegate(); |