Bug 1347644 - Fix possible deadlock with PromiseHelperTasks (r=lth)
MozReview-Commit-ID: 2aR2V1Dt4Bl
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -1173,16 +1173,24 @@ GlobalHelperThreadState::maxWasmCompilat
size_t
GlobalHelperThreadState::maxWasmTier2GeneratorThreads() const
{
return MaxTier2GeneratorTasks;
}
size_t
+GlobalHelperThreadState::maxPromiseHelperThreads() const
+{
+ if (IsHelperThreadSimulatingOOM(js::THREAD_TYPE_WASM))
+ return 1;
+ return cpuCount;
+}
+
+size_t
GlobalHelperThreadState::maxParseThreads() const
{
if (IsHelperThreadSimulatingOOM(js::THREAD_TYPE_PARSE))
return 1;
// Don't allow simultaneous off thread parses, to reduce contention on the
// atoms table. Note that wasm compilation depends on this to avoid
// stalling the helper thread, as off thread parse tasks can trigger and
@@ -1263,17 +1271,21 @@ GlobalHelperThreadState::canStartWasmTie
return !wasmTier2GeneratorWorklist(lock).empty() &&
checkTaskThreadLimit<wasm::Tier2GeneratorTask*>(maxWasmTier2GeneratorThreads(),
/*isMaster=*/true);
}
bool
GlobalHelperThreadState::canStartPromiseHelperTask(const AutoLockHelperThreadState& lock)
{
- return !promiseHelperTasks(lock).empty();
+ // PromiseHelperTasks can be wasm compilation tasks that in turn block on
+ // wasm compilation so set isMaster = true.
+ return !promiseHelperTasks(lock).empty() &&
+ checkTaskThreadLimit<PromiseHelperTask*>(maxPromiseHelperThreads(),
+ /*isMaster=*/true);
}
static bool
IonBuilderHasHigherPriority(jit::IonBuilder* first, jit::IonBuilder* second)
{
// Return true if priority(first) > priority(second).
//
// This method can return whatever it wants, though it really ought to be a
--- a/js/src/vm/HelperThreads.h
+++ b/js/src/vm/HelperThreads.h
@@ -141,16 +141,17 @@ class GlobalHelperThreadState
GCParallelTaskVector gcParallelWorklist_;
ParseTask* removeFinishedParseTask(ParseTaskKind kind, void* token);
public:
size_t maxIonCompilationThreads() const;
size_t maxWasmCompilationThreads() const;
size_t maxWasmTier2GeneratorThreads() const;
+ size_t maxPromiseHelperThreads() const;
size_t maxParseThreads() const;
size_t maxCompressionThreads() const;
size_t maxGCHelperThreads() const;
size_t maxGCParallelThreads() const;
GlobalHelperThreadState();
bool ensureInitialized();