| Index: device/hid/hid_service_linux.cc
|
| diff --git a/device/hid/hid_service_linux.cc b/device/hid/hid_service_linux.cc
|
| index c61ae4ed23023f6115f432363223de2bb375628d..1cd5d393b17030a5c6fdc05a7554016f27538276 100644
|
| --- a/device/hid/hid_service_linux.cc
|
| +++ b/device/hid/hid_service_linux.cc
|
| @@ -18,6 +18,7 @@
|
| #include "base/files/file_util.h"
|
| #include "base/location.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/scoped_observer.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| @@ -70,26 +71,25 @@ class HidServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer {
|
| public:
|
| FileThreadHelper(base::WeakPtr<HidServiceLinux> service,
|
| scoped_refptr<base::SingleThreadTaskRunner> task_runner)
|
| - : observer_(this), service_(service), task_runner_(task_runner) {}
|
| + : observer_(this), service_(service), task_runner_(task_runner) {
|
| + thread_checker_.DetachFromThread();
|
| + }
|
|
|
| ~FileThreadHelper() override {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| }
|
|
|
| - static void Start(std::unique_ptr<FileThreadHelper> self) {
|
| + void Start() {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| - self->thread_checker_.DetachFromThread();
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| DeviceMonitorLinux* monitor = DeviceMonitorLinux::GetInstance();
|
| - self->observer_.Add(monitor);
|
| - monitor->Enumerate(base::Bind(&FileThreadHelper::OnDeviceAdded,
|
| - base::Unretained(self.get())));
|
| - self->task_runner_->PostTask(
|
| + observer_.Add(monitor);
|
| + monitor->Enumerate(
|
| + base::Bind(&FileThreadHelper::OnDeviceAdded, base::Unretained(this)));
|
| + task_runner_->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&HidServiceLinux::FirstEnumerationComplete, self->service_));
|
| -
|
| - // |self| is now owned by the current message loop.
|
| - ignore_result(self.release());
|
| + base::Bind(&HidServiceLinux::FirstEnumerationComplete, service_));
|
| }
|
|
|
| private:
|
| @@ -187,11 +187,6 @@ class HidServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer {
|
| }
|
| }
|
|
|
| - void WillDestroyMonitorMessageLoop() override {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - delete this;
|
| - }
|
| -
|
| base::ThreadChecker thread_checker_;
|
| ScopedObserver<DeviceMonitorLinux, DeviceMonitorLinux::Observer> observer_;
|
|
|
| @@ -204,17 +199,24 @@ class HidServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer {
|
|
|
| HidServiceLinux::HidServiceLinux(
|
| scoped_refptr<base::SingleThreadTaskRunner> file_task_runner)
|
| - : file_task_runner_(file_task_runner), weak_factory_(this) {
|
| + : file_task_runner_(std::move(file_task_runner)), weak_factory_(this) {
|
| task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| - std::unique_ptr<FileThreadHelper> helper(
|
| - new FileThreadHelper(weak_factory_.GetWeakPtr(), task_runner_));
|
| - helper_ = helper.get();
|
| + helper_ = base::MakeUnique<FileThreadHelper>(weak_factory_.GetWeakPtr(),
|
| + task_runner_);
|
| file_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&FileThreadHelper::Start, base::Passed(&helper)));
|
| + FROM_HERE,
|
| + base::Bind(&FileThreadHelper::Start, base::Unretained(helper_.get())));
|
| }
|
|
|
| HidServiceLinux::~HidServiceLinux() {
|
| - file_task_runner_->DeleteSoon(FROM_HERE, helper_);
|
| + DCHECK(!helper_);
|
| +}
|
| +
|
| +void HidServiceLinux::Shutdown() {
|
| + const bool did_post_task =
|
| + file_task_runner_->DeleteSoon(FROM_HERE, helper_.release());
|
| + DCHECK(did_post_task);
|
| + HidService::Shutdown();
|
| }
|
|
|
| void HidServiceLinux::Connect(const HidDeviceId& device_id,
|
|
|