diff options
| author | 2022-08-01 19:38:14 +0000 | |
|---|---|---|
| committer | 2022-08-01 19:38:14 +0000 | |
| commit | 0fb2ccb47d4d87ea4da638f6174b4d2ad8ef3ea3 (patch) | |
| tree | cb7f466bb41c1c161b8d987642afdb43f60faeb3 | |
| parent | 2c7a0602cfdcf09080b481615ebe85ab4500c4d2 (diff) | |
| parent | be9d2d411f91a41ef0c106c11d613408ad0cd3f6 (diff) | |
Merge "libbinder_ndk: avoid BpRefBase" am: be9d2d411f
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2166123
Change-Id: I8481f01812116dfce3e562cc3a401f6fd29cfdf4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | libs/binder/ndk/ibinder.cpp | 20 | ||||
| -rw-r--r-- | libs/binder/ndk/ibinder_internal.h | 7 |
2 files changed, 7 insertions, 20 deletions
diff --git a/libs/binder/ndk/ibinder.cpp b/libs/binder/ndk/ibinder.cpp index b21a7e9584..9778ec0a76 100644 --- a/libs/binder/ndk/ibinder.cpp +++ b/libs/binder/ndk/ibinder.cpp @@ -64,6 +64,9 @@ struct Value { wp<ABpBinder> binder; }; void clean(const void* id, void* obj, void* cookie) { + // be weary of leaks! + // LOG(INFO) << "Deleting an ABpBinder"; + CHECK(id == kId) << id << " " << obj << " " << cookie; delete static_cast<Value*>(obj); @@ -239,26 +242,11 @@ status_t ABBinder::onTransact(transaction_code_t code, const Parcel& data, Parce } ABpBinder::ABpBinder(const ::android::sp<::android::IBinder>& binder) - : AIBinder(nullptr /*clazz*/), BpRefBase(binder) { + : AIBinder(nullptr /*clazz*/), mRemote(binder) { CHECK(binder != nullptr); } ABpBinder::~ABpBinder() {} -void ABpBinder::onLastStrongRef(const void* id) { - // Since ABpBinder is OBJECT_LIFETIME_WEAK, we must remove this weak reference in order for - // the ABpBinder to be deleted. Even though we have no more references on the ABpBinder - // (BpRefBase), the remote object may still exist (for instance, if we - // receive it from another process, before the ABpBinder is attached). - - ABpBinderTag::Value* value = - static_cast<ABpBinderTag::Value*>(remote()->findObject(ABpBinderTag::kId)); - CHECK_NE(nullptr, value) << "ABpBinder must always be attached"; - - remote()->withLock([&]() { value->binder = nullptr; }); - - BpRefBase::onLastStrongRef(id); -} - sp<AIBinder> ABpBinder::lookupOrCreateFromBinder(const ::android::sp<::android::IBinder>& binder) { if (binder == nullptr) { return nullptr; diff --git a/libs/binder/ndk/ibinder_internal.h b/libs/binder/ndk/ibinder_internal.h index 730e51b3e3..d7098e85bf 100644 --- a/libs/binder/ndk/ibinder_internal.h +++ b/libs/binder/ndk/ibinder_internal.h @@ -91,7 +91,7 @@ struct ABBinder : public AIBinder, public ::android::BBinder { // This binder object may be remote or local (even though it is 'Bp'). The implication if it is // local is that it is an IBinder object created outside of the domain of libbinder_ndk. -struct ABpBinder : public AIBinder, public ::android::BpRefBase { +struct ABpBinder : public AIBinder { // Looks up to see if this object has or is an existing ABBinder or ABpBinder object, otherwise // it creates an ABpBinder object. static ::android::sp<AIBinder> lookupOrCreateFromBinder( @@ -99,14 +99,13 @@ struct ABpBinder : public AIBinder, public ::android::BpRefBase { virtual ~ABpBinder(); - void onLastStrongRef(const void* id) override; - - ::android::sp<::android::IBinder> getBinder() override { return remote(); } + ::android::sp<::android::IBinder> getBinder() override { return mRemote; } ABpBinder* asABpBinder() override { return this; } private: friend android::sp<ABpBinder>; explicit ABpBinder(const ::android::sp<::android::IBinder>& binder); + ::android::sp<::android::IBinder> mRemote; }; struct AIBinder_Class { |