Loading libs/binder/ndk/ibinder.cpp +4 −16 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading libs/binder/ndk/ibinder_internal.h +3 −4 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 { Loading Loading
libs/binder/ndk/ibinder.cpp +4 −16 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading
libs/binder/ndk/ibinder_internal.h +3 −4 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 { Loading