diff options
author | 2024-02-23 22:57:18 +0000 | |
---|---|---|
committer | 2024-02-27 19:20:29 +0000 | |
commit | d8119dabbee2331395a7cdeb79999b706a58cf61 (patch) | |
tree | ae5edd9e3a0e2f5454ecc77a6e2865f01ec4399d | |
parent | 611a65d514033f5455fd9f32538e625500d64e7a (diff) |
Send wake event to ISensorHalWrapper fmq when switching to Hal Bypass Mode
When switching from NORMAL to HAL_BYPASS_REPLAY_DATA_INJECTION mode, the
ISensorHalWrapper::pollFmq() method continues to wait for sensor events.
Since the sensors are disabled when switching to Hal Bypass mode, the
polling thread may continue to wait on the fmq indefinitely.
Send an internal wake event to the fmq when switching to Hal Bypass
mode so that the thread drops out of pollFmq() and enters the branch for
accepting injected replay data.
Bug: 326433087
Test: manual
Change-Id: I984e55f64469cfac1c9156ea4660fc1dc4818695
-rw-r--r-- | services/sensorservice/AidlSensorHalWrapper.cpp | 16 | ||||
-rw-r--r-- | services/sensorservice/HidlSensorHalWrapper.cpp | 16 | ||||
-rw-r--r-- | services/sensorservice/ISensorHalWrapper.h | 2 | ||||
-rw-r--r-- | services/sensorservice/SensorDevice.cpp | 1 |
4 files changed, 34 insertions, 1 deletions
diff --git a/services/sensorservice/AidlSensorHalWrapper.cpp b/services/sensorservice/AidlSensorHalWrapper.cpp index e60db93431..91c2d1f3be 100644 --- a/services/sensorservice/AidlSensorHalWrapper.cpp +++ b/services/sensorservice/AidlSensorHalWrapper.cpp @@ -178,6 +178,11 @@ ssize_t AidlSensorHalWrapper::pollFmq(sensors_event_t *buffer, size_t maxNumEven if ((eventFlagState & asBaseType(INTERNAL_WAKE)) && mReconnecting) { ALOGD("Event FMQ internal wake, returning from poll with no events"); return DEAD_OBJECT; + } else if ((eventFlagState & asBaseType(INTERNAL_WAKE)) && mInHalBypassMode && + availableEvents == 0) { + ALOGD("Event FMQ internal wake due to HAL Bypass Mode, returning from poll with no " + "events"); + return OK; } } @@ -221,6 +226,17 @@ std::vector<sensor_t> AidlSensorHalWrapper::getSensorsList() { status_t AidlSensorHalWrapper::setOperationMode(SensorService::Mode mode) { if (mSensors == nullptr) return NO_INIT; + if (mode == SensorService::Mode::HAL_BYPASS_REPLAY_DATA_INJECTION) { + if (!mInHalBypassMode) { + mInHalBypassMode = true; + mEventQueueFlag->wake(asBaseType(INTERNAL_WAKE)); + } + return OK; + } else { + if (mInHalBypassMode) { + mInHalBypassMode = false; + } + } return convertToStatus(mSensors->setOperationMode(static_cast<ISensors::OperationMode>(mode))); } diff --git a/services/sensorservice/HidlSensorHalWrapper.cpp b/services/sensorservice/HidlSensorHalWrapper.cpp index c55c9b4748..8c867bdd32 100644 --- a/services/sensorservice/HidlSensorHalWrapper.cpp +++ b/services/sensorservice/HidlSensorHalWrapper.cpp @@ -203,6 +203,11 @@ ssize_t HidlSensorHalWrapper::pollFmq(sensors_event_t* buffer, size_t maxNumEven if ((eventFlagState & asBaseType(INTERNAL_WAKE)) && mReconnecting) { ALOGD("Event FMQ internal wake, returning from poll with no events"); return DEAD_OBJECT; + } else if ((eventFlagState & asBaseType(INTERNAL_WAKE)) && mInHalBypassMode && + availableEvents == 0) { + ALOGD("Event FMQ internal wake due to HAL Bypass Mode, returning from poll with no " + "events"); + return OK; } } @@ -251,6 +256,17 @@ std::vector<sensor_t> HidlSensorHalWrapper::getSensorsList() { status_t HidlSensorHalWrapper::setOperationMode(SensorService::Mode mode) { if (mSensors == nullptr) return NO_INIT; + if (mode == SensorService::Mode::HAL_BYPASS_REPLAY_DATA_INJECTION) { + if (!mInHalBypassMode) { + mInHalBypassMode = true; + mEventQueueFlag->wake(asBaseType(INTERNAL_WAKE)); + } + return OK; + } else { + if (mInHalBypassMode) { + mInHalBypassMode = false; + } + } return checkReturnAndGetStatus( mSensors->setOperationMode(static_cast<hardware::sensors::V1_0::OperationMode>(mode))); } diff --git a/services/sensorservice/ISensorHalWrapper.h b/services/sensorservice/ISensorHalWrapper.h index 3d33540c18..891dfe5a77 100644 --- a/services/sensorservice/ISensorHalWrapper.h +++ b/services/sensorservice/ISensorHalWrapper.h @@ -97,6 +97,8 @@ public: virtual void writeWakeLockHandled(uint32_t count) = 0; std::atomic_bool mReconnecting = false; + + std::atomic_bool mInHalBypassMode = false; }; } // namespace android diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index 8e9dfea65e..f62562ce9d 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -812,7 +812,6 @@ status_t SensorDevice::setMode(uint32_t mode) { } mInHalBypassMode = true; } - return OK; } else { if (mInHalBypassMode) { // We are transitioning out of HAL Bypass mode. We need to notify the reader thread |