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

Unified Diff: device/hid/hid_service_mac.cc

Issue 2780393006: Open IOHIDDevices on the FILE thread (Closed)
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « device/hid/hid_service_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/hid/hid_service_mac.cc
diff --git a/device/hid/hid_service_mac.cc b/device/hid/hid_service_mac.cc
index d887eeee947a14a22e21337d31a669a9fecf6a52..9c4961f63d39cb4d966f90abc80800b708160b66 100644
--- a/device/hid/hid_service_mac.cc
+++ b/device/hid/hid_service_mac.cc
@@ -5,7 +5,6 @@
#include "device/hid/hid_service_mac.h"
#include <CoreFoundation/CoreFoundation.h>
-#include <IOKit/hid/IOHIDDevice.h>
#include <stdint.h>
#include <set>
@@ -84,7 +83,7 @@ bool TryGetHidDataProperty(IOHIDDeviceRef device,
HidServiceMac::HidServiceMac(
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
- : file_task_runner_(file_task_runner) {
+ : file_task_runner_(file_task_runner), weak_factory_(this) {
task_runner_ = base::ThreadTaskRunnerHandle::Get();
DCHECK(task_runner_.get());
@@ -132,14 +131,25 @@ void HidServiceMac::Connect(const HidDeviceId& device_id,
task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr));
return;
}
- scoped_refptr<HidDeviceInfo> device_info = map_entry->second;
+ file_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&HidServiceMac::OpenOnBlockingThread, map_entry->second,
+ task_runner_, weak_factory_.GetWeakPtr(), callback));
+}
+
+// static
+void HidServiceMac::OpenOnBlockingThread(
+ scoped_refptr<HidDeviceInfo> device_info,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ base::WeakPtr<HidServiceMac> hid_service,
+ const ConnectCallback& callback) {
base::ScopedCFTypeRef<CFDictionaryRef> matching_dict(
- IORegistryEntryIDMatching(device_id));
+ IORegistryEntryIDMatching(device_info->device_id()));
if (!matching_dict.get()) {
HID_LOG(EVENT) << "Failed to create matching dictionary for ID: "
- << device_id;
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr));
+ << device_info->device_id();
+ task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr));
return;
}
@@ -148,8 +158,9 @@ void HidServiceMac::Connect(const HidDeviceId& device_id,
base::mac::ScopedIOObject<io_service_t> service(IOServiceGetMatchingService(
kIOMasterPortDefault, matching_dict.release()));
if (!service.get()) {
- HID_LOG(EVENT) << "IOService not found for ID: " << device_id;
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr));
+ HID_LOG(EVENT) << "IOService not found for ID: "
+ << device_info->device_id();
+ task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr));
return;
}
@@ -157,21 +168,28 @@ void HidServiceMac::Connect(const HidDeviceId& device_id,
IOHIDDeviceCreate(kCFAllocatorDefault, service));
if (!hid_device) {
HID_LOG(EVENT) << "Unable to create IOHIDDevice object.";
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr));
+ task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr));
return;
}
IOReturn result = IOHIDDeviceOpen(hid_device, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
HID_LOG(EVENT) << "Failed to open device: " << HexErrorCode(result);
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr));
+ task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr));
return;
}
- task_runner_->PostTask(
- FROM_HERE, base::Bind(callback, make_scoped_refptr(new HidConnectionMac(
- hid_device.release(), device_info,
- file_task_runner_))));
+ task_runner->PostTask(
+ FROM_HERE, base::Bind(&HidServiceMac::DeviceOpened, hid_service,
+ device_info, base::Passed(&hid_device), callback));
+}
+
+void HidServiceMac::DeviceOpened(
+ scoped_refptr<HidDeviceInfo> device_info,
+ base::ScopedCFTypeRef<IOHIDDeviceRef> hid_device,
+ const ConnectCallback& callback) {
+ callback.Run(make_scoped_refptr(new HidConnectionMac(
+ std::move(hid_device), std::move(device_info), file_task_runner_)));
}
// static
« no previous file with comments | « device/hid/hid_service_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698