Loading libs/binder/Android.bp +14 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,10 @@ cc_defaults { name: "libbinder_common_defaults", host_supported: true, defaults: [ "libbinder_defer_bc_request_freeze_notification_flag_default", ], srcs: [ "Binder.cpp", "BpBinder.cpp", Loading Loading @@ -549,10 +553,20 @@ libbinder_addservice_cache_config { }, } cc_defaults { name: "libbinder_defer_bc_request_freeze_notification_flag_default", cflags: select(release_flag("RELEASE_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"), { true: ["-DLIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], false: ["-DNO_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], default: ["-DNO_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], }), } cc_defaults { name: "libbinder_kernel_defaults", defaults: [ "libbinder_client_cache_flag", "libbinder_defer_bc_request_freeze_notification_flag_default", "libbinder_addservice_cache_flag", "libbinder_remove_cache_static_list_flag", ], Loading libs/binder/BpBinder.cpp +51 −3 Original line number Diff line number Diff line Loading @@ -36,6 +36,16 @@ namespace android { namespace { bool waitForFrozenListenerRemovalCompletion() { #if defined(LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION) return true; #else return false; #endif } } using android::binder::unique_fd; // --------------------------------------------------------------------------- Loading Loading @@ -575,6 +585,22 @@ void BpBinder::sendObituary() } } void BpBinder::onFrozenStateChangeListenerRemoved() { if (!waitForFrozenListenerRemovalCompletion()) { return; } { RpcMutexUniqueLock _l(mLock); if (mFrozen->callbacks.size() == 0) { mFrozen.reset(); } else { mFrozen->isPendingClear = false; std::ignore = IPCThreadState::self()->addFrozenStateChangeCallback(binderHandle(), this); } } } status_t BpBinder::addFrozenStateChangeCallback(const wp<FrozenStateChangeCallback>& callback) { LOG_ALWAYS_FATAL_IF(isRpcBinder(), "addFrozenStateChangeCallback() is not supported for RPC Binder."); Loading Loading @@ -645,6 +671,9 @@ status_t BpBinder::removeFrozenStateChangeCallback(const wp<FrozenStateChangeCal mFrozen->callbacks.removeAt(i); if (mFrozen->callbacks.size() == 0) { ALOGV("Clearing freeze notification: %p handle %d\n", this, binderHandle()); if (mFrozen->isPendingClear) { return NO_ERROR; } status_t status = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); Loading @@ -654,8 +683,13 @@ status_t BpBinder::removeFrozenStateChangeCallback(const wp<FrozenStateChangeCal "%p handle %d\n", statusToString(status).c_str(), this, binderHandle()); } if (waitForFrozenListenerRemovalCompletion()) { mFrozen->isPendingClear = true; mFrozen->initialStateReceived = false; } else { mFrozen.reset(); } } return NO_ERROR; } } Loading @@ -674,6 +708,9 @@ void BpBinder::onFrozenStateChanged(bool isFrozen) { if (!mFrozen) { return; } if (mFrozen->isPendingClear) { return; } bool stateChanged = !mFrozen->initialStateReceived || mFrozen->isFrozen != isFrozen; if (stateChanged) { mFrozen->isFrozen = isFrozen; Loading Loading @@ -822,9 +859,20 @@ void BpBinder::onLastStrongRef(const void* /*id*/) { mObituaries = nullptr; } if (mFrozen != nullptr) { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); if (waitForFrozenListenerRemovalCompletion()) { if (!mFrozen->isPendingClear) { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); mFrozen->isPendingClear = true; } mFrozen->callbacks.clear(); } else { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); mFrozen.reset(); } } mLock.unlock(); if (obits != nullptr) { Loading libs/binder/IPCThreadState.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -1628,6 +1628,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd) case BR_CLEAR_FREEZE_NOTIFICATION_DONE: { BpBinder* proxy = (BpBinder*)mIn.readPointer(); proxy->getPrivateAccessor().onFrozenStateChangeListenerRemoved(); proxy->getWeakRefs()->decWeak(proxy); } break; Loading libs/binder/include/binder/BpBinder.h +5 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,9 @@ public: const sp<RpcSession>& rpcSession() const { return mBinder->rpcSession(); } void onFrozenStateChanged(bool isFrozen) { mMutableBinder->onFrozenStateChanged(isFrozen); } void onFrozenStateChangeListenerRemoved() { mMutableBinder->onFrozenStateChangeListenerRemoved(); } const BpBinder* mBinder; BpBinder* mMutableBinder; }; Loading Loading @@ -208,11 +211,13 @@ private: }; void onFrozenStateChanged(bool isFrozen); void onFrozenStateChangeListenerRemoved(); struct FrozenStateChange { bool isFrozen = false; Vector<wp<FrozenStateChangeCallback>> callbacks; bool initialStateReceived = false; bool isPendingClear = false; }; void reportOneDeath(const Obituary& obit); Loading Loading
libs/binder/Android.bp +14 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,10 @@ cc_defaults { name: "libbinder_common_defaults", host_supported: true, defaults: [ "libbinder_defer_bc_request_freeze_notification_flag_default", ], srcs: [ "Binder.cpp", "BpBinder.cpp", Loading Loading @@ -549,10 +553,20 @@ libbinder_addservice_cache_config { }, } cc_defaults { name: "libbinder_defer_bc_request_freeze_notification_flag_default", cflags: select(release_flag("RELEASE_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"), { true: ["-DLIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], false: ["-DNO_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], default: ["-DNO_LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION"], }), } cc_defaults { name: "libbinder_kernel_defaults", defaults: [ "libbinder_client_cache_flag", "libbinder_defer_bc_request_freeze_notification_flag_default", "libbinder_addservice_cache_flag", "libbinder_remove_cache_static_list_flag", ], Loading
libs/binder/BpBinder.cpp +51 −3 Original line number Diff line number Diff line Loading @@ -36,6 +36,16 @@ namespace android { namespace { bool waitForFrozenListenerRemovalCompletion() { #if defined(LIBBINDER_DEFER_BC_REQUEST_FREEZE_NOTIFICATION) return true; #else return false; #endif } } using android::binder::unique_fd; // --------------------------------------------------------------------------- Loading Loading @@ -575,6 +585,22 @@ void BpBinder::sendObituary() } } void BpBinder::onFrozenStateChangeListenerRemoved() { if (!waitForFrozenListenerRemovalCompletion()) { return; } { RpcMutexUniqueLock _l(mLock); if (mFrozen->callbacks.size() == 0) { mFrozen.reset(); } else { mFrozen->isPendingClear = false; std::ignore = IPCThreadState::self()->addFrozenStateChangeCallback(binderHandle(), this); } } } status_t BpBinder::addFrozenStateChangeCallback(const wp<FrozenStateChangeCallback>& callback) { LOG_ALWAYS_FATAL_IF(isRpcBinder(), "addFrozenStateChangeCallback() is not supported for RPC Binder."); Loading Loading @@ -645,6 +671,9 @@ status_t BpBinder::removeFrozenStateChangeCallback(const wp<FrozenStateChangeCal mFrozen->callbacks.removeAt(i); if (mFrozen->callbacks.size() == 0) { ALOGV("Clearing freeze notification: %p handle %d\n", this, binderHandle()); if (mFrozen->isPendingClear) { return NO_ERROR; } status_t status = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); Loading @@ -654,8 +683,13 @@ status_t BpBinder::removeFrozenStateChangeCallback(const wp<FrozenStateChangeCal "%p handle %d\n", statusToString(status).c_str(), this, binderHandle()); } if (waitForFrozenListenerRemovalCompletion()) { mFrozen->isPendingClear = true; mFrozen->initialStateReceived = false; } else { mFrozen.reset(); } } return NO_ERROR; } } Loading @@ -674,6 +708,9 @@ void BpBinder::onFrozenStateChanged(bool isFrozen) { if (!mFrozen) { return; } if (mFrozen->isPendingClear) { return; } bool stateChanged = !mFrozen->initialStateReceived || mFrozen->isFrozen != isFrozen; if (stateChanged) { mFrozen->isFrozen = isFrozen; Loading Loading @@ -822,9 +859,20 @@ void BpBinder::onLastStrongRef(const void* /*id*/) { mObituaries = nullptr; } if (mFrozen != nullptr) { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); if (waitForFrozenListenerRemovalCompletion()) { if (!mFrozen->isPendingClear) { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); mFrozen->isPendingClear = true; } mFrozen->callbacks.clear(); } else { std::ignore = IPCThreadState::self()->removeFrozenStateChangeCallback(binderHandle(), this); mFrozen.reset(); } } mLock.unlock(); if (obits != nullptr) { Loading
libs/binder/IPCThreadState.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -1628,6 +1628,7 @@ status_t IPCThreadState::executeCommand(int32_t cmd) case BR_CLEAR_FREEZE_NOTIFICATION_DONE: { BpBinder* proxy = (BpBinder*)mIn.readPointer(); proxy->getPrivateAccessor().onFrozenStateChangeListenerRemoved(); proxy->getWeakRefs()->decWeak(proxy); } break; Loading
libs/binder/include/binder/BpBinder.h +5 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,9 @@ public: const sp<RpcSession>& rpcSession() const { return mBinder->rpcSession(); } void onFrozenStateChanged(bool isFrozen) { mMutableBinder->onFrozenStateChanged(isFrozen); } void onFrozenStateChangeListenerRemoved() { mMutableBinder->onFrozenStateChangeListenerRemoved(); } const BpBinder* mBinder; BpBinder* mMutableBinder; }; Loading Loading @@ -208,11 +211,13 @@ private: }; void onFrozenStateChanged(bool isFrozen); void onFrozenStateChangeListenerRemoved(); struct FrozenStateChange { bool isFrozen = false; Vector<wp<FrozenStateChangeCallback>> callbacks; bool initialStateReceived = false; bool isPendingClear = false; }; void reportOneDeath(const Obituary& obit); Loading