ACE_Event_Handler handle_close对于ACE_HANDLE处理的简单分析

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;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值