From 1dd04740bb4a0f2192f4b3ab734d8c7a76afdc15 Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 24 Feb 2023 19:22:10 +0800 Subject: [PATCH] Use MADV_DONTNEED as fallback --- app/src/main/cpp/archive.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/archive.c b/app/src/main/cpp/archive.c index bed98cd27..a5500eaf2 100644 --- a/app/src/main/cpp/archive.c +++ b/app/src/main/cpp/archive.c @@ -152,6 +152,13 @@ static bool is_mempool_pages_present_and_lock(int index) { #define MEMPOOL_IN_CORE_AND_LOCK(x) is_mempool_pages_present_and_lock(x) +static void mempool_release_pages(void *addr, size_t size) { + size = PAGE_ALIGN(size); + munlock(addr, size); + int ret = madvise(addr, size, MADV_FREE); + if (ret == -EINVAL) madvise(addr, size, MADV_DONTNEED); +} + static long archive_list_all_entries(archive_ctx *ctx) { long count = 0; while (archive_read_next_header(ctx->arc, &ctx->entry) == ARCHIVE_OK) @@ -370,8 +377,7 @@ Java_com_hippo_UriArchiveAccessor_extractToByteBuffer(JNIEnv *env, jobject thiz, LOGE("%s", "No enough data read, WTF?"); if (ret < 0) LOGE("%s%s", "Archive read failed:", archive_error_string(ctx->arc)); - munlock(addr, size); - madvise(addr, size, MADV_FREE); + mempool_release_pages(addr, size); } else { return (*env)->NewDirectByteBuffer(env, addr, size); } @@ -471,7 +477,5 @@ Java_com_hippo_UriArchiveAccessor_releaseByteBuffer(JNIEnv *env, jobject thiz, j EH_UNUSED(thiz); void *addr = (*env)->GetDirectBufferAddress(env, buffer); size_t size = (*env)->GetDirectBufferCapacity(env, buffer); - size = PAGE_ALIGN(size); - munlock(addr, size); - madvise(addr, size, MADV_FREE); + mempool_release_pages(addr, size); }