mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-04 22:49:32 +03:00
revise unix decommit
This commit is contained in:
parent
bfe2651ec9
commit
88a8b13782
1 changed files with 21 additions and 11 deletions
|
@ -357,26 +357,36 @@ static void unix_mprotect_hint(int err) {
|
||||||
|
|
||||||
int _mi_prim_commit(void* start, size_t size, bool* is_zero) {
|
int _mi_prim_commit(void* start, size_t size, bool* is_zero) {
|
||||||
// commit: ensure we can access the area
|
// commit: ensure we can access the area
|
||||||
*is_zero = false;
|
// note: we may think that *is_zero can be true since the memory
|
||||||
|
// was either from mmap PROT_NONE, or from decommit MADV_DONTNEED, but
|
||||||
|
// we sometimes call commit on a range with still partially committed
|
||||||
|
// memory and `mprotect` does not zero the range.
|
||||||
|
*is_zero = false;
|
||||||
int err = mprotect(start, size, (PROT_READ | PROT_WRITE));
|
int err = mprotect(start, size, (PROT_READ | PROT_WRITE));
|
||||||
if (err != 0) { err = errno; }
|
if (err != 0) {
|
||||||
unix_mprotect_hint(err);
|
err = errno;
|
||||||
|
unix_mprotect_hint(err);
|
||||||
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _mi_prim_decommit(void* start, size_t size, bool* needs_recommit) {
|
int _mi_prim_decommit(void* start, size_t size, bool* needs_recommit) {
|
||||||
int err = 0;
|
int err = 0;
|
||||||
#if defined(MADV_DONTNEED) && !MI_DEBUG && !MI_SECURE
|
// decommit: use MADV_DONTNEED as it decreases rss immediately (unlike MADV_FREE)
|
||||||
// decommit: use MADV_DONTNEED as it decreases rss immediately (unlike MADV_FREE)
|
err = unix_madvise(start, size, MADV_DONTNEED);
|
||||||
|
#if !MI_DEBUG && !MI_SECURE
|
||||||
*needs_recommit = false;
|
*needs_recommit = false;
|
||||||
err = unix_madvise(start, size, MADV_DONTNEED);
|
|
||||||
#else
|
#else
|
||||||
// decommit: use mmap with MAP_FIXED and PROT_NONE to discard the existing memory (and reduce rss)
|
|
||||||
*needs_recommit = true;
|
*needs_recommit = true;
|
||||||
const int fd = unix_mmap_fd();
|
mprotect(start, size, PROT_NONE);
|
||||||
void* p = mmap(start, size, PROT_NONE, (MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE), fd, 0);
|
|
||||||
if (p != start) { err = errno; }
|
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
|
// decommit: use mmap with MAP_FIXED and PROT_NONE to discard the existing memory (and reduce rss)
|
||||||
|
*needs_recommit = true;
|
||||||
|
const int fd = unix_mmap_fd();
|
||||||
|
void* p = mmap(start, size, PROT_NONE, (MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE), fd, 0);
|
||||||
|
if (p != start) { err = errno; }
|
||||||
|
*/
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue