From a91e7f45701b32cb5279a30dd314c8d1af7a68d5 Mon Sep 17 00:00:00 2001 From: Bill McCloskey Date: Tue, 28 Feb 2012 10:43:56 -0800 Subject: [PATCH] Bug 729367 - Add write barrier flag to shell worker class (r=jorendorff) --- js/src/jsfriendapi.cpp | 6 ++++++ js/src/jsfriendapi.h | 3 +++ js/src/shell/jsworkers.cpp | 12 ++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 6ecf043b029f..b6986a1df03b 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -734,6 +734,12 @@ IsIncrementalGCEnabled(JSRuntime *rt) return rt->gcIncrementalEnabled; } +extern JS_FRIEND_API(void) +DisableIncrementalGC(JSRuntime *rt) +{ + rt->gcIncrementalEnabled = false; +} + JS_FRIEND_API(bool) IsIncrementalBarrierNeeded(JSRuntime *rt) { diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index c81d036e8ae7..9381dea72ff8 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -751,6 +751,9 @@ NotifyDidPaint(JSContext *cx); extern JS_FRIEND_API(bool) IsIncrementalGCEnabled(JSRuntime *rt); +extern JS_FRIEND_API(void) +DisableIncrementalGC(JSRuntime *rt); + extern JS_FRIEND_API(bool) IsIncrementalBarrierNeeded(JSRuntime *rt); diff --git a/js/src/shell/jsworkers.cpp b/js/src/shell/jsworkers.cpp index 477206b73299..43254cc409af 100644 --- a/js/src/shell/jsworkers.cpp +++ b/js/src/shell/jsworkers.cpp @@ -49,6 +49,7 @@ #include "jsapi.h" #include "jscntxt.h" #include "jsdbgapi.h" +#include "jsfriendapi.h" #include "jslock.h" #include "jsworkers.h" @@ -863,6 +864,13 @@ class Worker MOZ_FINAL : public WorkerParent } static JSBool jsConstruct(JSContext *cx, uintN argc, jsval *vp) { + /* + * We pretend to implement write barriers on shell workers (by setting + * the JSCLASS_IMPLEMENTS_BARRIERS), but we don't. So we immediately + * disable incremental GC if shell workers are ever used. + */ + js::DisableIncrementalGC(JS_GetRuntime(cx)); + WorkerParent *parent; if (!getWorkerParentFromConstructor(cx, JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)), &parent)) return false; @@ -1267,14 +1275,14 @@ Event::trace(JSTracer *trc) } JSClass ThreadPool::jsClass = { - "ThreadPool", JSCLASS_HAS_PRIVATE, + "ThreadPool", JSCLASS_HAS_PRIVATE | JSCLASS_IMPLEMENTS_BARRIERS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, jsFinalize, NULL, NULL, NULL, NULL, jsTraceThreadPool }; JSClass Worker::jsWorkerClass = { - "Worker", JSCLASS_HAS_PRIVATE, + "Worker", JSCLASS_HAS_PRIVATE | JSCLASS_IMPLEMENTS_BARRIERS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, jsFinalize, NULL, NULL, NULL, NULL, jsTraceWorker