zoukankan      html  css  js  c++  java
  • 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

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

    本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso/

    DelayQueueEntry 延时队列节点类

    entry的意思如下

    entry n.进入,入场; 入口处,门口; 登记,记录; 参加比赛的人;

    为什么说是节点类呢?这个通过阅读代码就可以知道了。
    DelayQueueEntry类含有四个数据成员,其中fNextfPrev说明了其是一个链表的节点。fToken是节点的标识,DelayInterval fDeltaTimeRemaining成员是一个代表时间间隔的量,在后面任务调度器调度任务的时候会使用到。

    9_DelayQueueEntry.png

    还有一个静态的成员static intptr_t tokenCounter用来作为token标识的不重复的初始化;注意,静态成员不是对象的成员,而是类的成员。(所有的对象共享这一个)
    这里可以看到,其构造函数是protected权限的,而析构函数是public权限的。且没有了别的构造相关方法,也就是说这个类对象只能由其派生类来创建,但是销毁是对外开放的。其派生类有两个AlarmHandlerDelayQueue

    ///// DelayQueueEntry /////
    // 延时队列记录(节点)   entry n.进入,入场; 入口处,门口; 登记,记录; 参加比赛的人;
    class DelayQueueEntry {
    public:
      virtual ~DelayQueueEntry();
      intptr_t token() {
        return fToken;
      }
    protected: // abstract base class
      DelayQueueEntry(DelayInterval delay);
      // delete this;
      virtual void handleTimeout();
    private:
      friend class DelayQueue;
      DelayQueueEntry* fNext;	//下一个节点
      DelayQueueEntry* fPrev;	//上一个节点
      DelayInterval fDeltaTimeRemaining;	//延时剩余的时间
    
      intptr_t fToken;	//标识,等指针宽度的int型
      static intptr_t tokenCounter;	//标识计数(注意此处是static 变量)
    };
    

    DelayQueueEntry的构造

    DelayQueueEntry的构造是很简单的,其只有一个参数,就是延时间隔时间。这里的构造与前面说的HandlerDescriptor略有不同,因为它没有把自身加入到链表中,而是把fNext和fPrev都指向this

    这里要说的就是fToken的初始化赋值,是根据静态成员tockenCounter自增来的。这里便保证了在一个指针表示的范围内,fToken是不会重复的。这里说一下为什么fToken的类型是intptr_tintptr_t是一个等指针宽度的int型。我们知道指针是用来寻址的,指针的宽度代表了最大的寻址空间。32位的指针能够寻址的范围是4G大小。这里DelayQueueEntry对象的大小显然不是1Byte,就是把内存占满的情况下,fToken也不会重复。(不可能让它占满)

    DelayQueueEntry::DelayQueueEntry(DelayInterval delay)
      : fDeltaTimeRemaining(delay) {
      fNext = fPrev = this;
      fToken = ++tokenCounter;
    }
    

    handleTimeout方法

    这个方法异常简单,就是销毁自身。这里要说的是它的方法名,意思很简单,处理超时。顺便说一下,DelayQueueEntry的析构是空函数,什么也没有做。

    void DelayQueueEntry::handleTimeout() {
      delete this;
    }
    
  • 相关阅读:
    解决Maven下载速度缓慢问题
    IntelliJ IDEA 最新激活码
    Googel 浏览器 模拟发送请求工具--Advanced REST Client
    Firefox火狐 浏览器接口调试工具 JSON 格式化
    修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题
    解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid
    configure: error: You need a C++ compiler for C++ support.[系统缺少c++环境]
    解决编译apache出现的问题:configure: error: APR not found . Please read the documentation
    centos6 Linux安装redis 2.6.14
    Nginx+Tomcat负载均衡配置
  • 原文地址:https://www.cnblogs.com/oloroso/p/4596849.html
Copyright © 2011-2022 走看看