Beispiel #1
0
//从反应器注销一个ZCE_Event_Handler,同事取消他所有的mask
//event_mask其实只判断里面的DONT_CALL
int ZCE_Reactor::remove_handler(ZCE_Event_Handler *event_handler,
                                bool call_handle_close)
{
    int ret = 0;

    ZCE_HANDLE ev_hd = event_handler->get_handle();
    ZCE_Event_Handler *tmp_handler = NULL;

    //remove_handler可能会出现两次调用的情况,我推荐你直接调用handle_close
    ret = find_event_handler(ev_hd, tmp_handler);
    if (ret != 0)
    {
        // 未找到
        ZCE_LOG(RS_INFO, "[zcelib][%s] find handle [%lu] fail. my be reclose ?",
                __ZCE_FUNC__,
                ev_hd);
        return -1;
    }

    //不好用这个断言保护,因为可能出现一些重复调用等问题
    //ZCE_ASSERT_DGB(tmp_handler == event_handler);

    int event_mask = event_handler->get_mask();

    //如果有mask,取消掉
    if (event_mask != 0)
    {
        cancel_wakeup(event_handler, event_mask);
    }

    //不检测了,失败了就是命不好
    handler_map_.erase(event_handler->get_handle());

    //
    if (call_handle_close)
    {
        //调用handle_close
        event_handler->handle_close();
    }

    return 0;
}
//从反应器注销一个ZCE_Event_Handler,同事取消他所有的mask
//event_mask其实只判断里面的DONT_CALL
int ZCE_Reactor::remove_handler(ZCE_Event_Handler *event_handler,
                                bool call_handle_close)
{
    int ret = 0;

    ZCE_SOCKET socket_hd = event_handler->get_handle();
    ZCE_Event_Handler *tmp_handler = NULL;

    //remove_handler可能会出现两次调用的情况,我推荐你直接调用handle_close
    ret = find_event_handler(socket_hd, tmp_handler);

    if (ret != 0)
    {
        // 未找到
        return -1;
    }

    //不好用这个断言保护,因为可能出现一些重复调用等问题
    //ZCE_ASSERT_DGB(tmp_handler == event_handler);

    int event_mask = event_handler->get_mask();

    //如果有mask,取消掉
    if (event_mask != 0)
    {
        cancel_wakeup(event_handler, event_mask);
    }

    //不检测了,失败了就是命不好
    handler_map_.erase(event_handler->get_handle());

    //
    if (call_handle_close)
    {
        //调用handle_close
        event_handler->handle_close();
    }

    return 0;
}