Bug 1198245 - IonMonkey: Lock helperthread before finishing ionbuilder, r=jandem
☠☠ backed out by cb0c060fb081 ☠ ☠
authorHannes Verschore <hv1989@gmail.com>
Tue, 25 Aug 2015 22:49:07 +0200
changeset 259327 3a5257ac933dce09eb38c8f3615aa14ce996f1ee
parent 259326 793bc02002203267dfa825221fe0b6a18faf54ad
child 259328 c47ccde36664172dff25f8b444ffd7a6b150cee3
push id29277
push userryanvm@gmail.com
push dateWed, 26 Aug 2015 18:32:23 +0000
treeherdermozilla-central@fea87cbeaa6b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjandem
bugs1198245
milestone43.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1198245 - IonMonkey: Lock helperthread before finishing ionbuilder, r=jandem
js/src/jit/Ion.cpp
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -464,16 +464,18 @@ PrepareForDebuggerOnIonCompilationHook(J
         scripts->resize(info->scriptIndex);
         info->numBlocks = 0;
     }
 }
 
 void
 jit::FinishOffThreadBuilder(JSContext* cx, IonBuilder* builder)
 {
+    MOZ_ASSERT(HelperThreadState().isLocked());
+
     // Clean the references to the pending IonBuilder, if we just finished it.
     if (builder->script()->baselineScript()->hasPendingIonBuilder() &&
         builder->script()->baselineScript()->pendingIonBuilder() == builder)
     {
         builder->script()->baselineScript()->removePendingIonBuilder(builder->script());
     }
 
     // If the builder is still in one of the helper thread list, then remove it.
@@ -578,33 +580,33 @@ jit::LazyLink(JSContext* cx, HandleScrip
     MOZ_ASSERT(calleeScript->hasBaselineScript());
     IonBuilder* builder = calleeScript->baselineScript()->pendingIonBuilder();
     calleeScript->baselineScript()->removePendingIonBuilder(calleeScript);
 
     // See PrepareForDebuggerOnIonCompilationHook
     AutoScriptVector debugScripts(cx);
     OnIonCompilationInfo info(builder->alloc().lifoAlloc());
 
-    // Remove from pending.
-    builder->removeFrom(HelperThreadState().ionLazyLinkList());
-
     {
         AutoEnterAnalysis enterTypes(cx);
         if (!LinkBackgroundCodeGen(cx, builder, &debugScripts, &info)) {
             // Silently ignore OOM during code generation. The assembly code
             // doesn't has code to handle it after linking happened. So it's
             // not OK to throw a catchable exception from there.
             cx->clearPendingException();
         }
     }
 
     if (info.filled())
         Debugger::onIonCompilation(cx, debugScripts, info.graph);
 
-    FinishOffThreadBuilder(cx, builder);
+    {
+        AutoLockHelperThreadState lock;
+        FinishOffThreadBuilder(cx, builder);
+    }
 
     MOZ_ASSERT(calleeScript->hasBaselineScript());
     MOZ_ASSERT(calleeScript->baselineOrIonRawPointer());
 }
 
 uint8_t*
 jit::LazyLinkTopActivation(JSContext* cx)
 {