Index: base/task_runner_util.h |
diff --git a/base/task_runner_util.h b/base/task_runner_util.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9d20ef255ba0d0c2716d39aab019da9d88a8d01d |
--- /dev/null |
+++ b/base/task_runner_util.h |
@@ -0,0 +1,81 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef BASE_TASK_RUNNER_UTIL_H_ |
+#define BASE_TASK_RUNNER_UTIL_H_ |
+#pragma once |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/logging.h" |
+#include "base/task_runner.h" |
+ |
+namespace base { |
+ |
+namespace internal { |
+ |
+// Helper class for TaskRunner::PostTaskAndReplyWithResult. |
+template <typename ReturnType> |
+void ReturnAsParamAdapter(const Callback<ReturnType(void)>& func, |
+ ReturnType* result) { |
+ if (!func.is_null()) |
+ *result = func.Run(); |
+} |
+ |
+// Helper class for TaskRunner::PostTaskAndReplyWithResult. |
+template <typename ReturnType> |
+Closure ReturnAsParam(const Callback<ReturnType(void)>& func, |
+ ReturnType* result) { |
+ DCHECK(result); |
+ return Bind(&ReturnAsParamAdapter<ReturnType>, func, result); |
+} |
+ |
+// Helper class for TaskRunner::PostTaskAndReplyWithResult. |
+template <typename ReturnType> |
+void ReplyAdapter(const Callback<void(ReturnType)>& callback, |
+ ReturnType* result) { |
+ DCHECK(result); |
+ if(!callback.is_null()) |
+ callback.Run(*result); |
+} |
+ |
+// Helper class for TaskRunner::PostTaskAndReplyWithResult. |
+template <typename ReturnType, typename OwnedType> |
+Closure ReplyHelper(const Callback<void(ReturnType)>& callback, |
+ OwnedType result) { |
+ return Bind(&ReplyAdapter<ReturnType>, callback, result); |
+} |
+ |
+} // namespace internal |
+ |
+// When you have these methods |
+// |
+// R DoWorkAndReturn(); |
+// void Callback(const R& result); |
+// |
+// and want to call them in a PostTaskAndReply kind of fashion where the |
+// result of DoWorkAndReturn is passed to the Callback, you can use |
+// PostTaskAndReplyWithResult as in this example: |
+// |
+// PostTaskAndReplyWithResult( |
+// target_thread_.message_loop_proxy(), |
+// FROM_HERE, |
+// Bind(&DoWorkAndReturn), |
+// Bind(&Callback)); |
+template <typename ReturnType> |
+bool PostTaskAndReplyWithResult( |
+ TaskRunner* task_runner, |
+ const tracked_objects::Location& from_here, |
+ const Callback<ReturnType(void)>& task, |
+ const Callback<void(ReturnType)>& reply) { |
+ ReturnType* result = new ReturnType; |
+ return task_runner->PostTaskAndReply( |
+ from_here, |
+ internal::ReturnAsParam<ReturnType>(task, result), |
+ internal::ReplyHelper(reply, Owned(result))); |
+} |
+ |
+} // namespace base |
+ |
+#endif // BASE_TASK_RUNNER_UTIL_H_ |