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 "webrtc/base/task.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/common.h"
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/taskrunner.h"
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint32 Task::unique_id_seed_ = 0;
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTask::Task(TaskParent *parent)
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    : TaskParent(this, parent),
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      state_(STATE_INIT),
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      blocked_(false),
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      done_(false),
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      aborted_(false),
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      busy_(false),
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      error_(false),
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      start_time_(0),
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      timeout_time_(0),
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      timeout_seconds_(0),
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      timeout_suspended_(false)  {
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  unique_id_ = unique_id_seed_++;
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // sanity check that we didn't roll-over our id seed
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(unique_id_ < unique_id_seed_);
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTask::~Task() {
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Is this task being deleted in the correct manner?
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(!done_ || GetRunner()->is_ok_to_delete(this));
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(state_ == STATE_INIT || done_);
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT(state_ == STATE_INIT || blocked_);
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // If the task is being deleted without being done, it
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // means that it hasn't been removed from its parent.
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // This happens if a task is deleted outside of TaskRunner.
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!done_) {
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Stop();
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint64 Task::CurrentTime() {
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetRunner()->CurrentTime();
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint64 Task::ElapsedTime() {
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return CurrentTime() - start_time_;
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Start() {
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (state_ != STATE_INIT)
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Set the start time before starting the task.  Otherwise if the task
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // finishes quickly and deletes the Task object, setting start_time_
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // will crash.
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  start_time_ = CurrentTime();
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  GetRunner()->StartTask(this);
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Step() {
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (done_) {
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // we do not know how !blocked_ happens when done_ - should be impossible.
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // But it causes problems, so in retail build, we force blocked_, and
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // under debug we assert.
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ASSERT(blocked_);
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = true;
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Async Error() was called
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (error_) {
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    done_ = true;
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    state_ = STATE_ERROR;
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = true;
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   obsolete - an errored task is not considered done now
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//   SignalDone();
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Stop();
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // verify that stop removed this from its parent
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  busy_ = true;
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int new_state = Process(state_);
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  busy_ = false;
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (aborted_) {
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Abort(true);  // no need to wake because we're awake
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (new_state == STATE_BLOCKED) {
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = true;
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // Let the timeout continue
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    state_ = new_state;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = false;
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ResetTimeout();
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (new_state == STATE_DONE) {
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    done_ = true;
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else if (new_state == STATE_ERROR) {
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    done_ = true;
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    error_ = true;
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (done_) {
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//  obsolete - call this yourself
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org//    SignalDone();
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Stop();
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if _DEBUG
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // verify that stop removed this from its parent
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = true;
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Abort(bool nowake) {
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Why only check for done_ (instead of "aborted_ || done_")?
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  //
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // If aborted_ && !done_, it means the logic for aborting still
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // needs to be executed (because busy_ must have been true when
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Abort() was previously called).
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (done_)
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  aborted_ = true;
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!busy_) {
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    done_ = true;
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = true;
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    error_ = true;
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // "done_" is set before calling "Stop()" to ensure that this code
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // doesn't execute more than once (recursively) for the same task.
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Stop();
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // verify that stop removed this from its parent
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!nowake) {
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // WakeTasks to self-delete.
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // Don't call Wake() because it is a no-op after "done_" is set.
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // Even if Wake() did run, it clears "blocked_" which isn't desireable.
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      GetRunner()->WakeTasks();
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Wake() {
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (done_)
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (blocked_) {
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    blocked_ = false;
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    GetRunner()->WakeTasks();
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Error() {
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (error_ || done_)
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  error_ = true;
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Wake();
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstd::string Task::GetStateName(int state) const {
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  switch (state) {
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_BLOCKED: return "BLOCKED";
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_INIT: return "INIT";
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_START: return "START";
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_DONE: return "DONE";
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_ERROR: return "ERROR";
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    case STATE_RESPONSE: return "RESPONSE";
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return "??";
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint Task::Process(int state) {
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int newstate = STATE_ERROR;
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (TimedOut()) {
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ClearTimeout();
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    newstate = OnTimeout();
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    SignalTimeout();
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  } else {
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    switch (state) {
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      case STATE_INIT:
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        newstate = STATE_START;
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        break;
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      case STATE_START:
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        newstate = ProcessStart();
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        break;
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      case STATE_RESPONSE:
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        newstate = ProcessResponse();
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        break;
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      case STATE_DONE:
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      case STATE_ERROR:
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        newstate = STATE_BLOCKED;
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        break;
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return newstate;
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::Stop() {
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // No need to wake because we're either awake or in abort
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  TaskParent::OnStopped(this);
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::set_timeout_seconds(const int timeout_seconds) {
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  timeout_seconds_ = timeout_seconds;
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ResetTimeout();
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgbool Task::TimedOut() {
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return timeout_seconds_ &&
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    timeout_time_ &&
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    CurrentTime() >= timeout_time_;
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::ResetTimeout() {
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int64 previous_timeout_time = timeout_time_;
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool timeout_allowed = (state_ != STATE_INIT)
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                      && (state_ != STATE_DONE)
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                      && (state_ != STATE_ERROR);
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (timeout_seconds_ && timeout_allowed && !timeout_suspended_)
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    timeout_time_ = CurrentTime() +
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    (timeout_seconds_ * kSecToMsec * kMsecTo100ns);
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  else
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    timeout_time_ = 0;
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  GetRunner()->UpdateTaskTimeout(this, previous_timeout_time);
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::ClearTimeout() {
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int64 previous_timeout_time = timeout_time_;
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  timeout_time_ = 0;
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  GetRunner()->UpdateTaskTimeout(this, previous_timeout_time);
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::SuspendTimeout() {
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!timeout_suspended_) {
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    timeout_suspended_ = true;
26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ResetTimeout();
26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid Task::ResumeTimeout() {
26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (timeout_suspended_) {
26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    timeout_suspended_ = false;
26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ResetTimeout();
26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc
273