Index: device/usb/usb_service_linux.cc |
diff --git a/device/usb/usb_service_linux.cc b/device/usb/usb_service_linux.cc |
index 73c71a7b6c46e12f6b34fbeed48c729491dbbb1d..56ad14929c27362fb00ab788b66d33193e0b4206 100644 |
--- a/device/usb/usb_service_linux.cc |
+++ b/device/usb/usb_service_linux.cc |
@@ -6,11 +6,15 @@ |
#include <stdint.h> |
+#include <utility> |
+ |
#include "base/bind.h" |
#include "base/files/file.h" |
#include "base/files/file_path.h" |
#include "base/files/file_util.h" |
#include "base/location.h" |
+#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "base/memory/weak_ptr.h" |
#include "base/scoped_observer.h" |
#include "base/single_thread_task_runner.h" |
@@ -70,13 +74,12 @@ class UsbServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer { |
scoped_refptr<base::SingleThreadTaskRunner> task_runner); |
~FileThreadHelper() override; |
- static void Start(std::unique_ptr<FileThreadHelper> self); |
+ void Start(); |
private: |
// DeviceMonitorLinux::Observer: |
void OnDeviceAdded(udev_device* udev_device) override; |
void OnDeviceRemoved(udev_device* device) override; |
- void WillDestroyMonitorMessageLoop() override; |
base::ThreadChecker thread_checker_; |
ScopedObserver<DeviceMonitorLinux, DeviceMonitorLinux::Observer> observer_; |
@@ -91,27 +94,25 @@ class UsbServiceLinux::FileThreadHelper : public DeviceMonitorLinux::Observer { |
UsbServiceLinux::FileThreadHelper::FileThreadHelper( |
base::WeakPtr<UsbServiceLinux> service, |
scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
- : observer_(this), service_(service), task_runner_(task_runner) {} |
+ : observer_(this), service_(service), task_runner_(std::move(task_runner)) { |
+ thread_checker_.DetachFromThread(); |
+} |
UsbServiceLinux::FileThreadHelper::~FileThreadHelper() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
} |
// static |
-void UsbServiceLinux::FileThreadHelper::Start( |
- std::unique_ptr<FileThreadHelper> self) { |
+void UsbServiceLinux::FileThreadHelper::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( |
- FROM_HERE, base::Bind(&UsbServiceLinux::HelperStarted, self->service_)); |
- |
- // |self| is now owned by the current message loop. |
- ignore_result(self.release()); |
+ observer_.Add(monitor); |
+ monitor->Enumerate( |
+ base::Bind(&FileThreadHelper::OnDeviceAdded, base::Unretained(this))); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&UsbServiceLinux::HelperStarted, service_)); |
} |
void UsbServiceLinux::FileThreadHelper::OnDeviceAdded( |
@@ -182,23 +183,27 @@ void UsbServiceLinux::FileThreadHelper::OnDeviceRemoved(udev_device* device) { |
} |
} |
-void UsbServiceLinux::FileThreadHelper::WillDestroyMonitorMessageLoop() { |
- delete this; |
-} |
- |
UsbServiceLinux::UsbServiceLinux( |
- scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) |
- : UsbService(base::ThreadTaskRunnerHandle::Get(), blocking_task_runner), |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_in) |
+ : UsbService(base::ThreadTaskRunnerHandle::Get(), |
+ std::move(blocking_task_runner_in)), |
weak_factory_(this) { |
- std::unique_ptr<FileThreadHelper> helper( |
- new FileThreadHelper(weak_factory_.GetWeakPtr(), task_runner())); |
- helper_ = helper.get(); |
- blocking_task_runner->PostTask( |
- FROM_HERE, base::Bind(&FileThreadHelper::Start, base::Passed(&helper))); |
+ helper_ = base::MakeUnique<FileThreadHelper>(weak_factory_.GetWeakPtr(), |
+ task_runner()); |
+ blocking_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&FileThreadHelper::Start, base::Unretained(helper_.get()))); |
} |
UsbServiceLinux::~UsbServiceLinux() { |
- blocking_task_runner()->DeleteSoon(FROM_HERE, helper_); |
+ DCHECK(!helper_); |
+} |
+ |
+void UsbServiceLinux::Shutdown() { |
+ const bool did_post_task = |
+ blocking_task_runner()->DeleteSoon(FROM_HERE, helper_.release()); |
+ DCHECK(did_post_task); |
+ UsbService::Shutdown(); |
} |
void UsbServiceLinux::GetDevices(const GetDevicesCallback& callback) { |