OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_TASK_RUNNER_H_ | 5 #ifndef BASE_TASK_RUNNER_H_ |
6 #define BASE_TASK_RUNNER_H_ | 6 #define BASE_TASK_RUNNER_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include "base/base_export.h" | 9 #include "base/base_export.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/callback_forward.h" | 11 #include "base/bind.h" |
willchan no longer on Chromium
2012/04/04 17:35:49
I have a problem with all these new headers. I see
battre
2012/04/04 19:47:41
Either way is fine with me. I'll follow your decis
willchan no longer on Chromium
2012/04/05 16:53:03
darin/akalin, feel free to chime in, but otherwise
battre
2012/04/12 06:46:33
Done.
| |
12 #include "base/bind_helpers.h" | |
13 #include "base/callback.h" | |
14 #include "base/logging.h" | |
12 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
13 #include "base/time.h" | 16 #include "base/time.h" |
14 | 17 |
15 namespace tracked_objects { | 18 namespace tracked_objects { |
16 class Location; | 19 class Location; |
17 } // namespace tracked_objects | 20 } // namespace tracked_objects |
18 | 21 |
19 namespace base { | 22 namespace base { |
20 | 23 |
24 namespace internal { | |
25 | |
26 // Helper class for TaskRunner::PostTaskAndReplyWithResult. | |
27 template <typename ReturnType> | |
28 void ReturnAsParamAdapter(const Callback<ReturnType(void)>& func, | |
29 ReturnType* result) { | |
30 if (!func.is_null()) | |
31 *result = func.Run(); | |
32 } | |
33 | |
34 // Helper class for TaskRunner::PostTaskAndReplyWithResult. | |
35 template <typename ReturnType> | |
36 Closure ReturnAsParam(const Callback<ReturnType(void)>& func, | |
37 ReturnType* result) { | |
38 DCHECK(result); | |
39 return Bind(&ReturnAsParamAdapter<ReturnType>, func, result); | |
40 } | |
41 | |
42 // Helper class for TaskRunner::PostTaskAndReplyWithResult. | |
43 template <typename ReturnType> | |
44 void ReplyAdapter(const Callback<void(ReturnType)>& callback, | |
45 ReturnType* result) { | |
46 DCHECK(result); | |
47 if(!callback.is_null()) | |
48 callback.Run(*result); | |
49 } | |
50 | |
51 // Helper class for TaskRunner::PostTaskAndReplyWithResult. | |
52 template <typename ReturnType, typename OWNED> | |
willchan no longer on Chromium
2012/04/04 17:35:49
s/OWNED/OwnedType/
battre
2012/04/12 06:46:33
Done.
| |
53 Closure ReplyHelper(const Callback<void(ReturnType)>& callback, OWNED result) { | |
54 return Bind(&ReplyAdapter<ReturnType>, callback, result); | |
55 } | |
56 | |
57 } // namespace internal | |
58 | |
21 struct TaskRunnerTraits; | 59 struct TaskRunnerTraits; |
22 | 60 |
23 // A TaskRunner is an object that runs posted tasks (in the form of | 61 // A TaskRunner is an object that runs posted tasks (in the form of |
24 // Closure objects). The TaskRunner interface provides a way of | 62 // Closure objects). The TaskRunner interface provides a way of |
25 // decoupling task posting from the mechanics of how each task will be | 63 // decoupling task posting from the mechanics of how each task will be |
26 // run. TaskRunner provides very weak guarantees as to how posted | 64 // run. TaskRunner provides very weak guarantees as to how posted |
27 // tasks are run (or if they're run at all). In particular, it only | 65 // tasks are run (or if they're run at all). In particular, it only |
28 // guarantees: | 66 // guarantees: |
29 // | 67 // |
30 // - Posting a task will not run it synchronously. That is, no | 68 // - Posting a task will not run it synchronously. That is, no |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
127 // * Results of |task| are shared with |reply| by binding a shared argument | 165 // * Results of |task| are shared with |reply| by binding a shared argument |
128 // (a DataBuffer instance). | 166 // (a DataBuffer instance). |
129 // * The DataLoader object has no special thread safety. | 167 // * The DataLoader object has no special thread safety. |
130 // * The DataLoader object can be deleted while |task| is still running, | 168 // * The DataLoader object can be deleted while |task| is still running, |
131 // and the reply will cancel itself safely because it is bound to a | 169 // and the reply will cancel itself safely because it is bound to a |
132 // WeakPtr<>. | 170 // WeakPtr<>. |
133 bool PostTaskAndReply(const tracked_objects::Location& from_here, | 171 bool PostTaskAndReply(const tracked_objects::Location& from_here, |
134 const Closure& task, | 172 const Closure& task, |
135 const Closure& reply); | 173 const Closure& reply); |
136 | 174 |
175 // When you have these methods | |
176 // | |
177 // R DoWorkAndReturn(); | |
178 // void Callback(const R& result); | |
179 // | |
180 // and want to call them in a PostTaskAndReply kind of fashion where the | |
181 // result of DoWorkAndReturn is passed to the Callback, you can use | |
182 // PostTaskAndReplyWithResult as in this example: | |
183 // | |
184 // target_thread_.message_loop_proxy()->PostTaskAndReplyWithResult( | |
185 // FROM_HERE, | |
186 // Bind(&DoWorkAndReturn), | |
187 // Bind(&Callback)); | |
188 template <typename ReturnType> | |
189 bool PostTaskAndReplyWithResult( | |
190 const tracked_objects::Location& from_here, | |
191 const Callback<ReturnType(void)>& task, | |
192 const Callback<void(ReturnType)>& reply) { | |
193 ReturnType* result = new ReturnType; | |
194 return PostTaskAndReply( | |
195 from_here, | |
196 internal::ReturnAsParam<ReturnType>(task, result), | |
197 internal::ReplyHelper(reply, Owned(result))); | |
198 } | |
199 | |
137 protected: | 200 protected: |
138 friend struct TaskRunnerTraits; | 201 friend struct TaskRunnerTraits; |
139 | 202 |
140 // Only the Windows debug build seems to need this: see | 203 // Only the Windows debug build seems to need this: see |
141 // http://crbug.com/112250. | 204 // http://crbug.com/112250. |
142 friend class RefCountedThreadSafe<TaskRunner, TaskRunnerTraits>; | 205 friend class RefCountedThreadSafe<TaskRunner, TaskRunnerTraits>; |
143 | 206 |
144 TaskRunner(); | 207 TaskRunner(); |
145 virtual ~TaskRunner(); | 208 virtual ~TaskRunner(); |
146 | 209 |
147 // Called when this object should be destroyed. By default simply | 210 // Called when this object should be destroyed. By default simply |
148 // deletes |this|, but can be overridden to do something else, like | 211 // deletes |this|, but can be overridden to do something else, like |
149 // delete on a certain thread. | 212 // delete on a certain thread. |
150 virtual void OnDestruct() const; | 213 virtual void OnDestruct() const; |
151 }; | 214 }; |
152 | 215 |
153 struct BASE_EXPORT TaskRunnerTraits { | 216 struct BASE_EXPORT TaskRunnerTraits { |
154 static void Destruct(const TaskRunner* task_runner); | 217 static void Destruct(const TaskRunner* task_runner); |
155 }; | 218 }; |
156 | 219 |
157 } // namespace base | 220 } // namespace base |
158 | 221 |
159 #endif // BASE_TASK_RUNNER_H_ | 222 #endif // BASE_TASK_RUNNER_H_ |
OLD | NEW |