summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2023-06-23 19:46:14 +0100
committer Hans Boehm <hboehm@google.com> 2023-06-23 20:26:34 +0000
commit1a950face5cd9cc43af1fbc7be4a60c178800ddf (patch)
tree36dbb204695cf1cd070b6e28106fc9924beaf2cd
parenta8b6a489210919720542d87da1f6e3891b38e704 (diff)
Only use mincore on linux.
The API is different on mac. Test: m Change-Id: I35d179425cbf2b8c240f20ed19a8e0b0e3057275
-rw-r--r--libartbase/base/mem_map.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/libartbase/base/mem_map.cc b/libartbase/base/mem_map.cc
index 25fda674fa..a064f800c4 100644
--- a/libartbase/base/mem_map.cc
+++ b/libartbase/base/mem_map.cc
@@ -1245,6 +1245,8 @@ static inline void ClearMemory(uint8_t* page_begin, size_t size, bool resident)
DCHECK(IsAligned<kPageSize>(page_begin + size));
if (resident) {
RawClearMemory(page_begin, page_begin + size);
+ // Note we check madvise return value against -1, as it seems old kernels
+ // can return 1.
#ifdef MADV_FREE
bool res = madvise(page_begin, size, MADV_FREE);
CHECK_NE(res, -1) << "madvise failed";
@@ -1280,6 +1282,8 @@ void ZeroMemory(void* address, size_t length, bool release_eagerly) {
#else
RawClearMemory(mem_begin, page_begin);
RawClearMemory(page_end, mem_end);
+// mincore() is linux-specific syscall.
+#if defined(__linux__)
if (!release_eagerly) {
size_t vec_len = (page_end - page_begin) / kPageSize;
std::unique_ptr<unsigned char[]> vec(new unsigned char[vec_len]);
@@ -1308,9 +1312,10 @@ void ZeroMemory(void* address, size_t length, bool release_eagerly) {
}
// mincore failed, fall through to MADV_DONTNEED.
}
+#endif // __linux__
bool res = madvise(page_begin, page_end - page_begin, MADV_DONTNEED);
CHECK_NE(res, -1) << "madvise failed";
-#endif
+#endif // _WIN32
}
void MemMap::AlignBy(size_t alignment, bool align_both_ends) {