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
This commit is contained in:
Andreas Huber
2010-10-18 15:06:04 -07:00
parent 9f85ef4aeb
commit d68cda472a

View File

@@ -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<AMessage> &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;