void epoll_loop(engine_t n) { assert(n); struct epoll_event events[MAX_SOCKET]; memset(events,0,sizeof(events)); uint32_t tick = GetSystemMs(); uint32_t last_sync = tick; while(n->status) { int nfds = TEMP_FAILURE_RETRY(epoll_wait(n->poller_fd,events,MAX_SOCKET,10)); if(nfds < 0) { printf("error:%d\n",errno); break; } int i; for(i = 0 ; i < nfds ; ++i) { socket_t sock = (socket_t)events[i].data.ptr; if(sock) { if(events[i].events & EPOLLIN) on_read_active(sock); if(events[i].events & EPOLLOUT) on_write_active(sock); if(events[i].events & EPOLLERR) { } } } mq_flush(n->event_queue); uint32_t now = GetSystemMs(); if(now - tick > 1000) { printf("recv:%dmb\n",total_bytes_recv/1024/1024); tick = now; total_bytes_recv = 0; } } close(n->poller_fd); }
int32_t epoll_loop(engine_t n,int32_t timeout) { assert(n); uint32_t ms; uint32_t tick = GetSystemMs(); uint32_t _timeout = tick + timeout; do{ while(!LINK_LIST_IS_EMPTY(n->actived)) { socket_t s = LINK_LIST_POP(socket_t,n->actived); s->isactived = 0; if(Process(s) && s->isactived == 0) { s->isactived = 1; LINK_LIST_PUSH_BACK(n->actived,s); } } ms = _timeout - tick; int32_t nfds = TEMP_FAILURE_RETRY(epoll_wait(n->poller_fd,n->events,MAX_SOCKET,ms)); if(nfds < 0) return -1; int32_t i; for(i = 0 ; i < nfds ; ++i) { socket_t sock = (socket_t)n->events[i].data.ptr; if(sock) { //套接口可读 if(n->events[i].events & EPOLLIN) { on_read_active(sock); } //套接口可写 if(n->events[i].events & EPOLLOUT) on_write_active(sock); if(n->events[i].events & EPOLLERR) { //套接口异常 } } } tick = GetSystemMs(); }while(tick < _timeout); return 0; }
int32_t epoll_loop(engine_t n,int32_t ms) { assert(n); uint32_t sleep_ms; uint32_t timeout = GetSystemMs() + ms; uint32_t current_tick; do{ while(!double_link_empty(n->actived)) { socket_t s = (socket_t)double_link_pop(n->actived); s->isactived = 0; if(Process(s)) { s->isactived = 1; double_link_push(n->actived,(struct double_link_node*)s); } //if(GetCurrentMs() >= timeout) // break; } current_tick = GetSystemMs(); sleep_ms = timeout > current_tick ? timeout - current_tick:0; int32_t nfds = TEMP_FAILURE_RETRY(epoll_wait(n->poller_fd,n->events,MAX_SOCKET,sleep_ms)); if(nfds < 0) return -1; int32_t i; for(i = 0 ; i < nfds ; ++i) { socket_t sock = (socket_t)n->events[i].data.ptr; if(sock) { if(n->events[i].events & EPOLLIN) on_read_active(sock); if(n->events[i].events & EPOLLOUT) on_write_active(sock); if(n->events[i].events & EPOLLERR) on_read_active(sock); } } current_tick = GetSystemMs(); }while(timeout > current_tick); return 0; }
int32_t epoll_loop(poller_t n,int32_t ms) { assert(n); if(ms < 0)ms = 0; uint64_t sleep_ms; uint64_t timeout = GetSystemMs64() + (uint64_t)ms; uint64_t current_tick; uint32_t read_event = EV_IN | EPOLLRDHUP | EPOLLERR | EPOLLHUP; int32_t notify = 0; do{ if(!dlist_empty(&n->connecting)) { //check timeout connecting uint64_t l_now = GetSystemMs64(); dlist_check_remove(&n->connecting,check_connect_timeout,(void*)&l_now); } if(!is_active_empty(n)) { struct dlist *actived = get_active_list(n); n->actived_index = (n->actived_index+1)%2; socket_t s; while((s = (socket_t)dlist_pop(actived)) != NULL) { if(Process(s)) putin_active(n,(struct dnode*)s); } } current_tick = GetSystemMs64(); if(is_active_empty(n)) sleep_ms = timeout > current_tick ? timeout - current_tick:0; else sleep_ms = 0; notify = 0; int32_t nfds = _epoll_wait(n->poller_fd,n->events,MAX_SOCKET,(uint32_t)sleep_ms); if(nfds < 0) return -1; int32_t i; for(i = 0 ; i < nfds ; ++i) { if(n->events[i].data.fd == n->pipe_reader) { char buf[1]; read(n->pipe_reader,buf,1); notify = 1; }else{ socket_t sock = (socket_t)n->events[i].data.ptr; if(sock) { if(sock->socket_type == CONNECT){ process_connect(sock); } else if(sock->socket_type == LISTEN){ process_accept(sock); } else{ if(n->events[i].events & read_event) on_read_active(sock); if(n->events[i].events & EPOLLOUT) on_write_active(sock); } } } } current_tick = GetSystemMs64(); }while(notify == 0 && timeout > current_tick); return 0; }