| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /* | 
|  | 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
|  | 3  * | 
|  | 4  *  Use of this source code is governed by a BSD-style license | 
|  | 5  *  that can be found in the LICENSE file in the root of the source | 
|  | 6  *  tree. An additional intellectual property rights grant can be found | 
|  | 7  *  in the file PATENTS.  All contributing project authors may | 
|  | 8  *  be found in the AUTHORS file in the root of the source tree. | 
|  | 9  */ | 
|  | 10 | 
|  | 11 #include <algorithm> | 
|  | 12 | 
|  | 13 #include "webrtc/base/taskparent.h" | 
|  | 14 | 
|  | 15 #include "webrtc/base/checks.h" | 
|  | 16 #include "webrtc/base/task.h" | 
|  | 17 #include "webrtc/base/taskrunner.h" | 
|  | 18 | 
|  | 19 namespace rtc { | 
|  | 20 | 
|  | 21 TaskParent::TaskParent(Task* derived_instance, TaskParent *parent) | 
|  | 22     : parent_(parent) { | 
|  | 23   RTC_DCHECK(derived_instance != NULL); | 
|  | 24   RTC_DCHECK(parent != NULL); | 
|  | 25   runner_ = parent->GetRunner(); | 
|  | 26   parent_->AddChild(derived_instance); | 
|  | 27   Initialize(); | 
|  | 28 } | 
|  | 29 | 
|  | 30 TaskParent::TaskParent(TaskRunner *derived_instance) | 
|  | 31     : parent_(NULL), | 
|  | 32       runner_(derived_instance) { | 
|  | 33   RTC_DCHECK(derived_instance != NULL); | 
|  | 34   Initialize(); | 
|  | 35 } | 
|  | 36 | 
|  | 37 TaskParent::~TaskParent() = default; | 
|  | 38 | 
|  | 39 // Does common initialization of member variables | 
|  | 40 void TaskParent::Initialize() { | 
|  | 41   children_.reset(new ChildSet()); | 
|  | 42   child_error_ = false; | 
|  | 43 } | 
|  | 44 | 
|  | 45 void TaskParent::AddChild(Task *child) { | 
|  | 46   children_->insert(child); | 
|  | 47 } | 
|  | 48 | 
|  | 49 #if RTC_DCHECK_IS_ON | 
|  | 50 bool TaskParent::IsChildTask(Task *task) { | 
|  | 51   RTC_DCHECK(task != NULL); | 
|  | 52   return task->parent_ == this && children_->find(task) != children_->end(); | 
|  | 53 } | 
|  | 54 #endif | 
|  | 55 | 
|  | 56 bool TaskParent::AllChildrenDone() { | 
|  | 57   for (ChildSet::iterator it = children_->begin(); | 
|  | 58        it != children_->end(); | 
|  | 59        ++it) { | 
|  | 60     if (!(*it)->IsDone()) | 
|  | 61       return false; | 
|  | 62   } | 
|  | 63   return true; | 
|  | 64 } | 
|  | 65 | 
|  | 66 bool TaskParent::AnyChildError() { | 
|  | 67   return child_error_; | 
|  | 68 } | 
|  | 69 | 
|  | 70 void TaskParent::AbortAllChildren() { | 
|  | 71   if (children_->size() > 0) { | 
|  | 72 #if RTC_DCHECK_IS_ON | 
|  | 73     runner_->IncrementAbortCount(); | 
|  | 74 #endif | 
|  | 75 | 
|  | 76     ChildSet copy = *children_; | 
|  | 77     for (ChildSet::iterator it = copy.begin(); it != copy.end(); ++it) { | 
|  | 78       (*it)->Abort(true);  // Note we do not wake | 
|  | 79     } | 
|  | 80 | 
|  | 81 #if RTC_DCHECK_IS_ON | 
|  | 82     runner_->DecrementAbortCount(); | 
|  | 83 #endif | 
|  | 84   } | 
|  | 85 } | 
|  | 86 | 
|  | 87 void TaskParent::OnStopped(Task *task) { | 
|  | 88   AbortAllChildren(); | 
|  | 89   parent_->OnChildStopped(task); | 
|  | 90 } | 
|  | 91 | 
|  | 92 void TaskParent::OnChildStopped(Task *child) { | 
|  | 93   if (child->HasError()) | 
|  | 94     child_error_ = true; | 
|  | 95   children_->erase(child); | 
|  | 96 } | 
|  | 97 | 
|  | 98 } // namespace rtc | 
| OLD | NEW | 
|---|