147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <algorithm>
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/taskparent.h"
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/task.h"
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/taskrunner.h"
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTaskParent::TaskParent(Task* derived_instance, TaskParent *parent)
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    : parent_(parent) {
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(derived_instance != NULL);
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(parent != NULL);
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  runner_ = parent->GetRunner();
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  parent_->AddChild(derived_instance);
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Initialize();
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTaskParent::TaskParent(TaskRunner *derived_instance)
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    : parent_(NULL),
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      runner_(derived_instance) {
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(derived_instance != NULL);
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Initialize();
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Does common initialization of member variables
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TaskParent::Initialize() {
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  children_.reset(new ChildSet());
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  child_error_ = false;
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TaskParent::AddChild(Task *child) {
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  children_->insert(child);
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool TaskParent::IsChildTask(Task *task) {
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(task != NULL);
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return task->parent_ == this && children_->find(task) != children_->end();
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool TaskParent::AllChildrenDone() {
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (ChildSet::iterator it = children_->begin();
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != children_->end();
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       ++it) {
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!(*it)->IsDone())
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return true;
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool TaskParent::AnyChildError() {
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return child_error_;
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TaskParent::AbortAllChildren() {
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (children_->size() > 0) {
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    runner_->IncrementAbortCount();
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ChildSet copy = *children_;
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    for (ChildSet::iterator it = copy.begin(); it != copy.end(); ++it) {
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (*it)->Abort(true);  // Note we do not wake
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    runner_->DecrementAbortCount();
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TaskParent::OnStopped(Task *task) {
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  AbortAllChildren();
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  parent_->OnChildStopped(task);
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TaskParent::OnChildStopped(Task *child) {
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (child->HasError())
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    child_error_ = true;
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  children_->erase(child);
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc
96