Home | History | Annotate | Download | only in quota
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "webkit/browser/quota/quota_task.h"
      6 
      7 #include <algorithm>
      8 #include <functional>
      9 
     10 #include "base/bind.h"
     11 #include "base/location.h"
     12 #include "base/message_loop/message_loop.h"
     13 #include "base/message_loop/message_loop_proxy.h"
     14 #include "base/single_thread_task_runner.h"
     15 
     16 using base::TaskRunner;
     17 
     18 namespace quota {
     19 
     20 // QuotaTask ---------------------------------------------------------------
     21 
     22 QuotaTask::~QuotaTask() {
     23 }
     24 
     25 void QuotaTask::Start() {
     26   DCHECK(observer_);
     27   observer()->RegisterTask(this);
     28   Run();
     29 }
     30 
     31 QuotaTask::QuotaTask(QuotaTaskObserver* observer)
     32     : observer_(observer),
     33       original_task_runner_(base::MessageLoopProxy::current()),
     34       delete_scheduled_(false) {
     35 }
     36 
     37 void QuotaTask::CallCompleted() {
     38   DCHECK(original_task_runner_->BelongsToCurrentThread());
     39   if (observer_) {
     40     observer_->UnregisterTask(this);
     41     Completed();
     42   }
     43 }
     44 
     45 void QuotaTask::Abort() {
     46   DCHECK(original_task_runner_->BelongsToCurrentThread());
     47   observer_ = NULL;
     48   Aborted();
     49 }
     50 
     51 void QuotaTask::DeleteSoon() {
     52   DCHECK(original_task_runner_->BelongsToCurrentThread());
     53   if (delete_scheduled_)
     54     return;
     55   delete_scheduled_ = true;
     56   base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
     57 }
     58 
     59 // QuotaTaskObserver -------------------------------------------------------
     60 
     61 QuotaTaskObserver::~QuotaTaskObserver() {
     62   std::for_each(running_quota_tasks_.begin(),
     63                 running_quota_tasks_.end(),
     64                 std::mem_fun(&QuotaTask::Abort));
     65 }
     66 
     67 QuotaTaskObserver::QuotaTaskObserver() {
     68 }
     69 
     70 void QuotaTaskObserver::RegisterTask(QuotaTask* task) {
     71   running_quota_tasks_.insert(task);
     72 }
     73 
     74 void QuotaTaskObserver::UnregisterTask(QuotaTask* task) {
     75   DCHECK(running_quota_tasks_.find(task) != running_quota_tasks_.end());
     76   running_quota_tasks_.erase(task);
     77 }
     78 
     79 }  // namespace quota
     80