diff --git a/sensors/1.0/default/Sensors.cpp b/sensors/1.0/default/Sensors.cpp index 41eb945167..37e2b81d9b 100644 --- a/sensors/1.0/default/Sensors.cpp +++ b/sensors/1.0/default/Sensors.cpp @@ -145,22 +145,41 @@ Return Sensors::activate( } Return Sensors::poll(int32_t maxCount, poll_cb _hidl_cb) { + hidl_vec out; hidl_vec dynamicSensorsAdded; - if (maxCount <= 0) { - _hidl_cb(Result::BAD_VALUE, out, dynamicSensorsAdded); - return Void(); + std::unique_ptr data; + int err = android::NO_ERROR; + + { // scope of reentry lock + + // This enforces a single client, meaning that a maximum of one client can call poll(). + // If this function is re-entred, it means that we are stuck in a state that may prevent + // the system from proceeding normally. + // + // Exit and let the system restart the sensor-hal-implementation hidl service. + // + // This function must not call _hidl_cb(...) or return until there is no risk of blocking. + std::unique_lock lock(mPollLock, std::try_to_lock); + if(!lock.owns_lock()){ + // cannot get the lock, hidl service will go into deadlock if it is not restarted. + // This is guaranteed to not trigger in passthrough mode. + LOG(FATAL) << + "ISensors::poll() re-entry. I do not know what to do except killing myself."; + } + + if (maxCount <= 0) { + err = android::BAD_VALUE; + } else { + int bufferSize = maxCount <= kPollMaxBufferSize ? maxCount : kPollMaxBufferSize; + data.reset(new sensors_event_t[bufferSize]); + err = mSensorDevice->poll( + reinterpret_cast(mSensorDevice), + data.get(), bufferSize); + } } - int bufferSize = maxCount <= kPollMaxBufferSize ? maxCount : kPollMaxBufferSize; - - std::unique_ptr data(new sensors_event_t[bufferSize]); - - int err = mSensorDevice->poll( - reinterpret_cast(mSensorDevice), - data.get(), bufferSize); - if (err < 0) { _hidl_cb(ResultFromStatus(err), out, dynamicSensorsAdded); return Void(); diff --git a/sensors/1.0/default/Sensors.h b/sensors/1.0/default/Sensors.h index 09729d39e6..7d715e0f6f 100644 --- a/sensors/1.0/default/Sensors.h +++ b/sensors/1.0/default/Sensors.h @@ -20,6 +20,7 @@ #include #include +#include namespace android { namespace hardware { @@ -65,6 +66,7 @@ private: status_t mInitCheck; sensors_module_t *mSensorModule; sensors_poll_device_1_t *mSensorDevice; + std::mutex mPollLock; int getHalDeviceVersion() const;