From 6bb3114246f6f6aa406e65452dbaa12b135029ea Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 22 Oct 2015 16:46:12 -0700 Subject: [PATCH] Maintain Parcel ABI Makes sure we don't change the memory layout of the Parcel class to maintain binary compatibility with prebuilts linking against libbinder. Bug: 25004154 Change-Id: I656687497f08bb85cefda796aafa2341e601e30a --- include/binder/Parcel.h | 6 +++--- libs/binder/Parcel.cpp | 46 +++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 220a9353f..16cd6cf67 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -341,10 +341,10 @@ public: }; private: - size_t mBlobAshmemSize; size_t mOpenAshmemSize; public: + // TODO: Remove once ABI can be changed. size_t getBlobAshmemSize() const; size_t getOpenAshmemSize() const; }; @@ -414,9 +414,9 @@ inline TextOutput& operator<<(TextOutput& to, const Parcel& parcel) // Generic acquire and release of objects. void acquire_object(const sp& proc, - const flat_binder_object& obj, const void* who, size_t* outAshmemSize); + const flat_binder_object& obj, const void* who); void release_object(const sp& proc, - const flat_binder_object& obj, const void* who, size_t* outAshmemSize); + const flat_binder_object& obj, const void* who); void flatten_binder(const sp& proc, const sp& binder, flat_binder_object* out); diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 1c0358518..22d7ef36c 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -124,10 +124,12 @@ void acquire_object(const sp& proc, } case BINDER_TYPE_FD: { if (obj.cookie != 0) { - // 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; + 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; @@ -137,7 +139,13 @@ void acquire_object(const sp& proc, ALOGD("Invalid object type 0x%08x", obj.type); } -void release_object(const sp& proc, +void acquire_object(const sp& proc, + const flat_binder_object& obj, const void* who) +{ + acquire_object(proc, obj, who, NULL); +} + +static void release_object(const sp& proc, const flat_binder_object& obj, const void* who, size_t* outAshmemSize) { switch (obj.type) { @@ -165,13 +173,15 @@ void release_object(const sp& proc, return; } case BINDER_TYPE_FD: { - if (obj.cookie != 0) { - int size = ashmem_get_size_region(obj.handle); - if (size > 0) { - *outAshmemSize -= size; - } + if (outAshmemSize != NULL) { + if (obj.cookie != 0) { + int size = ashmem_get_size_region(obj.handle); + if (size > 0) { + *outAshmemSize -= size; + } - close(obj.handle); + close(obj.handle); + } } return; } @@ -180,6 +190,12 @@ void release_object(const sp& proc, ALOGE("Invalid object type 0x%08x", obj.type); } +void release_object(const sp& proc, + const flat_binder_object& obj, const void* who) +{ + release_object(proc, obj, who, NULL); +} + inline static status_t finish_flatten_binder( const sp& /*binder*/, const flat_binder_object& flat, Parcel* out) { @@ -935,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; @@ -1902,7 +1916,6 @@ void Parcel::initState() mFdsKnown = true; mAllowFds = true; mOwner = NULL; - mBlobAshmemSize = 0; mOpenAshmemSize = 0; } @@ -1923,7 +1936,10 @@ 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