注意cancel_wakeup等函数的返回值

1               注意cancel_wakeup等函数的返回值

这是最近调试发现的一个问题,原来由于为了排查一个同事的暴力压力测试下的问题,我检查代码过程中发现原来的cancel_wakeup函数没有处理判断返回值。

reactor()->cancel_wakeup(this,ACE_Event_Handler::WRITE_MASK);

由于担心有什么错误处理被遗漏了,看了一下cancel_wakeup的返回值是int,不假思索的将代码改成了:

ret = reactor()->cancel_wakeup(this,ACE_Event_Handler::WRITE_MASK);

if (ret != 0)

{

ACE_DEBUG((LM_ALERT,"TNNND cancel_wakeup return(%d) != 0 errno=%d|%m. /n",

ret,

         ACE_OS::last_error()));

}

 

因为觉得cancel_wakeup出错的可能性几乎为0,所以将日志级别调整成了LM_ALERT,结果发现新版本就每天收到ALERT日志告警,郁闷。于是又仔细看看了cancel_wakeup的代码。发现cancel_wakeup函数其实重用了int返回值,如果返回值等于-1(其实ACE大部分地方时返回== -1表示错误,而不是不等于!=0表示错误),才表示真正发生了错误,而返回值>0,表示返回的是原来的OLDMASK值。

导致这个bug的原因还是我对ACE的代码的理解的不慎重,没有仔细看看源码,但是ACE的这段代码的设计者将一个返回值做了2种含义,一种是函数返回是否正确,一种是原有的OLD MASK值。明显存在二义性,这个设计也是值得讨论的。

同样的问题不止出现在cancel_wakeup函数,也出现在成对schedule_wakeup函数中。而register_handler等函数倒没有用将返回值表示2个含义,可能是用于registerhandleold值都是0

【本文作者是fullsail(雁渡寒潭),本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://blog.csdn.net/fullsail,否则每字一元不讲价。】

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值