diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-08-26 10:13:48 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-26 10:13:48 -0700 |
commit | 801baed1ca81d87380d56298289fe8cc0b4f1e1a (patch) | |
tree | 683c8535f4e6072e41eda4fcda08e00da42b6626 /src/wasm-module-building.h | |
parent | 2cb8b275caf090bf56cc78424aaa97766cd02fb6 (diff) | |
parent | a008d4fd7af3b04a3d351a03d56df7c28998690e (diff) | |
download | binaryen-801baed1ca81d87380d56298289fe8cc0b4f1e1a.tar.gz binaryen-801baed1ca81d87380d56298289fe8cc0b4f1e1a.tar.bz2 binaryen-801baed1ca81d87380d56298289fe8cc0b4f1e1a.zip |
Merge pull request #682 from loganchien/fix-empty-deadlock
Fix asm2wasm dead lock caused by empty module
Diffstat (limited to 'src/wasm-module-building.h')
-rw-r--r-- | src/wasm-module-building.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index 3cdebc558..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<Function*>[numFunctions]; @@ -139,7 +147,7 @@ public: private: void createWorker() { DEBUG_THREAD("create a worker"); - threads.emplace_back(std::unique_ptr<std::thread>(new std::thread(workerMain, this))); + threads.emplace_back(make_unique<std::thread>(workerMain, this)); } void wakeWorker() { @@ -197,9 +205,8 @@ private: passRunner.runFunction(func); } - static void workerMain(void* param) { + static void workerMain(OptimizingIncrementalModuleBuilder* self) { DEBUG_THREAD("workerMain"); - OptimizingIncrementalModuleBuilder* self = (OptimizingIncrementalModuleBuilder*)param; { std::lock_guard<std::mutex> lock(self->mutex); self->liveWorkers++; |