
Untitled
By: a guest on
May 12th, 2012 | syntax:
None | size: 0.98 KB | hits: 13 | expires: Never
diff --git a/deps/jemalloc/src/chunk_mmap.c b/deps/jemalloc/src/chunk_mmap.c
index 164e86e..c2ce465 100644
--- a/deps/jemalloc/src/chunk_mmap.c
+++ b/deps/jemalloc/src/chunk_mmap.c
@@ -48,9 +48,25 @@ pages_map(void *addr, size_t size, bool noreserve)
if (noreserve)
flags |= MAP_NORESERVE;
#endif
+
+#ifdef MAP_HUGETLB
+ flags |= MAP_HUGETLB;
+#endif
ret = mmap(addr, size, PROT_READ | PROT_WRITE, flags, -1, 0);
assert(ret != NULL);
+#ifdef MAP_HUGETLB
+ /*
+ * Retry on ENOMEM when we tried to map using huge pages.
+ * This strategy is far from optimal, needs way more heuristics...
+ */
+ if (ret == MAP_FAILED && errno == ENOMEM) {
+ flags &= ~MAP_HUGETLB;
+ ret = mmap(addr, size, PROT_READ | PROT_WRITE, flags, -1, 0);
+ assert(ret != NULL);
+ }
+#endif
+
if (ret == MAP_FAILED)
ret = NULL;
else if (addr != NULL && ret != addr) {