Loading libs/binder/RpcServer.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,17 @@ sp<IBinder> RpcServer::getRootObject() { return ret; } static void joinRpcServer(sp<RpcServer>&& thiz) { thiz->join(); } void RpcServer::start() { LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!"); std::lock_guard<std::mutex> _l(mLock); LOG_ALWAYS_FATAL_IF(mJoinThread.get(), "Already started!"); mJoinThread = std::make_unique<std::thread>(&joinRpcServer, sp<RpcServer>::fromExisting(this)); } void RpcServer::join() { LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!"); Loading Loading @@ -178,6 +189,17 @@ bool RpcServer::shutdown() { mShutdownTrigger->trigger(); while (mJoinThreadRunning) mShutdownCv.wait(_l); // At this point, we know join() is about to exit, but the thread that calls // join() may not have exited yet. // If RpcServer owns the join thread (aka start() is called), make sure the thread exits; // otherwise ~thread() may call std::terminate(), which may crash the process. // If RpcServer does not own the join thread (aka join() is called directly), // then the owner of RpcServer is responsible for cleaning up that thread. if (mJoinThread.get()) { mJoinThread->join(); mJoinThread.reset(); } mShutdownTrigger = nullptr; return true; } Loading libs/binder/include/binder/RpcServer.h +7 −1 Original line number Diff line number Diff line Loading @@ -116,6 +116,11 @@ public: void setRootObjectWeak(const wp<IBinder>& binder); sp<IBinder> getRootObject(); /** * Runs join() in a background thread. Immediately returns. */ void start(); /** * You must have at least one client session before calling this. * Loading Loading @@ -159,12 +164,13 @@ private: base::unique_fd mServer; // socket we are accepting sessions on std::mutex mLock; // for below std::unique_ptr<std::thread> mJoinThread; bool mJoinThreadRunning = false; std::map<std::thread::id, std::thread> mConnectingThreads; sp<IBinder> mRootObject; wp<IBinder> mRootObjectWeak; std::map<int32_t, sp<RpcSession>> mSessions; int32_t mSessionIdCounter = 0; bool mJoinThreadRunning = false; std::unique_ptr<RpcSession::FdTrigger> mShutdownTrigger; std::condition_variable mShutdownCv; }; Loading Loading
libs/binder/RpcServer.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -128,6 +128,17 @@ sp<IBinder> RpcServer::getRootObject() { return ret; } static void joinRpcServer(sp<RpcServer>&& thiz) { thiz->join(); } void RpcServer::start() { LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!"); std::lock_guard<std::mutex> _l(mLock); LOG_ALWAYS_FATAL_IF(mJoinThread.get(), "Already started!"); mJoinThread = std::make_unique<std::thread>(&joinRpcServer, sp<RpcServer>::fromExisting(this)); } void RpcServer::join() { LOG_ALWAYS_FATAL_IF(!mAgreedExperimental, "no!"); Loading Loading @@ -178,6 +189,17 @@ bool RpcServer::shutdown() { mShutdownTrigger->trigger(); while (mJoinThreadRunning) mShutdownCv.wait(_l); // At this point, we know join() is about to exit, but the thread that calls // join() may not have exited yet. // If RpcServer owns the join thread (aka start() is called), make sure the thread exits; // otherwise ~thread() may call std::terminate(), which may crash the process. // If RpcServer does not own the join thread (aka join() is called directly), // then the owner of RpcServer is responsible for cleaning up that thread. if (mJoinThread.get()) { mJoinThread->join(); mJoinThread.reset(); } mShutdownTrigger = nullptr; return true; } Loading
libs/binder/include/binder/RpcServer.h +7 −1 Original line number Diff line number Diff line Loading @@ -116,6 +116,11 @@ public: void setRootObjectWeak(const wp<IBinder>& binder); sp<IBinder> getRootObject(); /** * Runs join() in a background thread. Immediately returns. */ void start(); /** * You must have at least one client session before calling this. * Loading Loading @@ -159,12 +164,13 @@ private: base::unique_fd mServer; // socket we are accepting sessions on std::mutex mLock; // for below std::unique_ptr<std::thread> mJoinThread; bool mJoinThreadRunning = false; std::map<std::thread::id, std::thread> mConnectingThreads; sp<IBinder> mRootObject; wp<IBinder> mRootObjectWeak; std::map<int32_t, sp<RpcSession>> mSessions; int32_t mSessionIdCounter = 0; bool mJoinThreadRunning = false; std::unique_ptr<RpcSession::FdTrigger> mShutdownTrigger; std::condition_variable mShutdownCv; }; Loading