An attempt to unregister a handler that's no longer registered should not cause an assertion.

There are edge cases in which a handler attempts to unregister itself while on another thread a message fails to be delivered to that very handler and causes automatic unregistration. In this case the handler's good cleanup intentions are thwarted by the CHECK.

Change-Id: I4e41b5e7b619159ecce4856c15cccca031a28b5b
related-to-bug: 3101247
QA-impact: no(!!!) risk
diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp
index 7683113..8aa1b15 100644
--- a/media/libstagefright/foundation/ALooperRoster.cpp
+++ b/media/libstagefright/foundation/ALooperRoster.cpp
@@ -54,7 +54,10 @@
     Mutex::Autolock autoLock(mLock);
 
     ssize_t index = mHandlers.indexOfKey(handlerID);
-    CHECK_GE(index, 0);
+
+    if (index < 0) {
+        return;
+    }
 
     const HandlerInfo &info = mHandlers.valueAt(index);
 
@@ -84,7 +87,8 @@
 
     if (looper == NULL) {
         LOGW("failed to post message. "
-             "Target handler still registered, but object gone.");
+             "Target handler %d still registered, but object gone.",
+             msg->target());
 
         mHandlers.removeItemsAt(index);
         return;
@@ -111,7 +115,8 @@
 
         if (handler == NULL) {
             LOGW("failed to deliver message. "
-                 "Target handler registered, but object gone.");
+                 "Target handler %d registered, but object gone.",
+                 msg->target());
 
             mHandlers.removeItemsAt(index);
             return;