void Channel::IOEventCallback(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask) { Channel* channel = (Channel*) clientData; bool fired = false; if (mask & AE_READABLE) { channel->OnRead(); fired = true; } if (mask & AE_WRITABLE) { if (!fired || !channel->IsClosed()) { channel->OnWrite(); } } }