Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Side by Side Diff: device/usb/usb_service_win.cc

Issue 2885143002: Use the task scheduler in the new Windows USB backend (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "device/usb/usb_service_win.h" 5 #include "device/usb/usb_service_win.h"
6 6
7 #include <setupapi.h> 7 #include <setupapi.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <usbiodef.h> 9 #include <usbiodef.h>
10 10
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 USB_PLOG(ERROR) << "SetupDiEnumDeviceInterfaces"; 163 USB_PLOG(ERROR) << "SetupDiEnumDeviceInterfaces";
164 return false; 164 return false;
165 } 165 }
166 166
167 return GetDeviceInterfaceDetails(dev_info.get(), &device_interface_data, 167 return GetDeviceInterfaceDetails(dev_info.get(), &device_interface_data,
168 device_path, nullptr, nullptr, nullptr); 168 device_path, nullptr, nullptr, nullptr);
169 } 169 }
170 170
171 } // namespace 171 } // namespace
172 172
173 class UsbServiceWin::BlockingThreadHelper { 173 class UsbServiceWin::BlockingTaskHelper {
174 public: 174 public:
175 explicit BlockingThreadHelper(base::WeakPtr<UsbServiceWin> service) 175 explicit BlockingTaskHelper(base::WeakPtr<UsbServiceWin> service)
176 : service_task_runner_(base::ThreadTaskRunnerHandle::Get()), 176 : service_task_runner_(base::ThreadTaskRunnerHandle::Get()),
177 service_(service) {} 177 service_(service) {}
178 ~BlockingThreadHelper() {} 178 ~BlockingTaskHelper() {}
179 179
180 void EnumerateDevices() { 180 void EnumerateDevices() {
181 ScopedDevInfo dev_info( 181 ScopedDevInfo dev_info(
182 SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, nullptr, 0, 182 SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, nullptr, 0,
183 DIGCF_DEVICEINTERFACE | DIGCF_PRESENT)); 183 DIGCF_DEVICEINTERFACE | DIGCF_PRESENT));
184 if (!dev_info.is_valid()) { 184 if (!dev_info.is_valid()) {
185 USB_PLOG(ERROR) << "Failed to set up device enumeration"; 185 USB_PLOG(ERROR) << "Failed to set up device enumeration";
186 service_task_runner_->PostTask( 186 service_task_runner_->PostTask(
187 FROM_HERE, base::Bind(&UsbServiceWin::HelperStarted, service_)); 187 FROM_HERE, base::Bind(&UsbServiceWin::HelperStarted, service_));
188 return; 188 return;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 269
270 private: 270 private:
271 std::unordered_map<std::string, std::string> hub_paths_; 271 std::unordered_map<std::string, std::string> hub_paths_;
272 272
273 // Calls back to |service_| must be posted to |service_task_runner_|, which 273 // Calls back to |service_| must be posted to |service_task_runner_|, which
274 // runs tasks on the thread where that object lives. 274 // runs tasks on the thread where that object lives.
275 scoped_refptr<base::SingleThreadTaskRunner> service_task_runner_; 275 scoped_refptr<base::SingleThreadTaskRunner> service_task_runner_;
276 base::WeakPtr<UsbServiceWin> service_; 276 base::WeakPtr<UsbServiceWin> service_;
277 }; 277 };
278 278
279 UsbServiceWin::UsbServiceWin( 279 UsbServiceWin::UsbServiceWin()
280 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) 280 : UsbService(CreateBlockingTaskRunner()),
281 : UsbService(blocking_task_runner),
282 device_observer_(this), 281 device_observer_(this),
283 weak_factory_(this) { 282 weak_factory_(this) {
284 DeviceMonitorWin* device_monitor = 283 DeviceMonitorWin* device_monitor =
285 DeviceMonitorWin::GetForDeviceInterface(GUID_DEVINTERFACE_USB_DEVICE); 284 DeviceMonitorWin::GetForDeviceInterface(GUID_DEVINTERFACE_USB_DEVICE);
286 if (device_monitor) 285 if (device_monitor)
287 device_observer_.Add(device_monitor); 286 device_observer_.Add(device_monitor);
288 287
289 helper_ = new BlockingThreadHelper(weak_factory_.GetWeakPtr()); 288 helper_ = base::MakeUnique<BlockingTaskHelper>(weak_factory_.GetWeakPtr());
290 blocking_task_runner->PostTask( 289 blocking_task_runner()->PostTask(
291 FROM_HERE, base::Bind(&BlockingThreadHelper::EnumerateDevices, 290 FROM_HERE, base::Bind(&BlockingTaskHelper::EnumerateDevices,
292 base::Unretained(helper_))); 291 base::Unretained(helper_.get())));
293 } 292 }
294 293
295 UsbServiceWin::~UsbServiceWin() {} 294 UsbServiceWin::~UsbServiceWin() {
295 DCHECK(!helper_);
296 }
297
298 void UsbServiceWin::Shutdown() {
299 blocking_task_runner()->DeleteSoon(FROM_HERE, helper_.release());
300 UsbService::Shutdown();
301 }
296 302
297 void UsbServiceWin::GetDevices(const GetDevicesCallback& callback) { 303 void UsbServiceWin::GetDevices(const GetDevicesCallback& callback) {
298 DCHECK(CalledOnValidThread()); 304 DCHECK(CalledOnValidThread());
299 if (enumeration_ready()) 305 if (enumeration_ready())
300 UsbService::GetDevices(callback); 306 UsbService::GetDevices(callback);
301 else 307 else
302 enumeration_callbacks_.push_back(callback); 308 enumeration_callbacks_.push_back(callback);
303 } 309 }
304 310
305 void UsbServiceWin::OnDeviceAdded(const GUID& class_guid, 311 void UsbServiceWin::OnDeviceAdded(const GUID& class_guid,
306 const std::string& device_path) { 312 const std::string& device_path) {
307 blocking_task_runner()->PostTask( 313 blocking_task_runner()->PostTask(
308 FROM_HERE, base::Bind(&BlockingThreadHelper::EnumerateDevicePath, 314 FROM_HERE, base::Bind(&BlockingTaskHelper::EnumerateDevicePath,
309 base::Unretained(helper_), device_path)); 315 base::Unretained(helper_.get()), device_path));
310 } 316 }
311 317
312 void UsbServiceWin::OnDeviceRemoved(const GUID& class_guid, 318 void UsbServiceWin::OnDeviceRemoved(const GUID& class_guid,
313 const std::string& device_path) { 319 const std::string& device_path) {
314 DCHECK(CalledOnValidThread()); 320 DCHECK(CalledOnValidThread());
315 auto by_path_it = devices_by_path_.find(device_path); 321 auto by_path_it = devices_by_path_.find(device_path);
316 if (by_path_it == devices_by_path_.end()) 322 if (by_path_it == devices_by_path_.end())
317 return; 323 return;
318 324
319 scoped_refptr<UsbDeviceWin> device = by_path_it->second; 325 scoped_refptr<UsbDeviceWin> device = by_path_it->second;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 result.push_back(map_entry.second); 406 result.push_back(map_entry.second);
401 for (const auto& callback : enumeration_callbacks_) 407 for (const auto& callback : enumeration_callbacks_)
402 callback.Run(result); 408 callback.Run(result);
403 enumeration_callbacks_.clear(); 409 enumeration_callbacks_.clear();
404 } else if (success && enumeration_ready()) { 410 } else if (success && enumeration_ready()) {
405 NotifyDeviceAdded(device); 411 NotifyDeviceAdded(device);
406 } 412 }
407 } 413 }
408 414
409 } // namespace device 415 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698