665
|
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;
|