From 4ffb0c7f7e8dfad5984438f8baa556002d804a4f Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Fri, 7 May 2021 18:35:14 -0700 Subject: Add RpcServer::setRootObjectWeak(wp) If the root binder object also holds a strong reference to the RpcServer, to avoid circular dependency, the RpcServer must hold a weak pointer of the RpcServer instead. Test: binderRpcTest Change-Id: I0d0c1f96a6a6d5339e2699f38edfaeb7ec2fd7f9 --- libs/binder/RpcServer.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'libs/binder/RpcServer.cpp') diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index 3a98cadb94..17c8efdc41 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -107,12 +107,21 @@ size_t RpcServer::getMaxThreads() { void RpcServer::setRootObject(const sp& binder) { std::lock_guard _l(mLock); - mRootObject = binder; + mRootObjectWeak = mRootObject = binder; +} + +void RpcServer::setRootObjectWeak(const wp& binder) { + std::lock_guard _l(mLock); + mRootObject.clear(); + mRootObjectWeak = binder; } sp RpcServer::getRootObject() { std::lock_guard _l(mLock); - return mRootObject; + bool hasWeak = mRootObjectWeak.unsafe_get(); + sp ret = mRootObjectWeak.promote(); + ALOGW_IF(hasWeak && ret == nullptr, "RpcServer root object is freed, returning nullptr"); + return ret; } void RpcServer::join() { -- cgit v1.2.3-59-g8ed1b