具体事件处理器定义的各种
handle_
*
挂钩方法的返回值致使
ACE_Reactor
以不同的方式工作。
0 : handle_ * 方法返回零( 0 )通知 ACE_Reactor 、事件处理器希望继续像前面一样被处理,也就是,它应该保持在 ACE_Reactor 的实现的一张表中。这样,当下一次 ACE_Reactor 的事件多路分离器系统调用经由 handle_events 被调用时,它还会继续包括该事件处理器的句柄。对于那些生存期超出一次 handle_ * 方法分派的事件处理器,这是一种“正常的”行为。
> : handle_ * 方法返回大于0(> 0 )的值通知 ACE_Reactor 、事件处理器希望在 ACE_Reactor 阻塞在它的事件多路分离器系统调用上面之前,再一次被分派。对协作的事件处理器来说,这种特性有助于增强全面的系统“公正性”。特别地,这种特性使得一个事件处理器在再次持有控制之前,允许其他事件处理器被分派。
< 0 : handle_ * 方法返回小于0(< 0 )的值通知 ACE_Reactor 、事件处理器想要被关闭、并从 ACE_Reactor 的内部表中移除。为完成此工作、 ACE_Reactor 调用事件处理器的 handle_close 清扫方法。该方法可以执行用户定义的终止活动,比如删除对象分配的动态内存或关闭日志文件。 handle_close 方法返回后, ACE_Reactor 将相关联的具体事件处理器从它的内部表中移除。
在实现具体事件处理器时,遵守下面的设计准则:
设计准则 0 :不要手工删除事件处理器对象或显式调用 handle_close ,相反,确保 ACE_Reactor 自动调用 handle_close 清扫方法。因而,应用必须遵从适当的协议来移除事件处理器,也就是,或者通过( 1 )从 handle_ * 挂钩方法中返回负值,或者通过( 2 )调用 remove_handler 。
该设计准则确保 ACE_Reactor 能够适当地清扫它的内部表。如果不服从这一准则,当 ACE_Reactor 试图移除已经在外部被删除的具体事件处理器时,就会带来不可预测的内存管理问题。后面的设计准则详细说明怎样确保 ACE_Reactor 调用 handle_close 清扫方法。
0 : handle_ * 方法返回零( 0 )通知 ACE_Reactor 、事件处理器希望继续像前面一样被处理,也就是,它应该保持在 ACE_Reactor 的实现的一张表中。这样,当下一次 ACE_Reactor 的事件多路分离器系统调用经由 handle_events 被调用时,它还会继续包括该事件处理器的句柄。对于那些生存期超出一次 handle_ * 方法分派的事件处理器,这是一种“正常的”行为。
> : handle_ * 方法返回大于0(> 0 )的值通知 ACE_Reactor 、事件处理器希望在 ACE_Reactor 阻塞在它的事件多路分离器系统调用上面之前,再一次被分派。对协作的事件处理器来说,这种特性有助于增强全面的系统“公正性”。特别地,这种特性使得一个事件处理器在再次持有控制之前,允许其他事件处理器被分派。
< 0 : handle_ * 方法返回小于0(< 0 )的值通知 ACE_Reactor 、事件处理器想要被关闭、并从 ACE_Reactor 的内部表中移除。为完成此工作、 ACE_Reactor 调用事件处理器的 handle_close 清扫方法。该方法可以执行用户定义的终止活动,比如删除对象分配的动态内存或关闭日志文件。 handle_close 方法返回后, ACE_Reactor 将相关联的具体事件处理器从它的内部表中移除。
在实现具体事件处理器时,遵守下面的设计准则:
设计准则 0 :不要手工删除事件处理器对象或显式调用 handle_close ,相反,确保 ACE_Reactor 自动调用 handle_close 清扫方法。因而,应用必须遵从适当的协议来移除事件处理器,也就是,或者通过( 1 )从 handle_ * 挂钩方法中返回负值,或者通过( 2 )调用 remove_handler 。
该设计准则确保 ACE_Reactor 能够适当地清扫它的内部表。如果不服从这一准则,当 ACE_Reactor 试图移除已经在外部被删除的具体事件处理器时,就会带来不可预测的内存管理问题。后面的设计准则详细说明怎样确保 ACE_Reactor 调用 handle_close 清扫方法。
设计准则1:
从继承自ACE_Event_Handler的类的handle_* 方法中返回的表达式必须是常量(constant)。这一设计准则有助于静态地检查是否handle_* 方法返回了恰当的值。如果必须违反此准则,开发者必须在return语句之前加一注释,解释为何要使用变量,而不是常量。
设计准则 2 :
设计准则 2 :
如果从继承自
ACE_Event_Handler
的类的
handle_
*
方法中返回的值不为
0
,必须在
return
语句之前加一注释,说明该返回值的含义。这一设计准则确保所有非
0
的返回值都是开发者有意使用的。
3 :
3 :
当你想要触发具体事件处理器的相应
handle_close
清扫方法时,从
handle_
*
方法中返回一个负值。值-
1
通常用于触发清扫挂钩,因为它是
ACE_OS
系统调用包装中一个常用的错误代码。但是,任何来自
handle_
*
方法的负数都将触发
handle_close
。
4 :
4 :
将所有
Event_Handler
清扫活动限制在
handle_close
清扫方法中。一般而言,将所有的清扫活动合并到
handle_close
方法中,而不是分散在事件处理器的各个
handle_
*
方法中要更为容易。在处理动态分配的、必须用
delete
this
来清除的事件处理器时,特别需要遵从此设计准则(见准则
9
)。
5 :
5 :
不要将绝对时间用作
ACE_Reactor
::
schedule_timer
的第三或第四参数。一般而言,这些参数应该小于一个极长的延迟,更远小于当前时间。
6 :
6 :
不要
delete
不是动态分配的事件处理器。任何含有
delete
this
、而其类又没有私有析构器的
handle_close
方法,都有可能违反这一设计准则。在缺乏一种能够静态地识别这一情况的规约检查器时,应该在
delete
this
的紧前面加上注释,解释为何要使用这一习语。
7 :
7 :
总是从堆中动态分配具体事件处理器。这是解决许多与具体处理器的生存期有关的问题的相对直接的方法。如果不可能遵从此准则,必须在具体事件处理器登记到
ACE_Reactor
时给出注释,解释为什么不使用动态分配。该注释应该在将静态分配的具体处理器登记到
ACE_Reactor
的
register_handler
语句的紧前面出现。
8 :
8 :
只允许在
handle_close
方法中使用
delete
this
习语,也就是,不允许在其他
handle_
*
方法中使用
delete
this
。该准则有助于检查是否有与删除非动态分配的内存有关的潜在错误。自然,与
ACE_Reactor
无关的组件可以拥有不同的对自删除进行管辖的准则。
10 :
10 :
仅在为具体事件处理器所登记的最后一个事件已从
ACE_Reactor
中移除时执行
delete
this
操作。过早删除在
ACE_Reactor
上登记了多个事件的具体处理器会导致“晃荡的指针”。
11 :
11 :