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

Unified Diff: device/hid/hid_service_linux.cc

Issue 2799743006: Remove MessageLoop destruction observer from hid_connection_linux.cc (Closed)
Patch Set: Last review comments Created 3 years, 8 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_linux.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_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(&params)),
error_callback);
#else
- file_task_runner_->PostTask(FROM_HERE,
- base::Bind(&HidServiceLinux::OpenOnBlockingThread,
- base::Passed(&params)));
+ blocking_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&HidServiceLinux::OpenOnBlockingThread,
+ base::Passed(&params)));
#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(&params)));
+ 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(&params)));
}
// 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
« no previous file with comments | « device/hid/hid_service_linux.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698