Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d5d66fc authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "libbinder_ndk: avoid BpRefBase" am: be9d2d41 am: 0fb2ccb4 am: b782b89d

parents 618044fa b782b89d
Loading
Loading
Loading
Loading
+4 −16
Original line number Original line Diff line number Diff line
@@ -64,6 +64,9 @@ struct Value {
    wp<ABpBinder> binder;
    wp<ABpBinder> binder;
};
};
void clean(const void* id, void* obj, void* cookie) {
void clean(const void* id, void* obj, void* cookie) {
    // be weary of leaks!
    // LOG(INFO) << "Deleting an ABpBinder";

    CHECK(id == kId) << id << " " << obj << " " << cookie;
    CHECK(id == kId) << id << " " << obj << " " << cookie;


    delete static_cast<Value*>(obj);
    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)
ABpBinder::ABpBinder(const ::android::sp<::android::IBinder>& binder)
    : AIBinder(nullptr /*clazz*/), BpRefBase(binder) {
    : AIBinder(nullptr /*clazz*/), mRemote(binder) {
    CHECK(binder != nullptr);
    CHECK(binder != nullptr);
}
}
ABpBinder::~ABpBinder() {}
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) {
sp<AIBinder> ABpBinder::lookupOrCreateFromBinder(const ::android::sp<::android::IBinder>& binder) {
    if (binder == nullptr) {
    if (binder == nullptr) {
        return nullptr;
        return nullptr;
+3 −4
Original line number Original line Diff line number Diff line
@@ -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
// 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.
// 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
    // Looks up to see if this object has or is an existing ABBinder or ABpBinder object, otherwise
    // it creates an ABpBinder object.
    // it creates an ABpBinder object.
    static ::android::sp<AIBinder> lookupOrCreateFromBinder(
    static ::android::sp<AIBinder> lookupOrCreateFromBinder(
@@ -99,14 +99,13 @@ struct ABpBinder : public AIBinder, public ::android::BpRefBase {


    virtual ~ABpBinder();
    virtual ~ABpBinder();


    void onLastStrongRef(const void* id) override;
    ::android::sp<::android::IBinder> getBinder() override { return mRemote; }

    ::android::sp<::android::IBinder> getBinder() override { return remote(); }
    ABpBinder* asABpBinder() override { return this; }
    ABpBinder* asABpBinder() override { return this; }


   private:
   private:
    friend android::sp<ABpBinder>;
    friend android::sp<ABpBinder>;
    explicit ABpBinder(const ::android::sp<::android::IBinder>& binder);
    explicit ABpBinder(const ::android::sp<::android::IBinder>& binder);
    ::android::sp<::android::IBinder> mRemote;
};
};


struct AIBinder_Class {
struct AIBinder_Class {