summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Prabir Pradhan <prabirmsp@google.com> 2025-03-21 07:58:31 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-21 07:58:31 -0700
commitb0ef41117ea39e5b522375d39487b4a4b705e239 (patch)
tree1304c4b8475288f5b0f211c412f5656a941187d3
parentf9bfbe16e4399252bdc51060e5c8af82db6f470e (diff)
parent727cbc09e054a64b639a878b60c7c288b4bb2d1e (diff)
Merge "EventHub: Close opening device before deleting on sysfs change" into main
-rw-r--r--services/inputflinger/reader/EventHub.cpp45
1 files changed, 26 insertions, 19 deletions
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp
index 2fcb5d831f..08d51c32b5 100644
--- a/services/inputflinger/reader/EventHub.cpp
+++ b/services/inputflinger/reader/EventHub.cpp
@@ -2694,32 +2694,25 @@ void EventHub::sysfsNodeChanged(const std::string& sysfsNodePath) {
return changed;
};
- std::set<Device*> devicesToClose;
- std::set<std::string /*path*/> devicesToOpen;
+ std::set<Device*> devicesToReopen;
- // Check in opening devices. If its associated device changed,
- // the device should be removed from mOpeningDevices and needs to be opened again.
- std::erase_if(mOpeningDevices, [&](const auto& dev) {
+ // Check in opening devices.
+ for (const auto& dev : mOpeningDevices) {
if (isAssociatedDeviceChanged(*dev)) {
- devicesToOpen.emplace(dev->path);
- return true;
+ devicesToReopen.emplace(dev.get());
}
- return false;
- });
+ }
- // Check in already added device. If its associated device changed,
- // the device needs to be re-opened.
+ // Check in already added devices.
for (const auto& [id, dev] : mDevices) {
if (isAssociatedDeviceChanged(*dev)) {
- devicesToOpen.emplace(dev->path);
- devicesToClose.emplace(dev.get());
+ devicesToReopen.emplace(dev.get());
}
}
- for (auto* device : devicesToClose) {
- closeDeviceLocked(*device);
- }
- for (const auto& path : devicesToOpen) {
+ for (auto* device : devicesToReopen) {
+ const auto path = device->path;
+ closeDeviceLocked(*device); // The Device object is deleted by this function.
openDeviceLocked(path);
}
}
@@ -2817,9 +2810,23 @@ void EventHub::closeDeviceLocked(Device& device) {
releaseControllerNumberLocked(device.controllerNumber);
device.controllerNumber = 0;
device.close();
- mClosingDevices.push_back(std::move(mDevices[device.id]));
- mDevices.erase(device.id);
+ // Try to remove this device from mDevices.
+ if (auto it = mDevices.find(device.id); it != mDevices.end()) {
+ mClosingDevices.push_back(std::move(mDevices[device.id]));
+ mDevices.erase(device.id);
+ return;
+ }
+
+ // Try to remove this device from mOpeningDevices.
+ if (auto it = std::find_if(mOpeningDevices.begin(), mOpeningDevices.end(),
+ [&device](auto& d) { return d->id == device.id; });
+ it != mOpeningDevices.end()) {
+ mOpeningDevices.erase(it);
+ return;
+ }
+
+ LOG_ALWAYS_FATAL("%s: Device with id %d was not found!", __func__, device.id);
}
base::Result<void> EventHub::readNotifyLocked() {