From e28dd9f756fd7df72e39260e82a7569a3636d0af Mon Sep 17 00:00:00 2001 From: Michael Hoisie Date: Tue, 12 Mar 2024 18:15:14 +0000 Subject: Use MappedFile for mmap-related operations in CursorWindow MappedFile from libbase can encapsulate all mmap and munmap operations. The advantage to MappedFile is that it is supported on all host platforms, including Windows. This change is a no-op in terms of functionality. Test: Roboelctric SQLiteDatabaseTest Bug: 317884162 Change-Id: I77b6b5481b64a930ecd2bd5ddf3692e54be60751 --- libs/androidfw/CursorWindow.cpp | 21 +++++++++++++-------- libs/androidfw/include/androidfw/CursorWindow.h | 4 ++++ 2 files changed, 17 insertions(+), 8 deletions(-) (limited to 'libs') diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 5e645cceea2d..cbb1e8f82838 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -18,11 +18,12 @@ #include -#include - #include "android-base/logging.h" +#include "android-base/mapped_file.h" #include "cutils/ashmem.h" +using android::base::MappedFile; + namespace android { /** @@ -39,7 +40,7 @@ CursorWindow::CursorWindow() { CursorWindow::~CursorWindow() { if (mAshmemFd != -1) { - ::munmap(mData, mSize); + mMappedFile.reset(); ::close(mAshmemFd); } else { free(mData); @@ -75,6 +76,7 @@ fail_silent: status_t CursorWindow::maybeInflate() { int ashmemFd = 0; void* newData = nullptr; + std::unique_ptr mappedFile; // Bail early when we can't expand any further if (mReadOnly || mSize == mInflatedSize) { @@ -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"; @@ -120,6 +123,7 @@ status_t CursorWindow::maybeInflate() { mData = newData; mSize = mInflatedSize; mSlotsOffset = newSlotsOffset; + mMappedFile = std::move(mappedFile); updateSlotsData(); } @@ -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; } @@ -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; diff --git a/libs/androidfw/include/androidfw/CursorWindow.h b/libs/androidfw/include/androidfw/CursorWindow.h index 9ec026a19c4c..c2eac12eb77d 100644 --- a/libs/androidfw/include/androidfw/CursorWindow.h +++ b/libs/androidfw/include/androidfw/CursorWindow.h @@ -26,6 +26,8 @@ #include "binder/Parcel.h" #include "utils/String8.h" +#include "android-base/mapped_file.h" + #define LOG_WINDOW(...) namespace android { @@ -149,6 +151,8 @@ private: String8 mName; int mAshmemFd = -1; void* mData = nullptr; + std::unique_ptr mMappedFile; + /** * Pointer to the first FieldSlot, used to optimize the extremely * hot code path of getFieldSlot(). -- cgit v1.2.3-59-g8ed1b