arc: Allow multiple bindings for a SensorDevice
ARC sensor HAL binds the same SensorDevice twice.
Once to query the sensor info, and once more to read sensor data.
Due to out-of-order mojo message arrival, the latter binding may
happen before the previous binding is closed.
BUG=b:162521349
TEST=Android app can access sensor data
Change-Id: I445e09623fa20ef55dd1a09a4fb1aa73074ed4ae
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2332199
Tested-by: Ryo Hashimoto <hashimoto@chromium.org>
Reviewed-by: Yusuke Sato <yusukes@chromium.org>
Commit-Queue: Ryo Hashimoto <hashimoto@chromium.org>
diff --git a/arc/vm/sensor_service/sensor_device_impl.cc b/arc/vm/sensor_service/sensor_device_impl.cc
index 5ff2221..06fc7f5 100644
--- a/arc/vm/sensor_service/sensor_device_impl.cc
+++ b/arc/vm/sensor_service/sensor_device_impl.cc
@@ -34,13 +34,14 @@
SensorDeviceImpl::SensorDeviceImpl(const base::FilePath& iio_sysfs_dir,
const base::FilePath& device_file)
- : iio_sysfs_dir_(iio_sysfs_dir), device_file_(device_file) {}
+ : iio_sysfs_dir_(iio_sysfs_dir), device_file_(device_file) {
+ bindings_.set_connection_error_handler(base::BindRepeating(
+ []() { LOG(INFO) << "SensorDevice connection closed."; }));
+}
SensorDeviceImpl::~SensorDeviceImpl() = default;
void SensorDeviceImpl::Bind(mojom::SensorDeviceRequest request) {
- binding_.Bind(std::move(request));
- binding_.set_connection_error_handler(base::BindOnce(
- []() { LOG(ERROR) << "SensorDevice connection closed."; }));
+ bindings_.AddBinding(this, std::move(request));
}
void SensorDeviceImpl::GetAttribute(const std::string& name,
diff --git a/arc/vm/sensor_service/sensor_device_impl.h b/arc/vm/sensor_service/sensor_device_impl.h
index 77dfa06..5e3e0f5 100644
--- a/arc/vm/sensor_service/sensor_device_impl.h
+++ b/arc/vm/sensor_service/sensor_device_impl.h
@@ -9,7 +9,7 @@
#include <string>
#include <base/files/file_descriptor_watcher_posix.h>
-#include <mojo/public/cpp/bindings/binding.h>
+#include <mojo/public/cpp/bindings/binding_set.h>
#include "arc/vm/sensor_service/sensor_service.mojom.h"
@@ -41,7 +41,7 @@
const base::FilePath iio_sysfs_dir_;
const base::FilePath device_file_;
- mojo::Binding<mojom::SensorDevice> binding_{this};
+ mojo::BindingSet<mojom::SensorDevice> bindings_;
base::ScopedFD device_fd_, pipe_write_end_;
std::unique_ptr<base::FileDescriptorWatcher::Controller> device_fd_watcher_;