1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/task.h"
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/common.h"
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/taskrunner.h"
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
170c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmint32_t Task::unique_id_seed_ = 0;
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTask::Task(TaskParent *parent)
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    : TaskParent(this, parent),
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      state_(STATE_INIT),
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      blocked_(false),
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      done_(false),
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      aborted_(false),
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      busy_(false),
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      error_(false),
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      start_time_(0),
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      timeout_time_(0),
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      timeout_seconds_(0),
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      timeout_suspended_(false)  {
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  unique_id_ = unique_id_seed_++;
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // sanity check that we didn't roll-over our id seed
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT(unique_id_ < unique_id_seed_);
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgTask::~Task() {
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Is this task being deleted in the correct manner?
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT(!done_ || GetRunner()->is_ok_to_delete(this));
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT(state_ == STATE_INIT || done_);
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ASSERT(state_ == STATE_INIT || blocked_);
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // If the task is being deleted without being done, it
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // means that it hasn't been removed from its parent.
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // This happens if a task is deleted outside of TaskRunner.
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!done_) {
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Stop();
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
510c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmint64_t Task::CurrentTime() {
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return GetRunner()->CurrentTime();
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
550c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmint64_t Task::ElapsedTime() {
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return CurrentTime() - start_time_;
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Start() {
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (state_ != STATE_INIT)
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Set the start time before starting the task.  Otherwise if the task
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // finishes quickly and deletes the Task object, setting start_time_
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // will crash.
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  start_time_ = CurrentTime();
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  GetRunner()->StartTask(this);
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Step() {
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (done_) {
71a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina#if !defined(NDEBUG)
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // we do not know how !blocked_ happens when done_ - should be impossible.
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // But it causes problems, so in retail build, we force blocked_, and
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // under debug we assert.
75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(blocked_);
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#else
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = true;
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Async Error() was called
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (error_) {
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done_ = true;
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    state_ = STATE_ERROR;
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = true;
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   obsolete - an errored task is not considered done now
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//   SignalDone();
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Stop();
91a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina#if !defined(NDEBUG)
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // verify that stop removed this from its parent
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  busy_ = true;
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int new_state = Process(state_);
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  busy_ = false;
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (aborted_) {
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Abort(true);  // no need to wake because we're awake
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (new_state == STATE_BLOCKED) {
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = true;
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // Let the timeout continue
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    state_ = new_state;
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = false;
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ResetTimeout();
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (new_state == STATE_DONE) {
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done_ = true;
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else if (new_state == STATE_ERROR) {
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done_ = true;
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    error_ = true;
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (done_) {
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//  obsolete - call this yourself
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org//    SignalDone();
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Stop();
128a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina#if !defined(NDEBUG)
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // verify that stop removed this from its parent
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = true;
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Abort(bool nowake) {
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Why only check for done_ (instead of "aborted_ || done_")?
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  //
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // If aborted_ && !done_, it means the logic for aborting still
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // needs to be executed (because busy_ must have been true when
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // Abort() was previously called).
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (done_)
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  aborted_ = true;
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!busy_) {
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    done_ = true;
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = true;
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    error_ = true;
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // "done_" is set before calling "Stop()" to ensure that this code
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // doesn't execute more than once (recursively) for the same task.
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Stop();
153a41ab9326c8f0f7eb738e5d51a239a2b9e276361tfarina#if !defined(NDEBUG)
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    // verify that stop removed this from its parent
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ASSERT(!parent()->IsChildTask(this));
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    if (!nowake) {
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // WakeTasks to self-delete.
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // Don't call Wake() because it is a no-op after "done_" is set.
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      // Even if Wake() did run, it clears "blocked_" which isn't desireable.
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      GetRunner()->WakeTasks();
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Wake() {
167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (done_)
168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (blocked_) {
170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    blocked_ = false;
171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    GetRunner()->WakeTasks();
172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Error() {
176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (error_ || done_)
177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    return;
178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  error_ = true;
179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Wake();
180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgstd::string Task::GetStateName(int state) const {
183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  switch (state) {
184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_BLOCKED: return "BLOCKED";
185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_INIT: return "INIT";
186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_START: return "START";
187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_DONE: return "DONE";
188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_ERROR: return "ERROR";
189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    case STATE_RESPONSE: return "RESPONSE";
190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return "??";
192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgint Task::Process(int state) {
195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int newstate = STATE_ERROR;
196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (TimedOut()) {
198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ClearTimeout();
199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    newstate = OnTimeout();
200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    SignalTimeout();
201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  } else {
202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    switch (state) {
203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      case STATE_INIT:
204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        newstate = STATE_START;
205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        break;
206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      case STATE_START:
207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        newstate = ProcessStart();
208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        break;
209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      case STATE_RESPONSE:
210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        newstate = ProcessResponse();
211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        break;
212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      case STATE_DONE:
213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org      case STATE_ERROR:
214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        newstate = STATE_BLOCKED;
215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org        break;
216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    }
217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return newstate;
220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::Stop() {
223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // No need to wake because we're either awake or in abort
224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  TaskParent::OnStopped(this);
225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
22767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.orgint Task::ProcessResponse() {
22867186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  return STATE_DONE;
22967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org}
23067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org
231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::set_timeout_seconds(const int timeout_seconds) {
232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  timeout_seconds_ = timeout_seconds;
233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ResetTimeout();
234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgbool Task::TimedOut() {
237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  return timeout_seconds_ &&
238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    timeout_time_ &&
239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    CurrentTime() >= timeout_time_;
240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::ResetTimeout() {
2430c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  int64_t previous_timeout_time = timeout_time_;
244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool timeout_allowed = (state_ != STATE_INIT)
245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      && (state_ != STATE_DONE)
246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                      && (state_ != STATE_ERROR);
247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (timeout_seconds_ && timeout_allowed && !timeout_suspended_)
248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    timeout_time_ = CurrentTime() +
249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org                    (timeout_seconds_ * kSecToMsec * kMsecTo100ns);
250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  else
251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    timeout_time_ = 0;
252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  GetRunner()->UpdateTaskTimeout(this, previous_timeout_time);
254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::ClearTimeout() {
2570c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  int64_t previous_timeout_time = timeout_time_;
258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  timeout_time_ = 0;
259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  GetRunner()->UpdateTaskTimeout(this, previous_timeout_time);
260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::SuspendTimeout() {
263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (!timeout_suspended_) {
264f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    timeout_suspended_ = true;
265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ResetTimeout();
266f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
268f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgvoid Task::ResumeTimeout() {
270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  if (timeout_suspended_) {
271f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    timeout_suspended_ = false;
272f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    ResetTimeout();
273f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
274f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}
275f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
27667186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.orgint Task::OnTimeout() {
27767186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  // by default, we are finished after timing out
27867186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org  return STATE_DONE;
27967186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org}
28067186fe00cc68cbe03aa66d17fb4962458ca96d2kwiberg@webrtc.org
281f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc
282