Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2007772 authored by Andreas Huber's avatar Andreas Huber
Browse files

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
parent b5b39d2c
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -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;