diff options
author | Riccardo Spagni <ric@spagni.net> | 2018-01-02 00:31:56 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2018-01-02 00:31:56 +0200 |
commit | aa4195e199fa052df4e26013a472663d5b0bdf78 (patch) | |
tree | be94304b16ea5b991c96ac6dee71d5a36a611d55 /src/common | |
parent | Merge pull request #2967 (diff) | |
parent | threadpool: fix deadlock in recursive waiter usage (diff) | |
download | monero-aa4195e199fa052df4e26013a472663d5b0bdf78.tar.xz |
Merge pull request #2977
c70e8daa threadpool: fix deadlock in recursive waiter usage (moneromooo-monero)
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/threadpool.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/common/threadpool.cpp b/src/common/threadpool.cpp index 20c5765b0..5d749e08e 100644 --- a/src/common/threadpool.cpp +++ b/src/common/threadpool.cpp @@ -34,6 +34,8 @@ #include "cryptonote_config.h" #include "common/util.h" +static __thread int depth = 0; + namespace tools { threadpool::threadpool() : running(true), active(0) { @@ -60,11 +62,13 @@ threadpool::~threadpool() { void threadpool::submit(waiter *obj, std::function<void()> f) { entry e = {obj, f}; boost::unique_lock<boost::mutex> lock(mutex); - if (active == max && !queue.empty()) { + if ((active == max && !queue.empty()) || depth > 0) { // if all available threads are already running // and there's work waiting, just run in current thread lock.unlock(); + ++depth; f(); + --depth; } else { if (obj) obj->inc(); @@ -106,7 +110,9 @@ void threadpool::run() { e = queue.front(); queue.pop_front(); lock.unlock(); + ++depth; e.f(); + --depth; if (e.wo) e.wo->dec(); |