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

Commit e47511f8 authored by Steven Moreland's avatar Steven Moreland
Browse files

libbinder: move FdTrigger to RpcSession

We need triggers accessible in RpcSession, RpcServer, and RpcState in
order to shut down the join + connection + rpc handler threads (the
RpcServer connection threads get transformed into becoming RpcSession
threads). In order for this to be used in all these places, the most
convenient location is RpcSession, since the RpcServer header imports
this and the C++ standard doesn't allow for nested classes to be forward
declared.

Bug: 185167543
Test: binderRpcTest
Change-Id: I3e655277bd183fddc6d5001280cf17a10672bea3
parent 33fd596d
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -128,16 +128,6 @@ sp<IBinder> RpcServer::getRootObject() {
    return ret;
}

std::unique_ptr<RpcServer::FdTrigger> RpcServer::FdTrigger::make() {
    auto ret = std::make_unique<RpcServer::FdTrigger>();
    if (!android::base::Pipe(&ret->mRead, &ret->mWrite)) return nullptr;
    return ret;
}

void RpcServer::FdTrigger::trigger() {
    mWrite.reset();
}

void RpcServer::join() {
    LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!");

@@ -146,7 +136,7 @@ void RpcServer::join() {
        LOG_ALWAYS_FATAL_IF(!mServer.ok(), "RpcServer must be setup to join.");
        LOG_ALWAYS_FATAL_IF(mShutdownTrigger != nullptr, "Already joined");
        mJoinThreadRunning = true;
        mShutdownTrigger = FdTrigger::make();
        mShutdownTrigger = RpcSession::FdTrigger::make();
        LOG_ALWAYS_FATAL_IF(mShutdownTrigger == nullptr, "Cannot create join signaler");
    }

+10 −0
Original line number Diff line number Diff line
@@ -113,6 +113,16 @@ status_t RpcSession::sendDecStrong(const RpcAddress& address) {
    return state()->sendDecStrong(connection.fd(), address);
}

std::unique_ptr<RpcSession::FdTrigger> RpcSession::FdTrigger::make() {
    auto ret = std::make_unique<RpcSession::FdTrigger>();
    if (!android::base::Pipe(&ret->mRead, &ret->mWrite)) return nullptr;
    return ret;
}

void RpcSession::FdTrigger::trigger() {
    mWrite.reset();
}

status_t RpcSession::readId() {
    {
        std::lock_guard<std::mutex> _l(mMutex);
+1 −18
Original line number Diff line number Diff line
@@ -153,23 +153,6 @@ public:
    void onSessionTerminating(const sp<RpcSession>& session);

private:
    /** This is not a pipe. */
    struct FdTrigger {
        static std::unique_ptr<FdTrigger> make();
        /**
         * poll() on this fd for POLLHUP to get notification when trigger is called
         */
        base::borrowed_fd readFd() const { return mRead; }
        /**
         * Close the write end of the pipe so that the read end receives POLLHUP.
         */
        void trigger();

    private:
        base::unique_fd mWrite;
        base::unique_fd mRead;
    };

    friend sp<RpcServer>;
    RpcServer();

@@ -188,7 +171,7 @@ private:
    std::map<int32_t, sp<RpcSession>> mSessions;
    int32_t mSessionIdCounter = 0;
    bool mJoinThreadRunning = false;
    std::unique_ptr<FdTrigger> mShutdownTrigger;
    std::unique_ptr<RpcSession::FdTrigger> mShutdownTrigger;
    std::condition_variable mShutdownCv;
};

+17 −0
Original line number Diff line number Diff line
@@ -112,6 +112,23 @@ private:
    friend RpcServer;
    RpcSession();

    /** This is not a pipe. */
    struct FdTrigger {
        static std::unique_ptr<FdTrigger> make();
        /**
         * poll() on this fd for POLLHUP to get notification when trigger is called
         */
        base::borrowed_fd readFd() const { return mRead; }
        /**
         * Close the write end of the pipe so that the read end receives POLLHUP.
         */
        void trigger();

    private:
        base::unique_fd mWrite;
        base::unique_fd mRead;
    };

    status_t readId();

    // transfer ownership of thread