Fix assertion failure in ThreadPool::enqueue()

This commit is contained in:
Eelco Dolstra 2016-07-21 18:14:16 +02:00
parent d57981bac4
commit e682a8e138
2 changed files with 6 additions and 2 deletions

View file

@ -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();

View file

@ -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