Loading libs/androidfw/CursorWindow.cpp +13 −8 Original line number Diff line number Diff line Loading @@ -18,11 +18,12 @@ #include <androidfw/CursorWindow.h> #include <sys/mman.h> #include "android-base/logging.h" #include "android-base/mapped_file.h" #include "cutils/ashmem.h" using android::base::MappedFile; namespace android { /** Loading @@ -39,7 +40,7 @@ CursorWindow::CursorWindow() { CursorWindow::~CursorWindow() { if (mAshmemFd != -1) { ::munmap(mData, mSize); mMappedFile.reset(); ::close(mAshmemFd); } else { free(mData); Loading Loading @@ -75,6 +76,7 @@ fail_silent: status_t CursorWindow::maybeInflate() { int ashmemFd = 0; void* newData = nullptr; std::unique_ptr<MappedFile> mappedFile; // Bail early when we can't expand any further if (mReadOnly || mSize == mInflatedSize) { Loading @@ -95,11 +97,12 @@ status_t CursorWindow::maybeInflate() { goto fail_silent; } newData = ::mmap(nullptr, mInflatedSize, PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0); if (newData == MAP_FAILED) { mappedFile = MappedFile::FromFd(ashmemFd, 0, mInflatedSize, PROT_READ | PROT_WRITE); if (mappedFile == nullptr) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } newData = mappedFile->data(); if (ashmem_set_prot_region(ashmemFd, PROT_READ) < 0) { PLOG(ERROR) << "Failed ashmem_set_prot_region"; Loading @@ -120,6 +123,7 @@ status_t CursorWindow::maybeInflate() { mData = newData; mSize = mInflatedSize; mSlotsOffset = newSlotsOffset; mMappedFile = std::move(mappedFile); updateSlotsData(); } Loading @@ -130,7 +134,7 @@ status_t CursorWindow::maybeInflate() { fail: LOG(ERROR) << "Failed maybeInflate"; fail_silent: ::munmap(newData, mInflatedSize); mappedFile.reset(); ::close(ashmemFd); return UNKNOWN_ERROR; } Loading Loading @@ -167,11 +171,12 @@ status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outWindow goto fail_silent; } window->mData = ::mmap(nullptr, window->mSize, PROT_READ, MAP_SHARED, window->mAshmemFd, 0); if (window->mData == MAP_FAILED) { window->mMappedFile = MappedFile::FromFd(window->mAshmemFd, 0, window->mSize, PROT_READ); if (window->mMappedFile == nullptr) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } window->mData = window->mMappedFile->data(); } else { window->mAshmemFd = -1; Loading libs/androidfw/include/androidfw/CursorWindow.h +4 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ #include "binder/Parcel.h" #include "utils/String8.h" #include "android-base/mapped_file.h" #define LOG_WINDOW(...) namespace android { Loading Loading @@ -149,6 +151,8 @@ private: String8 mName; int mAshmemFd = -1; void* mData = nullptr; std::unique_ptr<android::base::MappedFile> mMappedFile; /** * Pointer to the first FieldSlot, used to optimize the extremely * hot code path of getFieldSlot(). Loading Loading
libs/androidfw/CursorWindow.cpp +13 −8 Original line number Diff line number Diff line Loading @@ -18,11 +18,12 @@ #include <androidfw/CursorWindow.h> #include <sys/mman.h> #include "android-base/logging.h" #include "android-base/mapped_file.h" #include "cutils/ashmem.h" using android::base::MappedFile; namespace android { /** Loading @@ -39,7 +40,7 @@ CursorWindow::CursorWindow() { CursorWindow::~CursorWindow() { if (mAshmemFd != -1) { ::munmap(mData, mSize); mMappedFile.reset(); ::close(mAshmemFd); } else { free(mData); Loading Loading @@ -75,6 +76,7 @@ fail_silent: status_t CursorWindow::maybeInflate() { int ashmemFd = 0; void* newData = nullptr; std::unique_ptr<MappedFile> mappedFile; // Bail early when we can't expand any further if (mReadOnly || mSize == mInflatedSize) { Loading @@ -95,11 +97,12 @@ status_t CursorWindow::maybeInflate() { goto fail_silent; } newData = ::mmap(nullptr, mInflatedSize, PROT_READ | PROT_WRITE, MAP_SHARED, ashmemFd, 0); if (newData == MAP_FAILED) { mappedFile = MappedFile::FromFd(ashmemFd, 0, mInflatedSize, PROT_READ | PROT_WRITE); if (mappedFile == nullptr) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } newData = mappedFile->data(); if (ashmem_set_prot_region(ashmemFd, PROT_READ) < 0) { PLOG(ERROR) << "Failed ashmem_set_prot_region"; Loading @@ -120,6 +123,7 @@ status_t CursorWindow::maybeInflate() { mData = newData; mSize = mInflatedSize; mSlotsOffset = newSlotsOffset; mMappedFile = std::move(mappedFile); updateSlotsData(); } Loading @@ -130,7 +134,7 @@ status_t CursorWindow::maybeInflate() { fail: LOG(ERROR) << "Failed maybeInflate"; fail_silent: ::munmap(newData, mInflatedSize); mappedFile.reset(); ::close(ashmemFd); return UNKNOWN_ERROR; } Loading Loading @@ -167,11 +171,12 @@ status_t CursorWindow::createFromParcel(Parcel* parcel, CursorWindow** outWindow goto fail_silent; } window->mData = ::mmap(nullptr, window->mSize, PROT_READ, MAP_SHARED, window->mAshmemFd, 0); if (window->mData == MAP_FAILED) { window->mMappedFile = MappedFile::FromFd(window->mAshmemFd, 0, window->mSize, PROT_READ); if (window->mMappedFile == nullptr) { PLOG(ERROR) << "Failed mmap"; goto fail_silent; } window->mData = window->mMappedFile->data(); } else { window->mAshmemFd = -1; Loading
libs/androidfw/include/androidfw/CursorWindow.h +4 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ #include "binder/Parcel.h" #include "utils/String8.h" #include "android-base/mapped_file.h" #define LOG_WINDOW(...) namespace android { Loading Loading @@ -149,6 +151,8 @@ private: String8 mName; int mAshmemFd = -1; void* mData = nullptr; std::unique_ptr<android::base::MappedFile> mMappedFile; /** * Pointer to the first FieldSlot, used to optimize the extremely * hot code path of getFieldSlot(). Loading