| Index: third_party/libjingle_xmpp/task_runner/taskparent.cc
 | 
| diff --git a/third_party/libjingle_xmpp/task_runner/taskparent.cc b/third_party/libjingle_xmpp/task_runner/taskparent.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d0245ab04aee9841454132a8d2e836baea7a846b
 | 
| --- /dev/null
 | 
| +++ b/third_party/libjingle_xmpp/task_runner/taskparent.cc
 | 
| @@ -0,0 +1,98 @@
 | 
| +/*
 | 
| + *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
 | 
| + *
 | 
| + *  Use of this source code is governed by a BSD-style license
 | 
| + *  that can be found in the LICENSE file in the root of the source
 | 
| + *  tree. An additional intellectual property rights grant can be found
 | 
| + *  in the file PATENTS.  All contributing project authors may
 | 
| + *  be found in the AUTHORS file in the root of the source tree.
 | 
| + */
 | 
| +
 | 
| +#include <algorithm>
 | 
| +
 | 
| +#include "third_party/libjingle_xmpp/task_runner/taskparent.h"
 | 
| +
 | 
| +#include "third_party/libjingle_xmpp/task_runner/taskrunner.h"
 | 
| +#include "third_party/libjingle_xmpp/task_runner/task.h"
 | 
| +#include "third_party/webrtc/base/checks.h"
 | 
| +
 | 
| +namespace rtc {
 | 
| +
 | 
| +TaskParent::TaskParent(Task* derived_instance, TaskParent *parent)
 | 
| +    : parent_(parent) {
 | 
| +  RTC_DCHECK(derived_instance != NULL);
 | 
| +  RTC_DCHECK(parent != NULL);
 | 
| +  runner_ = parent->GetRunner();
 | 
| +  parent_->AddChild(derived_instance);
 | 
| +  Initialize();
 | 
| +}
 | 
| +
 | 
| +TaskParent::TaskParent(TaskRunner *derived_instance)
 | 
| +    : parent_(NULL),
 | 
| +      runner_(derived_instance) {
 | 
| +  RTC_DCHECK(derived_instance != NULL);
 | 
| +  Initialize();
 | 
| +}
 | 
| +
 | 
| +TaskParent::~TaskParent() = default;
 | 
| +
 | 
| +// Does common initialization of member variables
 | 
| +void TaskParent::Initialize() {
 | 
| +  children_.reset(new ChildSet());
 | 
| +  child_error_ = false;
 | 
| +}
 | 
| +
 | 
| +void TaskParent::AddChild(Task *child) {
 | 
| +  children_->insert(child);
 | 
| +}
 | 
| +
 | 
| +#if RTC_DCHECK_IS_ON
 | 
| +bool TaskParent::IsChildTask(Task *task) {
 | 
| +  RTC_DCHECK(task != NULL);
 | 
| +  return task->parent_ == this && children_->find(task) != children_->end();
 | 
| +}
 | 
| +#endif
 | 
| +
 | 
| +bool TaskParent::AllChildrenDone() {
 | 
| +  for (ChildSet::iterator it = children_->begin();
 | 
| +       it != children_->end();
 | 
| +       ++it) {
 | 
| +    if (!(*it)->IsDone())
 | 
| +      return false;
 | 
| +  }
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +bool TaskParent::AnyChildError() {
 | 
| +  return child_error_;
 | 
| +}
 | 
| +
 | 
| +void TaskParent::AbortAllChildren() {
 | 
| +  if (children_->size() > 0) {
 | 
| +#if RTC_DCHECK_IS_ON
 | 
| +    runner_->IncrementAbortCount();
 | 
| +#endif
 | 
| +
 | 
| +    ChildSet copy = *children_;
 | 
| +    for (ChildSet::iterator it = copy.begin(); it != copy.end(); ++it) {
 | 
| +      (*it)->Abort(true);  // Note we do not wake
 | 
| +    }
 | 
| +
 | 
| +#if RTC_DCHECK_IS_ON
 | 
| +    runner_->DecrementAbortCount();
 | 
| +#endif
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void TaskParent::OnStopped(Task *task) {
 | 
| +  AbortAllChildren();
 | 
| +  parent_->OnChildStopped(task);
 | 
| +}
 | 
| +
 | 
| +void TaskParent::OnChildStopped(Task *child) {
 | 
| +  if (child->HasError())
 | 
| +    child_error_ = true;
 | 
| +  children_->erase(child);
 | 
| +}
 | 
| +
 | 
| +} // namespace rtc
 | 
| 
 |