• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/common.h"
16 #include "webrtc/base/task.h"
17 #include "webrtc/base/taskrunner.h"
18 
19 namespace rtc {
20 
TaskParent(Task * derived_instance,TaskParent * parent)21 TaskParent::TaskParent(Task* derived_instance, TaskParent *parent)
22     : parent_(parent) {
23   ASSERT(derived_instance != NULL);
24   ASSERT(parent != NULL);
25   runner_ = parent->GetRunner();
26   parent_->AddChild(derived_instance);
27   Initialize();
28 }
29 
TaskParent(TaskRunner * derived_instance)30 TaskParent::TaskParent(TaskRunner *derived_instance)
31     : parent_(NULL),
32       runner_(derived_instance) {
33   ASSERT(derived_instance != NULL);
34   Initialize();
35 }
36 
37 TaskParent::~TaskParent() = default;
38 
39 // Does common initialization of member variables
Initialize()40 void TaskParent::Initialize() {
41   children_.reset(new ChildSet());
42   child_error_ = false;
43 }
44 
AddChild(Task * child)45 void TaskParent::AddChild(Task *child) {
46   children_->insert(child);
47 }
48 
49 #if !defined(NDEBUG)
IsChildTask(Task * task)50 bool TaskParent::IsChildTask(Task *task) {
51   ASSERT(task != NULL);
52   return task->parent_ == this && children_->find(task) != children_->end();
53 }
54 #endif
55 
AllChildrenDone()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 
AnyChildError()66 bool TaskParent::AnyChildError() {
67   return child_error_;
68 }
69 
AbortAllChildren()70 void TaskParent::AbortAllChildren() {
71   if (children_->size() > 0) {
72 #if !defined(NDEBUG)
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 !defined(NDEBUG)
82     runner_->DecrementAbortCount();
83 #endif
84   }
85 }
86 
OnStopped(Task * task)87 void TaskParent::OnStopped(Task *task) {
88   AbortAllChildren();
89   parent_->OnChildStopped(task);
90 }
91 
OnChildStopped(Task * child)92 void TaskParent::OnChildStopped(Task *child) {
93   if (child->HasError())
94     child_error_ = true;
95   children_->erase(child);
96 }
97 
98 } // namespace rtc
99