15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2006, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/task.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/taskrunner.h" 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint32 Task::unique_id_seed_ = 0; 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTask::Task(TaskParent *parent) 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : TaskParent(this, parent), 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org state_(STATE_INIT), 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_(false), 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org done_(false), 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org aborted_(false), 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org busy_(false), 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_(false), 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org start_time_(0), 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_time_(0), 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_seconds_(0), 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_suspended_(false) { 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unique_id_ = unique_id_seed_++; 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // sanity check that we didn't roll-over our id seed 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(unique_id_ < unique_id_seed_); 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTask::~Task() { 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Is this task being deleted in the correct manner? 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(!done_ || GetRunner()->is_ok_to_delete(this)); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(state_ == STATE_INIT || done_); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(state_ == STATE_INIT || blocked_); 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If the task is being deleted without being done, it 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // means that it hasn't been removed from its parent. 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // This happens if a task is deleted outside of TaskRunner. 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!done_) { 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Stop(); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint64 Task::CurrentTime() { 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return GetRunner()->CurrentTime(); 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint64 Task::ElapsedTime() { 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return CurrentTime() - start_time_; 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Start() { 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (state_ != STATE_INIT) 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set the start time before starting the task. Otherwise if the task 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // finishes quickly and deletes the Task object, setting start_time_ 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // will crash. 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org start_time_ = CurrentTime(); 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetRunner()->StartTask(this); 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Step() { 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (done_) { 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef _DEBUG 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // we do not know how !blocked_ happens when done_ - should be impossible. 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // But it causes problems, so in retail build, we force blocked_, and 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // under debug we assert. 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(blocked_); 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#else 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = true; 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Async Error() was called 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (error_) { 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org done_ = true; 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org state_ = STATE_ERROR; 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = true; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// obsolete - an errored task is not considered done now 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// SignalDone(); 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Stop(); 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef _DEBUG 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // verify that stop removed this from its parent 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(!parent()->IsChildTask(this)); 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org busy_ = true; 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int new_state = Process(state_); 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org busy_ = false; 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (aborted_) { 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Abort(true); // no need to wake because we're awake 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (new_state == STATE_BLOCKED) { 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = true; 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Let the timeout continue 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org state_ = new_state; 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = false; 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ResetTimeout(); 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (new_state == STATE_DONE) { 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org done_ = true; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (new_state == STATE_ERROR) { 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org done_ = true; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_ = true; 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (done_) { 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// obsolete - call this yourself 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// SignalDone(); 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Stop(); 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#if _DEBUG 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // verify that stop removed this from its parent 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(!parent()->IsChildTask(this)); 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = true; 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Abort(bool nowake) { 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Why only check for done_ (instead of "aborted_ || done_")? 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If aborted_ && !done_, it means the logic for aborting still 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // needs to be executed (because busy_ must have been true when 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Abort() was previously called). 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (done_) 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org aborted_ = true; 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!busy_) { 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org done_ = true; 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = true; 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_ = true; 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // "done_" is set before calling "Stop()" to ensure that this code 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // doesn't execute more than once (recursively) for the same task. 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Stop(); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef _DEBUG 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // verify that stop removed this from its parent 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(!parent()->IsChildTask(this)); 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!nowake) { 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WakeTasks to self-delete. 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Don't call Wake() because it is a no-op after "done_" is set. 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Even if Wake() did run, it clears "blocked_" which isn't desireable. 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetRunner()->WakeTasks(); 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Wake() { 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (done_) 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (blocked_) { 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org blocked_ = false; 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetRunner()->WakeTasks(); 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Error() { 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (error_ || done_) 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org error_ = true; 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Wake(); 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string Task::GetStateName(int state) const { 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org switch (state) { 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_BLOCKED: return "BLOCKED"; 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_INIT: return "INIT"; 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_START: return "START"; 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_DONE: return "DONE"; 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_ERROR: return "ERROR"; 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_RESPONSE: return "RESPONSE"; 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return "??"; 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgint Task::Process(int state) { 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int newstate = STATE_ERROR; 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (TimedOut()) { 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ClearTimeout(); 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org newstate = OnTimeout(); 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SignalTimeout(); 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org switch (state) { 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_INIT: 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org newstate = STATE_START; 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_START: 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org newstate = ProcessStart(); 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_RESPONSE: 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org newstate = ProcessResponse(); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_DONE: 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case STATE_ERROR: 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org newstate = STATE_BLOCKED; 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return newstate; 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::Stop() { 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // No need to wake because we're either awake or in abort 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TaskParent::OnStopped(this); 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::set_timeout_seconds(const int timeout_seconds) { 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_seconds_ = timeout_seconds; 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ResetTimeout(); 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool Task::TimedOut() { 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return timeout_seconds_ && 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_time_ && 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CurrentTime() >= timeout_time_; 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::ResetTimeout() { 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int64 previous_timeout_time = timeout_time_; 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool timeout_allowed = (state_ != STATE_INIT) 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org && (state_ != STATE_DONE) 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org && (state_ != STATE_ERROR); 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (timeout_seconds_ && timeout_allowed && !timeout_suspended_) 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_time_ = CurrentTime() + 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (timeout_seconds_ * kSecToMsec * kMsecTo100ns); 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org else 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_time_ = 0; 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetRunner()->UpdateTaskTimeout(this, previous_timeout_time); 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::ClearTimeout() { 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int64 previous_timeout_time = timeout_time_; 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_time_ = 0; 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetRunner()->UpdateTaskTimeout(this, previous_timeout_time); 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::SuspendTimeout() { 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!timeout_suspended_) { 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_suspended_ = true; 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ResetTimeout(); 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid Task::ResumeTimeout() { 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (timeout_suspended_) { 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org timeout_suspended_ = false; 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ResetTimeout(); 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 290