Merge "Rename libfiemap libraries."
diff --git a/base/include/android-base/endian.h b/base/include/android-base/endian.h
index 10efaa3..2d0f614 100644
--- a/base/include/android-base/endian.h
+++ b/base/include/android-base/endian.h
@@ -18,6 +18,9 @@
/* A cross-platform equivalent of bionic's <sys/endian.h>. */
+/* For __BIONIC__ and __GLIBC__ */
+#include <sys/cdefs.h>
+
#if defined(__BIONIC__)
#include <sys/endian.h>
@@ -38,6 +41,9 @@
#define betoh16(x) be16toh(x)
#define betoh32(x) be32toh(x)
#define betoh64(x) be64toh(x)
+#define letoh16(x) le16toh(x)
+#define letoh32(x) le32toh(x)
+#define letoh64(x) le64toh(x)
#else
@@ -45,10 +51,8 @@
/* macOS has some of the basics. */
#include <sys/_endian.h>
#else
-/* Windows really has nothing. */
-#define LITTLE_ENDIAN __LITTLE_ENDIAN
-#define BIG_ENDIAN __BIG_ENDIAN
-#define BYTE_ORDER __BYTE_ORDER
+/* Windows has even less. */
+#include <sys/param.h>
#define htons(x) __builtin_bswap16(x)
#define htonl(x) __builtin_bswap32(x)
#define ntohs(x) __builtin_bswap16(x)
diff --git a/base/include/android-base/mapped_file.h b/base/include/android-base/mapped_file.h
index 2ab49ab..6a19f1b 100644
--- a/base/include/android-base/mapped_file.h
+++ b/base/include/android-base/mapped_file.h
@@ -28,15 +28,17 @@
#include <windows.h>
#define PROT_READ 1
#define PROT_WRITE 2
+using os_handle = HANDLE;
#else
#include <sys/mman.h>
+using os_handle = int;
#endif
namespace android {
namespace base {
/**
- * A region of a file mapped into memory, also known as MmapFile.
+ * A region of a file mapped into memory (for grepping: also known as MmapFile or file mapping).
*/
class MappedFile {
public:
@@ -49,16 +51,33 @@
int prot);
/**
+ * Same thing, but using the raw OS file handle instead of a CRT wrapper.
+ */
+ static MappedFile FromOsHandle(os_handle h, off64_t offset, size_t length, int prot);
+
+ /**
* Removes the mapping.
*/
~MappedFile();
- char* data() { return base_ + offset_; }
- size_t size() { return size_; }
+ /**
+ * Not copyable but movable.
+ */
+ MappedFile(MappedFile&& other);
+ MappedFile& operator=(MappedFile&& other);
+
+ char* data() const { return base_ + offset_; }
+ size_t size() const { return size_; }
+
+ bool isValid() const { return base_ != nullptr; }
+
+ explicit operator bool() const { return isValid(); }
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(MappedFile);
+ void Close();
+
char* base_;
size_t size_;
diff --git a/base/mapped_file.cpp b/base/mapped_file.cpp
index f60de56..862b73b 100644
--- a/base/mapped_file.cpp
+++ b/base/mapped_file.cpp
@@ -16,13 +16,15 @@
#include "android-base/mapped_file.h"
-#include <errno.h>
+#include <utility>
-#include "android-base/unique_fd.h"
+#include <errno.h>
namespace android {
namespace base {
+static constexpr char kEmptyBuffer[] = {'0'};
+
static off64_t InitPageSize() {
#if defined(_WIN32)
SYSTEM_INFO si;
@@ -35,51 +37,86 @@
std::unique_ptr<MappedFile> MappedFile::FromFd(borrowed_fd fd, off64_t offset, size_t length,
int prot) {
- static off64_t page_size = InitPageSize();
+#if defined(_WIN32)
+ auto file =
+ FromOsHandle(reinterpret_cast<HANDLE>(_get_osfhandle(fd.get())), offset, length, prot);
+#else
+ auto file = FromOsHandle(fd.get(), offset, length, prot);
+#endif
+ return file ? std::make_unique<MappedFile>(std::move(file)) : std::unique_ptr<MappedFile>{};
+}
+
+MappedFile MappedFile::FromOsHandle(os_handle h, off64_t offset, size_t length, int prot) {
+ static const off64_t page_size = InitPageSize();
size_t slop = offset % page_size;
off64_t file_offset = offset - slop;
off64_t file_length = length + slop;
#if defined(_WIN32)
- HANDLE handle =
- CreateFileMapping(reinterpret_cast<HANDLE>(_get_osfhandle(fd.get())), nullptr,
- (prot & PROT_WRITE) ? PAGE_READWRITE : PAGE_READONLY, 0, 0, nullptr);
+ HANDLE handle = CreateFileMappingW(
+ h, nullptr, (prot & PROT_WRITE) ? PAGE_READWRITE : PAGE_READONLY, 0, 0, nullptr);
if (handle == nullptr) {
// http://b/119818070 "app crashes when reading asset of zero length".
// Return a MappedFile that's only valid for reading the size.
- if (length == 0) {
- return std::unique_ptr<MappedFile>(new MappedFile{nullptr, 0, 0, nullptr});
+ if (length == 0 && ::GetLastError() == ERROR_FILE_INVALID) {
+ return MappedFile{const_cast<char*>(kEmptyBuffer), 0, 0, nullptr};
}
- return nullptr;
+ return MappedFile(nullptr, 0, 0, nullptr);
}
void* base = MapViewOfFile(handle, (prot & PROT_WRITE) ? FILE_MAP_ALL_ACCESS : FILE_MAP_READ, 0,
file_offset, file_length);
if (base == nullptr) {
CloseHandle(handle);
- return nullptr;
+ return MappedFile(nullptr, 0, 0, nullptr);
}
- return std::unique_ptr<MappedFile>(
- new MappedFile{static_cast<char*>(base), length, slop, handle});
+ return MappedFile{static_cast<char*>(base), length, slop, handle};
#else
- void* base = mmap(nullptr, file_length, prot, MAP_SHARED, fd.get(), file_offset);
+ void* base = mmap(nullptr, file_length, prot, MAP_SHARED, h, file_offset);
if (base == MAP_FAILED) {
// http://b/119818070 "app crashes when reading asset of zero length".
// mmap fails with EINVAL for a zero length region.
if (errno == EINVAL && length == 0) {
- return std::unique_ptr<MappedFile>(new MappedFile{nullptr, 0, 0});
+ return MappedFile{const_cast<char*>(kEmptyBuffer), 0, 0};
}
- return nullptr;
+ return MappedFile(nullptr, 0, 0);
}
- return std::unique_ptr<MappedFile>(new MappedFile{static_cast<char*>(base), length, slop});
+ return MappedFile{static_cast<char*>(base), length, slop};
#endif
}
+MappedFile::MappedFile(MappedFile&& other)
+ : base_(std::exchange(other.base_, nullptr)),
+ size_(std::exchange(other.size_, 0)),
+ offset_(std::exchange(other.offset_, 0))
+#ifdef _WIN32
+ ,
+ handle_(std::exchange(other.handle_, nullptr))
+#endif
+{
+}
+
+MappedFile& MappedFile::operator=(MappedFile&& other) {
+ Close();
+ base_ = std::exchange(other.base_, nullptr);
+ size_ = std::exchange(other.size_, 0);
+ offset_ = std::exchange(other.offset_, 0);
+#ifdef _WIN32
+ handle_ = std::exchange(other.handle_, nullptr);
+#endif
+ return *this;
+}
+
MappedFile::~MappedFile() {
+ Close();
+}
+
+void MappedFile::Close() {
#if defined(_WIN32)
- if (base_ != nullptr) UnmapViewOfFile(base_);
+ if (base_ != nullptr && size_ != 0) UnmapViewOfFile(base_);
if (handle_ != nullptr) CloseHandle(handle_);
+ handle_ = nullptr;
#else
- if (base_ != nullptr) munmap(base_, size_ + offset_);
+ if (base_ != nullptr && size_ != 0) munmap(base_, size_ + offset_);
#endif
base_ = nullptr;
diff --git a/base/mapped_file_test.cpp b/base/mapped_file_test.cpp
index cfde73c..3629108 100644
--- a/base/mapped_file_test.cpp
+++ b/base/mapped_file_test.cpp
@@ -44,5 +44,8 @@
ASSERT_TRUE(tf.fd != -1);
auto m = android::base::MappedFile::FromFd(tf.fd, 4096, 0, PROT_READ);
- ASSERT_EQ(0u, m->size());
+ ASSERT_NE(nullptr, m);
+ EXPECT_TRUE((bool)*m);
+ EXPECT_EQ(0u, m->size());
+ EXPECT_NE(nullptr, m->data());
}
diff --git a/libnativeloader/library_namespaces.h b/libnativeloader/library_namespaces.h
index 84cabde..7b3efff 100644
--- a/libnativeloader/library_namespaces.h
+++ b/libnativeloader/library_namespaces.h
@@ -38,7 +38,7 @@
// object for a given ClassLoader.
class LibraryNamespaces {
public:
- LibraryNamespaces() : initialized_(false) {}
+ LibraryNamespaces() : initialized_(false), app_main_namespace_(nullptr) {}
LibraryNamespaces(LibraryNamespaces&&) = default;
LibraryNamespaces(const LibraryNamespaces&) = delete;
diff --git a/libsparse/output_file.cpp b/libsparse/output_file.cpp
index 5b8179f..c5c4960 100644
--- a/libsparse/output_file.cpp
+++ b/libsparse/output_file.cpp
@@ -17,6 +17,7 @@
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE 1
+#include <algorithm>
#include <fcntl.h>
#include <inttypes.h>
#include <limits.h>
@@ -48,13 +49,6 @@
#define off64_t off_t
#endif
-#define min(a, b) \
- ({ \
- typeof(a) _a = (a); \
- typeof(b) _b = (b); \
- (_a < _b) ? _a : _b; \
- })
-
#define SPARSE_HEADER_MAJOR_VER 1
#define SPARSE_HEADER_MINOR_VER 0
#define SPARSE_HEADER_LEN (sizeof(sparse_header_t))
@@ -231,7 +225,7 @@
struct output_file_gz* outgz = to_output_file_gz(out);
while (len > 0) {
- ret = gzwrite(outgz->gz_fd, data, min(len, (unsigned int)INT_MAX));
+ ret = gzwrite(outgz->gz_fd, data, std::min<unsigned int>(len, (unsigned int)INT_MAX));
if (ret == 0) {
error("gzwrite %s", gzerror(outgz->gz_fd, nullptr));
return -1;
@@ -268,7 +262,7 @@
int ret;
while (off > 0) {
- to_write = min(off, (int64_t)INT_MAX);
+ to_write = std::min(off, (int64_t)INT_MAX);
ret = outc->write(outc->priv, nullptr, to_write);
if (ret < 0) {
return ret;
@@ -470,7 +464,7 @@
}
while (len) {
- write_len = min(len, out->block_size);
+ write_len = std::min(len, out->block_size);
ret = out->ops->write(out, out->fill_buf, write_len);
if (ret < 0) {
return ret;
diff --git a/rootdir/etc/ld.config.txt b/rootdir/etc/ld.config.txt
index 46e9920..a639592 100644
--- a/rootdir/etc/ld.config.txt
+++ b/rootdir/etc/ld.config.txt
@@ -633,15 +633,15 @@
namespace.neuralnetworks.search.paths = /apex/com.android.neuralnetworks/${LIB}
namespace.neuralnetworks.asan.search.paths = /apex/com.android.neuralnetworks/${LIB}
-namespace.neuralnetworks.links = default
-namespace.neuralnetworks.link.default.shared_libs = libc.so
-namespace.neuralnetworks.link.default.shared_libs += libcgrouprc.so
-namespace.neuralnetworks.link.default.shared_libs += libdl.so
-namespace.neuralnetworks.link.default.shared_libs += liblog.so
-namespace.neuralnetworks.link.default.shared_libs += libm.so
-namespace.neuralnetworks.link.default.shared_libs += libnativewindow.so
-namespace.neuralnetworks.link.default.shared_libs += libsync.so
-namespace.neuralnetworks.link.default.shared_libs += libvndksupport.so
+namespace.neuralnetworks.links = system
+namespace.neuralnetworks.link.system.shared_libs = libc.so
+namespace.neuralnetworks.link.system.shared_libs += libcgrouprc.so
+namespace.neuralnetworks.link.system.shared_libs += libdl.so
+namespace.neuralnetworks.link.system.shared_libs += liblog.so
+namespace.neuralnetworks.link.system.shared_libs += libm.so
+namespace.neuralnetworks.link.system.shared_libs += libnativewindow.so
+namespace.neuralnetworks.link.system.shared_libs += libsync.so
+namespace.neuralnetworks.link.system.shared_libs += libvndksupport.so
###############################################################################
# Namespace config for native tests that need access to both system and vendor