Bug 1433013 - Only cancel off-thread jobs for the current context when a worker thread exits r=luke

This commit is contained in:
Jon Coppeard 2018-01-25 17:12:47 +00:00
Родитель ea1ff80377
Коммит d72b56bf6b
2 изменённых файлов: 25 добавлений и 4 удалений

Просмотреть файл

@ -0,0 +1,6 @@
if (helperThreadCount() === 0)
quit();
offThreadCompileScript("");
evalInCooperativeThread("");
runOffThreadScript();

Просмотреть файл

@ -370,13 +370,28 @@ DeleteOffThreadJob(JSContext* cx, OffThreadJob* job)
}
static void
CancelAllOffThreadJobs(JSContext* cx)
CancelOffThreadJobsForContext(JSContext* cx)
{
// Parse jobs may be blocked waiting on GC.
gc::FinishGC(cx);
CancelOffThreadParses(cx->runtime());
// Wait for jobs belonging to this context.
ShellContext* sc = GetShellContext(cx);
while (!sc->offThreadJobs.empty()) {
OffThreadJob* job = sc->offThreadJobs.popCopy();
job->waitUntilDone(cx);
js_delete(job);
}
}
static void
CancelOffThreadJobsForRuntime(JSContext* cx)
{
// Parse jobs may be blocked waiting on GC.
gc::FinishGC(cx);
// Cancel jobs belonging to this runtime.
CancelOffThreadParses(cx->runtime());
ShellContext* sc = GetShellContext(cx);
while (!sc->offThreadJobs.empty())
js_delete(sc->offThreadJobs.popCopy());
@ -3680,7 +3695,7 @@ WorkerMain(void* arg)
return;
auto guard = mozilla::MakeScopeExit([&] {
CancelAllOffThreadJobs(cx);
CancelOffThreadJobsForContext(cx);
JS_DestroyContext(cx);
js_delete(sc);
if (input->siblingContext) {
@ -9308,7 +9323,7 @@ main(int argc, char** argv, char** envp)
DestructSharedArrayBufferMailbox();
CancelAllOffThreadJobs(cx);
CancelOffThreadJobsForRuntime(cx);
JS_DestroyContext(cx);
return result;