| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // ============================================================================ | 5 // ============================================================================ |
| 6 // **************************************************************************** | 6 // **************************************************************************** |
| 7 // * THIS HEADER IS DEPRECATED, SEE base/callback.h FOR NEW IMPLEMENTATION * | 7 // * THIS HEADER IS DEPRECATED, SEE base/callback.h FOR NEW IMPLEMENTATION * |
| 8 // **************************************************************************** | 8 // **************************************************************************** |
| 9 // ============================================================================ | 9 // ============================================================================ |
| 10 // ============================================================================ | 10 // ============================================================================ |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 // | 297 // |
| 298 // This is different from DISALLOW_COPY_AND_ASSIGN which is declared inside the | 298 // This is different from DISALLOW_COPY_AND_ASSIGN which is declared inside the |
| 299 // class. | 299 // class. |
| 300 #define DISABLE_RUNNABLE_METHOD_REFCOUNT(TypeName) \ | 300 #define DISABLE_RUNNABLE_METHOD_REFCOUNT(TypeName) \ |
| 301 template <> \ | 301 template <> \ |
| 302 struct RunnableMethodTraits<TypeName> { \ | 302 struct RunnableMethodTraits<TypeName> { \ |
| 303 void RetainCallee(TypeName* manager) {} \ | 303 void RetainCallee(TypeName* manager) {} \ |
| 304 void ReleaseCallee(TypeName* manager) {} \ | 304 void ReleaseCallee(TypeName* manager) {} \ |
| 305 } | 305 } |
| 306 | 306 |
| 307 // RunnableMethod and RunnableFunction ----------------------------------------- | 307 // RunnableMethod -------------------------------------------------------------- |
| 308 // | 308 // |
| 309 // Runnable methods are a type of task that call a function on an object when | 309 // Runnable methods are a type of task that call a function on an object when |
| 310 // they are run. We implement both an object and a set of NewRunnableMethod and | 310 // they are run. We implement both an object and a set of NewRunnableMethod |
| 311 // NewRunnableFunction functions for convenience. These functions are | 311 // functions for convenience. These functions are overloaded and will infer the |
| 312 // overloaded and will infer the template types, simplifying calling code. | 312 // template types, simplifying calling code. |
| 313 // | 313 // |
| 314 // The template definitions all use the following names: | 314 // The template definitions all use the following names: |
| 315 // T - the class type of the object you're supplying | 315 // T - the class type of the object you're supplying |
| 316 // this is not needed for the Static version of the call | 316 // this is not needed for the Static version of the call |
| 317 // Method/Function - the signature of a pointer to the method or function you | 317 // Method/Function - the signature of a pointer to the method or function you |
| 318 // want to call | 318 // want to call |
| 319 // Param - the parameter(s) to the method, possibly packed as a Tuple | 319 // Param - the parameter(s) to the method, possibly packed as a Tuple |
| 320 // A - the first parameter (if any) to the method | 320 // A - the first parameter (if any) to the method |
| 321 // B - the second parameter (if any) to the method | 321 // B - the second parameter (if any) to the method |
| 322 // | 322 // |
| 323 // Put these all together and you get an object that can call a method whose | 323 // Put these all together and you get an object that can call a method whose |
| 324 // signature is: | 324 // signature is: |
| 325 // R T::MyFunction([A[, B]]) | 325 // R T::MyFunction([A[, B]]) |
| 326 // | 326 // |
| 327 // Usage: | 327 // Usage: |
| 328 // PostTask(FROM_HERE, NewRunnableMethod(object, &Object::method[, a[, b]]) | 328 // PostTask(FROM_HERE, NewRunnableMethod(object, &Object::method[, a[, b]]) |
| 329 // PostTask(FROM_HERE, NewRunnableFunction(&function[, a[, b]]) | |
| 330 | 329 |
| 331 // RunnableMethod and NewRunnableMethod implementation ------------------------- | 330 // RunnableMethod and NewRunnableMethod implementation ------------------------- |
| 332 | 331 |
| 333 template <class T, class Method, class Params> | 332 template <class T, class Method, class Params> |
| 334 class RunnableMethod : public CancelableTask { | 333 class RunnableMethod : public CancelableTask { |
| 335 public: | 334 public: |
| 336 RunnableMethod(T* obj, Method meth, const Params& params) | 335 RunnableMethod(T* obj, Method meth, const Params& params) |
| 337 : obj_(obj), meth_(meth), params_(params) { | 336 : obj_(obj), meth_(meth), params_(params) { |
| 338 traits_.RetainCallee(obj_); | 337 traits_.RetainCallee(obj_); |
| 339 COMPILE_ASSERT( | 338 COMPILE_ASSERT( |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 const F& f, const G& g, const H& h) { | 450 const F& f, const G& g, const H& h) { |
| 452 return new RunnableMethod<T, | 451 return new RunnableMethod<T, |
| 453 Method, | 452 Method, |
| 454 Tuple8<A, B, C, D, E, F, G, H> >(object, | 453 Tuple8<A, B, C, D, E, F, G, H> >(object, |
| 455 method, | 454 method, |
| 456 MakeTuple(a, b, c, | 455 MakeTuple(a, b, c, |
| 457 d, e, f, | 456 d, e, f, |
| 458 g, h)); | 457 g, h)); |
| 459 } | 458 } |
| 460 | 459 |
| 461 // RunnableFunction and NewRunnableFunction implementation --------------------- | |
| 462 | |
| 463 template <class Function, class Params> | |
| 464 class RunnableFunction : public Task { | |
| 465 public: | |
| 466 RunnableFunction(Function function, const Params& params) | |
| 467 : function_(function), params_(params) { | |
| 468 COMPILE_ASSERT( | |
| 469 (base::internal::ParamsUseScopedRefptrCorrectly<Params>::value), | |
| 470 badrunnablefunctionparams); | |
| 471 } | |
| 472 | |
| 473 ~RunnableFunction() { | |
| 474 function_ = reinterpret_cast<Function>(base::kDeadTask); | |
| 475 } | |
| 476 | |
| 477 virtual void Run() { | |
| 478 if (function_) | |
| 479 DispatchToFunction(function_, params_); | |
| 480 } | |
| 481 | |
| 482 private: | |
| 483 Function function_; | |
| 484 Params params_; | |
| 485 }; | |
| 486 | |
| 487 template <class Function> | |
| 488 inline Task* NewRunnableFunction(Function function) { | |
| 489 return new RunnableFunction<Function, Tuple0>(function, MakeTuple()); | |
| 490 } | |
| 491 | |
| 492 template <class Function, class A> | |
| 493 inline Task* NewRunnableFunction(Function function, const A& a) { | |
| 494 return new RunnableFunction<Function, Tuple1<A> >(function, MakeTuple(a)); | |
| 495 } | |
| 496 | |
| 497 template <class Function, class A, class B> | |
| 498 inline Task* NewRunnableFunction(Function function, const A& a, const B& b) { | |
| 499 return new RunnableFunction<Function, Tuple2<A, B> >(function, | |
| 500 MakeTuple(a, b)); | |
| 501 } | |
| 502 | |
| 503 template <class Function, class A, class B, class C> | |
| 504 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 505 const C& c) { | |
| 506 return new RunnableFunction<Function, Tuple3<A, B, C> >(function, | |
| 507 MakeTuple(a, b, c)); | |
| 508 } | |
| 509 | |
| 510 template <class Function, class A, class B, class C, class D> | |
| 511 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 512 const C& c, const D& d) { | |
| 513 return new RunnableFunction<Function, Tuple4<A, B, C, D> >(function, | |
| 514 MakeTuple(a, b, | |
| 515 c, d)); | |
| 516 } | |
| 517 | |
| 518 template <class Function, class A, class B, class C, class D, class E> | |
| 519 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 520 const C& c, const D& d, const E& e) { | |
| 521 return new RunnableFunction<Function, Tuple5<A, B, C, D, E> >(function, | |
| 522 MakeTuple(a, b, | |
| 523 c, d, | |
| 524 e)); | |
| 525 } | |
| 526 | |
| 527 template <class Function, class A, class B, class C, class D, class E, | |
| 528 class F> | |
| 529 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 530 const C& c, const D& d, const E& e, | |
| 531 const F& f) { | |
| 532 return new RunnableFunction<Function, Tuple6<A, B, C, D, E, F> >(function, | |
| 533 MakeTuple(a, b, c, d, e, f)); | |
| 534 } | |
| 535 | |
| 536 template <class Function, class A, class B, class C, class D, class E, | |
| 537 class F, class G> | |
| 538 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 539 const C& c, const D& d, const E& e, const F& f, | |
| 540 const G& g) { | |
| 541 return new RunnableFunction<Function, Tuple7<A, B, C, D, E, F, G> >(function, | |
| 542 MakeTuple(a, b, c, d, e, f, g)); | |
| 543 } | |
| 544 | |
| 545 template <class Function, class A, class B, class C, class D, class E, | |
| 546 class F, class G, class H> | |
| 547 inline Task* NewRunnableFunction(Function function, const A& a, const B& b, | |
| 548 const C& c, const D& d, const E& e, const F& f, | |
| 549 const G& g, const H& h) { | |
| 550 return new RunnableFunction<Function, Tuple8<A, B, C, D, E, F, G, H> >( | |
| 551 function, MakeTuple(a, b, c, d, e, f, g, h)); | |
| 552 } | |
| 553 | |
| 554 namespace base { | 460 namespace base { |
| 555 | 461 |
| 556 // ScopedTaskRunner is akin to scoped_ptr for Tasks. It ensures that the Task | 462 // ScopedTaskRunner is akin to scoped_ptr for Tasks. It ensures that the Task |
| 557 // is executed and deleted no matter how the current scope exits. | 463 // is executed and deleted no matter how the current scope exits. |
| 558 class BASE_EXPORT ScopedTaskRunner { | 464 class BASE_EXPORT ScopedTaskRunner { |
| 559 public: | 465 public: |
| 560 // Takes ownership of the task. | 466 // Takes ownership of the task. |
| 561 explicit ScopedTaskRunner(Task* task); | 467 explicit ScopedTaskRunner(Task* task); |
| 562 ~ScopedTaskRunner(); | 468 ~ScopedTaskRunner(); |
| 563 | 469 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 Task* task_; | 522 Task* task_; |
| 617 bool* should_leak_task_; | 523 bool* should_leak_task_; |
| 618 static bool kTaskLeakingDefault; | 524 static bool kTaskLeakingDefault; |
| 619 }; | 525 }; |
| 620 | 526 |
| 621 } // namespace subtle | 527 } // namespace subtle |
| 622 | 528 |
| 623 } // namespace base | 529 } // namespace base |
| 624 | 530 |
| 625 #endif // BASE_TASK_H_ | 531 #endif // BASE_TASK_H_ |
| OLD | NEW |