1#ifndef INTERNAL_VM_MAP_H
2#define INTERNAL_VM_MAP_H
11#include "ruby/internal/config.h"
24#ifdef NEED_MADVICE_PROTOTYPE_USING_CADDR_T
26extern int madvise(caddr_t,
size_t,
int);
38rb_vm_map_reusable_lazy(
void *addr,
size_t len,
int advice,
bool *zeroed_out)
40 if (zeroed_out) *zeroed_out =
false;
43#elif defined(VM_CHECK_MODE) && VM_CHECK_MODE > 0 && defined(MADV_DONTNEED)
44 if (!advice) advice = MADV_DONTNEED;
45 int err = madvise(addr,
len, advice);
47 if (zeroed_out) *zeroed_out = (err == 0 && advice == MADV_DONTNEED);
51#elif defined(MADV_FREE_REUSABLE)
54 if (!advice) advice = MADV_FREE_REUSABLE;
55 while (madvise(addr,
len, advice) == -1 &&
errno == EAGAIN);
56#elif defined(MADV_FREE)
58 if (!advice) advice = MADV_FREE;
59 madvise(addr,
len, advice);
60#elif defined(MADV_DONTNEED)
62 if (!advice) advice = MADV_DONTNEED;
63 madvise(addr,
len, advice);
64#elif defined(POSIX_MADV_DONTNEED)
66 if (!advice) advice = POSIX_MADV_DONTNEED;
67 posix_madvise(addr,
len, advice);
69 VirtualAlloc(addr,
len, MEM_RESET, PAGE_READWRITE);
76rb_vm_map_reusable_immediate(
void *addr,
size_t len,
int advice,
bool *zeroed_out)
78 if (zeroed_out) *zeroed_out =
false;
81#elif defined(MADV_FREE_REUSABLE)
84 if (!advice) advice = MADV_FREE_REUSABLE;
85 while (madvise(addr,
len, advice) == -1 &&
errno == EAGAIN);
86#elif defined(MADV_DONTNEED)
89 if (!advice) advice = MADV_DONTNEED;
90 int err = madvise(addr,
len, advice);
92 if (zeroed_out) *zeroed_out = (err == 0 && advice == MADV_DONTNEED);
96#elif defined(POSIX_MADV_DONTNEED)
97 if (!advice) advice = POSIX_MADV_DONTNEED;
98 posix_madvise(addr,
len, advice);
101 VirtualAlloc(addr,
len, MEM_RESET, PAGE_READWRITE);
107rb_vm_map_reuse(
void *addr,
size_t len)
109#if defined(MADV_FREE_REUSE)
111 while (madvise(addr,
len, MADV_FREE_REUSE) == -1 &&
errno == EAGAIN);
int len
Length of the buffer.
#define errno
Ractor-aware version of errno.