diff --git a/llvm/include/llvm/Support/ThreadPool.h b/llvm/include/llvm/Support/ThreadPool.h --- a/llvm/include/llvm/Support/ThreadPool.h +++ b/llvm/include/llvm/Support/ThreadPool.h @@ -56,8 +56,7 @@ /// Asynchronous submission of a task to the pool. The returned future can be /// used to wait for the task to finish and is *non-blocking* on destruction. - template - auto async(Func &&F) -> std::shared_future { + template auto async(Func &&F) -> std::future { return asyncImpl(std::function(std::forward(F))); } @@ -101,7 +100,7 @@ /// Asynchronous submission of a task to the pool. The returned future can be /// used to wait for the task to finish and is *non-blocking* on destruction. template - std::shared_future asyncImpl(std::function Task) { + std::future asyncImpl(std::function Task) { #if LLVM_ENABLE_THREADS /// Wrap the Task in a std::function that sets the result of the @@ -117,12 +116,12 @@ Tasks.push(std::move(R.first)); } QueueCondition.notify_one(); - return R.second.share(); + return std::move(R.second); #else // LLVM_ENABLE_THREADS Disabled // Get a Future with launch::deferred execution using std::async - auto Future = std::async(std::launch::deferred, std::move(Task)).share(); + auto Future = std::async(std::launch::deferred, std::move(Task)); // Wrap the future so that both ThreadPool::wait() can operate and the // returned future can be sync'ed on. Tasks.push([Future]() { Future.get(); }); diff --git a/mlir/include/mlir/IR/Threading.h b/mlir/include/mlir/IR/Threading.h --- a/mlir/include/mlir/IR/Threading.h +++ b/mlir/include/mlir/IR/Threading.h @@ -71,14 +71,14 @@ // Otherwise, process the elements in parallel. llvm::ThreadPool &threadPool = context->getThreadPool(); size_t numActions = std::min(numElements, threadPool.getThreadCount()); - SmallVector> threadFutures; + SmallVector> threadFutures; threadFutures.reserve(numActions - 1); for (unsigned i = 1; i < numActions; ++i) threadFutures.emplace_back(threadPool.async(processFn)); processFn(); // Wait for all of the threads to finish. - for (std::shared_future &future : threadFutures) + for (std::future &future : threadFutures) future.wait(); return failure(processingFailed); }