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

Commit 40c37581 authored by Jing Ji's avatar Jing Ji
Browse files

Move the binder proxy accounting to libbinder

So the android.os.Debug#getBinderProxyObjectCount will include
the binder proxies from both of the Java and native layers.

Ignore-AOSP-First: Will cherry-pick for AOSP after a soak time.

Bug: 298314844
Test: dumpsys meminfo
Change-Id: I822fbbfd47bf1929f587a5147f124d99e7ba1059
parent 1d6ad144
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -54,6 +54,11 @@ uint32_t BpBinder::sBinderProxyCountHighWatermark = 2500;
// Another arbitrary value a binder count needs to drop below before another callback will be called
uint32_t BpBinder::sBinderProxyCountLowWatermark = 2000;

std::atomic<uint32_t> BpBinder::sBinderProxyCount(0);
std::atomic<uint32_t> BpBinder::sBinderProxyCountWarned(0);

static constexpr uint32_t kBinderProxyCountWarnInterval = 5000;

// Log any transactions for which the data exceeds this size
#define LOG_TRANSACTIONS_OVER_SIZE (300 * 1024)

@@ -193,6 +198,18 @@ sp<BpBinder> BpBinder::create(int32_t handle) {
        }
        sTrackingMap[trackedUid]++;
    }
    uint32_t numProxies = sBinderProxyCount.fetch_add(1, std::memory_order_relaxed);
    uint32_t numLastWarned = sBinderProxyCountWarned.load(std::memory_order_relaxed);
    uint32_t numNextWarn = numLastWarned + kBinderProxyCountWarnInterval;
    if (numProxies >= numNextWarn) {
        // Multiple threads can get here, make sure only one of them gets to
        // update the warn counter.
        if (sBinderProxyCountWarned.compare_exchange_strong(numLastWarned,
                                                            numNextWarn,
                                                            std::memory_order_relaxed)) {
            ALOGW("Unexpectedly many live BinderProxies: %d\n", numProxies);
        }
    }
    return sp<BpBinder>::make(BinderHandle{handle}, trackedUid);
}

@@ -604,6 +621,7 @@ BpBinder::~BpBinder() {
            }
        }
    }
    --sBinderProxyCount;

    if (ipc) {
        ipc->expungeHandle(binderHandle(), this);
@@ -688,6 +706,11 @@ uint32_t BpBinder::getBinderProxyCount(uint32_t uid)
    return 0;
}

uint32_t BpBinder::getBinderProxyCount()
{
    return sBinderProxyCount.load();
}

void BpBinder::getCountByUid(Vector<uint32_t>& uids, Vector<uint32_t>& counts)
{
    AutoMutex _l(sTrackingLock);
+3 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ public:
    static void         setCountByUidEnabled(bool enable);
    static void         setLimitCallback(binder_proxy_limit_callback cb);
    static void         setBinderProxyCountWatermarks(int high, int low);
    static uint32_t     getBinderProxyCount();

    std::optional<int32_t> getDebugBinderHandle() const;

@@ -208,6 +209,8 @@ private:
    static uint32_t                             sBinderProxyCountLowWatermark;
    static bool                                 sBinderProxyThrottleCreate;
    static std::unordered_map<int32_t,uint32_t> sLastLimitCallbackMap;
    static std::atomic<uint32_t>                sBinderProxyCount;
    static std::atomic<uint32_t>                sBinderProxyCountWarned;
};

} // namespace android