aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-01-02 00:31:56 +0200
committerRiccardo Spagni <ric@spagni.net>2018-01-02 00:31:56 +0200
commitaa4195e199fa052df4e26013a472663d5b0bdf78 (patch)
treebe94304b16ea5b991c96ac6dee71d5a36a611d55 /src
parentMerge pull request #2967 (diff)
parentthreadpool: fix deadlock in recursive waiter usage (diff)
downloadmonero-aa4195e199fa052df4e26013a472663d5b0bdf78.tar.xz
Merge pull request #2977
c70e8daa threadpool: fix deadlock in recursive waiter usage (moneromooo-monero)
Diffstat (limited to 'src')
-rw-r--r--src/common/threadpool.cpp8
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();