|
1 Index: mozilla/js/src/gc/Heap.h |
|
2 =================================================================== |
|
3 --- mozilla.orig/js/src/gc/Heap.h |
|
4 +++ mozilla/js/src/gc/Heap.h |
|
5 @@ -110,19 +110,22 @@ struct Cell |
|
6 */ |
|
7 #if defined(SOLARIS) && (defined(__sparc) || defined(__sparcv9)) |
|
8 const size_t PageShift = 13; |
|
9 +const size_t ArenaShift = PageShift; |
|
10 +#elif defined(__powerpc__) |
|
11 +const size_t PageShift = 16; |
|
12 +const size_t ArenaShift = 12; |
|
13 #else |
|
14 const size_t PageShift = 12; |
|
15 +const size_t ArenaShift = PageShift; |
|
16 #endif |
|
17 const size_t PageSize = size_t(1) << PageShift; |
|
18 +const size_t ArenaSize = size_t(1) << ArenaShift; |
|
19 +const size_t ArenaMask = ArenaSize - 1; |
|
20 |
|
21 const size_t ChunkShift = 20; |
|
22 const size_t ChunkSize = size_t(1) << ChunkShift; |
|
23 const size_t ChunkMask = ChunkSize - 1; |
|
24 |
|
25 -const size_t ArenaShift = PageShift; |
|
26 -const size_t ArenaSize = PageSize; |
|
27 -const size_t ArenaMask = ArenaSize - 1; |
|
28 - |
|
29 /* |
|
30 * This is the maximum number of arenas we allow in the FreeCommitted state |
|
31 * before we trigger a GC_SHRINK to release free arenas to the OS. |
|
32 Index: mozilla/js/src/gc/Memory.cpp |
|
33 =================================================================== |
|
34 --- mozilla.orig/js/src/gc/Memory.cpp |
|
35 +++ mozilla/js/src/gc/Memory.cpp |
|
36 @@ -15,6 +15,15 @@ |
|
37 namespace js { |
|
38 namespace gc { |
|
39 |
|
40 +/* Unused memory decommiting requires the arena size match the page size. */ |
|
41 +extern const size_t PageSize; |
|
42 +extern const size_t ArenaSize; |
|
43 +static bool |
|
44 +DecommitEnabled() |
|
45 +{ |
|
46 + return PageSize == ArenaSize; |
|
47 +} |
|
48 + |
|
49 #if defined(XP_WIN) |
|
50 #include "jswin.h" |
|
51 #include <psapi.h> |
|
52 @@ -83,6 +92,9 @@ UnmapPages(void *p, size_t size) |
|
53 bool |
|
54 MarkPagesUnused(void *p, size_t size) |
|
55 { |
|
56 + if (!DecommitEnabled()) |
|
57 + return false; |
|
58 + |
|
59 JS_ASSERT(uintptr_t(p) % PageSize == 0); |
|
60 LPVOID p2 = VirtualAlloc(p, size, MEM_RESET, PAGE_READWRITE); |
|
61 return p2 == p; |
|
62 @@ -352,6 +364,9 @@ UnmapPages(void *p, size_t size) |
|
63 bool |
|
64 MarkPagesUnused(void *p, size_t size) |
|
65 { |
|
66 + if (!DecommitEnabled()) |
|
67 + return false; |
|
68 + |
|
69 JS_ASSERT(uintptr_t(p) % PageSize == 0); |
|
70 int result = madvise(p, size, MADV_DONTNEED); |
|
71 return result != -1; |