Lines Matching refs:ev
20 static int fdevent_linux_sysepoll_init(struct fdevents *ev);
24 static int fdevent_freebsd_kqueue_init(struct fdevents *ev);
28 static int fdevent_solaris_port_init(struct fdevents *ev);
32 static int fdevent_solaris_devpoll_init(struct fdevents *ev);
36 static int fdevent_poll_init(struct fdevents *ev);
40 static int fdevent_select_init(struct fdevents *ev);
168 fdevents *ev; in fdevent_init() local
189 ev = ck_calloc(1, sizeof(*ev)); in fdevent_init()
190 ev->errh = errh; in fdevent_init()
191 ev->cur_fds = cur_fds; in fdevent_init()
192 ev->event_handler = event_handler; in fdevent_init()
193 ev->fdarray = ck_calloc(maxfds, sizeof(*ev->fdarray)); in fdevent_init()
194 ev->maxfds = maxfds; in fdevent_init()
199 if (0 == fdevent_poll_init(ev)) return ev; in fdevent_init()
204 if (0 == fdevent_select_init(ev)) return ev; in fdevent_init()
209 if (0 == fdevent_linux_sysepoll_init(ev)) return ev; in fdevent_init()
214 if (0 == fdevent_solaris_devpoll_init(ev)) return ev; in fdevent_init()
219 if (0 == fdevent_solaris_port_init(ev)) return ev; in fdevent_init()
224 if (0 == fdevent_freebsd_kqueue_init(ev)) return ev; in fdevent_init()
232 free(ev->fdarray); in fdevent_init()
233 free(ev); in fdevent_init()
244 fdevent_free (fdevents *ev) in fdevent_free() argument
246 if (!ev) return; in fdevent_free()
247 if (ev->free) ev->free(ev); in fdevent_free()
249 for (uint32_t i = 0; i < ev->maxfds; ++i) { in fdevent_free()
252 if (ev->fdarray[i]) in fdevent_free()
253 free((fdnode *)((uintptr_t)ev->fdarray[i] & ~0x3)); in fdevent_free()
256 free(ev->fdarray); in fdevent_free()
257 free(ev); in fdevent_free()
262 fdevent_reset (fdevents *ev) in fdevent_reset() argument
264 int rc = (NULL != ev->reset) ? ev->reset(ev) : 0; in fdevent_reset()
266 log_error(ev->errh, __FILE__, __LINE__, in fdevent_reset()
269 ev->event_handler ? ev->event_handler : ""); in fdevent_reset()
276 fdevent_sched_run (fdevents * const ev) in fdevent_sched_run() argument
278 for (fdnode *fdn = ev->pendclose; fdn; ) { in fdevent_sched_run()
285 log_perror(ev->errh, __FILE__, __LINE__, "close failed %d", fd); in fdevent_sched_run()
287 --(*ev->cur_fds); in fdevent_sched_run()
292 ev->fdarray[fd] = NULL; in fdevent_sched_run()
295 ev->pendclose = NULL; in fdevent_sched_run()
300 fdevent_poll (fdevents * const ev, const int timeout_ms) in fdevent_poll() argument
302 const int n = ev->poll(ev, ev->pendclose ? 0 : timeout_ms); in fdevent_poll()
304 fdevent_sched_run(ev); in fdevent_poll()
306 log_perror(ev->errh, __FILE__, __LINE__, "fdevent_poll failed"); in fdevent_poll()
316 fdevent_linux_sysepoll_event_del (fdevents *ev, fdnode *fdn) in fdevent_linux_sysepoll_event_del() argument
318 return epoll_ctl(ev->epoll_fd, EPOLL_CTL_DEL, fdn->fd, NULL); in fdevent_linux_sysepoll_event_del()
322 fdevent_linux_sysepoll_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_linux_sysepoll_event_set() argument
332 return epoll_ctl(ev->epoll_fd, op, fd, &ep); in fdevent_linux_sysepoll_event_set()
336 fdevent_linux_sysepoll_poll (fdevents * const ev, int timeout_ms) in fdevent_linux_sysepoll_poll() argument
338 struct epoll_event * const restrict epoll_events = ev->epoll_events; in fdevent_linux_sysepoll_poll()
339 int n = epoll_wait(ev->epoll_fd, epoll_events, ev->maxfds, timeout_ms); in fdevent_linux_sysepoll_poll()
351 fdevent_linux_sysepoll_free (fdevents *ev) in fdevent_linux_sysepoll_free() argument
353 close(ev->epoll_fd); in fdevent_linux_sysepoll_free()
354 free(ev->epoll_events); in fdevent_linux_sysepoll_free()
359 fdevent_linux_sysepoll_init (fdevents *ev) in fdevent_linux_sysepoll_init() argument
370 ev->type = FDEVENT_HANDLER_LINUX_SYSEPOLL; in fdevent_linux_sysepoll_init()
371 ev->event_set = fdevent_linux_sysepoll_event_set; in fdevent_linux_sysepoll_init()
372 ev->event_del = fdevent_linux_sysepoll_event_del; in fdevent_linux_sysepoll_init()
373 ev->poll = fdevent_linux_sysepoll_poll; in fdevent_linux_sysepoll_init()
374 ev->free = fdevent_linux_sysepoll_free; in fdevent_linux_sysepoll_init()
377 if (-1 == (ev->epoll_fd = epoll_create1(EPOLL_CLOEXEC))) return -1; in fdevent_linux_sysepoll_init()
379 if (-1 == (ev->epoll_fd = epoll_create(ev->maxfds))) return -1; in fdevent_linux_sysepoll_init()
380 fdevent_setfd_cloexec(ev->epoll_fd); in fdevent_linux_sysepoll_init()
383 ev->epoll_events = ck_calloc(ev->maxfds, sizeof(*ev->epoll_events)); in fdevent_linux_sysepoll_init()
398 fdevent_freebsd_kqueue_event_del (fdevents *ev, fdnode *fdn) in fdevent_freebsd_kqueue_event_del() argument
415 return (0 != n) ? kevent(ev->kq_fd, kev, n, NULL, 0, &ts) : 0; in fdevent_freebsd_kqueue_event_del()
421 fdevent_freebsd_kqueue_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_freebsd_kqueue_event_set() argument
449 return (0 != n) ? kevent(ev->kq_fd, kev, n, NULL, 0, &ts) : 0; in fdevent_freebsd_kqueue_event_set()
455 fdevent_freebsd_kqueue_poll (fdevents * const ev, int timeout_ms) in fdevent_freebsd_kqueue_poll() argument
461 struct kevent * const restrict kq_results = ev->kq_results; in fdevent_freebsd_kqueue_poll()
462 const int n = kevent(ev->kq_fd, NULL, 0, kq_results, ev->maxfds, &ts); in fdevent_freebsd_kqueue_poll()
482 fdevent_freebsd_kqueue_reset (fdevents *ev) in fdevent_freebsd_kqueue_reset() argument
485 ev->kq_fd = kqueue1(O_NONBLOCK|O_CLOEXEC|O_NOSIGPIPE); in fdevent_freebsd_kqueue_reset()
486 return (-1 != ev->kq_fd) ? 0 : -1; in fdevent_freebsd_kqueue_reset()
488 ev->kq_fd = kqueue(); in fdevent_freebsd_kqueue_reset()
489 if (-1 == ev->kq_fd) return -1; in fdevent_freebsd_kqueue_reset()
490 fdevent_setfd_cloexec(ev->kq_fd); in fdevent_freebsd_kqueue_reset()
497 fdevent_freebsd_kqueue_free (fdevents *ev) in fdevent_freebsd_kqueue_free() argument
499 close(ev->kq_fd); in fdevent_freebsd_kqueue_free()
500 free(ev->kq_results); in fdevent_freebsd_kqueue_free()
505 fdevent_freebsd_kqueue_init (fdevents *ev) in fdevent_freebsd_kqueue_init() argument
507 ev->type = FDEVENT_HANDLER_FREEBSD_KQUEUE; in fdevent_freebsd_kqueue_init()
508 ev->event_set = fdevent_freebsd_kqueue_event_set; in fdevent_freebsd_kqueue_init()
509 ev->event_del = fdevent_freebsd_kqueue_event_del; in fdevent_freebsd_kqueue_init()
510 ev->poll = fdevent_freebsd_kqueue_poll; in fdevent_freebsd_kqueue_init()
511 ev->reset = fdevent_freebsd_kqueue_reset; in fdevent_freebsd_kqueue_init()
512 ev->free = fdevent_freebsd_kqueue_free; in fdevent_freebsd_kqueue_init()
513 ev->kq_fd = -1; in fdevent_freebsd_kqueue_init()
514 ev->kq_results = ck_calloc(ev->maxfds, sizeof(*ev->kq_results)); in fdevent_freebsd_kqueue_init()
527 fdevent_solaris_port_event_del (fdevents *ev, fdnode *fdn) in fdevent_solaris_port_event_del() argument
529 return port_dissociate(ev->port_fd, PORT_SOURCE_FD, fdn->fd); in fdevent_solaris_port_event_del()
533 fdevent_solaris_port_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_solaris_port_event_set() argument
537 return port_associate(ev->port_fd,PORT_SOURCE_FD,fd,(int)ud,(void*)ud); in fdevent_solaris_port_event_set()
543 fdevent_solaris_port_poll (fdevents *ev, int timeout_ms) in fdevent_solaris_port_poll() argument
545 const int pfd = ev->port_fd; in fdevent_solaris_port_poll()
555 if ((ret = port_getn(pfd, ev->port_events, 0, &wait_for_events, &timeout)) < 0) return ret; in fdevent_solaris_port_poll()
563 if ((ret = port_getn(pfd, ev->port_events, ev->maxfds, &available_events, &timeout)) < 0) { in fdevent_solaris_port_poll()
570 int fd = (int)ev->port_events[i].portev_object; in fdevent_solaris_port_poll()
571 fdnode * const fdn = ev->fdarray[fd]; in fdevent_solaris_port_poll()
572 const intptr_t ud = (intptr_t)ev->port_events[i].portev_user; in fdevent_solaris_port_poll()
573 int revents = ev->port_events[i].portev_events; in fdevent_solaris_port_poll()
576 log_error(ev->errh,__FILE__,__LINE__,"port_associate failed"); in fdevent_solaris_port_poll()
588 fdevent_solaris_port_free (fdevents *ev) in fdevent_solaris_port_free() argument
590 close(ev->port_fd); in fdevent_solaris_port_free()
591 free(ev->port_events); in fdevent_solaris_port_free()
596 fdevent_solaris_port_init (fdevents *ev) in fdevent_solaris_port_init() argument
608 ev->type = FDEVENT_HANDLER_SOLARIS_PORT; in fdevent_solaris_port_init()
609 ev->event_set = fdevent_solaris_port_event_set; in fdevent_solaris_port_init()
610 ev->event_del = fdevent_solaris_port_event_del; in fdevent_solaris_port_init()
611 ev->poll = fdevent_solaris_port_poll; in fdevent_solaris_port_init()
612 ev->free = fdevent_solaris_port_free; in fdevent_solaris_port_init()
613 ev->port_events = ck_calloc(ev->maxfds, sizeof(*ev->port_events)); in fdevent_solaris_port_init()
615 if ((ev->port_fd = port_create()) < 0) return -1; in fdevent_solaris_port_init()
630 fdevent_solaris_devpoll_event_del (fdevents *ev, fdnode *fdn) in fdevent_solaris_devpoll_event_del() argument
636 return (-1 != write(ev->devpoll_fd, &pfd, sizeof(pfd))) ? 0 : -1; in fdevent_solaris_devpoll_event_del()
640 fdevent_solaris_devpoll_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_solaris_devpoll_event_set() argument
649 return (-1 != write(ev->devpoll_fd, &pfd, sizeof(pfd))) ? 0 : -1; in fdevent_solaris_devpoll_event_set()
653 fdevent_solaris_devpoll_poll (fdevents *ev, int timeout_ms) in fdevent_solaris_devpoll_poll() argument
655 fdnode ** const fdarray = ev->fdarray; in fdevent_solaris_devpoll_poll()
656 struct pollfd * const devpollfds = ev->devpollfds; in fdevent_solaris_devpoll_poll()
660 dopoll.dp_nfds = ev->maxfds - 1; in fdevent_solaris_devpoll_poll()
663 const int n = ioctl(ev->devpoll_fd, DP_POLL, &dopoll); in fdevent_solaris_devpoll_poll()
676 fdevent_solaris_devpoll_reset (fdevents *ev) in fdevent_solaris_devpoll_reset() argument
680 ev->devpoll_fd = fdevent_open_cloexec("/dev/poll", 1, O_RDWR, 0); in fdevent_solaris_devpoll_reset()
681 return (ev->devpoll_fd >= 0) ? 0 : -1; in fdevent_solaris_devpoll_reset()
686 fdevent_solaris_devpoll_free (fdevents *ev) in fdevent_solaris_devpoll_free() argument
688 free(ev->devpollfds); in fdevent_solaris_devpoll_free()
689 close(ev->devpoll_fd); in fdevent_solaris_devpoll_free()
694 fdevent_solaris_devpoll_init (fdevents *ev) in fdevent_solaris_devpoll_init() argument
706 ev->type = FDEVENT_HANDLER_SOLARIS_DEVPOLL; in fdevent_solaris_devpoll_init()
707 ev->event_set = fdevent_solaris_devpoll_event_set; in fdevent_solaris_devpoll_init()
708 ev->event_del = fdevent_solaris_devpoll_event_del; in fdevent_solaris_devpoll_init()
709 ev->poll = fdevent_solaris_devpoll_poll; in fdevent_solaris_devpoll_init()
710 ev->reset = fdevent_solaris_devpoll_reset; in fdevent_solaris_devpoll_init()
711 ev->free = fdevent_solaris_devpoll_free; in fdevent_solaris_devpoll_init()
712 ev->devpoll_fd = -1; in fdevent_solaris_devpoll_init()
713 ev->devpollfds = ck_calloc(ev->maxfds, sizeof(*ev->devpollfds)); in fdevent_solaris_devpoll_init()
729 fdevent_poll_event_del (fdevents *ev, fdnode *fdn) in fdevent_poll_event_del() argument
733 if ((uint32_t)k >= ev->used || ev->pollfds[k].fd != fd) in fdevent_poll_event_del()
736 ev->pollfds[k].fd = -1; in fdevent_poll_event_del()
740 if (ev->unused.size == ev->unused.used) { in fdevent_poll_event_del()
741 ck_realloc_u32((void **)&ev->unused.ptr, ev->unused.size, in fdevent_poll_event_del()
742 16, sizeof(*ev->unused.ptr)); in fdevent_poll_event_del()
743 ev->unused.size += 16; in fdevent_poll_event_del()
746 ev->unused.ptr[ev->unused.used++] = k; in fdevent_poll_event_del()
752 fdevent_poll_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_poll_event_set() argument
762 if ((uint32_t)k >= ev->used || ev->pollfds[k].fd != fd) in fdevent_poll_event_set()
764 ev->pollfds[k].events = events; in fdevent_poll_event_set()
768 if (ev->unused.used > 0) { in fdevent_poll_event_set()
769 k = ev->unused.ptr[--ev->unused.used]; in fdevent_poll_event_set()
772 if (ev->size == ev->used) { in fdevent_poll_event_set()
773 ck_realloc_u32((void **)&ev->pollfds, ev->size, in fdevent_poll_event_set()
774 16, sizeof(*ev->pollfds)); in fdevent_poll_event_set()
775 ev->size += 16; in fdevent_poll_event_set()
778 k = ev->used++; in fdevent_poll_event_set()
782 ev->pollfds[k].fd = fd; in fdevent_poll_event_set()
783 ev->pollfds[k].events = events; in fdevent_poll_event_set()
789 fdevent_poll_poll (fdevents *ev, int timeout_ms) in fdevent_poll_poll() argument
791 const int n = poll(ev->pollfds, ev->used, timeout_ms); in fdevent_poll_poll()
792 fdnode ** const fdarray = ev->fdarray; in fdevent_poll_poll()
794 struct pollfd * const restrict pfds = ev->pollfds; in fdevent_poll_poll()
805 fdevent_poll_free (fdevents *ev) in fdevent_poll_free() argument
807 free(ev->pollfds); in fdevent_poll_free()
808 if (ev->unused.ptr) free(ev->unused.ptr); in fdevent_poll_free()
813 fdevent_poll_init (fdevents *ev) in fdevent_poll_init() argument
825 ev->type = FDEVENT_HANDLER_POLL; in fdevent_poll_init()
826 ev->event_set = fdevent_poll_event_set; in fdevent_poll_init()
827 ev->event_del = fdevent_poll_event_del; in fdevent_poll_init()
828 ev->poll = fdevent_poll_poll; in fdevent_poll_init()
829 ev->free = fdevent_poll_free; in fdevent_poll_init()
842 fdevent_select_reset (fdevents *ev) in fdevent_select_reset() argument
844 FD_ZERO(&(ev->select_set_read)); in fdevent_select_reset()
845 FD_ZERO(&(ev->select_set_write)); in fdevent_select_reset()
846 FD_ZERO(&(ev->select_set_error)); in fdevent_select_reset()
847 ev->select_max_fd = -1; in fdevent_select_reset()
852 fdevent_select_event_del (fdevents *ev, fdnode *fdn) in fdevent_select_event_del() argument
855 FD_CLR(fd, &(ev->select_set_read)); in fdevent_select_event_del()
856 FD_CLR(fd, &(ev->select_set_write)); in fdevent_select_event_del()
857 FD_CLR(fd, &(ev->select_set_error)); in fdevent_select_event_del()
862 fdevent_select_event_set (fdevents *ev, fdnode *fdn, int events) in fdevent_select_event_set() argument
870 FD_SET(fd, &(ev->select_set_read)); in fdevent_select_event_set()
872 FD_CLR(fd, &(ev->select_set_read)); in fdevent_select_event_set()
875 FD_SET(fd, &(ev->select_set_write)); in fdevent_select_event_set()
877 FD_CLR(fd, &(ev->select_set_write)); in fdevent_select_event_set()
879 FD_SET(fd, &(ev->select_set_error)); in fdevent_select_event_set()
881 if (fd > ev->select_max_fd) ev->select_max_fd = fd; in fdevent_select_event_set()
887 fdevent_select_poll (fdevents *ev, int timeout_ms) in fdevent_select_poll() argument
893 ev->select_read = ev->select_set_read; in fdevent_select_poll()
894 ev->select_write = ev->select_set_write; in fdevent_select_poll()
895 ev->select_error = ev->select_set_error; in fdevent_select_poll()
897 const int nfds = ev->select_max_fd + 1; in fdevent_select_poll()
899 select(nfds, &ev->select_read, &ev->select_write, &ev->select_error, &tv); in fdevent_select_poll()
903 if (FD_ISSET(ndx, &ev->select_read)) revents |= FDEVENT_IN; in fdevent_select_poll()
904 if (FD_ISSET(ndx, &ev->select_write)) revents |= FDEVENT_OUT; in fdevent_select_poll()
905 if (FD_ISSET(ndx, &ev->select_error)) revents |= FDEVENT_ERR; in fdevent_select_poll()
907 const fdnode *fdn = ev->fdarray[ndx]; in fdevent_select_poll()
918 static int fdevent_select_init (fdevents *ev) in fdevent_select_init() argument
920 ev->type = FDEVENT_HANDLER_SELECT; in fdevent_select_init()
921 ev->event_set = fdevent_select_event_set; in fdevent_select_init()
922 ev->event_del = fdevent_select_event_del; in fdevent_select_init()
923 ev->poll = fdevent_select_poll; in fdevent_select_init()
924 ev->reset = fdevent_select_reset; in fdevent_select_init()