pipeevt_t* poll_event_from_pipes(void) { struct timeval to; to.tv_sec=0; to.tv_usec=100000; fd_set set; memcpy(&set, &pipeset, sizeof(fd_set)); int nfds=select(fd_max+1, &set, NULL, NULL, &to); pipeevt_t* ret=NULL; if(nfds>0) { for(int i=0; i<=pipe_slot; ++i) { if(pipe_fds[i] != -1 && FD_ISSET(pipe_fds[i], &set)) { int s; ret=event_recv(pipe_fds[i], &s); if(s==1) { pipe_remove(pipe_fds[i]); continue; } return ret; } } } return ret; }
void event_poll::handle_poll() { int event_cnt; while (looping()) { event_cnt = _poll.poll(_event, 1000); while (event_cnt > 0) { io_epoll::event ev = _event.at(static_cast<size_t>(--event_cnt)); tunnel * tun = (tunnel *)ev.data.ptr; if (io_epoll::ev_error(ev)) { event_remove(tun); } else { if (io_epoll::ev_recv(ev)) { event_recv(tun); } if (io_epoll::ev_send(ev)) { event_send(tun); } } } handle_event(); } }
static void *event_threadfunc(void *args) { int fd=*(int*)args; struct pollfd fds[1]; fds[0].fd=fd; fds[0].events=POLLIN; while(run_event_thread) { if(((poll(fds, 1, 1)) > 0) && (fds[0].revents & POLLIN)) { pipeevt_t* e=event_recv(fd, NULL); free(e); } fds[0].fd=fd; fds[0].events=POLLIN; } free(args); return NULL; }