文档章节

18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

乌合之众
 乌合之众
发布于 2015/06/16 08:52
字数 1027
阅读 25
收藏 0

#18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

这是Live555源码阅读的第二部分,包括了任务调度相关的三个类。任务调度是Live555源码中很重要的部分。

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

##TaskScheduler任务调度器抽象基类

TaskScheduler是一个抽象基类,其定义在live555sourcecontrol\UsageEnvironment\include\UsageEnvironment.hh文件中。 TaskScheduler声明了很多纯虚接口,其实现一般在class BasicTaskScheduler0中。这里简要介绍一下。 TaskScheduler的默认构造函数是protected权限的,也就是只能被其内部的或派生类的方法调用。 这里先列出三个类型定义,这个在后面就不介绍了。在前面AlarmHandler中提过。

typedef void TaskFunc(void* clientData);
typedef void* TaskToken;	//token 标志
typedef u_int32_t EventTriggerId;	//Trigger 触发

TaskScheduler1

##TaskScheduler的定义如下

//任务调度器
class TaskScheduler {
public:
	virtual ~TaskScheduler();

	/* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
	virtual TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc,
		void* clientData) = 0;
	/* 这是一个纯虚接口,在BasicTaskScheduler0中有一个实现*/
	virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0;
	// 没有影响,如果 prevTask == NULL
	// 完成之后将设置 prevTask 为NULL

	// 虚接口,重新调度延时任务
	// 先调用unscheduleDelayedTask(task);
	// 在调用task = scheduleDelayedTask(microseconds, proc, clientData);
	virtual void rescheduleDelayedTask(TaskToken& task,
		int64_t microseconds, TaskFunc* proc,
		void* clientData);

	// For handling socket operations in the background (from the event loop):
	// 后台处理套接字操作类型(从事件循环):注意,这是一个类型定义
	typedef void BackgroundHandlerProc(void* clientData, int mask);
	// 设置掩码位为mask,这是特意这样定义的,为了符合Tcl接口的一致性
	// Tcl 是“工具控制语言(Tool Control Language)”的缩写。Tk 是 Tcl“图形工具箱”的扩展
	// 它提供各种标准的 GUI 接口项,以利于迅速进行高级应用程序开发

#define SOCKET_READABLE    (1<<1)	//readable  adj.易读的;   易懂的;   
#define SOCKET_WRITABLE    (1<<2)	//writable  adj.可写下的,能写成文的; 
#define SOCKET_EXCEPTION   (1<<3)	//exception n.例外,除外; 反对,批评;[法律]异议,反对;

	//设置后台处理
	virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0;
	//禁用后台处理
	void disableBackgroundHandling(int socketNum) { setBackgroundHandling(socketNum, 0, NULL, NULL); }
	virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0;
	// Changes any socket handling for "oldSocketNum" so that occurs with "newSocketNum" instead.
	// 改变任何套接字操作“oldsocketnum”,发生在“newsocketnum”代替。

	virtual void doEventLoop(char* watchVariable = NULL) = 0;

	//创建一个事件触发器
	virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc) = 0;

	//删除一个事件触发器
	virtual void deleteEventTrigger(EventTriggerId eventTriggerId) = 0;

	//触发事件
	virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL) = 0;
	//以下两个功能是过时的,并提供仅为了向后兼容
	void turnOnBackgroundReadHandling(int socketNum, BackgroundHandlerProc* handlerProc, void* clientData) {
		setBackgroundHandling(socketNum, SOCKET_READABLE, handlerProc, clientData);
	}
	void turnOffBackgroundReadHandling(int socketNum) { disableBackgroundHandling(socketNum); }
	//内部错误
	virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library.
protected:
	TaskScheduler(); // abstract base class 抽象基类
};

##virtual void internalError()方法

因为TaskScheduler只实现了两个方法,所以还是说一说了。这个方法调用了库函数abort()。abrot函数作用是引发不正常进程的终止。这是用于在发生了内部错误的情况下,不得作出终止当前进程的决定。 在这个函数的实现处,有一行注释,翻译为中文大概意思是:默认情况下,我们处理的不应该发生的错误的类型调用abort()库函数。子类可以重新定义,如果需要的话。

// By default, we handle 'should not occur'-type library errors by calling abort().  Subclasses can redefine this, if desired.
void TaskScheduler::internalError() {
  abort();
}

##rescheduleDelayedTask重新调度延时任务

这个方法确实是在TaskScheduler中实现的,但是其调用的两个方法都是在其派生类中实现的。这个方法先取消一个任务的调度,然后重新调度这个任务。

void TaskScheduler::rescheduleDelayedTask(TaskToken& task,
					  int64_t microseconds, TaskFunc* proc,
					  void* clientData) {
  unscheduleDelayedTask(task);
  task = scheduleDelayedTask(microseconds, proc, clientData);
}

© 著作权归作者所有

共有 人打赏支持
乌合之众
粉丝 13
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
Live555学习基础类

Live555主要用到的类介绍: 1.UsageEnvironment类:抽象基类 class UsageEnvironment {public:void reclaim(); TaskScheduler& taskScheduler() const {return fScheduler;}//返回TaskSched......

rootusers
2015/01/08
0
0
Live555源代码解读(1)

一、整体架构 从程序的结构来看,live项目包括了四个基本库、程序入口类(在mediaServer中)和一些测试代码(在testProgs中)。四个基本库是UsageEnvironment、BasicUsageEnvironment、group...

Sean-x
2016/02/24
251
0
基于Mesos的作业云 Elastic-Job-Cloud 源码分析 —— 作业调度(一)

本文基于 Elastic-Job V2.1.5 版本分享 Elastic-Job-Cloud 源码分析系列(6篇)传送门 1. 概述 2. 作业执行类型 3. Producer 发布任务 3.1 常驻作业 3.2 瞬时作业 3.3 小结 4. TaskLaunchSch...

芋道源码掘金Java群217878901
2017/09/07
0
0
spark内核揭秘-04-spark任务调度系统个人理解

spark的任务调度系统如下所示: 从上图中可以看出来由RDD Objects产生DAG,然后进入了DAGScheduler阶段,DAGScheduler是面向state的高层次的调度器,DAGScheduler把DAG拆分成很多的tasks,每...

stark_summer
2015/01/18
0
2
taobao-pamirs-schedule-2.0源码分析——类设计

使用方法 首先学习一个开源项目,一定要先学习该开源项目的使用方法。该项目的使用方法本文不再详述。请参考博文: http://pinsir.iteye.com/blog/882275 http://pinsir.iteye.com/blog/882...

杨武兵
2016/03/02
956
8

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部