int
ACE_Event_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask)
对于第一个参数handle,传入的ACE_Reactor触发回调的句柄,
当处理单个I/O源的时候,handle参数可以不用关注
当一个ACE_Event_Handler处理多个I/O源的时候,可以根据handle知道是对哪个句柄处理回调
当然也有其他的用法,例如当ACE_Event_Handler被其他的线程所引用(例如ACE_Task中),此时ACE_Reactor运行在主线程中,
这个时候需要手动调用handle_close来清除处理器,当ACE_Event_Handler的引用计数为0的时候,最终才会在ACE_Reactor中解除处理器的注册。
示例代码:
int
TP_Logging_Handler::handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask) {
int close_now = 0;
if (handle != ACE_INVALID_HANDLE) { //当ACE_Reactor调用的时候传入实际的触发回调的ACE_HANDLE
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, guard, lock_, -1);
if (queued_count_ == 0)
close_now = 1;
else
deferred_close_ = 1;
} else {
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, guard, lock_, -1); //这里减少引用计数
queued_count_--;
if (queued_count_ == 0) close_now = deferred_close_;
}
if (close_now)
return Logging_Event_Handler::handle_close ();
return 0;
}
int TP_Logging_Task::svc () {
for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) {
TP_Logging_Handler *tp_handler = reinterpret_cast<TP_Logging_Handler *> (log_blk->rd_ptr ());
Logging_Handler logging_handler (tp_handler->log_file ());
logging_handler.write_log_record (log_blk->cont ());
log_blk->release ();
tp_handler->handle_close (ACE_INVALID_HANDLE, 0); //这里手动调用,传入ACE_INVALID_HANDLE
}
return 0;
}