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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user