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,表示返回的是原来的OLD的MASK值。
导致这个bug的原因还是我对ACE的代码的理解的不慎重,没有仔细看看源码,但是ACE的这段代码的设计者将一个返回值做了2种含义,一种是函数返回是否正确,一种是原有的OLD MASK值。明显存在二义性,这个设计也是值得讨论的。
同样的问题不止出现在cancel_wakeup函数,也出现在成对的schedule_wakeup函数中。而register_handler等函数倒没有用将返回值表示2个含义,可能是用于register的handle的old值都是0?
【本文作者是fullsail(雁渡寒潭),本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://blog.csdn.net/fullsail,否则每字一元不讲价。】