Don't use mmap on platforms that have large OS page sizes
This commit is contained in:
parent
6d834371c0
commit
0bd1bc559f
Notes:
git
2021-03-03 03:05:22 +09:00
@ -1931,6 +1931,7 @@ AC_CHECK_FUNCS(lutimes)
|
|||||||
AC_CHECK_FUNCS(malloc_usable_size)
|
AC_CHECK_FUNCS(malloc_usable_size)
|
||||||
AC_CHECK_FUNCS(malloc_size)
|
AC_CHECK_FUNCS(malloc_size)
|
||||||
AC_CHECK_FUNCS(mblen)
|
AC_CHECK_FUNCS(mblen)
|
||||||
|
AC_CHECK_FUNCS(memalign)
|
||||||
AC_CHECK_FUNCS(memset_s)
|
AC_CHECK_FUNCS(memset_s)
|
||||||
AC_CHECK_FUNCS(writev)
|
AC_CHECK_FUNCS(writev)
|
||||||
AC_CHECK_FUNCS(memrchr)
|
AC_CHECK_FUNCS(memrchr)
|
||||||
@ -1943,6 +1944,7 @@ AC_CHECK_FUNCS(openat)
|
|||||||
AC_CHECK_FUNCS(pipe2)
|
AC_CHECK_FUNCS(pipe2)
|
||||||
AC_CHECK_FUNCS(poll)
|
AC_CHECK_FUNCS(poll)
|
||||||
AC_CHECK_FUNCS(posix_fadvise)
|
AC_CHECK_FUNCS(posix_fadvise)
|
||||||
|
AC_CHECK_FUNCS(posix_memalign)
|
||||||
AC_CHECK_FUNCS(ppoll)
|
AC_CHECK_FUNCS(ppoll)
|
||||||
AC_CHECK_FUNCS(pread)
|
AC_CHECK_FUNCS(pread)
|
||||||
AC_CHECK_FUNCS(pwrite)
|
AC_CHECK_FUNCS(pwrite)
|
||||||
|
21
gc.c
21
gc.c
@ -823,6 +823,13 @@ enum {
|
|||||||
HEAP_PAGE_BITMAP_SIZE = (BITS_SIZE * HEAP_PAGE_BITMAP_LIMIT),
|
HEAP_PAGE_BITMAP_SIZE = (BITS_SIZE * HEAP_PAGE_BITMAP_LIMIT),
|
||||||
HEAP_PAGE_BITMAP_PLANES = 4 /* RGENGC: mark, unprotected, uncollectible, marking */
|
HEAP_PAGE_BITMAP_PLANES = 4 /* RGENGC: mark, unprotected, uncollectible, marking */
|
||||||
};
|
};
|
||||||
|
#define HEAP_PAGE_ALIGN (1 << HEAP_PAGE_ALIGN_LOG)
|
||||||
|
#define HEAP_PAGE_SIZE HEAP_PAGE_ALIGN
|
||||||
|
#if defined(HAVE_MMAP) && (PAGE_SIZE <= HEAP_PAGE_SIZE)
|
||||||
|
# define USE_MMAP_ALIGNED_ALLOC 1
|
||||||
|
#else
|
||||||
|
# define USE_MMAP_ALIGNED_ALLOC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
struct heap_page {
|
struct heap_page {
|
||||||
short total_slots;
|
short total_slots;
|
||||||
@ -9989,7 +9996,7 @@ gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
|||||||
|
|
||||||
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
||||||
* the read barrier, so we must disable automatic compaction. */
|
* the read barrier, so we must disable automatic compaction. */
|
||||||
#if !defined(__MINGW32__) && !defined(_WIN32) && !defined(HAVE_MMAP)
|
#if !defined(__MINGW32__) && !defined(_WIN32) && !USE_MMAP_ALIGNED_ALLOC
|
||||||
rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
|
rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -10389,7 +10396,7 @@ rb_aligned_malloc(size_t alignment, size_t size)
|
|||||||
#elif defined _WIN32
|
#elif defined _WIN32
|
||||||
void *_aligned_malloc(size_t, size_t);
|
void *_aligned_malloc(size_t, size_t);
|
||||||
res = _aligned_malloc(size, alignment);
|
res = _aligned_malloc(size, alignment);
|
||||||
#elif defined(HAVE_MMAP)
|
#elif USE_MMAP_ALIGNED_ALLOC
|
||||||
GC_ASSERT(alignment % sysconf(_SC_PAGE_SIZE) == 0);
|
GC_ASSERT(alignment % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
|
|
||||||
char *ptr = mmap(NULL, alignment + size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
char *ptr = mmap(NULL, alignment + size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
@ -10419,6 +10426,12 @@ rb_aligned_malloc(size_t alignment, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (void *)aligned;
|
res = (void *)aligned;
|
||||||
|
#elif defined(HAVE_POSIX_MEMALIGN)
|
||||||
|
if (posix_memalign(&res, alignment, size) != 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#elif defined(HAVE_MEMALIGN)
|
||||||
|
res = memalign(alignment, size);
|
||||||
#else
|
#else
|
||||||
char* aligned;
|
char* aligned;
|
||||||
res = malloc(alignment + size + sizeof(void*));
|
res = malloc(alignment + size + sizeof(void*));
|
||||||
@ -10441,11 +10454,13 @@ rb_aligned_free(void *ptr, size_t size)
|
|||||||
__mingw_aligned_free(ptr);
|
__mingw_aligned_free(ptr);
|
||||||
#elif defined _WIN32
|
#elif defined _WIN32
|
||||||
_aligned_free(ptr);
|
_aligned_free(ptr);
|
||||||
#elif defined HAVE_MMAP
|
#elif USE_MMAP_ALIGNED_ALLOC
|
||||||
GC_ASSERT(size % sysconf(_SC_PAGE_SIZE) == 0);
|
GC_ASSERT(size % sysconf(_SC_PAGE_SIZE) == 0);
|
||||||
if (munmap(ptr, size)) {
|
if (munmap(ptr, size)) {
|
||||||
rb_bug("rb_aligned_free: munmap failed");
|
rb_bug("rb_aligned_free: munmap failed");
|
||||||
}
|
}
|
||||||
|
#elif defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN)
|
||||||
|
free(ptr);
|
||||||
#else
|
#else
|
||||||
free(((void**)ptr)[-1]);
|
free(((void**)ptr)[-1]);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user