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#ifndef WEBRTC_BASE_TASKRUNNER_H__ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_TASKRUNNER_H__ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/sigslot.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/taskparent.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Task; 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int64 kSecToMsec = 1000; 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int64 kMsecTo100ns = 10000; 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int64 kSecTo100ns = kSecToMsec * kMsecTo100ns; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TaskRunner : public TaskParent, public sigslot::has_slots<> { 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskRunner(); 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~TaskRunner(); 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void WakeTasks() = 0; 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the current time in 100ns units. It is used for 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // determining timeouts. The origin is not important, only 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the units and that rollover while the computer is running. 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // On Windows, GetSystemTimeAsFileTime is the typical implementation. 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int64 CurrentTime() = 0 ; 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void StartTask(Task *task); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void RunTasks(); 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void PollTasks(); 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void UpdateTaskTimeout(Task *task, int64 previous_task_timeout_time); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool is_ok_to_delete(Task* task) { 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return task == deleting_task_; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void IncrementAbortCount() { 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++abort_count_; 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void DecrementAbortCount() { 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org --abort_count_; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Returns the next absolute time when a task times out 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // OR "0" if there is no next timeout. 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int64 next_task_timeout() const; 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The primary usage of this method is to know if 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // a callback timer needs to be set-up or adjusted. 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This method will be called 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // * when the next_task_timeout() becomes a smaller value OR 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // * when next_task_timeout() has changed values and the previous 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // value is in the past. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // If the next_task_timeout moves to the future, this method will *not* 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // get called (because it subclass should check next_task_timeout() 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // when its timer goes off up to see if it needs to set-up a new timer). 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note that this maybe called conservatively. In that it may be 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // called when no time change has happened. 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnTimeoutChange() { 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // by default, do nothing. 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void InternalRunTasks(bool in_destructor); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void CheckForTimeoutChange(int64 previous_timeout_time); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::vector<Task *> tasks_; 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Task *next_timeout_task_; 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool tasks_running_; 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int abort_count_; 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Task* deleting_task_; 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void RecalcNextTimeout(Task *exclude_task); 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // TASK_BASE_TASKRUNNER_H__ 101