Loading include/binder/Parcel.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; }; // --------------------------------------------------------------------------- Loading libs/binder/Parcel.cpp +48 −14 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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; } } Loading @@ -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: Loading @@ -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; } } Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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++; } Loading Loading @@ -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); } } Loading @@ -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); } } Loading Loading @@ -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)); Loading Loading @@ -1890,7 +1916,7 @@ void Parcel::initState() mFdsKnown = true; mAllowFds = true; mOwner = NULL; mBlobAshmemSize = 0; mOpenAshmemSize = 0; } void Parcel::scanForFds() const Loading @@ -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 Loading
include/binder/Parcel.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; }; // --------------------------------------------------------------------------- Loading
libs/binder/Parcel.cpp +48 −14 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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; } } Loading @@ -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: Loading @@ -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; } } Loading @@ -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) { Loading Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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++; } Loading Loading @@ -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); } } Loading @@ -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); } } Loading Loading @@ -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)); Loading Loading @@ -1890,7 +1916,7 @@ void Parcel::initState() mFdsKnown = true; mAllowFds = true; mOwner = NULL; mBlobAshmemSize = 0; mOpenAshmemSize = 0; } void Parcel::scanForFds() const Loading @@ -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