summaryrefslogtreecommitdiffstats
path: root/src/pages.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-03-10 02:20:02 (GMT)
committerJason Evans <jasone@canonware.com>2017-03-14 01:19:57 (GMT)
commit7cbcd2e2b70d9a8547030b5a8640c85b2b7b50ab (patch)
tree9e8065b9556d53cec06633119a5db2ed6cc54059 /src/pages.c
parent21a68e2d22da08e0f60ff79d6866dd3add19775b (diff)
downloadjemalloc-7cbcd2e2b70d9a8547030b5a8640c85b2b7b50ab.zip
jemalloc-7cbcd2e2b70d9a8547030b5a8640c85b2b7b50ab.tar.gz
jemalloc-7cbcd2e2b70d9a8547030b5a8640c85b2b7b50ab.tar.bz2
Fix pages_purge_forced() to discard pages on non-Linux systems.
madvise(..., MADV_DONTNEED) only causes demand-zeroing on Linux, so fall back to overlaying a new mapping.
Diffstat (limited to 'src/pages.c')
-rw-r--r--src/pages.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/pages.c b/src/pages.c
index 444a97c..e80c365 100644
--- a/src/pages.c
+++ b/src/pages.c
@@ -170,6 +170,9 @@ pages_purge_lazy(void *addr, size_t size) {
VirtualAlloc(addr, size, MEM_RESET, PAGE_READWRITE);
#elif defined(JEMALLOC_PURGE_MADVISE_FREE)
madvise(addr, size, MADV_FREE);
+#elif defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \
+ !defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS)
+ madvise(addr, size, MADV_DONTNEED);
#else
not_reached();
#endif
@@ -182,8 +185,12 @@ pages_purge_forced(void *addr, size_t size) {
return true;
}
-#if defined(JEMALLOC_PURGE_MADVISE_DONTNEED)
+#if defined(JEMALLOC_PURGE_MADVISE_DONTNEED) && \
+ defined(JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS)
return (madvise(addr, size, MADV_DONTNEED) != 0);
+#elif defined(JEMALLOC_MAPS_COALESCE)
+ /* Try to overlay a new demand-zeroed mapping. */
+ return pages_commit(addr, size);
#else
not_reached();
#endif