Chromium Code Reviews| 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 |