Implement configuration pref for Generational Garbage Collection.

Pref: javascript.options.mem.gc_generational
This resolves #20
This commit is contained in:
wolfbeast 2017-07-19 01:24:28 +02:00 • committed by Roy Tam
commit 935b074787
4 changed files with 20 additions and 0 deletions

View file

@ -2282,6 +2282,7 @@ SetMemoryGCModePrefChangedCallback(const char* aPrefName, void* aClosure)
{ {
bool enableZoneGC = Preferences::GetBool("javascript.options.mem.gc_per_zone"); bool enableZoneGC = Preferences::GetBool("javascript.options.mem.gc_per_zone");
bool enableIncrementalGC = Preferences::GetBool("javascript.options.mem.gc_incremental"); bool enableIncrementalGC = Preferences::GetBool("javascript.options.mem.gc_incremental");
bool enableGenerationalGC = Preferences::GetBool("javascript.options.mem.gc_generational");
JSGCMode mode; JSGCMode mode;
if (enableIncrementalGC) { if (enableIncrementalGC) {
mode = JSGC_MODE_INCREMENTAL; mode = JSGC_MODE_INCREMENTAL;
@ -2291,6 +2292,7 @@ SetMemoryGCModePrefChangedCallback(const char* aPrefName, void* aClosure)
mode = JSGC_MODE_GLOBAL; mode = JSGC_MODE_GLOBAL;
} }
JS_SetGCParameter(sContext, JSGC_MODE, mode); JS_SetGCParameter(sContext, JSGC_MODE, mode);
JS_SetGGCMode(sContext, enableGenerationalGC);
} }
static void static void
@ -2485,6 +2487,9 @@ nsJSContext::EnsureStatics()
Preferences::RegisterCallbackAndCall(SetMemoryGCSliceTimePrefChangedCallback, Preferences::RegisterCallbackAndCall(SetMemoryGCSliceTimePrefChangedCallback,
"javascript.options.mem.gc_incremental_slice_ms"); "javascript.options.mem.gc_incremental_slice_ms");
Preferences::RegisterCallbackAndCall(SetMemoryGCModePrefChangedCallback,
"javascript.options.mem.gc_generational");
Preferences::RegisterCallbackAndCall(SetMemoryGCCompactingPrefChangedCallback, Preferences::RegisterCallbackAndCall(SetMemoryGCCompactingPrefChangedCallback,
"javascript.options.mem.gc_compacting"); "javascript.options.mem.gc_compacting");

View file

@ -1410,6 +1410,17 @@ JS_SetGCParameter(JSContext* cx, JSGCParamKey key, uint32_t value)
MOZ_ALWAYS_TRUE(cx->gc.setParameter(key, value, lock)); MOZ_ALWAYS_TRUE(cx->gc.setParameter(key, value, lock));
} }
JS_PUBLIC_API(void)
JS_SetGGCMode(JSContext* cx, bool enabled)
{
// Control GGC
if (enabled && !cx->gc.isGenerationalGCEnabled()) {
cx->gc.enableGenerationalGC();
} else if (!enabled && cx->gc.isGenerationalGCEnabled()) {
cx->gc.disableGenerationalGC();
}
}
JS_PUBLIC_API(uint32_t) JS_PUBLIC_API(uint32_t)
JS_GetGCParameter(JSContext* cx, JSGCParamKey key) JS_GetGCParameter(JSContext* cx, JSGCParamKey key)
{ {

View file

@ -1768,6 +1768,9 @@ typedef enum JSGCParamKey {
extern JS_PUBLIC_API(void) extern JS_PUBLIC_API(void)
JS_SetGCParameter(JSContext* cx, JSGCParamKey key, uint32_t value); JS_SetGCParameter(JSContext* cx, JSGCParamKey key, uint32_t value);
extern JS_PUBLIC_API(void)
JS_SetGGCMode(JSContext* cx, bool enabled);
extern JS_PUBLIC_API(uint32_t) extern JS_PUBLIC_API(uint32_t)
JS_GetGCParameter(JSContext* cx, JSGCParamKey key); JS_GetGCParameter(JSContext* cx, JSGCParamKey key);

View file

@ -1258,6 +1258,7 @@ pref("javascript.options.mem.max", -1);
pref("javascript.options.mem.gc_per_zone", true); pref("javascript.options.mem.gc_per_zone", true);
pref("javascript.options.mem.gc_incremental", true); pref("javascript.options.mem.gc_incremental", true);
pref("javascript.options.mem.gc_incremental_slice_ms", 10); pref("javascript.options.mem.gc_incremental_slice_ms", 10);
pref("javascript.options.mem.gc_generational", true);
pref("javascript.options.mem.gc_compacting", true); pref("javascript.options.mem.gc_compacting", true);
pref("javascript.options.mem.log", false); pref("javascript.options.mem.log", false);
pref("javascript.options.mem.notify", false); pref("javascript.options.mem.notify", false);