Exemple #1
0
bool Channel::DoClose(bool inDestructor)
{
    bool hasfd = false;
    //DEBUG_LOG("Before close channel, read fd:%d, write fd:%d for channel[%u]", GetReadFD(),  GetWriteFD(), GetID());
    int read_fd = GetReadFD();
    int write_fd = GetWriteFD();
    //int mask = AE_READABLE | AE_WRITABLE;
    if (read_fd > 0)
    {
        aeDeleteFileEvent(GetService().GetRawEventLoop(), read_fd,
        AE_READABLE | AE_WRITABLE);
        hasfd = true;
    }
    if (read_fd != write_fd && write_fd > 0)
    {
        aeDeleteFileEvent(GetService().GetRawEventLoop(), write_fd,
        AE_WRITABLE);
        hasfd = true;
    }
    CancelFlushTimerTask();

    if (NULL != m_file_sending)
    {
        close(m_file_sending->fd);
        m_file_sending->fd = -1;
        if (NULL != m_file_sending->on_failure)
        {
            m_file_sending->on_failure(m_file_sending->data);
        }
    }

    bool ret = false;
    if (hasfd && DoClose() && !inDestructor)
    {
        ret = fire_channel_closed(this);
        if (0 != m_parent_id)
        {
            Channel* parent = GetService().GetChannel(m_parent_id);
            if (NULL != parent)
            {
                parent->OnChildClose(this);
            }
        }
    }

    DELETE(m_file_sending);
    if (!m_has_removed && !inDestructor)
    {
        m_has_removed = true;
        GetService().RemoveChannel(this);
    }
    return ret;
}