void CEventDispatch::StartDispatch(uint32_t wait_timeout) { struct epoll_event events[1024]; int nfds = 0; if(running) return; running = true; while (running){ nfds = epoll_wait(m_epfd, events, 1024, wait_timeout); for (int i = 0; i < nfds; i++){ int ev_fd = events[i].data.fd; CBaseSocket* pSocket = FindBaseSocket(ev_fd); if (!pSocket) continue; #ifdef EPOLLRDHUP if (events[i].events & EPOLLRDHUP){ Logger.Log(INFO, "On Peer Close, socket=%d", ev_fd); pSocket->OnClose(); } #endif // Commit End if (events[i].events & EPOLLIN){ Logger.Log(INFO, "OnRead, socket=%d\n", ev_fd); pSocket->OnRead(); } if (events[i].events & EPOLLOUT){ Logger.Log(INFO, "OnWrite, socket=%d\n", ev_fd); pSocket->OnWrite(); } if (events[i].events & (EPOLLPRI | EPOLLERR | EPOLLHUP)){ Logger.Log(INFO, "OnClose, socket=%d\n", ev_fd); pSocket->OnClose(); } pSocket->ReleaseRef(); } _CheckTimer(); _CheckLoop(); } }
void CEventDispatch::StartDispatch(uint32_t wait_timeout) { struct epoll_event events[1024]; int nfds = 0; while (running) { nfds = epoll_wait(m_epfd, events, 1024, wait_timeout); for (int i = 0; i < nfds; i++) { int ev_fd = events[i].data.fd; CBaseSocket* pSocket = FindBaseSocket(ev_fd); if (!pSocket) continue; if (events[i].events & EPOLLIN) { //LOG__(NET, "OnRead, socket=%d\n", ev_fd); pSocket->OnRead(); } if (events[i].events & EPOLLOUT) { //LOG__(NET, "OnWrite, socket=%d\n", ev_fd); pSocket->OnWrite(); } if (events[i].events & (EPOLLPRI | EPOLLERR | EPOLLHUP)) { //LOG__(NET, "OnClose, socket=%d\n", ev_fd); pSocket->OnClose(); } pSocket->ReleaseRef(); } _CheckTimer(); _CheckLoop(); } }
void CEventDispatch::StartDispatch(uint32_t wait_timeout) { struct kevent events[1024]; int nfds = 0; struct timespec timeout; timeout.tv_sec = 0; timeout.tv_nsec = wait_timeout * 1000000; while (running) { nfds = kevent(m_kqfd, NULL, 0, events, 1024, &timeout); for (int i = 0; i < nfds; i++) { int ev_fd = events[i].ident; CBaseSocket* pSocket = FindBaseSocket(ev_fd); if (!pSocket) continue; if (events[i].filter == EVFILT_READ) { //LOG__(NET, "OnRead, socket=%d\n", ev_fd); pSocket->OnRead(); } if (events[i].filter == EVFILT_WRITE) { //LOG__(NET, "OnWrite, socket=%d\n", ev_fd); pSocket->OnWrite(); } pSocket->ReleaseRef(); } _CheckTimer(); _CheckLoop(); } }
void CEventDispatch::StartDispatch(uint32_t wait_timeout) { fd_set read_set, write_set, excep_set; timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = wait_timeout * 1000; // 10 millisecond if(running) return; running = true; while (running){ _CheckTimer(); _CheckLoop(); if (!m_read_set.fd_count && !m_write_set.fd_count && !m_excep_set.fd_count){ Sleep(MIN_TIMER_DURATION); continue; } m_lock.lock(); memcpy(&read_set, &m_read_set, sizeof(fd_set)); memcpy(&write_set, &m_write_set, sizeof(fd_set)); memcpy(&excep_set, &m_excep_set, sizeof(fd_set)); m_lock.unlock(); int nfds = select(0, &read_set, &write_set, &excep_set, &timeout); if (nfds == SOCKET_ERROR){ Logger.Log(ERROR, "select failed, error code: %d", GetLastError()); Sleep(MIN_TIMER_DURATION); continue; // select again } if (nfds == 0){ continue; } for (u_int i = 0; i < read_set.fd_count; i++){ SOCKET fd = read_set.fd_array[i]; CBaseSocket* pSocket = FindBaseSocket((net_handle_t)fd); if (pSocket){ pSocket->OnRead(); pSocket->ReleaseRef(); } } for (u_int i = 0; i < write_set.fd_count; i++){ SOCKET fd = write_set.fd_array[i]; CBaseSocket* pSocket = FindBaseSocket((net_handle_t)fd); if (pSocket){ pSocket->OnWrite(); pSocket->ReleaseRef(); } } for (u_int i = 0; i < excep_set.fd_count; i++){ SOCKET fd = excep_set.fd_array[i]; CBaseSocket* pSocket = FindBaseSocket((net_handle_t)fd); if (pSocket){ pSocket->OnClose(); pSocket->ReleaseRef(); } } } }