From d68cda472a3646966a203338ccac04f0783293b7 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 18 Oct 2010 15:06:04 -0700 Subject: [PATCH] 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 --- media/libstagefright/foundation/ALooperRoster.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp index 7683113477cee..8aa1b151fcd5c 100644 --- a/media/libstagefright/foundation/ALooperRoster.cpp +++ b/media/libstagefright/foundation/ALooperRoster.cpp @@ -54,7 +54,10 @@ void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) { 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 @@ void ALooperRoster::postMessage( 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 @@ void ALooperRoster::deliverMessage(const sp &msg) { 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;