Merge "Add tracking of parcel memory allocations." into lmp-mr1-dev
This commit is contained in:
commit
ca69e8f2d0
@ -206,6 +206,10 @@ public:
|
|||||||
// Explicitly close all file descriptors in the parcel.
|
// Explicitly close all file descriptors in the parcel.
|
||||||
void closeFileDescriptors();
|
void closeFileDescriptors();
|
||||||
|
|
||||||
|
// Debugging: get metrics on current allocations.
|
||||||
|
static size_t getGlobalAllocSize();
|
||||||
|
static size_t getGlobalAllocCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef void (*release_func)(Parcel* parcel,
|
typedef void (*release_func)(Parcel* parcel,
|
||||||
const uint8_t* data, size_t dataSize,
|
const uint8_t* data, size_t dataSize,
|
||||||
|
@ -34,7 +34,12 @@ extern Vector<int32_t> gTextBuffers;
|
|||||||
extern Mutex gProcessMutex;
|
extern Mutex gProcessMutex;
|
||||||
extern sp<ProcessState> gProcess;
|
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 Mutex gDefaultServiceManagerLock;
|
||||||
extern sp<IServiceManager> gDefaultServiceManager;
|
extern sp<IServiceManager> gDefaultServiceManager;
|
||||||
extern sp<IPermissionController> gPermissionController;
|
extern sp<IPermissionController> gPermissionController;
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <cutils/ashmem.h>
|
#include <cutils/ashmem.h>
|
||||||
|
|
||||||
#include <private/binder/binder_module.h>
|
#include <private/binder/binder_module.h>
|
||||||
|
#include <private/binder/Static.h>
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -48,6 +49,8 @@
|
|||||||
|
|
||||||
#define LOG_REFS(...)
|
#define LOG_REFS(...)
|
||||||
//#define LOG_REFS(...) ALOG(LOG_DEBUG, "Parcel", __VA_ARGS__)
|
//#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()
|
Parcel::Parcel()
|
||||||
{
|
{
|
||||||
|
LOG_ALLOC("Parcel %p: constructing", this);
|
||||||
initState();
|
initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
Parcel::~Parcel()
|
Parcel::~Parcel()
|
||||||
{
|
{
|
||||||
freeDataNoInit();
|
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
|
const uint8_t* Parcel::data() const
|
||||||
@ -1488,11 +1503,20 @@ void Parcel::freeData()
|
|||||||
void Parcel::freeDataNoInit()
|
void Parcel::freeDataNoInit()
|
||||||
{
|
{
|
||||||
if (mOwner) {
|
if (mOwner) {
|
||||||
|
LOG_ALLOC("Parcel %p: freeing other owner data", this);
|
||||||
//ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
|
//ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
|
||||||
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
|
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
|
||||||
} else {
|
} else {
|
||||||
|
LOG_ALLOC("Parcel %p: freeing allocated data", this);
|
||||||
releaseObjects();
|
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);
|
if (mObjects) free(mObjects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1521,6 +1545,11 @@ status_t Parcel::restartWrite(size_t desired)
|
|||||||
releaseObjects();
|
releaseObjects();
|
||||||
|
|
||||||
if (data) {
|
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;
|
mData = data;
|
||||||
mDataCapacity = desired;
|
mDataCapacity = desired;
|
||||||
}
|
}
|
||||||
@ -1600,6 +1629,12 @@ status_t Parcel::continueWrite(size_t desired)
|
|||||||
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
|
mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
|
||||||
mOwner = NULL;
|
mOwner = NULL;
|
||||||
|
|
||||||
|
LOG_ALLOC("Parcel %p: taking ownership of %zu capacity", this, desired);
|
||||||
|
gParcelGlobalAllocSizeLock.lock();
|
||||||
|
gParcelGlobalAllocSize += desired;
|
||||||
|
gParcelGlobalAllocCount++;
|
||||||
|
gParcelGlobalAllocSizeLock.unlock();
|
||||||
|
|
||||||
mData = data;
|
mData = data;
|
||||||
mObjects = objects;
|
mObjects = objects;
|
||||||
mDataSize = (mDataSize < desired) ? mDataSize : desired;
|
mDataSize = (mDataSize < desired) ? mDataSize : desired;
|
||||||
@ -1634,6 +1669,12 @@ status_t Parcel::continueWrite(size_t desired)
|
|||||||
if (desired > mDataCapacity) {
|
if (desired > mDataCapacity) {
|
||||||
uint8_t* data = (uint8_t*)realloc(mData, desired);
|
uint8_t* data = (uint8_t*)realloc(mData, desired);
|
||||||
if (data) {
|
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;
|
mData = data;
|
||||||
mDataCapacity = desired;
|
mDataCapacity = desired;
|
||||||
} else if (desired > mDataCapacity) {
|
} 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);
|
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;
|
mData = data;
|
||||||
mDataSize = mDataPos = 0;
|
mDataSize = mDataPos = 0;
|
||||||
ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
|
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()
|
void Parcel::initState()
|
||||||
{
|
{
|
||||||
|
LOG_ALLOC("Parcel %p: initState", this);
|
||||||
mError = NO_ERROR;
|
mError = NO_ERROR;
|
||||||
mData = 0;
|
mData = 0;
|
||||||
mDataSize = 0;
|
mDataSize = 0;
|
||||||
|
@ -90,7 +90,13 @@ public:
|
|||||||
|
|
||||||
static LibBinderIPCtStatics gIPCStatics;
|
static LibBinderIPCtStatics gIPCStatics;
|
||||||
|
|
||||||
// ------------ ServiceManager.cpp
|
// ------------ Parcel.cpp
|
||||||
|
|
||||||
|
Mutex gParcelGlobalAllocSizeLock;
|
||||||
|
size_t gParcelGlobalAllocSize = 0;
|
||||||
|
size_t gParcelGlobalAllocCount = 0;
|
||||||
|
|
||||||
|
// ------------ IServiceManager.cpp
|
||||||
|
|
||||||
Mutex gDefaultServiceManagerLock;
|
Mutex gDefaultServiceManagerLock;
|
||||||
sp<IServiceManager> gDefaultServiceManager;
|
sp<IServiceManager> gDefaultServiceManager;
|
||||||
|
Loading…
Reference in New Issue
Block a user