summaryrefslogtreecommitdiff
path: root/sensors/1.0/default/Sensors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sensors/1.0/default/Sensors.cpp')
-rw-r--r--sensors/1.0/default/Sensors.cpp41
1 files changed, 30 insertions, 11 deletions
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,21 +145,40 @@ Return<Result> Sensors::activate(
}
Return<void> Sensors::poll(int32_t maxCount, poll_cb _hidl_cb) {
+
hidl_vec<Event> out;
hidl_vec<SensorInfo> dynamicSensorsAdded;
- if (maxCount <= 0) {
- _hidl_cb(Result::BAD_VALUE, out, dynamicSensorsAdded);
- return Void();
- }
-
- int bufferSize = maxCount <= kPollMaxBufferSize ? maxCount : kPollMaxBufferSize;
-
- std::unique_ptr<sensors_event_t[]> data(new sensors_event_t[bufferSize]);
+ std::unique_ptr<sensors_event_t[]> 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<std::mutex> 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.";
+ }
- int err = mSensorDevice->poll(
- reinterpret_cast<sensors_poll_device_t *>(mSensorDevice),
- data.get(), bufferSize);
+ 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<sensors_poll_device_t *>(mSensorDevice),
+ data.get(), bufferSize);
+ }
+ }
if (err < 0) {
_hidl_cb(ResultFromStatus(err), out, dynamicSensorsAdded);