Skip to content

Commit

Permalink
An attempt to unregister a handler that's no longer registered should…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
theandi666 committed Oct 18, 2010
1 parent 9f85ef4 commit d68cda4
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions media/libstagefright/foundation/ALooperRoster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit d68cda4

Please sign in to comment.