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

Commit 0488a413 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "libbinder: avoid attached objects for stability" into rvc-dev am: 5a451b70

Change-Id: I9059264c4f7ddd6736f45f417ea69eb8f68c61bc
parents 4fc8a158 5a451b70
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -141,7 +141,7 @@ public:

// ---------------------------------------------------------------------------

BBinder::BBinder() : mExtras(nullptr)
BBinder::BBinder() : mExtras(nullptr), mStability(0)
{
}

+1 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ BpBinder* BpBinder::create(int32_t handle) {

BpBinder::BpBinder(int32_t handle, int32_t trackedUid)
    : mHandle(handle)
    , mStability(0)
    , mAlive(1)
    , mObitsSent(0)
    , mObituaries(nullptr)
+15 −7
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
 */
#include <binder/Stability.h>

#include <binder/BpBinder.h>
#include <binder/Binder.h>

namespace android {
namespace internal {

@@ -78,11 +81,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {

    if (currentStability == stability) return OK;

    binder->attachObject(
        reinterpret_cast<void*>(&Stability::get),
        reinterpret_cast<void*>(stability),
        nullptr /*cleanupCookie*/,
        nullptr /*cleanup function*/);
    BBinder* local = binder->localBinder();
    if (local != nullptr) {
        local->mStability = static_cast<int32_t>(stability);
    } else {
        binder->remoteBinder()->mStability = static_cast<int32_t>(stability);
    }

    return OK;
}
@@ -90,8 +94,12 @@ status_t Stability::set(IBinder* binder, int32_t stability, bool log) {
Stability::Level Stability::get(IBinder* binder) {
    if (binder == nullptr) return UNDECLARED;

    return static_cast<Level>(reinterpret_cast<intptr_t>(
        binder->findObject(reinterpret_cast<void*>(&Stability::get))));
    BBinder* local = binder->localBinder();
    if (local != nullptr) {
        return static_cast<Stability::Level>(local->mStability);
    }

    return static_cast<Stability::Level>(binder->remoteBinder()->mStability);
}

bool Stability::check(int32_t provided, Level required) {
+10 −1
Original line number Diff line number Diff line
@@ -24,6 +24,10 @@
// ---------------------------------------------------------------------------
namespace android {

namespace internal {
class Stability;
}

class BBinder : public IBinder
{
public:
@@ -88,8 +92,13 @@ private:
    Extras*             getOrCreateExtras();

    std::atomic<Extras*> mExtras;

    friend ::android::internal::Stability;
    union {
        int32_t mStability;
        void* mReserved0;
    };
};

// ---------------------------------------------------------------------------

+7 −0
Original line number Diff line number Diff line
@@ -27,6 +27,10 @@
// ---------------------------------------------------------------------------
namespace android {

namespace internal {
class Stability;
};

using binder_proxy_limit_callback = void(*)(int);

class BpBinder : public IBinder
@@ -116,6 +120,9 @@ protected:
private:
    const   int32_t             mHandle;

    friend ::android::internal::Stability;
            int32_t             mStability;

    struct Obituary {
        wp<DeathRecipient> recipient;
        void* cookie;