1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
--- ./js/src/jsgcchunk.cpp 2011-12-22 17:13:21.000000000 +0000
+++ ./js/src/jsgcchunk.cpp 2011-12-22 17:18:31.000000000 +0000
@@ -213,7 +213,7 @@
#elif defined(XP_UNIX)
/* Required on Solaris 10. Might improve performance elsewhere. */
-# if defined(SOLARIS) && defined(MAP_ALIGN)
+# if (defined(SOLARIS) && defined(MAP_ALIGN)) || defined(MOZ_MEMORY_LINUX)
# define JS_GC_HAS_MAP_ALIGN
static void *
--- ./js/src/jsgcchunk.cpp 2011-12-22 17:55:24.000000000 +0000
+++ ./js/src/jsgcchunk.cpp 2011-12-22 18:02:24.000000000 +0000
@@ -226,12 +226,24 @@
#ifdef SOLARIS
void *p = mmap((caddr_t) alignment, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0);
+ if (p == MAP_FAILED)
+ return NULL;
#else
- void *p = mmap((void *) alignment, size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_NOSYNC | MAP_ALIGN | MAP_ANON, -1, 0);
-#endif
+ void *p = mmap(NULL, size + alignment, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_NOSYNC | MAP_ANON, -1, 0);
if (p == MAP_FAILED)
return NULL;
+ uintptr_t aligned_ret;
+ size_t extra_size;
+
+ aligned_ret = (uintptr_t)p + alignment - 1;
+ aligned_ret &= ~(alignment - 1);
+ extra_size = aligned_ret - (uintptr_t)p;
+ munmap(p, extra_size);
+ munmap(p + extra_size + size, alignment - extra_size);
+ p = (void *)aligned_ret;
+#endif
+
return p;
}
|