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

Unified Diff: device/generic_sensor/platform_sensor_provider_linux.cc

Issue 2533793002: [sensors](CrOS/Linux) Implement Sensor device manager for sensors (Closed)
Patch Set: fix build.gn Created 4 years, 1 month 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
Index: device/generic_sensor/platform_sensor_provider_linux.cc
diff --git a/device/generic_sensor/platform_sensor_provider_linux.cc b/device/generic_sensor/platform_sensor_provider_linux.cc
index ec5226bf5ca69ec5047cb97ce11542c6ec91957f..b58c69f421b78ea3ab6e4efdda30b9baca268e8d 100644
--- a/device/generic_sensor/platform_sensor_provider_linux.cc
+++ b/device/generic_sensor/platform_sensor_provider_linux.cc
@@ -5,11 +5,9 @@
#include "device/generic_sensor/platform_sensor_provider_linux.h"
#include "base/memory/singleton.h"
-#include "base/task_runner_util.h"
#include "base/threading/thread.h"
-#include "device/generic_sensor/linux/platform_sensor_utils_linux.h"
-#include "device/generic_sensor/linux/sensor_data_linux.h"
#include "device/generic_sensor/platform_sensor_linux.h"
+#include "device/generic_sensor/platform_sensor_manager_linux.h"
namespace device {
@@ -28,41 +26,23 @@ void PlatformSensorProviderLinux::CreateSensorInternal(
mojom::SensorType type,
mojo::ScopedSharedBufferMapping mapping,
const CreateSensorCallback& callback) {
- SensorDataLinux data;
- if (!InitSensorData(type, &data)) {
- callback.Run(nullptr);
- return;
- }
-
- if (!polling_thread_)
- polling_thread_.reset(new base::Thread("Sensor polling thread"));
+ DCHECK(sensor_device_manager_);
- if (!polling_thread_->IsRunning()) {
- if (!polling_thread_->StartWithOptions(
- base::Thread::Options(base::MessageLoop::TYPE_IO, 0))) {
- callback.Run(nullptr);
- return;
- }
- polling_thread_task_runner_ = polling_thread_->task_runner();
- }
+ SensorDeviceManager::GetSensorDeviceCallback cb = base::Bind(
+ &PlatformSensorProviderLinux::SensorDeviceFound, base::Unretained(this),
+ type, base::Passed(&mapping), callback);
- base::PostTaskAndReplyWithResult(
- polling_thread_task_runner_.get(), FROM_HERE,
- base::Bind(SensorReader::Create, data),
- base::Bind(&PlatformSensorProviderLinux::SensorReaderFound,
- base::Unretained(this), type, base::Passed(&mapping), callback,
- data));
+ sensor_device_manager_->GetSensorDevice(type, cb);
}
-void PlatformSensorProviderLinux::SensorReaderFound(
+void PlatformSensorProviderLinux::SensorDeviceFound(
mojom::SensorType type,
mojo::ScopedSharedBufferMapping mapping,
const PlatformSensorProviderBase::CreateSensorCallback& callback,
- const SensorDataLinux& data,
- std::unique_ptr<SensorReader> sensor_reader) {
+ SensorDeviceLinux* sensor_device) {
DCHECK(CalledOnValidThread());
- if (!sensor_reader) {
+ if (!sensor_device) {
// If there are no sensors, stop polling thread.
if (!HasSensors())
AllSensorsRemoved();
@@ -70,33 +50,63 @@ void PlatformSensorProviderLinux::SensorReaderFound(
return;
}
- callback.Run(new PlatformSensorLinux(type, std::move(mapping), this, data,
- std::move(sensor_reader),
- polling_thread_task_runner_));
+ if (!StartPollingThread()) {
+ callback.Run(nullptr);
+ return;
+ }
+
+ callback.Run(new PlatformSensorLinux(type, std::move(mapping), this,
+ sensor_device,
+ polling_thread_->task_runner()));
}
void PlatformSensorProviderLinux::SetFileTaskRunner(
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner) {
DCHECK(CalledOnValidThread());
- if (!file_task_runner_)
- file_task_runner_ = file_task_runner;
+ file_task_runner_ = file_task_runner;
Mikhail 2016/11/30 12:29:36 runner should not be reset in runtime, otherwise s
maksims (do not use this acc) 2016/12/05 13:06:59 Done.
+ InitializeSensorDeviceManager();
+}
+
+void PlatformSensorProviderLinux::SetSensorDeviceServiceForTesting(
+ std::unique_ptr<SensorDeviceService> device) {
+ DCHECK(sensor_device_manager_);
+ sensor_device_manager_->SetSensorDeviceServiceForTesting(std::move(device));
}
void PlatformSensorProviderLinux::AllSensorsRemoved() {
DCHECK(CalledOnValidThread());
DCHECK(file_task_runner_);
+ sensor_device_manager_->Shutdown();
// When there are no sensors left, the polling thread must be stopped.
- // Stop() can only be called on a different thread that allows io.
+ // Stop() can only be called on a different thread that allows I/O.
// Thus, browser's file thread is used for this purpose.
file_task_runner_->PostTask(
FROM_HERE, base::Bind(&PlatformSensorProviderLinux::StopPollingThread,
base::Unretained(this)));
}
+bool PlatformSensorProviderLinux::StartPollingThread() {
+ if (!polling_thread_)
+ polling_thread_.reset(new base::Thread("Sensor polling thread"));
+
+ if (!polling_thread_->IsRunning()) {
+ return polling_thread_->StartWithOptions(
+ base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
+ }
+ return true;
+}
+
void PlatformSensorProviderLinux::StopPollingThread() {
DCHECK(file_task_runner_);
DCHECK(file_task_runner_->BelongsToCurrentThread());
- polling_thread_->Stop();
+ if (polling_thread_ && polling_thread_->IsRunning())
+ polling_thread_->Stop();
+}
+
+void PlatformSensorProviderLinux::InitializeSensorDeviceManager() {
+ if (!sensor_device_manager_)
+ sensor_device_manager_.reset(new SensorDeviceManager());
+ sensor_device_manager_->SetBlockingTaskRunner(file_task_runner_);
}
} // namespace device

Powered by Google App Engine
This is Rietveld 408576698