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

Commit 7e790af7 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add tracking of parcel memory allocations.

Change-Id: I76ffed0e69ccfe70e87d98646f11d4de7c3fd980
parent 37878b1e
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -206,6 +206,10 @@ public:
    // Explicitly close all file descriptors in the parcel.
    void                closeFileDescriptors();

    // Debugging: get metrics on current allocations.
    static size_t       getGlobalAllocSize();
    static size_t       getGlobalAllocCount();

private:
    typedef void        (*release_func)(Parcel* parcel,
                                        const uint8_t* data, size_t dataSize,
+6 −1
Original line number Diff line number Diff line
@@ -34,7 +34,12 @@ extern Vector<int32_t> gTextBuffers;
extern Mutex gProcessMutex;
extern sp<ProcessState> gProcess;

// For ServiceManager.cpp
// For Parcel.cpp
extern Mutex gParcelGlobalAllocSizeLock;
extern size_t gParcelGlobalAllocSize;
extern size_t gParcelGlobalAllocCount;

// For IServiceManager.cpp
extern Mutex gDefaultServiceManagerLock;
extern sp<IServiceManager> gDefaultServiceManager;
extern sp<IPermissionController> gPermissionController;
+49 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <cutils/ashmem.h>

#include <private/binder/binder_module.h>
#include <private/binder/Static.h>

#include <inttypes.h>
#include <stdio.h>
@@ -48,6 +49,8 @@

#define LOG_REFS(...)
//#define LOG_REFS(...) ALOG(LOG_DEBUG, "Parcel", __VA_ARGS__)
#define LOG_ALLOC(...)
//#define LOG_ALLOC(...) ALOG(LOG_DEBUG, "Parcel", __VA_ARGS__)

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

@@ -291,12 +294,24 @@ status_t unflatten_binder(const sp<ProcessState>& proc,

Parcel::Parcel()
{
    LOG_ALLOC("Parcel %p: constructing", this);
    initState();
}

Parcel::~Parcel()
{
    freeDataNoInit();
    LOG_ALLOC("Parcel %p: destroyed", this);
}

size_t Parcel::getGlobalAllocSize() {
    AutoMutex _l(gParcelGlobalAllocSizeLock);
    return gParcelGlobalAllocSize;
}

size_t Parcel::getGlobalAllocCount() {
    AutoMutex _l(gParcelGlobalAllocSizeLock);
    return gParcelGlobalAllocCount;
}

const uint8_t* Parcel::data() const
@@ -1488,11 +1503,20 @@ void Parcel::freeData()
void Parcel::freeDataNoInit()
{
    if (mOwner) {
        LOG_ALLOC("Parcel %p: freeing other owner data", this);
        //ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
        mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
    } else {
        LOG_ALLOC("Parcel %p: freeing allocated data", this);
        releaseObjects();
        if (mData) free(mData);
        if (mData) {
            LOG_ALLOC("Parcel %p: freeing with %zu capacity", this, mDataCapacity);
            gParcelGlobalAllocSizeLock.lock();
            gParcelGlobalAllocSize -= mDataCapacity;
            gParcelGlobalAllocCount--;
            gParcelGlobalAllocSizeLock.unlock();
            free(mData);
        }
        if (mObjects) free(mObjects);
    }
}
@@ -1521,6 +1545,11 @@ status_t Parcel::restartWrite(size_t desired)
    releaseObjects();

    if (data) {
        LOG_ALLOC("Parcel %p: restart from %zu to %zu capacity", this, mDataCapacity, desired);
        gParcelGlobalAllocSizeLock.lock();
        gParcelGlobalAllocSize += desired;
        gParcelGlobalAllocSize -= mDataCapacity;
        gParcelGlobalAllocSizeLock.unlock();
        mData = data;
        mDataCapacity = desired;
    }
@@ -1600,6 +1629,12 @@ status_t Parcel::continueWrite(size_t desired)
        mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
        mOwner = NULL;

        LOG_ALLOC("Parcel %p: taking ownership of %zu capacity", this, desired);
        gParcelGlobalAllocSizeLock.lock();
        gParcelGlobalAllocSize += desired;
        gParcelGlobalAllocCount++;
        gParcelGlobalAllocSizeLock.unlock();

        mData = data;
        mObjects = objects;
        mDataSize = (mDataSize < desired) ? mDataSize : desired;
@@ -1634,6 +1669,12 @@ status_t Parcel::continueWrite(size_t desired)
        if (desired > mDataCapacity) {
            uint8_t* data = (uint8_t*)realloc(mData, desired);
            if (data) {
                LOG_ALLOC("Parcel %p: continue from %zu to %zu capacity", this, mDataCapacity,
                        desired);
                gParcelGlobalAllocSizeLock.lock();
                gParcelGlobalAllocSize += desired;
                gParcelGlobalAllocSize -= mDataCapacity;
                gParcelGlobalAllocSizeLock.unlock();
                mData = data;
                mDataCapacity = desired;
            } else if (desired > mDataCapacity) {
@@ -1664,6 +1705,12 @@ status_t Parcel::continueWrite(size_t desired)
            ALOGE("continueWrite: %zu/%p/%zu/%zu", mDataCapacity, mObjects, mObjectsCapacity, desired);
        }

        LOG_ALLOC("Parcel %p: allocating with %zu capacity", this, desired);
        gParcelGlobalAllocSizeLock.lock();
        gParcelGlobalAllocSize += desired;
        gParcelGlobalAllocCount++;
        gParcelGlobalAllocSizeLock.unlock();

        mData = data;
        mDataSize = mDataPos = 0;
        ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
@@ -1676,6 +1723,7 @@ status_t Parcel::continueWrite(size_t desired)

void Parcel::initState()
{
    LOG_ALLOC("Parcel %p: initState", this);
    mError = NO_ERROR;
    mData = 0;
    mDataSize = 0;
+7 −1
Original line number Diff line number Diff line
@@ -90,7 +90,13 @@ public:

static LibBinderIPCtStatics gIPCStatics;

// ------------ ServiceManager.cpp
// ------------ Parcel.cpp

Mutex gParcelGlobalAllocSizeLock;
size_t gParcelGlobalAllocSize = 0;
size_t gParcelGlobalAllocCount = 0;

// ------------ IServiceManager.cpp

Mutex gDefaultServiceManagerLock;
sp<IServiceManager> gDefaultServiceManager;