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