summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2022-11-05 14:22:21 +0900
committernagachika <nagachika@ruby-lang.org>2022-11-05 14:24:03 +0900
commitad92236d245b791d14fd78bcb5a0a0789aa169c0 (patch)
tree3d6b1b7ab4b9d9c23be3bca92d1dbc2f18e713ac
parent01eab9a5d1886412869f85d4b87779f22d548867 (diff)
merge revision(s) 2bb89b7f114e4beb3012f63e12e726ae23005e6f: [Backport #19101]
Lower priority of `POSIX_MADV_DONTNEED`. (#6671) --- cont.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
-rw-r--r--cont.c21
-rw-r--r--version.h2
2 files changed, 19 insertions, 4 deletions
diff --git a/cont.c b/cont.c
index 2d33ff4025..82b7e965b1 100644
--- a/cont.c
+++ b/cont.c
@@ -656,21 +656,36 @@ fiber_pool_stack_free(struct fiber_pool_stack * stack)
if (DEBUG) fprintf(stderr, "fiber_pool_stack_free: %p+%"PRIuSIZE" [base=%p, size=%"PRIuSIZE"]\n", base, size, stack->base, stack->size);
-#if VM_CHECK_MODE > 0 && defined(MADV_DONTNEED)
+ // The pages being used by the stack can be returned back to the system.
+ // That doesn't change the page mapping, but it does allow the system to
+ // reclaim the physical memory.
+ // Since we no longer care about the data itself, we don't need to page
+ // out to disk, since that is costly. Not all systems support that, so
+ // we try our best to select the most efficient implementation.
+ // In addition, it's actually slightly desirable to not do anything here,
+ // but that results in higher memory usage.
+
+#ifdef __wasi__
+ // WebAssembly doesn't support madvise, so we just don't do anything.
+#elif VM_CHECK_MODE > 0 && defined(MADV_DONTNEED)
// This immediately discards the pages and the memory is reset to zero.
madvise(base, size, MADV_DONTNEED);
-#elif defined(POSIX_MADV_DONTNEED)
- posix_madvise(base, size, POSIX_MADV_DONTNEED);
#elif defined(MADV_FREE_REUSABLE)
+ // Darwin / macOS / iOS.
// Acknowledge the kernel down to the task info api we make this
// page reusable for future use.
// As for MADV_FREE_REUSE below we ensure in the rare occasions the task was not
// completed at the time of the call to re-iterate.
while (madvise(base, size, MADV_FREE_REUSABLE) == -1 && errno == EAGAIN);
#elif defined(MADV_FREE)
+ // Recent Linux.
madvise(base, size, MADV_FREE);
#elif defined(MADV_DONTNEED)
+ // Old Linux.
madvise(base, size, MADV_DONTNEED);
+#elif defined(POSIX_MADV_DONTNEED)
+ // Solaris?
+ posix_madvise(base, size, POSIX_MADV_DONTNEED);
#elif defined(_WIN32)
VirtualAlloc(base, size, MEM_RESET, PAGE_READWRITE);
// Not available in all versions of Windows.
diff --git a/version.h b/version.h
index e70b3360d5..9ab52edcb0 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 3
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 175
+#define RUBY_PATCHLEVEL 176
#define RUBY_RELEASE_YEAR 2022
#define RUBY_RELEASE_MONTH 11