summaryrefslogtreecommitdiffstats
path: root/storage/browser/quota/quota_task.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/browser/quota/quota_task.cc')
-rw-r--r--storage/browser/quota/quota_task.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/storage/browser/quota/quota_task.cc b/storage/browser/quota/quota_task.cc
new file mode 100644
index 0000000..b8d4ed1
--- /dev/null
+++ b/storage/browser/quota/quota_task.cc
@@ -0,0 +1,79 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "storage/browser/quota/quota_task.h"
+
+#include <algorithm>
+#include <functional>
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "base/single_thread_task_runner.h"
+
+using base::TaskRunner;
+
+namespace storage {
+
+// QuotaTask ---------------------------------------------------------------
+
+QuotaTask::~QuotaTask() {
+}
+
+void QuotaTask::Start() {
+ DCHECK(observer_);
+ observer()->RegisterTask(this);
+ Run();
+}
+
+QuotaTask::QuotaTask(QuotaTaskObserver* observer)
+ : observer_(observer),
+ original_task_runner_(base::MessageLoopProxy::current()),
+ delete_scheduled_(false) {
+}
+
+void QuotaTask::CallCompleted() {
+ DCHECK(original_task_runner_->BelongsToCurrentThread());
+ if (observer_) {
+ observer_->UnregisterTask(this);
+ Completed();
+ }
+}
+
+void QuotaTask::Abort() {
+ DCHECK(original_task_runner_->BelongsToCurrentThread());
+ observer_ = NULL;
+ Aborted();
+}
+
+void QuotaTask::DeleteSoon() {
+ DCHECK(original_task_runner_->BelongsToCurrentThread());
+ if (delete_scheduled_)
+ return;
+ delete_scheduled_ = true;
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
+}
+
+// QuotaTaskObserver -------------------------------------------------------
+
+QuotaTaskObserver::~QuotaTaskObserver() {
+ std::for_each(running_quota_tasks_.begin(),
+ running_quota_tasks_.end(),
+ std::mem_fun(&QuotaTask::Abort));
+}
+
+QuotaTaskObserver::QuotaTaskObserver() {
+}
+
+void QuotaTaskObserver::RegisterTask(QuotaTask* task) {
+ running_quota_tasks_.insert(task);
+}
+
+void QuotaTaskObserver::UnregisterTask(QuotaTask* task) {
+ DCHECK(running_quota_tasks_.find(task) != running_quota_tasks_.end());
+ running_quota_tasks_.erase(task);
+}
+
+} // namespace storage