diff options
author | Bart Sears <bsears@google.com> | 2011-09-25 14:30:21 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-25 14:30:21 -0700 |
commit | 8acda7803417cc38cb284298fcb86b479d11fdb5 (patch) | |
tree | 81e904ced86ff0d345781382171a55eb7a73bce6 | |
parent | f4c1088d750a182bd85889c86b3c9ef4ba772405 (diff) | |
download | frameworks_native-8acda7803417cc38cb284298fcb86b479d11fdb5.zip frameworks_native-8acda7803417cc38cb284298fcb86b479d11fdb5.tar.gz frameworks_native-8acda7803417cc38cb284298fcb86b479d11fdb5.tar.bz2 |
Revert "Transfer large bitmaps using ashmem. Bug: 5224703"
This reverts commit 56c58f66b97d22fe7e7de1f7d9548bcbe1973029
This CL was causing the browser to crash when adding bookmarks, visiting the bookmarks page, and sharing pages (see bug http://b/issue?id=5369231
-rw-r--r-- | include/binder/Parcel.h | 49 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 97 |
2 files changed, 3 insertions, 143 deletions
diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 53a53c4..bfe13f0 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -38,9 +38,6 @@ struct flat_binder_object; // defined in support_p/binder_module.h class Parcel { public: - class ReadableBlob; - class WritableBlob; - Parcel(); ~Parcel(); @@ -112,13 +109,7 @@ public: // Place a file descriptor into the parcel. A dup of the fd is made, which // will be closed once the parcel is destroyed. status_t writeDupFileDescriptor(int fd); - - // Writes a blob to the parcel. - // If the blob is small, then it is stored in-place, otherwise it is - // transferred by way of an anonymous shared memory region. - // The caller should call release() on the blob after writing its contents. - status_t writeBlob(size_t len, WritableBlob* outBlob); - + status_t writeObject(const flat_binder_object& val, bool nullMetaData); // Like Parcel.java's writeNoException(). Just writes a zero int32. @@ -166,11 +157,7 @@ public: // Retrieve a file descriptor from the parcel. This returns the raw fd // in the parcel, which you do not own -- use dup() to get your own copy. int readFileDescriptor() const; - - // Reads a blob from the parcel. - // The caller should call release() on the blob after reading its contents. - status_t readBlob(size_t len, ReadableBlob* outBlob) const; - + const flat_binder_object* readObject(bool nullMetaData) const; // Explicitly close all file descriptors in the parcel. @@ -190,7 +177,7 @@ public: release_func relFunc, void* relCookie); void print(TextOutput& to, uint32_t flags = 0) const; - + private: Parcel(const Parcel& o); Parcel& operator=(const Parcel& o); @@ -228,36 +215,6 @@ private: release_func mOwner; void* mOwnerCookie; - - class Blob { - public: - Blob(); - ~Blob(); - - void release(); - inline size_t size() const { return mSize; } - - protected: - void init(bool mapped, void* data, size_t size); - void clear(); - - bool mMapped; - void* mData; - size_t mSize; - }; - -public: - class ReadableBlob : public Blob { - friend class Parcel; - public: - inline const void* data() const { return mData; } - }; - - class WritableBlob : public Blob { - friend class Parcel; - public: - inline void* data() { return mData; } - }; }; // --------------------------------------------------------------------------- diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 126d3f5..a0fc4d0 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -30,14 +30,12 @@ #include <utils/TextOutput.h> #include <utils/misc.h> #include <utils/Flattenable.h> -#include <cutils/ashmem.h> #include <private/binder/binder_module.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> -#include <sys/mman.h> #ifndef INT32_MAX #define INT32_MAX ((int32_t)(2147483647)) @@ -56,9 +54,6 @@ // Note: must be kept in sync with android/os/Parcel.java's EX_HAS_REPLY_HEADER #define EX_HAS_REPLY_HEADER -128 -// Maximum size of a blob to transfer in-place. -static const size_t IN_PLACE_BLOB_LIMIT = 40 * 1024; - // XXX This can be made public if we want to provide // support for typed data. struct small_flat_data @@ -711,47 +706,6 @@ status_t Parcel::writeDupFileDescriptor(int fd) return writeObject(obj, true); } -status_t Parcel::writeBlob(size_t len, WritableBlob* outBlob) -{ - if (len <= IN_PLACE_BLOB_LIMIT) { - LOGV("writeBlob: write in place"); - void* ptr = writeInplace(len); - if (!ptr) return NO_MEMORY; - - outBlob->init(false /*mapped*/, ptr, len); - return NO_ERROR; - } - - LOGV("writeBlob: write to ashmem"); - int fd = ashmem_create_region("Parcel Blob", len); - if (fd < 0) return NO_MEMORY; - - status_t status; - int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); - if (result < 0) { - status = -result; - } else { - void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (ptr == MAP_FAILED) { - status = -errno; - } else { - result = ashmem_set_prot_region(fd, PROT_READ); - if (result < 0) { - status = -result; - } else { - status = writeFileDescriptor(fd); - if (!status) { - outBlob->init(true /*mapped*/, ptr, len); - return NO_ERROR; - } - } - } - ::munmap(ptr, len); - } - ::close(fd); - return status; -} - status_t Parcel::write(const Flattenable& val) { status_t err; @@ -1071,28 +1025,6 @@ int Parcel::readFileDescriptor() const return BAD_TYPE; } -status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const -{ - if (len <= IN_PLACE_BLOB_LIMIT) { - LOGV("readBlob: read in place"); - const void* ptr = readInplace(len); - if (!ptr) return BAD_VALUE; - - outBlob->init(false /*mapped*/, const_cast<void*>(ptr), len); - return NO_ERROR; - } - - LOGV("readBlob: read from ashmem"); - int fd = readFileDescriptor(); - if (fd == int(BAD_TYPE)) return BAD_VALUE; - - void* ptr = ::mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0); - if (!ptr) return NO_MEMORY; - - outBlob->init(true /*mapped*/, ptr, len); - return NO_ERROR; -} - status_t Parcel::read(Flattenable& val) const { // size @@ -1520,33 +1452,4 @@ void Parcel::scanForFds() const mFdsKnown = true; } -// --- Parcel::Blob --- - -Parcel::Blob::Blob() : - mMapped(false), mData(NULL), mSize(0) { -} - -Parcel::Blob::~Blob() { - release(); -} - -void Parcel::Blob::release() { - if (mMapped && mData) { - ::munmap(mData, mSize); - } - clear(); -} - -void Parcel::Blob::init(bool mapped, void* data, size_t size) { - mMapped = mapped; - mData = data; - mSize = size; -} - -void Parcel::Blob::clear() { - mMapped = false; - mData = NULL; - mSize = 0; -} - }; // namespace android |