summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2021-05-05 21:06:56 +0000
committerPeter Zhu <peter@peterzhu.ca>2021-05-05 17:54:26 -0400
commitb655a3fa5b8d1a30565e19425c28a1cfd8631165 (patch)
treeff2a196987f2776e9ba0877e330eea321c7bb0b7 /gc.c
parent23a98237df28ad01d17b163eb650dfbd321b13ba (diff)
Fall back to sysconf to determine page size during runtime
On some platforms the PAGE_SIZE macro does not exist so we can fall back to `sysconf` to determine the page size at runtime.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4462
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 721e2440a3..90446d1bd7 100644
--- a/gc.c
+++ b/gc.c
@@ -835,10 +835,12 @@ enum {
#define HEAP_PAGE_ALIGN (1 << HEAP_PAGE_ALIGN_LOG)
#define HEAP_PAGE_SIZE HEAP_PAGE_ALIGN
-#if defined(HAVE_MMAP) && defined(PAGE_SIZE)
+#ifdef HAVE_MMAP
# if HAVE_CONST_PAGE_SIZE
+/* If we have the HEAP_PAGE and it is a constant, then we can directly use it. */
# define USE_MMAP_ALIGNED_ALLOC (PAGE_SIZE <= HEAP_PAGE_SIZE)
# else
+/* Otherwise, fall back to determining if we can use mmap during runtime. */
# define USE_MMAP_ALIGNED_ALLOC (use_mmap_aligned_alloc != false)
static bool use_mmap_aligned_alloc;
@@ -3208,8 +3210,18 @@ Init_heap(void)
{
rb_objspace_t *objspace = &rb_objspace;
-#if defined(HAVE_MMAP) && defined(PAGE_SIZE) && !HAVE_CONST_PAGE_SIZE
+#if defined(HAVE_MMAP) && !HAVE_CONST_PAGE_SIZE
+ /* Need to determine if we can use mmap at runtime. */
+# ifdef PAGE_SIZE
+ /* If the PAGE_SIZE macro can be used. */
use_mmap_aligned_alloc = PAGE_SIZE <= HEAP_PAGE_SIZE;
+# elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
+ /* If we can use sysconf to determine the page size. */
+ use_mmap_aligned_alloc = sysconf(_SC_PAGE_SIZE) <= HEAP_PAGE_SIZE;
+# else
+ /* Otherwise we can't determine the system page size, so don't use mmap. */
+ use_mmap_aligned_alloc = FALSE;
+# endif
#endif
#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)