| Index: device/hid/hid_service_linux.cc
|
| diff --git a/device/hid/hid_service_linux.cc b/device/hid/hid_service_linux.cc
|
| index 1cd5d393b17030a5c6fdc05a7554016f27538276..6b524466403b7ac191356c5e95d6150d9e1bb94d 100644
|
| --- a/device/hid/hid_service_linux.cc
|
| +++ b/device/hid/hid_service_linux.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/files/file.h"
|
| #include "base/files/file_path.h"
|
| #include "base/files/file_util.h"
|
| +#include "base/files/scoped_file.h"
|
| #include "base/location.h"
|
| #include "base/macros.h"
|
| #include "base/memory/ptr_util.h"
|
| @@ -52,25 +53,25 @@ const char kSysfsReportDescriptorKey[] = "report_descriptor";
|
| struct HidServiceLinux::ConnectParams {
|
| ConnectParams(scoped_refptr<HidDeviceInfoLinux> device_info,
|
| const ConnectCallback& callback,
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
|
| - : device_info(device_info),
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner,
|
| + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
|
| + : device_info(std::move(device_info)),
|
| callback(callback),
|
| - task_runner(task_runner),
|
| - file_task_runner(file_task_runner) {}
|
| + task_runner(std::move(task_runner)),
|
| + blocking_task_runner(std::move(blocking_task_runner)) {}
|
| ~ConnectParams() {}
|
|
|
| scoped_refptr<HidDeviceInfoLinux> device_info;
|
| ConnectCallback callback;
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner;
|
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner;
|
| - base::File device_file;
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner;
|
| + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner;
|
| + base::ScopedFD fd;
|
| };
|
|
|
| class HidServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer {
|
| public:
|
| FileThreadHelper(base::WeakPtr<HidServiceLinux> service,
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner)
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner)
|
| : observer_(this), service_(service), task_runner_(task_runner) {
|
| thread_checker_.DetachFromThread();
|
| }
|
| @@ -192,18 +193,19 @@ class HidServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer {
|
|
|
| // This weak pointer is only valid when checked on this task runner.
|
| base::WeakPtr<HidServiceLinux> service_;
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(FileThreadHelper);
|
| };
|
|
|
| HidServiceLinux::HidServiceLinux(
|
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
|
| - : file_task_runner_(std::move(file_task_runner)), weak_factory_(this) {
|
| - task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner)
|
| + : task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| + blocking_task_runner_(std::move(blocking_task_runner)),
|
| + weak_factory_(this) {
|
| helper_ = base::MakeUnique<FileThreadHelper>(weak_factory_.GetWeakPtr(),
|
| task_runner_);
|
| - file_task_runner_->PostTask(
|
| + blocking_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&FileThreadHelper::Start, base::Unretained(helper_.get())));
|
| }
|
| @@ -214,7 +216,7 @@ HidServiceLinux::~HidServiceLinux() {
|
|
|
| void HidServiceLinux::Shutdown() {
|
| const bool did_post_task =
|
| - file_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
|
| + blocking_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
|
| DCHECK(did_post_task);
|
| HidService::Shutdown();
|
| }
|
| @@ -232,7 +234,7 @@ void HidServiceLinux::Connect(const HidDeviceId& device_id,
|
| static_cast<HidDeviceInfoLinux*>(map_entry->second.get());
|
|
|
| std::unique_ptr<ConnectParams> params(new ConnectParams(
|
| - device_info, callback, task_runner_, file_task_runner_));
|
| + device_info, callback, task_runner_, blocking_task_runner_));
|
|
|
| #if defined(OS_CHROMEOS)
|
| chromeos::PermissionBrokerClient* client =
|
| @@ -246,9 +248,9 @@ void HidServiceLinux::Connect(const HidDeviceId& device_id,
|
| base::Bind(&HidServiceLinux::OnPathOpenComplete, base::Passed(¶ms)),
|
| error_callback);
|
| #else
|
| - file_task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(&HidServiceLinux::OpenOnBlockingThread,
|
| - base::Passed(¶ms)));
|
| + blocking_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&HidServiceLinux::OpenOnBlockingThread,
|
| + base::Passed(¶ms)));
|
| #endif // defined(OS_CHROMEOS)
|
| }
|
|
|
| @@ -257,11 +259,12 @@ void HidServiceLinux::Connect(const HidDeviceId& device_id,
|
| // static
|
| void HidServiceLinux::OnPathOpenComplete(std::unique_ptr<ConnectParams> params,
|
| base::ScopedFD fd) {
|
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner =
|
| - params->file_task_runner;
|
| - params->device_file = base::File(fd.release());
|
| - file_task_runner->PostTask(FROM_HERE, base::Bind(&HidServiceLinux::FinishOpen,
|
| - base::Passed(¶ms)));
|
| + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner =
|
| + params->blocking_task_runner;
|
| + params->fd = std::move(fd);
|
| + blocking_task_runner->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&HidServiceLinux::FinishOpen, base::Passed(¶ms)));
|
| }
|
|
|
| // static
|
| @@ -280,10 +283,10 @@ void HidServiceLinux::OnPathOpenError(const std::string& device_path,
|
| void HidServiceLinux::OpenOnBlockingThread(
|
| std::unique_ptr<ConnectParams> params) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner;
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
|
|
|
| base::FilePath device_path(params->device_info->device_node());
|
| - base::File& device_file = params->device_file;
|
| + base::File device_file;
|
| int flags =
|
| base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE;
|
| device_file.Initialize(device_path, flags);
|
| @@ -304,7 +307,7 @@ void HidServiceLinux::OpenOnBlockingThread(
|
| task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr));
|
| return;
|
| }
|
| -
|
| + params->fd.reset(device_file.TakePlatformFile());
|
| FinishOpen(std::move(params));
|
| }
|
|
|
| @@ -313,9 +316,9 @@ void HidServiceLinux::OpenOnBlockingThread(
|
| // static
|
| void HidServiceLinux::FinishOpen(std::unique_ptr<ConnectParams> params) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner = params->task_runner;
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner = params->task_runner;
|
|
|
| - if (!base::SetNonBlocking(params->device_file.GetPlatformFile())) {
|
| + if (!base::SetNonBlocking(params->fd.get())) {
|
| HID_PLOG(ERROR) << "Failed to set the non-blocking flag on the device fd";
|
| task_runner->PostTask(FROM_HERE, base::Bind(params->callback, nullptr));
|
| return;
|
| @@ -328,10 +331,10 @@ void HidServiceLinux::FinishOpen(std::unique_ptr<ConnectParams> params) {
|
|
|
| // static
|
| void HidServiceLinux::CreateConnection(std::unique_ptr<ConnectParams> params) {
|
| - DCHECK(params->device_file.IsValid());
|
| + DCHECK(params->fd.is_valid());
|
| params->callback.Run(make_scoped_refptr(new HidConnectionLinux(
|
| - params->device_info, std::move(params->device_file),
|
| - params->file_task_runner)));
|
| + std::move(params->device_info), std::move(params->fd),
|
| + std::move(params->blocking_task_runner))));
|
| }
|
|
|
| } // namespace device
|
|
|