OSDN Git Service

Bug fix in SensorManager.
authorAravind Akella <aakella@google.com>
Fri, 24 Jul 2015 18:08:41 +0000 (11:08 -0700)
committerAravind Akella <aakella@google.com>
Sun, 26 Jul 2015 18:48:06 +0000 (11:48 -0700)
If SensorService hasn't started when SensorManager instance is requested, keep retrying for a
longer duration.

Bug: 22529981
Change-Id: I4ba6b760608e34d79273aeb39568f0fa72fbaf9d

include/gui/SensorManager.h
libs/gui/SensorManager.cpp

index 3796067..9794d4e 100644 (file)
@@ -101,7 +101,6 @@ public:
         return *sensorManager;
     }
 
-    SensorManager(const String16& opPackageName);
     ~SensorManager();
 
     ssize_t getSensorList(Sensor const* const** list) const;
@@ -113,6 +112,7 @@ private:
     // DeathRecipient interface
     void sensorManagerDied();
 
+    SensorManager(const String16& opPackageName);
     status_t assertStateLocked() const;
 
 private:
@@ -127,6 +127,8 @@ private:
     const String16 mOpPackageName;
 };
 
+android::Mutex android::SensorManager::sLock;
+std::map<String16, SensorManager*> android::SensorManager::sPackageInstances;
 // ----------------------------------------------------------------------------
 }; // namespace android
 
index dd37781..ead535e 100644 (file)
@@ -59,12 +59,13 @@ void SensorManager::sensorManagerDied()
 
 status_t SensorManager::assertStateLocked() const {
     if (mSensorServer == NULL) {
-        // try for one second
         const String16 name("sensorservice");
-        for (int i=0 ; i<4 ; i++) {
+        // try 10 times before giving up ...
+        for (int i = 0; i < 10; ++i) {
             status_t err = getService(name, &mSensorServer);
             if (err == NAME_NOT_FOUND) {
-                usleep(250000);
+                // Sleep for 1 second before retrying.
+                sleep(1);
                 continue;
             }
             if (err != NO_ERROR) {
@@ -73,6 +74,10 @@ status_t SensorManager::assertStateLocked() const {
             break;
         }
 
+        if (mSensorServer == NULL) {
+            ALOGE("FATAL getsensorservice returned` NULL");
+        }
+
         class DeathObserver : public IBinder::DeathRecipient {
             SensorManager& mSensorManger;
             virtual void binderDied(const wp<IBinder>& who) {