From: Adrian Roos Date: Thu, 22 Oct 2015 23:12:53 +0000 (-0700) Subject: Revert "Revert "Track ashmem memory usage in Parcel"" X-Git-Tag: android-x86-7.1-r1~779 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d5c3a1c080c576b8f3a6e037fe3564900f8c8fb1;p=android-x86%2Fframeworks-native.git Revert "Revert "Track ashmem memory usage in Parcel"" This reverts commit 6880307e8e35a6c484942443fb4ddd6173126152. Bug: 25004154 Change-Id: I9b432d1ebc39f3bbcd7afdefc403f0fb6ced8158 (cherry picked from commit cbf3726357966539c2a685f46e61c3fc8937f19e) --- diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 5a37e6a408..7b80dd9e51 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -372,9 +372,11 @@ public: private: size_t mBlobAshmemSize; + size_t mOpenAshmemSize; public: size_t getBlobAshmemSize() const; + size_t getOpenAshmemSize() const; }; // --------------------------------------------------------------------------- @@ -442,9 +444,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); + const flat_binder_object& obj, const void* who, size_t* outAshmemSize); void release_object(const sp& proc, - const flat_binder_object& obj, const void* who); + const flat_binder_object& obj, const void* who, size_t* outAshmemSize); 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 436af85599..5a62fce840 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -96,7 +96,7 @@ enum { }; void acquire_object(const sp& 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,13 @@ void acquire_object(const sp& 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 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; } } @@ -133,7 +138,7 @@ void acquire_object(const sp& proc, } void release_object(const sp& 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: @@ -160,7 +165,14 @@ void release_object(const sp& proc, return; } case BINDER_TYPE_FD: { - if (obj.cookie != 0) close(obj.handle); + if (obj.cookie != 0) { + int size = ashmem_get_size_region(obj.handle); + if (size > 0) { + *outAshmemSize -= size; + } + + close(obj.handle); + } return; } } @@ -502,7 +514,7 @@ status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len) flat_binder_object* flat = reinterpret_cast(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 @@ -1223,7 +1235,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++; } @@ -2083,7 +2095,7 @@ void Parcel::releaseObjects() i--; const flat_binder_object* flat = reinterpret_cast(data+objects[i]); - release_object(proc, *flat, this); + release_object(proc, *flat, this, &mOpenAshmemSize); } } @@ -2097,7 +2109,7 @@ void Parcel::acquireObjects() i--; const flat_binder_object* flat = reinterpret_cast(data+objects[i]); - acquire_object(proc, *flat, this); + acquire_object(proc, *flat, this, &mOpenAshmemSize); } } @@ -2285,7 +2297,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)); @@ -2372,6 +2384,7 @@ void Parcel::initState() mAllowFds = true; mOwner = NULL; mBlobAshmemSize = 0; + mOpenAshmemSize = 0; } void Parcel::scanForFds() const @@ -2394,6 +2407,11 @@ size_t Parcel::getBlobAshmemSize() const return mBlobAshmemSize; } +size_t Parcel::getOpenAshmemSize() const +{ + return mOpenAshmemSize; +} + // --- Parcel::Blob --- Parcel::Blob::Blob() :