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/task.h" 16 #include "webrtc/base/taskrunner.h" 17 18 namespace rtc { 19 TaskParent(Task * derived_instance,TaskParent * parent)20TaskParent::TaskParent(Task* derived_instance, TaskParent *parent) 21 : parent_(parent) { 22 ASSERT(derived_instance != NULL); 23 ASSERT(parent != NULL); 24 runner_ = parent->GetRunner(); 25 parent_->AddChild(derived_instance); 26 Initialize(); 27 } 28 TaskParent(TaskRunner * derived_instance)29TaskParent::TaskParent(TaskRunner *derived_instance) 30 : parent_(NULL), 31 runner_(derived_instance) { 32 ASSERT(derived_instance != NULL); 33 Initialize(); 34 } 35 36 // Does common initialization of member variables Initialize()37void TaskParent::Initialize() { 38 children_.reset(new ChildSet()); 39 child_error_ = false; 40 } 41 AddChild(Task * child)42void TaskParent::AddChild(Task *child) { 43 children_->insert(child); 44 } 45 46 #ifdef _DEBUG IsChildTask(Task * task)47bool TaskParent::IsChildTask(Task *task) { 48 ASSERT(task != NULL); 49 return task->parent_ == this && children_->find(task) != children_->end(); 50 } 51 #endif 52 AllChildrenDone()53bool TaskParent::AllChildrenDone() { 54 for (ChildSet::iterator it = children_->begin(); 55 it != children_->end(); 56 ++it) { 57 if (!(*it)->IsDone()) 58 return false; 59 } 60 return true; 61 } 62 AnyChildError()63bool TaskParent::AnyChildError() { 64 return child_error_; 65 } 66 AbortAllChildren()67void TaskParent::AbortAllChildren() { 68 if (children_->size() > 0) { 69 #ifdef _DEBUG 70 runner_->IncrementAbortCount(); 71 #endif 72 73 ChildSet copy = *children_; 74 for (ChildSet::iterator it = copy.begin(); it != copy.end(); ++it) { 75 (*it)->Abort(true); // Note we do not wake 76 } 77 78 #ifdef _DEBUG 79 runner_->DecrementAbortCount(); 80 #endif 81 } 82 } 83 OnStopped(Task * task)84void TaskParent::OnStopped(Task *task) { 85 AbortAllChildren(); 86 parent_->OnChildStopped(task); 87 } 88 OnChildStopped(Task * child)89void TaskParent::OnChildStopped(Task *child) { 90 if (child->HasError()) 91 child_error_ = true; 92 children_->erase(child); 93 } 94 95 } // namespace rtc 96