OSDN Git Service

Unregister any handlers still registered on now "dead" ALoopers
authorAndreas Huber <andih@google.com>
Wed, 31 Jul 2013 20:04:50 +0000 (13:04 -0700)
committerAndreas Huber <andih@google.com>
Wed, 31 Jul 2013 20:04:50 +0000 (13:04 -0700)
upon the death of an ALooper.

Change-Id: I64c0835b8db04486204f3d0fa7173ee53708a116
related-to-bug: 10106648

include/media/stagefright/foundation/ALooperRoster.h
media/libstagefright/foundation/ALooper.cpp
media/libstagefright/foundation/ALooperRoster.cpp

index 2e5fd73..940fc55 100644 (file)
@@ -30,6 +30,7 @@ struct ALooperRoster {
             const sp<ALooper> looper, const sp<AHandler> &handler);
 
     void unregisterHandler(ALooper::handler_id handlerID);
+    void unregisterStaleHandlers();
 
     status_t postMessage(const sp<AMessage> &msg, int64_t delayUs = 0);
     void deliverMessage(const sp<AMessage> &msg);
index 22777a2..ebf9d8d 100644 (file)
@@ -72,6 +72,10 @@ ALooper::ALooper()
 
 ALooper::~ALooper() {
     stop();
+
+    // Since this looper is "dead" (or as good as dead by now),
+    // have ALooperRoster unregister any handlers still registered for it.
+    gLooperRoster.unregisterStaleHandlers();
 }
 
 void ALooper::setName(const char *name) {
index ad10d2b..0c181ff 100644 (file)
@@ -71,6 +71,20 @@ void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) {
     mHandlers.removeItemsAt(index);
 }
 
+void ALooperRoster::unregisterStaleHandlers() {
+    Mutex::Autolock autoLock(mLock);
+
+    for (size_t i = mHandlers.size(); i-- > 0;) {
+        const HandlerInfo &info = mHandlers.valueAt(i);
+
+        sp<ALooper> looper = info.mLooper.promote();
+        if (looper == NULL) {
+            ALOGV("Unregistering stale handler %d", mHandlers.keyAt(i));
+            mHandlers.removeItemsAt(i);
+        }
+    }
+}
+
 status_t ALooperRoster::postMessage(
         const sp<AMessage> &msg, int64_t delayUs) {
     Mutex::Autolock autoLock(mLock);