diff options
author | Mike Pall <mike> | 2009-12-28 23:33:10 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2009-12-28 23:33:10 +0100 |
commit | 61abf342a3242d8f667eed2fd718dd1f170da7c0 (patch) | |
tree | 2a144ad34ea686893e95ff859b1ce32960ee5e21 /src | |
parent | 9c8f42573f138eee095eea9f6100dbb75800b2f6 (diff) | |
download | luajit-61abf342a3242d8f667eed2fd718dd1f170da7c0.tar.gz luajit-61abf342a3242d8f667eed2fd718dd1f170da7c0.tar.bz2 luajit-61abf342a3242d8f667eed2fd718dd1f170da7c0.zip |
Linux/x64 mremap() does not obey MAP_32BIT, so make it non-moving.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_alloc.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/lj_alloc.c b/src/lj_alloc.c index 6d8b4ccb..e4a9d356 100644 --- a/src/lj_alloc.c +++ b/src/lj_alloc.c | |||
@@ -137,6 +137,13 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size) | |||
137 | #ifdef __linux__ | 137 | #ifdef __linux__ |
138 | /* Need to define _GNU_SOURCE to get the mremap prototype. */ | 138 | /* Need to define _GNU_SOURCE to get the mremap prototype. */ |
139 | #define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) | 139 | #define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) |
140 | #define CALL_MREMAP_NOMOVE 0 | ||
141 | #define CALL_MREMAP_MAYMOVE 1 | ||
142 | #if LJ_64 | ||
143 | #define CALL_MREMAP_MV CALL_MREMAP_NOMOVE | ||
144 | #else | ||
145 | #define CALL_MREMAP_MV CALL_MREMAP_MAYMOVE | ||
146 | #endif | ||
140 | #endif | 147 | #endif |
141 | 148 | ||
142 | #endif | 149 | #endif |
@@ -612,7 +619,7 @@ static mchunkptr direct_resize(mchunkptr oldp, size_t nb) | |||
612 | size_t oldmmsize = oldsize + offset + DIRECT_FOOT_PAD; | 619 | size_t oldmmsize = oldsize + offset + DIRECT_FOOT_PAD; |
613 | size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); | 620 | size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
614 | char *cp = (char *)CALL_MREMAP((char *)oldp - offset, | 621 | char *cp = (char *)CALL_MREMAP((char *)oldp - offset, |
615 | oldmmsize, newmmsize, 1); | 622 | oldmmsize, newmmsize, CALL_MREMAP_MV); |
616 | if (cp != CMFAIL) { | 623 | if (cp != CMFAIL) { |
617 | mchunkptr newp = (mchunkptr)(cp + offset); | 624 | mchunkptr newp = (mchunkptr)(cp + offset); |
618 | size_t psize = newmmsize - offset - DIRECT_FOOT_PAD; | 625 | size_t psize = newmmsize - offset - DIRECT_FOOT_PAD; |
@@ -857,7 +864,7 @@ static int alloc_trim(mstate m, size_t pad) | |||
857 | !has_segment_link(m, sp)) { /* can't shrink if pinned */ | 864 | !has_segment_link(m, sp)) { /* can't shrink if pinned */ |
858 | size_t newsize = sp->size - extra; | 865 | size_t newsize = sp->size - extra; |
859 | /* Prefer mremap, fall back to munmap */ | 866 | /* Prefer mremap, fall back to munmap */ |
860 | if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || | 867 | if ((CALL_MREMAP(sp->base, sp->size, newsize, CALL_MREMAP_NOMOVE) != MFAIL) || |
861 | (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { | 868 | (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { |
862 | released = extra; | 869 | released = extra; |
863 | } | 870 | } |