From de6c44e90681cbdb754e55721953fc828ec8e2aa Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Sun, 16 Oct 2011 22:15:23 -0700 Subject: [PATCH] SensorManager reconnects to sensor service when the later dies if system process ever restarted, processes using a SensorManager would loose the ability to use it, resulting to a crash. we now listen for sensor service death and reconnected if necessary. Bug: 5445240 Change-Id: Ia47f8b26cdcecb729fa22bf11d55e10fcaef8cfc --- include/gui/SensorManager.h | 20 +++++-- libs/gui/SensorManager.cpp | 109 ++++++++++++++++++++++++++---------- 2 files changed, 95 insertions(+), 34 deletions(-) diff --git a/include/gui/SensorManager.h b/include/gui/SensorManager.h index e1b1a7be45fb9..3176462db622b 100644 --- a/include/gui/SensorManager.h +++ b/include/gui/SensorManager.h @@ -20,6 +20,8 @@ #include #include +#include + #include #include #include @@ -41,7 +43,9 @@ class SensorEventQueue; // ---------------------------------------------------------------------------- -class SensorManager : public ASensorManager, public Singleton +class SensorManager : + public ASensorManager, + public Singleton { public: SensorManager(); @@ -52,9 +56,17 @@ public: sp createEventQueue(); private: - sp mSensorServer; - Sensor const** mSensorList; - Vector mSensors; + // DeathRecipient interface + void sensorManagerDied(); + + status_t assertStateLocked() const; + +private: + mutable Mutex mLock; + mutable sp mSensorServer; + mutable Sensor const** mSensorList; + mutable Vector mSensors; + mutable sp mDeathObserver; }; // ---------------------------------------------------------------------------- diff --git a/libs/gui/SensorManager.cpp b/libs/gui/SensorManager.cpp index 4774a58b3a0e1..dafcdea2331e5 100644 --- a/libs/gui/SensorManager.cpp +++ b/libs/gui/SensorManager.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -40,17 +41,8 @@ ANDROID_SINGLETON_STATIC_INSTANCE(SensorManager) SensorManager::SensorManager() : mSensorList(0) { - const String16 name("sensorservice"); - while (getService(name, &mSensorServer) != NO_ERROR) { - usleep(250000); - } - - mSensors = mSensorServer->getSensorList(); - size_t count = mSensors.size(); - mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*)); - for (size_t i=0 ; i& who) { + LOGW("sensorservice died [%p]", who.unsafe_get()); + mSensorManger.sensorManagerDied(); + } + public: + DeathObserver(SensorManager& mgr) : mSensorManger(mgr) { } + }; + + mDeathObserver = new DeathObserver(*const_cast(this)); + mSensorServer->asBinder()->linkToDeath(mDeathObserver); + + mSensors = mSensorServer->getSensorList(); + size_t count = mSensors.size(); + mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*)); + for (size_t i=0 ; igetType() == type) - return mSensorList[i]; + Mutex::Autolock _l(mLock); + if (assertStateLocked() == NO_ERROR) { + // For now we just return the first sensor of that type we find. + // in the future it will make sense to let the SensorService make + // that decision. + for (size_t i=0 ; igetType() == type) + return mSensorList[i]; + } } return NULL; } @@ -80,20 +131,18 @@ sp SensorManager::createEventQueue() { sp queue; - if (mSensorServer == NULL) { - LOGE("createEventQueue: mSensorSever is NULL"); - return queue; + Mutex::Autolock _l(mLock); + while (assertStateLocked() == NO_ERROR) { + sp connection = + mSensorServer->createSensorEventConnection(); + if (connection == NULL) { + // SensorService just died. + LOGE("createEventQueue: connection is NULL. SensorService died."); + continue; + } + queue = new SensorEventQueue(connection); + break; } - - sp connection = - mSensorServer->createSensorEventConnection(); - if (connection == NULL) { - LOGE("createEventQueue: connection is NULL"); - return queue; - } - - queue = new SensorEventQueue(connection); - return queue; }