From eb15a35ecbe2acd3437cff474686df8fde9bf42a Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Fri, 26 Aug 2016 02:06:27 +0800 Subject: Replace std::unique(new T()) with make_unique(). This commit modernize the code base by replacing: std::unique_ptr(new T(...)) with: make_unique(...) or: wasm::make_unique(...) This is a step closer to adopt C++14 std::make_unique(...). --- src/asm2wasm.h | 2 +- src/cfg/Relooper.cpp | 2 +- src/passes/LowerIfElse.cpp | 2 +- src/passes/LowerInt64.cpp | 2 +- src/support/threads.cpp | 7 ++++--- src/wasm-module-building.h | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/asm2wasm.h b/src/asm2wasm.h index a5754f725..ce3c0749d 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -537,7 +537,7 @@ void Asm2WasmBuilder::processAsm(Ref ast) { for (unsigned i = 1; i < body->size(); i++) { if (body[i][0] == DEFUN) numFunctions++; } - optimizingBuilder = std::unique_ptr(new OptimizingIncrementalModuleBuilder(&wasm, numFunctions)); + optimizingBuilder = make_unique(&wasm, numFunctions); } // first pass - do almost everything, but function imports and indirect calls diff --git a/src/cfg/Relooper.cpp b/src/cfg/Relooper.cpp index cde61df0b..e75adbce5 100644 --- a/src/cfg/Relooper.cpp +++ b/src/cfg/Relooper.cpp @@ -98,7 +98,7 @@ Branch::Branch(wasm::Expression* ConditionInit, wasm::Expression* CodeInit) : An Branch::Branch(std::vector&& ValuesInit, wasm::Expression* CodeInit) : Ancestor(nullptr), Code(CodeInit) { if (ValuesInit.size() > 0) { - SwitchValues = std::unique_ptr>(new std::vector(ValuesInit)); + SwitchValues = wasm::make_unique>(ValuesInit); } // otherwise, it is the default } diff --git a/src/passes/LowerIfElse.cpp b/src/passes/LowerIfElse.cpp index 7bdb2f419..b566e8207 100644 --- a/src/passes/LowerIfElse.cpp +++ b/src/passes/LowerIfElse.cpp @@ -38,7 +38,7 @@ struct LowerIfElse : public WalkerPassallocator; - namer = std::unique_ptr(new NameManager()); + namer = make_unique(); namer->run(runner, module); } diff --git a/src/passes/LowerInt64.cpp b/src/passes/LowerInt64.cpp index b59b1d5fc..69f6d5ae9 100644 --- a/src/passes/LowerInt64.cpp +++ b/src/passes/LowerInt64.cpp @@ -35,7 +35,7 @@ struct LowerInt64 : public Pass { void prepare(PassRunner* runner, Module *module) override { allocator = runner->allocator; - namer = std::unique_ptr(new NameManager()); + namer = make_unique(); namer->run(runner, module); } diff --git a/src/support/threads.cpp b/src/support/threads.cpp index d9e8f8bf2..18f99d5ca 100644 --- a/src/support/threads.cpp +++ b/src/support/threads.cpp @@ -22,6 +22,7 @@ #include "threads.h" #include "compiler-support.h" +#include "utilities.h" // debugging tools @@ -47,7 +48,7 @@ static std::unique_ptr pool; Thread::Thread() { assert(!ThreadPool::get()->isRunning()); - thread = std::unique_ptr(new std::thread(mainLoop, this)); + thread = make_unique(mainLoop, this); } Thread::~Thread() { @@ -110,7 +111,7 @@ void ThreadPool::initialize(size_t num) { ready.store(threads.size()); // initial state before first resetThreadsAreReady() resetThreadsAreReady(); for (size_t i = 0; i < num; i++) { - threads.emplace_back(std::unique_ptr(new Thread())); + threads.emplace_back(make_unique()); } DEBUG_POOL("initialize() waiting\n"); condition.wait(lock, [this]() { return areThreadsReady(); }); @@ -127,7 +128,7 @@ size_t ThreadPool::getNumCores() { ThreadPool* ThreadPool::get() { if (!pool) { - pool = std::unique_ptr(new ThreadPool()); + pool = make_unique(); pool->initialize(getNumCores()); } return pool.get(); diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index 3cdebc558..1d181277f 100644 --- a/src/wasm-module-building.h +++ b/src/wasm-module-building.h @@ -139,7 +139,7 @@ public: private: void createWorker() { DEBUG_THREAD("create a worker"); - threads.emplace_back(std::unique_ptr(new std::thread(workerMain, this))); + threads.emplace_back(make_unique(workerMain, this)); } void wakeWorker() { -- cgit v1.2.3 From a08643d788dd025345c63798f2e3ed7ca9b12e06 Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Fri, 26 Aug 2016 02:09:35 +0800 Subject: Remove unnecessary type cast. std::thread can forward the arguments to main function properly. We don't have to cast them from/to void*. --- src/wasm-module-building.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/wasm-module-building.h b/src/wasm-module-building.h index 1d181277f..cb72fef3f 100644 --- a/src/wasm-module-building.h +++ b/src/wasm-module-building.h @@ -197,9 +197,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 lock(self->mutex); self->liveWorkers++; -- cgit v1.2.3 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 +++++++++- test/empty.asm.js | 4 ++++ test/empty.fromasm | 4 ++++ test/empty.fromasm.imprecise | 4 ++++ test/empty.fromasm.imprecise.no-opts | 4 ++++ test/empty.fromasm.no-opts | 4 ++++ 6 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/empty.asm.js create mode 100644 test/empty.fromasm create mode 100644 test/empty.fromasm.imprecise create mode 100644 test/empty.fromasm.imprecise.no-opts create mode 100644 test/empty.fromasm.no-opts (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]; diff --git a/test/empty.asm.js b/test/empty.asm.js new file mode 100644 index 000000000..94fa6bb38 --- /dev/null +++ b/test/empty.asm.js @@ -0,0 +1,4 @@ +function EmptyModule() { + 'use asm'; + return {}; +} diff --git a/test/empty.fromasm b/test/empty.fromasm new file mode 100644 index 000000000..939cbb87c --- /dev/null +++ b/test/empty.fromasm @@ -0,0 +1,4 @@ +(module + (memory 256 256) + (export "memory" memory) +) diff --git a/test/empty.fromasm.imprecise b/test/empty.fromasm.imprecise new file mode 100644 index 000000000..939cbb87c --- /dev/null +++ b/test/empty.fromasm.imprecise @@ -0,0 +1,4 @@ +(module + (memory 256 256) + (export "memory" memory) +) diff --git a/test/empty.fromasm.imprecise.no-opts b/test/empty.fromasm.imprecise.no-opts new file mode 100644 index 000000000..939cbb87c --- /dev/null +++ b/test/empty.fromasm.imprecise.no-opts @@ -0,0 +1,4 @@ +(module + (memory 256 256) + (export "memory" memory) +) diff --git a/test/empty.fromasm.no-opts b/test/empty.fromasm.no-opts new file mode 100644 index 000000000..939cbb87c --- /dev/null +++ b/test/empty.fromasm.no-opts @@ -0,0 +1,4 @@ +(module + (memory 256 256) + (export "memory" memory) +) -- cgit v1.2.3