Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(746)

Side by Side Diff: base/task.h

Issue 248021: Reverting 27379. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/ref_counted.h ('k') | chrome/browser/browser_process_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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_H_ 5 #ifndef BASE_TASK_H_
6 #define BASE_TASK_H_ 6 #define BASE_TASK_H_
7 7
8 #include "base/non_thread_safe.h" 8 #include "base/non_thread_safe.h"
9 #include "base/tracked.h" 9 #include "base/tracked.h"
10 #include "base/tuple.h" 10 #include "base/tuple.h"
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 // 198 //
199 // This traits-class is used by RunnableMethod to manage the lifetime of the 199 // This traits-class is used by RunnableMethod to manage the lifetime of the
200 // callee object. By default, it is assumed that the callee supports AddRef 200 // callee object. By default, it is assumed that the callee supports AddRef
201 // and Release methods. A particular class can specialize this template to 201 // and Release methods. A particular class can specialize this template to
202 // define other lifetime management. For example, if the callee is known to 202 // define other lifetime management. For example, if the callee is known to
203 // live longer than the RunnableMethod object, then a RunnableMethodTraits 203 // live longer than the RunnableMethod object, then a RunnableMethodTraits
204 // struct could be defined with empty RetainCallee and ReleaseCallee methods. 204 // struct could be defined with empty RetainCallee and ReleaseCallee methods.
205 205
206 template <class T> 206 template <class T>
207 struct RunnableMethodTraits { 207 struct RunnableMethodTraits {
208 RunnableMethodTraits() { 208 static void RetainCallee(T* obj) {
209 #ifndef NDEBUG
210 origin_thread_id_ = PlatformThread::CurrentId();
211 #endif
212 }
213
214 ~RunnableMethodTraits() {
215 #ifndef NDEBUG
216 // If destroyed on a separate thread, then we had better have been using
217 // thread-safe reference counting!
218 if (origin_thread_id_ != PlatformThread::CurrentId())
219 DCHECK(T::ImplementsThreadSafeReferenceCounting());
220 #endif
221 }
222
223 void RetainCallee(T* obj) {
224 obj->AddRef(); 209 obj->AddRef();
225 } 210 }
226 211 static void ReleaseCallee(T* obj) {
227 void ReleaseCallee(T* obj) {
228 obj->Release(); 212 obj->Release();
229 } 213 }
230
231 private:
232 #ifndef NDEBUG
233 PlatformThreadId origin_thread_id_;
234 #endif
235 }; 214 };
236 215
237 // RunnableMethod and RunnableFunction ----------------------------------------- 216 // RunnableMethod and RunnableFunction -----------------------------------------
238 // 217 //
239 // Runnable methods are a type of task that call a function on an object when 218 // Runnable methods are a type of task that call a function on an object when
240 // they are run. We implement both an object and a set of NewRunnableMethod and 219 // they are run. We implement both an object and a set of NewRunnableMethod and
241 // NewRunnableFunction functions for convenience. These functions are 220 // NewRunnableFunction functions for convenience. These functions are
242 // overloaded and will infer the template types, simplifying calling code. 221 // overloaded and will infer the template types, simplifying calling code.
243 // 222 //
244 // The template definitions all use the following names: 223 // The template definitions all use the following names:
245 // T - the class type of the object you're supplying 224 // T - the class type of the object you're supplying
246 // this is not needed for the Static version of the call 225 // this is not needed for the Static version of the call
247 // Method/Function - the signature of a pointer to the method or function you 226 // Method/Function - the signature of a pointer to the method or function you
248 // want to call 227 // want to call
249 // Param - the parameter(s) to the method, possibly packed as a Tuple 228 // Param - the parameter(s) to the method, possibly packed as a Tuple
250 // A - the first parameter (if any) to the method 229 // A - the first parameter (if any) to the method
251 // B - the second parameter (if any) to the mathod 230 // B - the second parameter (if any) to the mathod
252 // 231 //
253 // Put these all together and you get an object that can call a method whose 232 // Put these all together and you get an object that can call a method whose
254 // signature is: 233 // signature is:
255 // R T::MyFunction([A[, B]]) 234 // R T::MyFunction([A[, B]])
256 // 235 //
257 // Usage: 236 // Usage:
258 // PostTask(FROM_HERE, NewRunnableMethod(object, &Object::method[, a[, b]]) 237 // PostTask(FROM_HERE, NewRunnableMethod(object, &Object::method[, a[, b]])
259 // PostTask(FROM_HERE, NewRunnableFunction(&function[, a[, b]]) 238 // PostTask(FROM_HERE, NewRunnableFunction(&function[, a[, b]])
260 239
261 // RunnableMethod and NewRunnableMethod implementation ------------------------- 240 // RunnableMethod and NewRunnableMethod implementation -------------------------
262 241
263 template <class T, class Method, class Params> 242 template <class T, class Method, class Params>
264 class RunnableMethod : public CancelableTask { 243 class RunnableMethod : public CancelableTask,
244 public RunnableMethodTraits<T> {
265 public: 245 public:
266 RunnableMethod(T* obj, Method meth, const Params& params) 246 RunnableMethod(T* obj, Method meth, const Params& params)
267 : obj_(obj), meth_(meth), params_(params) { 247 : obj_(obj), meth_(meth), params_(params) {
268 traits_.RetainCallee(obj_); 248 RetainCallee(obj_);
269 } 249 }
270
271 ~RunnableMethod() { 250 ~RunnableMethod() {
272 ReleaseCallee(); 251 ReleaseCallee();
273 } 252 }
274 253
275 virtual void Run() { 254 virtual void Run() {
276 if (obj_) 255 if (obj_)
277 DispatchToMethod(obj_, meth_, params_); 256 DispatchToMethod(obj_, meth_, params_);
278 } 257 }
279 258
280 virtual void Cancel() { 259 virtual void Cancel() {
281 ReleaseCallee(); 260 ReleaseCallee();
282 } 261 }
283 262
284 private: 263 private:
285 void ReleaseCallee() { 264 void ReleaseCallee() {
286 if (obj_) { 265 if (obj_) {
287 traits_.ReleaseCallee(obj_); 266 RunnableMethodTraits<T>::ReleaseCallee(obj_);
288 obj_ = NULL; 267 obj_ = NULL;
289 } 268 }
290 } 269 }
291 270
292 T* obj_; 271 T* obj_;
293 Method meth_; 272 Method meth_;
294 Params params_; 273 Params params_;
295 RunnableMethodTraits<T> traits_;
296 }; 274 };
297 275
298 template <class T, class Method> 276 template <class T, class Method>
299 inline CancelableTask* NewRunnableMethod(T* object, Method method) { 277 inline CancelableTask* NewRunnableMethod(T* object, Method method) {
300 return new RunnableMethod<T, Method, Tuple0>(object, method, MakeTuple()); 278 return new RunnableMethod<T, Method, Tuple0>(object, method, MakeTuple());
301 } 279 }
302 280
303 template <class T, class Method, class A> 281 template <class T, class Method, class A>
304 inline CancelableTask* NewRunnableMethod(T* object, Method method, const A& a) { 282 inline CancelableTask* NewRunnableMethod(T* object, Method method, const A& a) {
305 return new RunnableMethod<T, Method, Tuple1<A> >(object, 283 return new RunnableMethod<T, Method, Tuple1<A> >(object,
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 646
669 template <class T, typename ReturnValue> 647 template <class T, typename ReturnValue>
670 typename CallbackWithReturnValue<ReturnValue>::Type* 648 typename CallbackWithReturnValue<ReturnValue>::Type*
671 NewCallbackWithReturnValue(T* object, ReturnValue (T::*method)()) { 649 NewCallbackWithReturnValue(T* object, ReturnValue (T::*method)()) {
672 return new CallbackWithReturnValueImpl<T, ReturnValue (T::*)(), ReturnValue>( 650 return new CallbackWithReturnValueImpl<T, ReturnValue (T::*)(), ReturnValue>(
673 object, method); 651 object, method);
674 } 652 }
675 653
676 654
677 #endif // BASE_TASK_H_ 655 #endif // BASE_TASK_H_
OLDNEW
« no previous file with comments | « base/ref_counted.h ('k') | chrome/browser/browser_process_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698