From: Davide Italiano Date: Mon, 28 Nov 2016 08:53:41 +0000 (+0000) Subject: [ThreadPool] Simplify the interface. NFCI. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9bb8d18237f2cc86a980e6a74be3eac8483cdda0;p=llvm [ThreadPool] Simplify the interface. NFCI. The callers don't use the return value. Found by Michael Spencer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288016 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/ThreadPool.h b/include/llvm/Support/ThreadPool.h index 665cec2465b..9e948a0e9ee 100644 --- a/include/llvm/Support/ThreadPool.h +++ b/include/llvm/Support/ThreadPool.h @@ -75,29 +75,26 @@ public: /// 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 - inline std::shared_future async(Function &&F, Args &&... ArgList) { + inline void async(Function &&F, Args &&... ArgList) { auto Task = std::bind(std::forward(F), std::forward(ArgList)...); #ifndef _MSC_VER - return asyncImpl(std::move(Task)); + asyncImpl(std::move(Task)); #else // This lambda has to be marked mutable because MSVC 2013's std::bind call // operator isn't const qualified. - return asyncImpl([Task](VoidTy) mutable -> VoidTy { - Task(); - return VoidTy(); - }); + asyncImpl([Task](VoidTy) mutable { Task(); }); #endif } /// 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 - inline std::shared_future async(Function &&F) { + inline void async(Function &&F) { #ifndef _MSC_VER - return asyncImpl(std::forward(F)); + asyncImpl(std::forward(F)); #else - return asyncImpl([F] (VoidTy) -> VoidTy { F(); return VoidTy(); }); + asyncImpl([F] (VoidTy) { F(); }); #endif } @@ -106,9 +103,8 @@ public: void wait(); private: - /// 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. - std::shared_future asyncImpl(TaskTy F); + /// Asynchronous submission of a task to the pool. + void asyncImpl(TaskTy F); /// Threads in flight std::vector Threads; diff --git a/lib/Support/ThreadPool.cpp b/lib/Support/ThreadPool.cpp index db03a4d6240..022f32a1378 100644 --- a/lib/Support/ThreadPool.cpp +++ b/lib/Support/ThreadPool.cpp @@ -82,7 +82,7 @@ void ThreadPool::wait() { [&] { return !ActiveThreads && Tasks.empty(); }); } -std::shared_future ThreadPool::asyncImpl(TaskTy Task) { +void 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(); @@ -96,7 +96,6 @@ std::shared_future ThreadPool::asyncImpl(TaskTy Task) { Tasks.push(std::move(PackagedTask)); } QueueCondition.notify_one(); - return Future.share(); } // The destructor joins all threads, waiting for completion. @@ -136,7 +135,7 @@ void ThreadPool::wait() { } } -std::shared_future ThreadPool::asyncImpl(TaskTy Task) { +void ThreadPool::asyncImpl(TaskTy Task) { #ifndef _MSC_VER // Get a Future with launch::deferred execution using std::async auto Future = std::async(std::launch::deferred, std::move(Task)).share(); @@ -148,7 +147,6 @@ std::shared_future ThreadPool::asyncImpl(TaskTy Task) { PackagedTaskTy PackagedTask([Future](bool) -> bool { Future.get(); return false; }); #endif Tasks.push(std::move(PackagedTask)); - return Future; } ThreadPool::~ThreadPool() { diff --git a/unittests/Support/ThreadPool.cpp b/unittests/Support/ThreadPool.cpp index 8e03aacfb1e..bb972f7daa9 100644 --- a/unittests/Support/ThreadPool.cpp +++ b/unittests/Support/ThreadPool.cpp @@ -131,22 +131,6 @@ TEST_F(ThreadPoolTest, Async) { ASSERT_EQ(2, i.load()); } -TEST_F(ThreadPoolTest, GetFuture) { - CHECK_UNSUPPORTED(); - ThreadPool Pool{2}; - std::atomic_int i{0}; - Pool.async([this, &i] { - waitForMainThread(); - ++i; - }); - // Force the future using get() - Pool.async([&i] { ++i; }).get(); - ASSERT_NE(2, i.load()); - setMainThreadReady(); - Pool.wait(); - ASSERT_EQ(2, i.load()); -} - TEST_F(ThreadPoolTest, PoolDestruction) { CHECK_UNSUPPORTED(); // Test that we are waiting on destruction