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
diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp
index 5e645cc..cbb1e8f 100644
--- a/libs/androidfw/CursorWindow.cpp
+++ b/libs/androidfw/CursorWindow.cpp
@@ -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 {
/**
@@ -39,7 +40,7 @@
CursorWindow::~CursorWindow() {
if (mAshmemFd != -1) {
- ::munmap(mData, mSize);
+ mMappedFile.reset();
::close(mAshmemFd);
} else {
free(mData);
@@ -75,6 +76,7 @@
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) {
@@ -95,11 +97,12 @@
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 @@
mData = newData;
mSize = mInflatedSize;
mSlotsOffset = newSlotsOffset;
+ mMappedFile = std::move(mappedFile);
updateSlotsData();
}
@@ -130,7 +134,7 @@
fail:
LOG(ERROR) << "Failed maybeInflate";
fail_silent:
- ::munmap(newData, mInflatedSize);
+ mappedFile.reset();
::close(ashmemFd);
return UNKNOWN_ERROR;
}
@@ -167,11 +171,12 @@
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;