yate学习yateclass.hclass YATE_API RefObject : public GenObject

请声明出处:

对象的引用计数的类,基本大部分的类都继承了该类:

/
 * A reference counted object.
 * 引用计数的对象
 * Whenever using multiple inheritance you should inherit this class virtually.
 * 使用多重继承,一般都会继承这个类
 */
class YATE_API RefObject : public GenObject
{
    YNOCOPY(RefObject); // no automatic copies please
public:
    /
     * The constructor initializes the reference counter to 1!
     * 构造函数,初始化引用计数器为1.
     * Use deref() to destruct the object when safe
     * 使用deref()去销毁这个对象在安全的时候
     */
    RefObject();

    /
     * Destructor.
     */
    virtual ~RefObject();

    /
     * Get a pointer to a derived class given that class name
     * 获取一个指向派生类的指针,因为类名
     * @param name Name of the class we are asking for
     * @参数 name,请求的类名
     * @return Pointer to the requested class or NULL if this object doesn't implement it
     * @返回被请求类的地址,为NULL,如果这个对象没有实例化
     */
    virtual void* getObject(const String& name) const;

    /
     * Check if the object is still referenced and safe to access.
     * 检查对象是否依旧被引用并且安全的访问
     * Note that you should not trust this result unless the object is locked
     * 注意,不能完全相信这个结果,除非对象被其他方法锁定
     *  by other means.
     * @return True if the object is referenced and safe to access
     * @返回True,如果对象被引用并且安全的访问
     */
    virtual bool alive() const;

    /
     * Increments the reference counter if not already zero
     * 增加引用计数器,如果不为0
     * @return True if the object was successfully referenced and is safe to access
     * @返回True,如果对象被引用并且安全的访问
     */
    bool ref();

    /
     * Decrements the reference counter, destroys the object if it reaches zero
     * 减少引用计数器,如果为0则销毁对象
     * <pre>
     * // Deref this object, return quickly if the object was deleted
     * if (deref()) return;
     * </pre>
     * @return True if the object may have been deleted, false if it still exists and is safe to access
     * @返回true,如果对象已经被删除,false,依旧存在并且安全的访问
     */
    bool deref();

    /
     * Get the current value of the reference counter
     * 获取引用计数器当前的值
     * @return The value of the reference counter
     */
    inline int refcount() const
	{ return m_refcount; }

    /
     * Refcounted objects should just have the counter decremented.
     * 引用计数对象减少计数器
     * That will destroy them only when the refcount reaches zero.
     * 当引用计数器为0的时候销毁
     */
    virtual void destruct();

    /
     * Check if reference counter manipulations are efficient on this platform.
     * 检查在这个平台上引用计数器对象是否有效
     * If platform does not support atomic operations a mutex pool is used.
     * 如果该平台不支持原子操作使用互斥对象池
     * @return True if refcount uses atomic integer operations
     * @返回true,如果对象计数使用原子整数操作
     */
    static bool efficientIncDec();

protected:
    /
     * This method is called when the reference count reaches zero after
     * 当该应用计数为0之后调用这个方法
     *  unlocking the mutex if the call to zeroRefsTest() returned true.
     * 如果调用zeroRefsTest() 返回true,解除这个互斥锁
     * The default behaviour is to delete the object.
     * 默认删除这个对象
     */
    virtual void zeroRefs();

    /
     * Bring the object back alive by setting the reference counter to one.
     * Note that it works only if the counter was zero previously
     * @return True if the object was resurrected - its name may be Lazarus ;-)
     */
    bool resurrect();

    /
     * Pre-destruction notification, called just before the object is deleted.
     * Unlike in the destructor it is safe to call virtual methods here.
     * Reimplementing this method allows to perform any object cleanups.
     */
    virtual void destroyed();

private:
    int m_refcount;
    Mutex* m_mutex;
};


更多相关文章
  • 1.若有定义:int a=8,b=5,c:执行语句c=a/b+0.4;后c的值为   A) 1.4             B) 1          C) 2.0        D) 2 2.假定x和y为 double型,则表达式x=2,y=x+3/2的值是      A) 3.500000    ...
  • 对VNXe3200 lun在线的扩容,首先需要明确你的storage pool里面有多余的空间,如果没有多余的空间,那么需要对pool先进行expand,比如说新加磁盘或者将之前没有使用的磁盘加入到pool里面.这里要说的一点是:VNXe3200 划分RAID的时候都是以storage pool形式 ...
  • 前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里发慌.确实这东西就像最开始学 ...
  • 介绍: 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准.VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败 ...
  • 互联网时代用户对业务体验的要求很高,包括对语音业务.这从某种程度上可以解释相对于全球LTE的建设高潮,VoLTE业务的发展却相对平缓得多.作为第一个真正意义上的电信级IP公共语音业务,VoLTE对运营商的网络提出了很高的要求.相对于一些技术问题,LTE的网络覆盖覆盖问题显得比较突出.从一些已经商用的 ...
  • 文/新喜目前,Google.Microsofte.IBM.HP等跨国科技巨头不约而同的盯上了非洲,两年前,Facebook CEO 扎克伯格联合爱立信.诺基亚.高通等品牌,成立了Internet.org 组织,推出Internet.org 应用,表示要让全世界的穷人都可以上网.目前,facebook ...
一周排行
  • 随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞清楚这三个.NE ...
  • 动画 1.头尾式动画 动画开始 [UIView beginAnimations:nil context:nil]; 设置动画时间 [UIView s ! etAnimationDuration:3]; [UIView ...
  • 易网科技讯 8月24日消息,据国外媒体报道,周三一份备忘录文件显示,美国司法部指责苹果出于自身利益,故意延缓此前有关电子书案件的进展.这份备忘是对此前苹果一周前提交文件的.苹果当时表示,公司反对法庭做出和解的简易判决 ...
  • 一.安装 创建安装目录,在/usr/java下建立安装路径,并将文件考到该路径下: # mkdir /usr/java   1.jdk-6u11-linux-i586.bin 这个是自解压的文件,在linux上安装如 ...
  • Your mission, if you decide to accept it, is to create a maze drawing program. A maze will consist of the al ...
  • 随着通信业务的不断膨胀,传统的语音方式已经不能满足我们的通讯需要了.那么新一代的,基于网络的IP电话技术也就应运而生.这就是我们现在要为大家介绍的voip网络技术,那么很多朋友都是到voip电话,这个只是voip网络 ...
  • 在作用域开头最好把以后要用的this指针存起来 a.click(function(){ var $this=$(this); $.get("/a").always( $this.val() ) } ...
  • 关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的C2DM,具体不 ...
  • 假如挂载时使用了:mount /dev/sda1 /mnt/sda1   #查找占用设备的pid fuser -m /mnt/sda1 #假如此时得到的pid为12345 kill -9 12345 umount / ...
  • 新华网西宁4月29日电(记者张进林 马勇)记者从青海省公安厅获悉,4月28日早晨6时30分左右,青海省果洛藏族自治州达日县公安局刑警队队长拉玛才旦(藏族)在追捕这个县“3·21”“藏独”闹事骨干分子时,遭枪击牺牲. ...