diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-11-11 12:22:53 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2014-11-11 16:23:04 -0800 |
commit | 7e790af756d7891cb1cf1374bb283a8fbcbe6b49 (patch) | |
tree | aa12e039c68c41b88b76543331ccdcd5d5fcbba8 | |
parent | 37878b1e57ee25629f0d9aff5edf599afcc8c6eb (diff) | |
download | frameworks_native-7e790af756d7891cb1cf1374bb283a8fbcbe6b49.zip frameworks_native-7e790af756d7891cb1cf1374bb283a8fbcbe6b49.tar.gz frameworks_native-7e790af756d7891cb1cf1374bb283a8fbcbe6b49.tar.bz2 |
Add tracking of parcel memory allocations.
Change-Id: I76ffed0e69ccfe70e87d98646f11d4de7c3fd980
-rw-r--r-- | include/binder/Parcel.h | 6 | ||||
-rw-r--r-- | include/private/binder/Static.h | 7 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 50 | ||||
-rw-r--r-- | libs/binder/Static.cpp | 8 |
4 files changed, 67 insertions, 4 deletions
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 2ee99f8..6a69761 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -205,7 +205,11 @@ 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, diff --git a/include/private/binder/Static.h b/include/private/binder/Static.h index 6a03594..eeb37d7 100644 --- a/include/private/binder/Static.h +++ b/include/private/binder/Static.h @@ -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; diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 09238c2..98a3dd7 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -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; diff --git a/libs/binder/Static.cpp b/libs/binder/Static.cpp index 2062692..b870c34 100644 --- a/libs/binder/Static.cpp +++ b/libs/binder/Static.cpp @@ -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; |