Index: base/task.h |
diff --git a/base/task.h b/base/task.h |
index 9666a65c0b5c26df0e406e1a571bcad5c8ba3c3c..f22300a6c99b8d6888f1967cdded494fa20a0ee9 100644 |
--- a/base/task.h |
+++ b/base/task.h |
@@ -70,231 +70,9 @@ void DeletePointer(T* obj) { |
delete obj; |
} |
-// RunnableMethodTraits -------------------------------------------------------- |
-// |
-// This traits-class is used by RunnableMethod to manage the lifetime of the |
-// callee object. By default, it is assumed that the callee supports AddRef |
-// and Release methods. A particular class can specialize this template to |
-// define other lifetime management. For example, if the callee is known to |
-// live longer than the RunnableMethod object, then a RunnableMethodTraits |
-// struct could be defined with empty RetainCallee and ReleaseCallee methods. |
-// |
-// The DISABLE_RUNNABLE_METHOD_REFCOUNT macro is provided as a convenient way |
-// for declaring a RunnableMethodTraits that disables refcounting. |
- |
-template <class T> |
-struct RunnableMethodTraits { |
- RunnableMethodTraits() { |
-#ifndef NDEBUG |
- origin_thread_id_ = base::PlatformThread::CurrentId(); |
-#endif |
- } |
- |
- ~RunnableMethodTraits() { |
-#ifndef NDEBUG |
- // If destroyed on a separate thread, then we had better have been using |
- // thread-safe reference counting! |
- if (origin_thread_id_ != base::PlatformThread::CurrentId()) |
- DCHECK(T::ImplementsThreadSafeReferenceCounting()); |
-#endif |
- } |
- |
- void RetainCallee(T* obj) { |
-#ifndef NDEBUG |
- // Catch NewRunnableMethod being called in an object's constructor. This |
- // isn't safe since the method can be invoked before the constructor |
- // completes, causing the object to be deleted. |
- obj->AddRef(); |
- obj->Release(); |
-#endif |
- obj->AddRef(); |
- } |
- |
- void ReleaseCallee(T* obj) { |
- obj->Release(); |
- } |
- |
- private: |
-#ifndef NDEBUG |
- base::PlatformThreadId origin_thread_id_; |
-#endif |
-}; |
- |
-// Convenience macro for declaring a RunnableMethodTraits that disables |
-// refcounting of a class. This is useful if you know that the callee |
-// will outlive the RunnableMethod object and thus do not need the ref counts. |
-// |
-// The invocation of DISABLE_RUNNABLE_METHOD_REFCOUNT should be done at the |
-// global namespace scope. Example: |
-// |
-// namespace foo { |
-// class Bar { |
-// ... |
-// }; |
-// } // namespace foo |
-// |
-// DISABLE_RUNNABLE_METHOD_REFCOUNT(foo::Bar); |
-// |
-// This is different from DISALLOW_COPY_AND_ASSIGN which is declared inside the |
-// class. |
-#define DISABLE_RUNNABLE_METHOD_REFCOUNT(TypeName) \ |
- template <> \ |
- struct RunnableMethodTraits<TypeName> { \ |
- void RetainCallee(TypeName* manager) {} \ |
- void ReleaseCallee(TypeName* manager) {} \ |
- } |
- |
-// RunnableMethod -------------------------------------------------------------- |
-// |
-// Runnable methods are a type of task that call a function on an object when |
-// they are run. We implement both an object and a set of NewRunnableMethod |
-// functions for convenience. These functions are overloaded and will infer the |
-// template types, simplifying calling code. |
-// |
-// The template definitions all use the following names: |
-// T - the class type of the object you're supplying |
-// this is not needed for the Static version of the call |
-// Method/Function - the signature of a pointer to the method or function you |
-// want to call |
-// Param - the parameter(s) to the method, possibly packed as a Tuple |
-// A - the first parameter (if any) to the method |
-// B - the second parameter (if any) to the method |
-// |
-// Put these all together and you get an object that can call a method whose |
-// signature is: |
-// R T::MyFunction([A[, B]]) |
-// |
-// Usage: |
-// PostTask(FROM_HERE, NewRunnableMethod(object, &Object::method[, a[, b]]) |
- |
-// RunnableMethod and NewRunnableMethod implementation ------------------------- |
- |
-template <class T, class Method, class Params> |
-class RunnableMethod : public CancelableTask { |
- public: |
- RunnableMethod(T* obj, Method meth, const Params& params) |
- : obj_(obj), meth_(meth), params_(params) { |
- traits_.RetainCallee(obj_); |
- COMPILE_ASSERT( |
- (base::internal::ParamsUseScopedRefptrCorrectly<Params>::value), |
- badrunnablemethodparams); |
- } |
- |
- ~RunnableMethod() { |
- ReleaseCallee(); |
- obj_ = reinterpret_cast<T*>(base::kDeadTask); |
- } |
- |
- virtual void Run() { |
- if (obj_) |
- DispatchToMethod(obj_, meth_, params_); |
- } |
- |
- virtual void Cancel() { |
- ReleaseCallee(); |
- } |
- |
- private: |
- void ReleaseCallee() { |
- T* obj = obj_; |
- obj_ = NULL; |
- if (obj) |
- traits_.ReleaseCallee(obj); |
- } |
- |
- T* obj_; |
- Method meth_; |
- Params params_; |
- RunnableMethodTraits<T> traits_; |
-}; |
- |
-template <class T, class Method> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method) { |
- return new RunnableMethod<T, Method, Tuple0>(object, method, MakeTuple()); |
-} |
- |
-template <class T, class Method, class A> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, const A& a) { |
- return new RunnableMethod<T, Method, Tuple1<A> >(object, |
- method, |
- MakeTuple(a)); |
-} |
- |
-template <class T, class Method, class A, class B> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
-const A& a, const B& b) { |
- return new RunnableMethod<T, Method, Tuple2<A, B> >(object, method, |
- MakeTuple(a, b)); |
-} |
- |
-template <class T, class Method, class A, class B, class C> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, const C& c) { |
- return new RunnableMethod<T, Method, Tuple3<A, B, C> >(object, method, |
- MakeTuple(a, b, c)); |
-} |
- |
-template <class T, class Method, class A, class B, class C, class D> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, |
- const C& c, const D& d) { |
- return new RunnableMethod<T, Method, Tuple4<A, B, C, D> >(object, method, |
- MakeTuple(a, b, |
- c, d)); |
-} |
- |
-template <class T, class Method, class A, class B, class C, class D, class E> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, |
- const C& c, const D& d, const E& e) { |
- return new RunnableMethod<T, |
- Method, |
- Tuple5<A, B, C, D, E> >(object, |
- method, |
- MakeTuple(a, b, c, d, e)); |
-} |
- |
-template <class T, class Method, class A, class B, class C, class D, class E, |
- class F> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, |
- const C& c, const D& d, const E& e, |
- const F& f) { |
- return new RunnableMethod<T, |
- Method, |
- Tuple6<A, B, C, D, E, F> >(object, |
- method, |
- MakeTuple(a, b, c, d, e, |
- f)); |
-} |
- |
-template <class T, class Method, class A, class B, class C, class D, class E, |
- class F, class G> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, |
- const C& c, const D& d, const E& e, |
- const F& f, const G& g) { |
- return new RunnableMethod<T, |
- Method, |
- Tuple7<A, B, C, D, E, F, G> >(object, |
- method, |
- MakeTuple(a, b, c, d, |
- e, f, g)); |
-} |
- |
-template <class T, class Method, class A, class B, class C, class D, class E, |
- class F, class G, class H> |
-inline CancelableTask* NewRunnableMethod(T* object, Method method, |
- const A& a, const B& b, |
- const C& c, const D& d, const E& e, |
- const F& f, const G& g, const H& h) { |
- return new RunnableMethod<T, |
- Method, |
- Tuple8<A, B, C, D, E, F, G, H> >(object, |
- method, |
- MakeTuple(a, b, c, |
- d, e, f, |
- g, h)); |
+template<typename T> |
+void ReleasePointer(T* obj) { |
+ obj->Release(); |
} |
namespace base { |