Merge changes from topic \'parcel-v2\' into mnc-dr-dev
am: cf33d50d25
* commit 'cf33d50d25c5660bf1d4325c11433fb281bc31cb':
Maintain Parcel ABI
Revert "Revert "Track ashmem memory usage in Parcel""
This commit is contained in:
commit
0c11f9918c
@ -341,10 +341,12 @@ public:
|
||||
};
|
||||
|
||||
private:
|
||||
size_t mBlobAshmemSize;
|
||||
size_t mOpenAshmemSize;
|
||||
|
||||
public:
|
||||
// TODO: Remove once ABI can be changed.
|
||||
size_t getBlobAshmemSize() const;
|
||||
size_t getOpenAshmemSize() const;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
@ -96,7 +96,7 @@ enum {
|
||||
};
|
||||
|
||||
void acquire_object(const sp<ProcessState>& proc,
|
||||
const flat_binder_object& obj, const void* who)
|
||||
const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
|
||||
{
|
||||
switch (obj.type) {
|
||||
case BINDER_TYPE_BINDER:
|
||||
@ -123,8 +123,15 @@ void acquire_object(const sp<ProcessState>& proc,
|
||||
return;
|
||||
}
|
||||
case BINDER_TYPE_FD: {
|
||||
// intentionally blank -- nothing to do to acquire this, but we do
|
||||
// recognize it as a legitimate object type.
|
||||
if (obj.cookie != 0) {
|
||||
if (outAshmemSize != NULL) {
|
||||
// If we own an ashmem fd, keep track of how much memory it refers to.
|
||||
int size = ashmem_get_size_region(obj.handle);
|
||||
if (size > 0) {
|
||||
*outAshmemSize += size;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -132,8 +139,14 @@ void acquire_object(const sp<ProcessState>& proc,
|
||||
ALOGD("Invalid object type 0x%08x", obj.type);
|
||||
}
|
||||
|
||||
void release_object(const sp<ProcessState>& proc,
|
||||
void acquire_object(const sp<ProcessState>& proc,
|
||||
const flat_binder_object& obj, const void* who)
|
||||
{
|
||||
acquire_object(proc, obj, who, NULL);
|
||||
}
|
||||
|
||||
static void release_object(const sp<ProcessState>& proc,
|
||||
const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
|
||||
{
|
||||
switch (obj.type) {
|
||||
case BINDER_TYPE_BINDER:
|
||||
@ -160,7 +173,16 @@ void release_object(const sp<ProcessState>& proc,
|
||||
return;
|
||||
}
|
||||
case BINDER_TYPE_FD: {
|
||||
if (obj.cookie != 0) close(obj.handle);
|
||||
if (outAshmemSize != NULL) {
|
||||
if (obj.cookie != 0) {
|
||||
int size = ashmem_get_size_region(obj.handle);
|
||||
if (size > 0) {
|
||||
*outAshmemSize -= size;
|
||||
}
|
||||
|
||||
close(obj.handle);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -168,6 +190,12 @@ void release_object(const sp<ProcessState>& proc,
|
||||
ALOGE("Invalid object type 0x%08x", obj.type);
|
||||
}
|
||||
|
||||
void release_object(const sp<ProcessState>& proc,
|
||||
const flat_binder_object& obj, const void* who)
|
||||
{
|
||||
release_object(proc, obj, who, NULL);
|
||||
}
|
||||
|
||||
inline static status_t finish_flatten_binder(
|
||||
const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
|
||||
{
|
||||
@ -504,7 +532,7 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
|
||||
|
||||
flat_binder_object* flat
|
||||
= reinterpret_cast<flat_binder_object*>(mData + off);
|
||||
acquire_object(proc, *flat, this);
|
||||
acquire_object(proc, *flat, this, &mOpenAshmemSize);
|
||||
|
||||
if (flat->type == BINDER_TYPE_FD) {
|
||||
// If this is a file descriptor, we need to dup it so the
|
||||
@ -923,8 +951,6 @@ status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
|
||||
int fd = ashmem_create_region("Parcel Blob", len);
|
||||
if (fd < 0) return NO_MEMORY;
|
||||
|
||||
mBlobAshmemSize += len;
|
||||
|
||||
int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
|
||||
if (result < 0) {
|
||||
status = result;
|
||||
@ -1026,7 +1052,7 @@ restart_write:
|
||||
// Need to write meta-data?
|
||||
if (nullMetaData || val.binder != 0) {
|
||||
mObjects[mObjectsSize] = mDataPos;
|
||||
acquire_object(ProcessState::self(), val, this);
|
||||
acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
|
||||
mObjectsSize++;
|
||||
}
|
||||
|
||||
@ -1609,7 +1635,7 @@ void Parcel::releaseObjects()
|
||||
i--;
|
||||
const flat_binder_object* flat
|
||||
= reinterpret_cast<flat_binder_object*>(data+objects[i]);
|
||||
release_object(proc, *flat, this);
|
||||
release_object(proc, *flat, this, &mOpenAshmemSize);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1623,7 +1649,7 @@ void Parcel::acquireObjects()
|
||||
i--;
|
||||
const flat_binder_object* flat
|
||||
= reinterpret_cast<flat_binder_object*>(data+objects[i]);
|
||||
acquire_object(proc, *flat, this);
|
||||
acquire_object(proc, *flat, this, &mOpenAshmemSize);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1805,7 +1831,7 @@ status_t Parcel::continueWrite(size_t desired)
|
||||
// will need to rescan because we may have lopped off the only FDs
|
||||
mFdsKnown = false;
|
||||
}
|
||||
release_object(proc, *flat, this);
|
||||
release_object(proc, *flat, this, &mOpenAshmemSize);
|
||||
}
|
||||
binder_size_t* objects =
|
||||
(binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
|
||||
@ -1890,7 +1916,7 @@ void Parcel::initState()
|
||||
mFdsKnown = true;
|
||||
mAllowFds = true;
|
||||
mOwner = NULL;
|
||||
mBlobAshmemSize = 0;
|
||||
mOpenAshmemSize = 0;
|
||||
}
|
||||
|
||||
void Parcel::scanForFds() const
|
||||
@ -1910,7 +1936,15 @@ void Parcel::scanForFds() const
|
||||
|
||||
size_t Parcel::getBlobAshmemSize() const
|
||||
{
|
||||
return mBlobAshmemSize;
|
||||
// This used to return the size of all blobs that were written to ashmem, now we're returning
|
||||
// the ashmem currently referenced by this Parcel, which should be equivalent.
|
||||
// TODO: Remove method once ABI can be changed.
|
||||
return mOpenAshmemSize;
|
||||
}
|
||||
|
||||
size_t Parcel::getOpenAshmemSize() const
|
||||
{
|
||||
return mOpenAshmemSize;
|
||||
}
|
||||
|
||||
// --- Parcel::Blob ---
|
||||
|
Loading…
Reference in New Issue
Block a user