| Index: media/base/callback.h
|
| ===================================================================
|
| --- media/base/callback.h (revision 86971)
|
| +++ media/base/callback.h (working copy)
|
| @@ -4,9 +4,9 @@
|
|
|
| // Some basic utilities for aiding in the management of Tasks and Callbacks.
|
| //
|
| -// AutoCallbackRunner is akin to scoped_ptr for callbacks. It is useful for
|
| -// ensuring a callback is executed and delete in the face of multiple return
|
| -// points in a function.
|
| +// AutoTaskRunner, and its brother AutoCallbackRunner are the scoped_ptr
|
| +// equivalents for callbacks. They are useful for ensuring a callback is
|
| +// executed and delete in the face of multiple return points in a function.
|
| //
|
| // TaskToCallbackAdapter converts a Task to a Callback0::Type since the two type
|
| // hierarchies are strangely separate.
|
| @@ -27,6 +27,23 @@
|
|
|
| namespace media {
|
|
|
| +class AutoTaskRunner {
|
| + public:
|
| + // Takes ownership of the task.
|
| + explicit AutoTaskRunner(Task* task)
|
| + : task_(task) {
|
| + }
|
| +
|
| + ~AutoTaskRunner();
|
| +
|
| + Task* release() { return task_.release(); }
|
| +
|
| + private:
|
| + scoped_ptr<Task> task_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AutoTaskRunner);
|
| +};
|
| +
|
| class AutoCallbackRunner {
|
| public:
|
| // Takes ownership of the callback.
|
| @@ -60,6 +77,38 @@
|
| DISALLOW_COPY_AND_ASSIGN(TaskToCallbackAdapter);
|
| };
|
|
|
| +template <typename CallbackType>
|
| +class CleanupCallback : public CallbackType {
|
| + public:
|
| + explicit CleanupCallback(CallbackType* callback) : callback_(callback) {}
|
| +
|
| + virtual ~CleanupCallback() {
|
| + for (size_t i = 0; i < run_when_done_.size(); i++) {
|
| + run_when_done_[i]->Run();
|
| + delete run_when_done_[i];
|
| + }
|
| + }
|
| +
|
| + virtual void RunWithParams(const typename CallbackType::TupleType& params) {
|
| + callback_->RunWithParams(params);
|
| + }
|
| +
|
| + template <typename T>
|
| + void DeleteWhenDone(T* ptr) {
|
| + RunWhenDone(new DeleteTask<T>(ptr));
|
| + }
|
| +
|
| + void RunWhenDone(Task* ptr) {
|
| + run_when_done_.push_back(ptr);
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<CallbackType> callback_;
|
| + std::vector<Task*> run_when_done_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CleanupCallback);
|
| +};
|
| +
|
| } // namespace media
|
|
|
| #endif // MEDIA_BASE_CALLBACK_
|
|
|