From a008d4fd7af3b04a3d351a03d56df7c28998690e Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Fri, 26 Aug 2016 02:13:00 +0800 Subject: Fix asm2wasm dead lock caused by empty modules. This commit fixes an asm2wasm dead lock when asm2wasm is compiling an empty module, i.e. a module without any functions. Without this commit, worker threads are likely to leave `workerMain()` and decrease `liveWorkers` early. Consequently, `waitUntilAllReady()` will never observe `liveWorkers == numWorkers`. --- src/wasm-module-building.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index cb72fef3f..ead074991 100644 --- a/src/wasm-module-building.h +++ b/src/wasm-module-building.h @@ -86,7 +86,15 @@ class OptimizingIncrementalModuleBuilder { public: // numFunctions must be equal to the number of functions allocated, or higher. Knowing // this bounds helps avoid locking. - OptimizingIncrementalModuleBuilder(Module* wasm, Index numFunctions) : wasm(wasm), numFunctions(numFunctions), nextFunction(0), finishing(false) { + OptimizingIncrementalModuleBuilder(Module* wasm, Index numFunctions) + : wasm(wasm), numFunctions(numFunctions), endMarker(nullptr), list(nullptr), nextFunction(0), + numWorkers(0), liveWorkers(0), activeWorkers(0), availableFuncs(0), finishedFuncs(0), + finishing(false) { + if (numFunctions == 0) { + // special case: no functions to be optimized. Don't create any threads. + return; + } + // prepare work list endMarker = new Function(); list = new std::atomic[numFunctions]; -- cgit v1.2.3