labath requested changes to this revision.
labath added a comment.
This revision now requires changes to proceed.

Although it may not seem from the number of my comments, I actually quite like 
this implementation. However, I think more work needs to be done to make this 
future-proof.

- we definitely need unit tests for this.
- we need more documentation (especially on the public interfaces, but the 
trickier internal parts could use some explanation as well).


================
Comment at: include/lldb/Utility/TaskPool.h:23
@@ +22,3 @@
+
+    // Add a new task to the thread pool and return a std::future belongs for 
the newly created task.
+    // The caller of this function have to wait on the future for this task to 
complete.
----------------
belonging to

================
Comment at: include/lldb/Utility/TaskPool.h:24
@@ +23,3 @@
+    // Add a new task to the thread pool and return a std::future belongs for 
the newly created task.
+    // The caller of this function have to wait on the future for this task to 
complete.
+    template<typename F, typename... Args>
----------------
s/have/has

================
Comment at: include/lldb/Utility/TaskPool.h:33
@@ +32,3 @@
+    static void
+    RunTasks(T&&... t);
+
----------------
Perhahs the entire TaskPool could be an implementation detail and this 
functionality would be accessed (via a static method on) TaskRunner? What do 
you think? I have found it confusing it the other commit, why you sometimes use 
TaskPool and another time TaskRunner...

================
Comment at: include/lldb/Utility/TaskPool.h:80
@@ +79,3 @@
+    void
+    WaitForAllTask();
+
----------------
WaitForAllTasks

================
Comment at: include/lldb/Utility/TaskPool.h:103
@@ +102,3 @@
+
+template<typename H, typename... T>
+struct TaskPool::RunTaskImpl<H, T...>
----------------
Suggestion: name these `Head`, `Tail`. You use `T` for other purposes 
elsewhere, and I have spent a lot of time trying to figure out why is this `H` 
and not `F` before I figured out what's going on here.

================
Comment at: include/lldb/Utility/TaskPool.h:126
@@ +125,3 @@
+{
+    auto task = std::make_shared<std::packaged_task<typename 
std::result_of<F(Args...)>::type()>>(
+        std::bind(std::forward<F>(f), std::forward<Args>(args)...));
----------------
task_sp

================
Comment at: include/lldb/Utility/TaskPool.h:138
@@ +137,3 @@
+
+template <typename T>
+template<typename F, typename... Args>
----------------
You use `T` for both "task" and the "result value of a task". Could you 
disambiguate the two. Suggestion: `Ret` (or `Return`) and `Task`.

================
Comment at: include/lldb/Utility/TaskPool.h:145
@@ +144,3 @@
+    auto it = m_pending.emplace(m_pending.end());
+    *it = std::move(TaskPool::AddTask(
+        [this, it](F&& f, Args&&... args)
----------------
This construction is quite convoluted. Do you actually need a list of the 
pending tasks anywhere? As far as I can tell, you only need to check if there 
are any tasks pending, which can be done with a simple (atomic) integer.

================
Comment at: include/lldb/Utility/TaskPool.h:148
@@ +147,3 @@
+        {
+            T&& r = f(args...);
+
----------------
Is `std::forward` needed here?


http://reviews.llvm.org/D13727



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to