Chromium Code Reviews| Index: base/task.h |
| diff --git a/base/task.h b/base/task.h |
| index ae47f32615b1b789db5b8a841b5908e62a9ed57d..66d1ab666771d1f01637ba174d281fa9a8838993 100644 |
| --- a/base/task.h |
| +++ b/base/task.h |
| @@ -564,6 +564,57 @@ class BASE_API ScopedTaskRunner { |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedTaskRunner); |
| }; |
| +namespace subtle { |
|
darin (slow to review)
2011/07/07 21:54:01
nit: new line after namespace
awong
2011/07/08 00:38:40
Done.
|
| +// This class is meant for use in the implementation of MessageLoop classes |
| +// such as MessageLoop, MessageLoopProxy, BrowserThread, and WorkerPool to |
| +// implement the compatibiltiy APIs while we are transitioning from Task to |
| +// Callback. |
| +// |
| +// It should NOT be used anywhere else! |
| +// |
| +// In particular, notice that the this is RefCounted instead of |
| +// RefCountedThreadSafe. We rely on the fact thas users of this class are |
| +// careful to ensure that a lock is taken during transfer of ownership for |
| +// objects from this class to ensure the refcount is not corrupted. |
| +class TaskClosureAdapter : public RefCounted<TaskClosureAdapter> { |
| + public: |
| + explicit TaskClosureAdapter(Task* task) |
| + : task_(task), |
| + should_leak_task_(&kTaskLeakingDefault) { |
| + } |
| + |
| + // |should_leak_task| points to a flag variable that can be used to determine |
| + // if this class should leak the Task on destruction. This is important |
| + // at MessageLoop shutdown since not all tasks can be safely deleted without |
| + // running. See MessageLoop::DeletePendingTasks() for the exact behavior |
| + // of when a Task should be deleted. It is subtle. |
| + TaskClosureAdapter(Task* task, bool* should_leak_task) |
| + : task_(task), |
| + should_leak_task_(should_leak_task) { |
| + } |
| + |
| + void Run() { |
| + task_->Run(); |
| + delete task_; |
| + task_ = NULL; |
| + } |
| + |
| + private: |
| + friend class base::RefCounted<TaskClosureAdapter>; |
| + |
| + ~TaskClosureAdapter() { |
| + if (!*should_leak_task_) { |
| + delete task_; |
| + } |
| + } |
| + |
| + Task* task_; |
| + bool* should_leak_task_; |
| + static bool kTaskLeakingDefault; |
| +}; |
| + |
| +} // namespace subtle |
| + |
| } // namespace base |
| #endif // BASE_TASK_H_ |