From 50b66767f6c5635430483393e17d15969dfe2f05 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 29 Nov 2010 17:26:51 -0800 Subject: [PATCH] fix [3237242] sensormanager sensor active count gets out of sync whether a physical sensor needed to be active or not was managed by a simpe reference counter; unfortunatelly nothing prevented it to get out of sync if a sensor was disabled more than once. sensorservice already maintainted a list of all the "clients" connected to a physical sensor; we now use that list to determine if a sensor should be enabled. This can never be "out-of-sync" since this is the only data structure linking a sensor to a user of that sensor. also removed the isEnabled() method, which was never used and implemented wrongly (since it didn't take into account that a sensor could be disabled for a client but not of another). Change-Id: I789affb877728ca957e99f7ba749def37c4db1c7 --- services/sensorservice/GravitySensor.cpp | 8 +------ services/sensorservice/GravitySensor.h | 2 -- .../LinearAccelerationSensor.cpp | 4 ---- .../sensorservice/LinearAccelerationSensor.h | 1 - .../sensorservice/RotationVectorSensor.cpp | 18 +++++---------- services/sensorservice/RotationVectorSensor.h | 2 -- services/sensorservice/SensorDevice.cpp | 22 ++++++++++--------- services/sensorservice/SensorDevice.h | 3 +-- services/sensorservice/SensorInterface.cpp | 13 +++-------- services/sensorservice/SensorInterface.h | 3 --- 10 files changed, 22 insertions(+), 54 deletions(-) diff --git a/services/sensorservice/GravitySensor.cpp b/services/sensorservice/GravitySensor.cpp index da72f9c4b..5c6aa99e9 100644 --- a/services/sensorservice/GravitySensor.cpp +++ b/services/sensorservice/GravitySensor.cpp @@ -29,7 +29,7 @@ namespace android { GravitySensor::GravitySensor(sensor_t const* list, size_t count) : mSensorDevice(SensorDevice::getInstance()), - mEnabled(false), mAccTime(0), + mAccTime(0), mLowPass(M_SQRT1_2, 1.5f), mX(mLowPass), mY(mLowPass), mZ(mLowPass) @@ -71,15 +71,9 @@ bool GravitySensor::process(sensors_event_t* outEvent, } return false; } - -bool GravitySensor::isEnabled() const { - return mEnabled; -} - status_t GravitySensor::activate(void* ident, bool enabled) { status_t err = mSensorDevice.activate(this, mAccelerometer.getHandle(), enabled); if (err == NO_ERROR) { - mEnabled = enabled; if (enabled) { mAccTime = 0; } diff --git a/services/sensorservice/GravitySensor.h b/services/sensorservice/GravitySensor.h index ff3bea77e..decfbb891 100644 --- a/services/sensorservice/GravitySensor.h +++ b/services/sensorservice/GravitySensor.h @@ -33,7 +33,6 @@ namespace android { class GravitySensor : public SensorInterface { SensorDevice& mSensorDevice; Sensor mAccelerometer; - bool mEnabled; double mAccTime; SecondOrderLowPassFilter mLowPass; @@ -43,7 +42,6 @@ public: GravitySensor(sensor_t const* list, size_t count); virtual bool process(sensors_event_t* outEvent, const sensors_event_t& event); - virtual bool isEnabled() const; virtual status_t activate(void* ident, bool enabled); virtual status_t setDelay(void* ident, int handle, int64_t ns); virtual Sensor getSensor() const; diff --git a/services/sensorservice/LinearAccelerationSensor.cpp b/services/sensorservice/LinearAccelerationSensor.cpp index 2dc12dc50..9425a9209 100644 --- a/services/sensorservice/LinearAccelerationSensor.cpp +++ b/services/sensorservice/LinearAccelerationSensor.cpp @@ -53,10 +53,6 @@ bool LinearAccelerationSensor::process(sensors_event_t* outEvent, return result; } -bool LinearAccelerationSensor::isEnabled() const { - return mGravitySensor.isEnabled(); -} - status_t LinearAccelerationSensor::activate(void* ident, bool enabled) { return mGravitySensor.activate(ident, enabled); } diff --git a/services/sensorservice/LinearAccelerationSensor.h b/services/sensorservice/LinearAccelerationSensor.h index ee918ce1c..c577086ab 100644 --- a/services/sensorservice/LinearAccelerationSensor.h +++ b/services/sensorservice/LinearAccelerationSensor.h @@ -40,7 +40,6 @@ class LinearAccelerationSensor : public SensorInterface { const sensors_event_t& event); public: LinearAccelerationSensor(sensor_t const* list, size_t count); - virtual bool isEnabled() const; virtual status_t activate(void* ident, bool enabled); virtual status_t setDelay(void* ident, int handle, int64_t ns); virtual Sensor getSensor() const; diff --git a/services/sensorservice/RotationVectorSensor.cpp b/services/sensorservice/RotationVectorSensor.cpp index 50cd6beac..418e7f8d0 100644 --- a/services/sensorservice/RotationVectorSensor.cpp +++ b/services/sensorservice/RotationVectorSensor.cpp @@ -34,7 +34,6 @@ static inline T clamp(T v) { RotationVectorSensor::RotationVectorSensor(sensor_t const* list, size_t count) : mSensorDevice(SensorDevice::getInstance()), - mEnabled(false), mALowPass(M_SQRT1_2, 5.0f), mAX(mALowPass), mAY(mALowPass), mAZ(mALowPass), mMLowPass(M_SQRT1_2, 2.5f), @@ -133,19 +132,12 @@ bool RotationVectorSensor::process(sensors_event_t* outEvent, return false; } -bool RotationVectorSensor::isEnabled() const { - return mEnabled; -} - status_t RotationVectorSensor::activate(void* ident, bool enabled) { - if (mEnabled != enabled) { - mSensorDevice.activate(this, mAcc.getHandle(), enabled); - mSensorDevice.activate(this, mMag.getHandle(), enabled); - mEnabled = enabled; - if (enabled) { - mMagTime = 0; - mAccTime = 0; - } + mSensorDevice.activate(this, mAcc.getHandle(), enabled); + mSensorDevice.activate(this, mMag.getHandle(), enabled); + if (enabled) { + mMagTime = 0; + mAccTime = 0; } return NO_ERROR; } diff --git a/services/sensorservice/RotationVectorSensor.h b/services/sensorservice/RotationVectorSensor.h index e7f28c93a..b7c951274 100644 --- a/services/sensorservice/RotationVectorSensor.h +++ b/services/sensorservice/RotationVectorSensor.h @@ -34,7 +34,6 @@ class RotationVectorSensor : public SensorInterface { SensorDevice& mSensorDevice; Sensor mAcc; Sensor mMag; - bool mEnabled; float mMagData[3]; double mAccTime; double mMagTime; @@ -47,7 +46,6 @@ public: RotationVectorSensor(sensor_t const* list, size_t count); virtual bool process(sensors_event_t* outEvent, const sensors_event_t& event); - virtual bool isEnabled() const; virtual status_t activate(void* ident, bool enabled); virtual status_t setDelay(void* ident, int handle, int64_t ns); virtual Sensor getSensor() const; diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp index 73f85ba35..f192913fd 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -137,9 +137,8 @@ void SensorDevice::dump(String8& result, char* buffer, size_t SIZE) Mutex::Autolock _l(mLock); for (size_t i=0 ; i= 0) { + if (info.rates.size() == 0) { + actuateHardware = true; + } + } else { + // sensor wasn't enabled for this ident + } } + if (actuateHardware) { err = mSensorDevice->activate(mSensorDevice, handle, enabled); if (enabled) { diff --git a/services/sensorservice/SensorDevice.h b/services/sensorservice/SensorDevice.h index 63ecbcdde..c19b2ced4 100644 --- a/services/sensorservice/SensorDevice.h +++ b/services/sensorservice/SensorDevice.h @@ -40,8 +40,7 @@ class SensorDevice : public Singleton { Mutex mLock; // protect mActivationCount[].rates // fixed-size array after construction struct Info { - Info() : count(0) { } - int32_t count; + Info() { } KeyedVector rates; }; DefaultKeyedVector mActivationCount; diff --git a/services/sensorservice/SensorInterface.cpp b/services/sensorservice/SensorInterface.cpp index 93d23d9a4..be8eaff73 100644 --- a/services/sensorservice/SensorInterface.cpp +++ b/services/sensorservice/SensorInterface.cpp @@ -32,7 +32,7 @@ SensorInterface::~SensorInterface() HardwareSensor::HardwareSensor(const sensor_t& sensor) : mSensorDevice(SensorDevice::getInstance()), - mSensor(&sensor), mEnabled(false) + mSensor(&sensor) { LOGI("%s", sensor.name); } @@ -46,15 +46,8 @@ bool HardwareSensor::process(sensors_event_t* outEvent, return true; } -bool HardwareSensor::isEnabled() const { - return mEnabled; -} - -status_t HardwareSensor::activate(void* ident,bool enabled) { - status_t err = mSensorDevice.activate(ident, mSensor.getHandle(), enabled); - if (err == NO_ERROR) - mEnabled = enabled; - return err; +status_t HardwareSensor::activate(void* ident, bool enabled) { + return mSensorDevice.activate(ident, mSensor.getHandle(), enabled); } status_t HardwareSensor::setDelay(void* ident, int handle, int64_t ns) { diff --git a/services/sensorservice/SensorInterface.h b/services/sensorservice/SensorInterface.h index eebd5638f..084f2f5cc 100644 --- a/services/sensorservice/SensorInterface.h +++ b/services/sensorservice/SensorInterface.h @@ -38,7 +38,6 @@ public: virtual bool process(sensors_event_t* outEvent, const sensors_event_t& event) = 0; - virtual bool isEnabled() const = 0; virtual status_t activate(void* ident, bool enabled) = 0; virtual status_t setDelay(void* ident, int handle, int64_t ns) = 0; virtual Sensor getSensor() const = 0; @@ -51,7 +50,6 @@ class HardwareSensor : public SensorInterface { SensorDevice& mSensorDevice; Sensor mSensor; - bool mEnabled; public: HardwareSensor(const sensor_t& sensor); @@ -61,7 +59,6 @@ public: virtual bool process(sensors_event_t* outEvent, const sensors_event_t& event); - virtual bool isEnabled() const; virtual status_t activate(void* ident, bool enabled); virtual status_t setDelay(void* ident, int handle, int64_t ns); virtual Sensor getSensor() const;