From 9b8b0794b8dd8ebdd17b3653ad29abcc6b7a3583 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Wed, 13 Jun 2018 21:24:19 +0000 Subject: Revert "Enable ThreadPool to queue tasks that return values." This is failing to compile when LLVM_ENABLE_THREADS is false, and the fix is not immediately obvious, so reverting while I look into it. llvm-svn: 334658 --- llvm/lib/Support/ThreadPool.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'llvm/lib/Support/ThreadPool.cpp') diff --git a/llvm/lib/Support/ThreadPool.cpp b/llvm/lib/Support/ThreadPool.cpp index fef665ba3d1..d0212ca1346 100644 --- a/llvm/lib/Support/ThreadPool.cpp +++ b/llvm/lib/Support/ThreadPool.cpp @@ -32,7 +32,7 @@ ThreadPool::ThreadPool(unsigned ThreadCount) for (unsigned ThreadID = 0; ThreadID < ThreadCount; ++ThreadID) { Threads.emplace_back([&] { while (true) { - std::unique_ptr Task; + PackagedTaskTy Task; { std::unique_lock LockGuard(QueueLock); // Wait for tasks to be pushed in the queue @@ -54,7 +54,7 @@ ThreadPool::ThreadPool(unsigned ThreadCount) Tasks.pop(); } // Run the task we just grabbed - Task->execute(); + Task(); { // Adjust `ActiveThreads`, in case someone waits on ThreadPool::wait() @@ -79,6 +79,23 @@ void ThreadPool::wait() { [&] { return !ActiveThreads && Tasks.empty(); }); } +std::shared_future ThreadPool::asyncImpl(TaskTy Task) { + /// Wrap the Task in a packaged_task to return a future object. + PackagedTaskTy PackagedTask(std::move(Task)); + auto Future = PackagedTask.get_future(); + { + // Lock the queue and push the new task + std::unique_lock LockGuard(QueueLock); + + // Don't allow enqueueing after disabling the pool + assert(EnableFlag && "Queuing a thread during ThreadPool destruction"); + + Tasks.push(std::move(PackagedTask)); + } + QueueCondition.notify_one(); + return Future.share(); +} + // The destructor joins all threads, waiting for completion. ThreadPool::~ThreadPool() { { -- cgit v1.2.3