Index: chrome/browser/sync_file_system/drive_backend/callback_helper.h |
diff --git a/chrome/browser/sync_file_system/drive_backend/callback_helper.h b/chrome/browser/sync_file_system/drive_backend/callback_helper.h |
index 2dd97964a52d9aea78af4fac4b015f44a597649a..5a1f4b35e83b43320988ba95cec7a6115c7adb31 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/callback_helper.h |
+++ b/chrome/browser/sync_file_system/drive_backend/callback_helper.h |
@@ -7,7 +7,10 @@ |
#include "base/bind.h" |
#include "base/location.h" |
-#include "base/message_loop/message_loop_proxy.h" |
+#include "base/logging.h" |
+#include "base/thread_task_runner_handle.h" |
+ |
+// TODO(tzik): Merge this file to media/base/bind_to_current_loop.h. |
namespace sync_file_system { |
namespace drive_backend { |
@@ -30,45 +33,65 @@ RebindForward(T& t) { |
return t; |
} |
-template <typename T> |
-void RelayToTaskRunner1(base::SequencedTaskRunner* task_runner, |
- const tracked_objects::Location& from_here, |
- const base::Callback<void(T)>& callback, |
- T arg) { |
- task_runner->PostTask( |
- from_here, base::Bind(callback, RebindForward(arg))); |
-} |
+template <typename> |
+struct RelayToTaskRunner; |
+ |
+template <> |
+struct RelayToTaskRunner<void()> { |
+ static void Run(base::TaskRunner* task_runner, |
+ const tracked_objects::Location& from_here, |
+ const base::Callback<void()>& callback) { |
+ task_runner->PostTask(from_here, base::Bind( |
+ callback)); |
+ } |
+}; |
+ |
+template <typename T1> |
+struct RelayToTaskRunner<void(T1)> { |
+ static void Run(base::TaskRunner* task_runner, |
+ const tracked_objects::Location& from_here, |
+ const base::Callback<void(T1)>& callback, |
+ T1 t1) { |
+ task_runner->PostTask(from_here, base::Bind( |
+ callback, |
+ RebindForward(t1))); |
+ } |
+}; |
template <typename T1, typename T2> |
-void RelayToTaskRunner2(base::SequencedTaskRunner* task_runner, |
- const tracked_objects::Location& from_here, |
- const base::Callback<void(T1, T2)>& callback, |
- T1 arg1, |
- T2 arg2) { |
- task_runner->PostTask( |
- from_here, base::Bind(callback, |
- RebindForward(arg1), |
- RebindForward(arg2))); |
-} |
+struct RelayToTaskRunner<void(T1, T2)> { |
+ static void Run(base::TaskRunner* task_runner, |
+ const tracked_objects::Location& from_here, |
+ const base::Callback<void(T1, T2)>& callback, |
+ T1 t1, |
+ T2 t2) { |
+ task_runner->PostTask(from_here, base::Bind( |
+ callback, |
+ RebindForward(t1), |
+ RebindForward(t2))); |
+ } |
+}; |
} // namespace internal |
template <typename T> |
-base::Callback<void(T)> CreateRelayedCallback( |
- const base::Callback<void(T)>& callback) { |
- return base::Bind(&internal::RelayToTaskRunner1<T>, |
- base::MessageLoopProxy::current(), |
- FROM_HERE, |
+base::Callback<T> RelayCallbackToTaskRunner( |
peria
2014/04/24 05:13:53
Please add a test for this template.
Or move this
tzik
2014/04/24 07:02:17
Done.
|
+ base::TaskRunner* task_runner, |
+ const tracked_objects::Location& from_here, |
+ const base::Callback<T>& callback) { |
+ DCHECK(task_runner->RunsTasksOnCurrentThread()); |
+ return base::Bind(&internal::RelayToTaskRunner<T>::Run, |
+ make_scoped_refptr(task_runner), from_here, |
callback); |
} |
-template <typename T1, typename T2> |
-base::Callback<void(T1, T2)> CreateRelayedCallback( |
- const base::Callback<void(T1, T2)>& callback) { |
- return base::Bind(&internal::RelayToTaskRunner2<T1, T2>, |
- base::MessageLoopProxy::current(), |
- FROM_HERE, |
- callback); |
+template <typename T> |
+base::Callback<T> RelayCallbackToCurrentThread( |
+ const tracked_objects::Location& from_here, |
+ const base::Callback<T>& callback) { |
+ return RelayCallbackToTaskRunner( |
+ base::ThreadTaskRunnerHandle::Get(), |
+ from_here, callback); |
} |
} // namespace drive_backend |