diff options
Diffstat (limited to 'libs/binder/RpcServer.cpp')
| -rw-r--r-- | libs/binder/RpcServer.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
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<IBinder>& binder) { std::lock_guard<std::mutex> _l(mLock); - mRootObject = binder; + mRootObjectWeak = mRootObject = binder; +} + +void RpcServer::setRootObjectWeak(const wp<IBinder>& binder) { + std::lock_guard<std::mutex> _l(mLock); + mRootObject.clear(); + mRootObjectWeak = binder; } sp<IBinder> RpcServer::getRootObject() { std::lock_guard<std::mutex> _l(mLock); - return mRootObject; + bool hasWeak = mRootObjectWeak.unsafe_get(); + sp<IBinder> ret = mRootObjectWeak.promote(); + ALOGW_IF(hasWeak && ret == nullptr, "RpcServer root object is freed, returning nullptr"); + return ret; } void RpcServer::join() { |