这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类。

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

HandlerSet 处理程序链表类

这里使用的Set这个单词,Set是集合的意思,这里实质上是一个双向循环链表。这个类比较重要,这里会详细的介绍。

HandlerSet类只有一个数据成员,就是HandlerDescriptor fHandlers;这是作为链表的头结点而存在的。






HandlerSet的定义,代码如下

class HandlerSet {
public:
//设置fHandlers的下一个和上一个指向fHandler自己
HandlerSet();
//逐个释放链表节点
virtual ~HandlerSet();
// 从链表中查找socketNum代表的HandlerDescriptor,如果没有找到就创建一个并加入到链表
void assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData);
//从链表中查找socketNum对应的HandlerDescriptor,找到了就delete
void clearHandler(int socketNum);
// 从链表中查找oldSocketNum代表的HandlerDescriptor,找到了就将其sockerNum成员替换为newSocketNum
void moveHandler(int oldSocketNum, int newSocketNum);
private:
// 从链表中查找socketNum代表的HandlerDescriptor,没找到返回NULL
HandlerDescriptor* lookupHandler(int socketNum);
private:
friend class HandlerIterator;
HandlerDescriptor fHandlers; //处理程序描述对象 链表头节点
};

HandlerSet的构造

在其构造函数中,默认对头结点HandlerDescriptor fHandlers进行了初始化操作。

HandlerSet::HandlerSet()
: fHandlers(&fHandlers) {
fHandlers.socketNum = -1; // shouldn't ever get looked at, but in case...
}

这里调用了HandlerDescriptor的构造,这个可以在之前的介绍中查看。这里可以看到,其将头结点的数据成员socketNum设置为了-1,之前我们说过,socketNum在链表中被用来标识节点,这里说明了其是一个特殊的存在,头结点不做为保存处理程序的节点。


HandlerSet的析构

析构函数就是释放链表,就是逐个释放除了头结点之外的节点。代码如下

HandlerSet::~HandlerSet() {
// Delete each handler descriptor:
while (fHandlers.fNextHandler != &fHandlers) {
delete fHandlers.fNextHandler; // changes fHandlers->fNextHandler
}
}

lookupHandler方法

这里先说这个方法,因为后面的几个方法都用到了它。从方法名也可以看出来,这个方法是用来查找节点的。

这里要说以下的就是,这里面用到了迭代器。方法中创建了一个迭代器,并将自身绑定给了迭代器。前面说过迭代器构造的时候会将其fNextPtr指向链表的头结点的下一个。也就是说会从第二个节点开始查找。如果本身就只有头节点呢?因为在只有头结点的情况下,下一个节点就是头结点,其socketNum为-1,这里是没问题的。

HandlerDescriptor* HandlerSet::lookupHandler(int socketNum) {
HandlerDescriptor* handler;
HandlerIterator iter(*this);
while ((handler = iter.next()) != NULL) {
if (handler->socketNum == socketNum) break;
}
return handler;
}

assignHandler(分配处理程序)方法

通过前面的描述可知,HandlerSet类都是在操作内部的一个双向链表。但是HandlerSet是没有一个addNode方法的,这个方法就由assignHandler来做了。

assignHandler的参数有四个,对应了一个节点对象的四个数据成员** socketNum/conditionSet/handlerProc/clientData **。前面说过socketNum成员在链表中用来标识节点,在这个成员方法中就可以看出来。这个方法会在BasicTaskScheduler的setBackgroundHandling方法中被用到。其socketNum参数应该是传一个socket套接口给它。

assignHandler方法先是从链表中查找socketNum标识的节点是否存在,如果不存在就new一个,并设置新节点的socketNum为参数的socketNum。这样链表中就存在了一个标识为参数socketNum的节点。然后把这个节点的 处理程序指针,客户端数据地址,条件集合都更新为参数中的。

void HandlerSet::assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData) {
// First, see if there's already a handler for this socket:
HandlerDescriptor* handler = lookupHandler(socketNum);
if (handler == NULL) { // No existing handler, so create a new descr:
handler = new HandlerDescriptor(fHandlers.fNextHandler);
handler->socketNum = socketNum;
} handler->conditionSet = conditionSet;
handler->handlerProc = handlerProc;
handler->clientData = clientData;
}

clearHandler和moveHandler方法

这两个方法比较类似,放在一起来说。

clearHandler方法是从链表中找socketNum标识的节点,然后delete这个节点。有之前的描述可以知道,这里把找到的节点从链表中移除了。如果没有找到呢? lookupHandler会返回NULL,delete NULL,是可以的。

void HandlerSet::clearHandler(int socketNum) {
HandlerDescriptor* handler = lookupHandler(socketNum);
delete handler;
}

moveHandler则是从链表中找oldSocketNum标识的节点,找到了就将其标识替换为newSocketNum。如果没有找到就声明也不做了。这里和前面说的assignHandler方法来对比下。assignHandler是找到了就替换其他的三个数据成员,这里是找到了就替换标识。

void HandlerSet::moveHandler(int oldSocketNum, int newSocketNum) {
HandlerDescriptor* handler = lookupHandler(oldSocketNum);
if (handler != NULL) {
handler->socketNum = newSocketNum;
}
}

7 HandlerSet 处理程序链表类——Live555源码阅读(一)基本组件类的更多相关文章

  1. 12 哈希表相关类——Live555源码阅读(一)基本组件类

    12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...

  2. 6 HandlerDescriptor 处理程序描述类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  3. 5 HandlerIterator处理程序迭代器类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso Handler ...

  4. 4 Handler相关类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. Handler相关类概述 处理程序相关类一共有三个,其没有派生继承关系,但是其有友元关系和使用关系 ...

  5. 11 AlarmHandler定时处理类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  6. 10 DelayQueue 延时队列类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 www.cnblogs.com/oloroso/ 本文由乌合 ...

  7. 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  8. 13 HashTable抽象哈希表类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  9. 8 延时队列相关类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

随机推荐

  1. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  2. HTTP2.0介绍

    HTTP2.0的所有通信都是在一个TCP连接上完成的. 1.信息传输术语 1.1 流 虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1.2....N); 1.2 消息 逻辑上的HTTP消 ...

  3. linux设置和删除环境变量

    删除环境变量: unset -v PKG_CONFIG_PATH 添加环境变量: export PKG_CONFIG_PATH="你需要设置的路径", 例如: export LAN ...

  4. 在项目中那个少用if else 语句,精简代码,便于维护的方法(1)

    一般我在写一个函数的时候,可能需要一个回调函数,例如: function loadQtipCode(dom, title, content, width, showcb, hidecb) { $(do ...

  5. ecshop 团购点击价格变动

    前提:价格阶梯只能设置一级 需要用到: jquery,transport.js(transport_jquery.js),Ajax.call html页面 js代码,还需要插入jquery,trans ...

  6. Mac安装Brew

    安装命令如下:curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip ...

  7. Linux 挂载 NFS

    NFS(网络文件系统),这是在 Linux 系统上常用的文件共享方式.也可以做为作为一个远程存储使用,比如:我有个网站,用户可以上传文件,但文件慢慢会越来越多,这个时候我们只能把存放上传文件的目录挂在 ...

  8. 是时候放弃Uploadify了

    1.Uploadify是什么? Uploadify是来自国外的一款优秀jQuery插件,主要功能是批量上传文件. 这话是复制百度百科的,是:基于jQuery开发的文件上传插件. 2.为什么大家都在用? ...

  9. 自定义列表dl的使用原因和场合

    为什么要使用自定义列表? dl和ol, ul的区别? 要正确理解dl的意图, 理解 dl的 "语义" ! 才能知道为什么要使用dl, 以及在什么时候/ 什么情况下使用 dl? dl ...

  10. 用libsvm进行回归预测

    最近因工作需要,学习了台湾大学林智仁(Lin Chih-Jen)教授等人开发的SVM算法开源算法包. 为了以后方便查阅,特把环境配置及参数设置等方面的信息记录下来. 林教授年轻时照片 SVM属于十大挖 ...