| 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_ | 
|  |