зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1284056 - Baldr: simplify the parallel compilation guard (r=bbouvier)
MozReview-Commit-ID: Bske3m8PqdT --HG-- extra : rebase_source : dff7b7e4b88f6a4fd6edd6cf5a8bac6c8eaf7f66
This commit is contained in:
Родитель
4ae72389d7
Коммит
0ca10d8c16
|
@ -95,21 +95,6 @@ ModuleGenerator::~ModuleGenerator()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
ParallelCompilationEnabled(ExclusiveContext* cx)
|
|
||||||
{
|
|
||||||
// Since there are a fixed number of helper threads and one is already being
|
|
||||||
// consumed by this parsing task, ensure that there another free thread to
|
|
||||||
// avoid deadlock. (Note: there is at most one thread used for parsing so we
|
|
||||||
// don't have to worry about general dining philosophers.)
|
|
||||||
if (HelperThreadState().threadCount <= 1 || !CanUseExtraThreads())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// If 'cx' isn't a JSContext, then we are already off the main thread so
|
|
||||||
// off-thread compilation must be enabled.
|
|
||||||
return !cx->isJSContext() || cx->asJSContext()->runtime()->canUseOffthreadIonCompilation();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ModuleGenerator::init(UniqueModuleGeneratorData shared, UniqueChars file, Assumptions&& assumptions,
|
ModuleGenerator::init(UniqueModuleGeneratorData shared, UniqueChars file, Assumptions&& assumptions,
|
||||||
Metadata* maybeMetadata)
|
Metadata* maybeMetadata)
|
||||||
|
@ -746,10 +731,22 @@ ModuleGenerator::startFuncDefs()
|
||||||
MOZ_ASSERT(!startedFuncDefs_);
|
MOZ_ASSERT(!startedFuncDefs_);
|
||||||
MOZ_ASSERT(!finishedFuncDefs_);
|
MOZ_ASSERT(!finishedFuncDefs_);
|
||||||
|
|
||||||
|
// The wasmCompilationInProgress atomic ensures that there is only one
|
||||||
|
// parallel compilation in progress at a time. In the special case of
|
||||||
|
// asm.js, where the ModuleGenerator itself can be on a helper thread, this
|
||||||
|
// avoids the possibility of deadlock since at most 1 helper thread will be
|
||||||
|
// blocking on other helper threads and there are always >1 helper threads.
|
||||||
|
// With wasm, this restriction could be relaxed by moving the worklist state
|
||||||
|
// out of HelperThreadState since each independent compilation needs its own
|
||||||
|
// worklist pair. Alternatively, the deadlock could be avoided by having the
|
||||||
|
// ModuleGenerator thread make progress (on compile tasks) instead of
|
||||||
|
// blocking.
|
||||||
|
|
||||||
|
GlobalHelperThreadState& threads = HelperThreadState();
|
||||||
|
MOZ_ASSERT(threads.threadCount > 1);
|
||||||
|
|
||||||
uint32_t numTasks;
|
uint32_t numTasks;
|
||||||
if (ParallelCompilationEnabled(cx_) &&
|
if (CanUseExtraThreads() && threads.wasmCompilationInProgress.compareExchange(false, true)) {
|
||||||
HelperThreadState().wasmCompilationInProgress.compareExchange(false, true))
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
{
|
{
|
||||||
AutoLockHelperThreadState lock;
|
AutoLockHelperThreadState lock;
|
||||||
|
@ -758,9 +755,8 @@ ModuleGenerator::startFuncDefs()
|
||||||
MOZ_ASSERT(HelperThreadState().wasmFinishedList().empty());
|
MOZ_ASSERT(HelperThreadState().wasmFinishedList().empty());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
parallel_ = true;
|
parallel_ = true;
|
||||||
numTasks = HelperThreadState().maxWasmCompilationThreads();
|
numTasks = threads.maxWasmCompilationThreads();
|
||||||
} else {
|
} else {
|
||||||
numTasks = 1;
|
numTasks = 1;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче