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

Commit 791e466e authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: shutdownAndWait based on # of in conns

shutdownAndWait no longer waits when it is called on a zero-thread
session (the session only needs to be deleted). However, more
importantly, we save a small amount of memory, and the log here is much
better (we can see how many incoming threads are stuck).

Bug: N/A
Test: binderRpcTest
Change-Id: I5924a82c33b4c3c2c970e6c6e86f1b8e2af074f5
parent 5623d1a7
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ bool RpcSession::shutdownAndWait(bool wait) {

    if (wait) {
        LOG_ALWAYS_FATAL_IF(mShutdownListener == nullptr, "Shutdown listener not installed");
        mShutdownListener->waitForShutdown(_l);
        mShutdownListener->waitForShutdown(_l, sp<RpcSession>::fromExisting(this));

        LOG_ALWAYS_FATAL_IF(!mThreads.empty(), "Shutdown failed");
    }
@@ -256,17 +256,19 @@ status_t RpcSession::readId() {
void RpcSession::WaitForShutdownListener::onSessionAllIncomingThreadsEnded(
        const sp<RpcSession>& session) {
    (void)session;
    mShutdown = true;
}

void RpcSession::WaitForShutdownListener::onSessionIncomingThreadEnded() {
    mCv.notify_all();
}

void RpcSession::WaitForShutdownListener::waitForShutdown(std::unique_lock<std::mutex>& lock) {
    while (!mShutdown) {
void RpcSession::WaitForShutdownListener::waitForShutdown(std::unique_lock<std::mutex>& lock,
                                                          const sp<RpcSession>& session) {
    while (session->mIncomingConnections.size() > 0) {
        if (std::cv_status::timeout == mCv.wait_for(lock, std::chrono::seconds(1))) {
            ALOGE("Waiting for RpcSession to shut down (1s w/o progress).");
            ALOGE("Waiting for RpcSession to shut down (1s w/o progress): %zu incoming connections "
                  "still.",
                  session->mIncomingConnections.size());
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -182,12 +182,12 @@ private:
    public:
        void onSessionAllIncomingThreadsEnded(const sp<RpcSession>& session) override;
        void onSessionIncomingThreadEnded() override;
        void waitForShutdown(std::unique_lock<std::mutex>& lock);
        void waitForShutdown(std::unique_lock<std::mutex>& lock, const sp<RpcSession>& session);

    private:
        std::condition_variable mCv;
        volatile bool mShutdown = false;
    };
    friend WaitForShutdownListener;

    struct RpcConnection : public RefBase {
        std::unique_ptr<RpcTransport> rpcTransport;