]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Switch to futures users/cbiesinger/threadpool
authorChristian Biesinger <cbiesinger@google.com>
Tue, 8 Oct 2019 22:25:26 +0000 (17:25 -0500)
committerChristian Biesinger <cbiesinger@google.com>
Tue, 8 Oct 2019 22:36:15 +0000 (17:36 -0500)
gdb/gdbsupport/parallel-for.h
gdb/gdbsupport/thread_pool.c
gdb/gdbsupport/thread_pool.h

index 6f4235da3631690ec5b50ebb6fbff3efe423eec3..11af33d61f1e1b9d7636885b91bcba41456fdce9 100644 (file)
@@ -68,9 +68,7 @@ parallel_for_each (RandomIt first, RandomIt last, RangeFunction callback)
     parallel_for_pool.start (n_threads);
   }
 
-  std::mutex mtx;
-  std::condition_variable cv;
-  int num_finished = 0;
+  std::future<void> futures[n_threads];
 
   size_t n_elements = last - first;
   if (n_threads > 1 && 2 * n_threads <= n_elements)
@@ -79,12 +77,9 @@ parallel_for_each (RandomIt first, RandomIt last, RangeFunction callback)
       for (int i = 0; i < n_threads; ++i)
        {
          RandomIt end = first + elts_per_thread;
-         parallel_for_pool.post_task ([&, first, end] () {
-                                      callback (first, end);
-                                      std::unique_lock<std::mutex> lck (mtx);
-                                      num_finished++;
-                                      cv.notify_all ();
-                                      });
+         futures[i] = parallel_for_pool.post_task ([&, first, end] () {
+                                                    callback (first, end);
+                                                    });
          first = end;
        }
     }
@@ -94,15 +89,10 @@ parallel_for_each (RandomIt first, RandomIt last, RangeFunction callback)
 
   /* Process all the remaining elements in the main thread.  */
   callback (first, last);
-  if (n_threads)
-    {
-      for (;;) {
-       std::unique_lock<std::mutex> lck (mtx);
-       if (num_finished == n_threads)
-         break;
-       cv.wait (lck);
-      }
-    }
+#ifdef CXX_STD_THREAD
+  for (size_t i = 0; i < n_threads; ++i)
+    futures[i].wait ();
+#endif /* CXX_STD_THREAD */
 }
 
 }
index 03fef956df7a22c53f171d58f509489b05ee814b..a78edeaef7ac32a7955367a78de7d559b9ea2930 100644 (file)
@@ -40,7 +40,7 @@ thread_pool::thread_function ()
          break;
        if (m_tasks.empty ())
          continue;
-       t = m_tasks.front();
+       t = std::move (m_tasks.front());
        m_tasks.pop();
       }
       t ();
index 77760a95042838e691d936ddeffd6ecb8bd2a015..9717263309fa9ac6706abe242c4c14a5f879028c 100644 (file)
@@ -8,6 +8,7 @@
 #include <atomic>
 #include <mutex>
 #include <condition_variable>
+#include <future>
 
 namespace gdb {
 
@@ -20,11 +21,14 @@ class thread_pool {
 
   void start(size_t num_threads);
 
-  typedef std::function<void ()> task;
-  void post_task(task t) {
+  typedef std::packaged_task<void()> task;
+  std::future<void> post_task(std::function<void ()> func) {
+    task t(func);
+    std::future<void> f = t.get_future();
     std::lock_guard<std::mutex> guard (m_tasks_mutex);
-    m_tasks.push (t);
+    m_tasks.push (std::move (t));
     m_tasks_cv.notify_one ();
+    return f;
   }
 
  private: