Fix assertion failure in ThreadPool::enqueue()
This commit is contained in:
parent
d57981bac4
commit
e682a8e138
2 changed files with 6 additions and 2 deletions
|
@ -36,7 +36,8 @@ ThreadPool::~ThreadPool()
|
||||||
void ThreadPool::enqueue(const work_t & t)
|
void ThreadPool::enqueue(const work_t & t)
|
||||||
{
|
{
|
||||||
auto state(state_.lock());
|
auto state(state_.lock());
|
||||||
assert(!state->quit);
|
if (state->quit)
|
||||||
|
throw ThreadPoolShutDown("cannot enqueue a work item while the thread pool is shutting down");
|
||||||
state->left.push(t);
|
state->left.push(t);
|
||||||
if (state->left.size() > state->workers.size() && state->workers.size() < maxThreads)
|
if (state->left.size() > state->workers.size() && state->workers.size() < maxThreads)
|
||||||
state->workers.emplace_back(&ThreadPool::workerEntry, this);
|
state->workers.emplace_back(&ThreadPool::workerEntry, this);
|
||||||
|
@ -84,7 +85,8 @@ void ThreadPool::workerEntry()
|
||||||
} catch (std::exception & e) {
|
} catch (std::exception & e) {
|
||||||
auto state(state_.lock());
|
auto state(state_.lock());
|
||||||
if (state->exception) {
|
if (state->exception) {
|
||||||
if (!dynamic_cast<Interrupted*>(&e))
|
if (!dynamic_cast<Interrupted*>(&e) &&
|
||||||
|
!dynamic_cast<ThreadPoolShutDown*>(&e))
|
||||||
printMsg(lvlError, format("error: %s") % e.what());
|
printMsg(lvlError, format("error: %s") % e.what());
|
||||||
} else {
|
} else {
|
||||||
state->exception = std::current_exception();
|
state->exception = std::current_exception();
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
MakeError(ThreadPoolShutDown, Error)
|
||||||
|
|
||||||
/* A simple thread pool that executes a queue of work items
|
/* A simple thread pool that executes a queue of work items
|
||||||
(lambdas). */
|
(lambdas). */
|
||||||
class ThreadPool
|
class ThreadPool
|
||||||
|
|
Loading…
Reference in a new issue