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

Commit 57576c1c authored by Andreas Huber's avatar Andreas Huber
Browse files

ALooperRoster no longer holds strong references to handlers and loopers.

Change-Id: I038d69b0a34eda1bfc5216d92c837a5ddf4fb802
parent 9406f626
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -38,8 +38,8 @@ struct ALooperRoster {

private:
    struct HandlerInfo {
        sp<ALooper> mLooper;
        sp<AHandler> mHandler;
        wp<ALooper> mLooper;
        wp<AHandler> mHandler;
    };

    Mutex mLock;
+38 −6
Original line number Diff line number Diff line
@@ -54,10 +54,15 @@ void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) {
    Mutex::Autolock autoLock(mLock);

    ssize_t index = mHandlers.indexOfKey(handlerID);
    CHECK(index >= 0);
    CHECK_GE(index, 0);

    const HandlerInfo &info = mHandlers.valueAt(index);
    info.mHandler->setID(0);

    sp<AHandler> handler = info.mHandler.promote();

    if (handler != NULL) {
        handler->setID(0);
    }

    mHandlers.removeItemsAt(index);
}
@@ -74,7 +79,18 @@ void ALooperRoster::postMessage(
    }

    const HandlerInfo &info = mHandlers.valueAt(index);
    info.mLooper->post(msg, delayUs);

    sp<ALooper> looper = info.mLooper.promote();

    if (looper == NULL) {
        LOG(WARNING) << "failed to post message. "
                        "Target handler still registered, but object gone.";

        mHandlers.removeItemsAt(index);
        return;
    }

    looper->post(msg, delayUs);
}

void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
@@ -86,12 +102,21 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
        ssize_t index = mHandlers.indexOfKey(msg->target());

        if (index < 0) {
            LOG(WARNING) << "failed to deliver message. Target handler not registered.";
            LOG(WARNING) << "failed to deliver message. "
                         << "Target handler not registered.";
            return;
        }

        const HandlerInfo &info = mHandlers.valueAt(index);
        handler = info.mHandler;
        handler = info.mHandler.promote();

        if (handler == NULL) {
            LOG(WARNING) << "failed to deliver message. "
                            "Target handler registered, but object gone.";

            mHandlers.removeItemsAt(index);
            return;
        }
    }

    handler->onMessageReceived(msg);
@@ -106,7 +131,14 @@ sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) {
        return NULL;
    }

    return mHandlers.valueAt(index).mLooper;
    sp<ALooper> looper = mHandlers.valueAt(index).mLooper.promote();

    if (looper == NULL) {
        mHandlers.removeItemsAt(index);
        return NULL;
    }

    return looper;
}

}  // namespace android