5 #if defined ZMQ_IOTHREAD_POLLER_USE_KQUEUE
24 #if defined ZMQ_HAVE_NETBSD && defined(ZMQ_NETBSD_KEVENT_UDATA_INTPTR_T)
25 #define kevent_udata_t intptr_t
27 #define kevent_udata_t void *
31 worker_poller_base_t (ctx_)
34 kqueue_fd = kqueue ();
41 zmq::kqueue_t::~kqueue_t ()
47 void zmq::kqueue_t::kevent_add (
fd_t fd_,
short filter_,
void *udata_)
52 EV_SET (&ev, fd_, filter_, EV_ADD, 0, 0, (kevent_udata_t) udata_);
53 int rc = kevent (kqueue_fd, &ev, 1,
NULL, 0,
NULL);
57 void zmq::kqueue_t::kevent_delete (
fd_t fd_,
short filter_)
61 EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, 0);
62 int rc = kevent (kqueue_fd, &ev, 1,
NULL, 0,
NULL);
66 zmq::kqueue_t::handle_t zmq::kqueue_t::add_fd (
fd_t fd_,
67 i_poll_events *reactor_)
70 poll_entry_t *pe =
new (std::nothrow) poll_entry_t;
76 pe->reactor = reactor_;
83 void zmq::kqueue_t::rm_fd (handle_t handle_)
86 poll_entry_t *pe = (poll_entry_t *) handle_;
88 kevent_delete (pe->fd, EVFILT_READ);
90 kevent_delete (pe->fd, EVFILT_WRITE);
92 retired.push_back (pe);
97 void zmq::kqueue_t::set_pollin (handle_t handle_)
100 poll_entry_t *pe = (poll_entry_t *) handle_;
101 if (
likely (!pe->flag_pollin)) {
102 pe->flag_pollin =
true;
103 kevent_add (pe->fd, EVFILT_READ, pe);
107 void zmq::kqueue_t::reset_pollin (handle_t handle_)
110 poll_entry_t *pe = (poll_entry_t *) handle_;
111 if (
likely (pe->flag_pollin)) {
112 pe->flag_pollin =
false;
113 kevent_delete (pe->fd, EVFILT_READ);
117 void zmq::kqueue_t::set_pollout (handle_t handle_)
120 poll_entry_t *pe = (poll_entry_t *) handle_;
121 if (
likely (!pe->flag_pollout)) {
122 pe->flag_pollout =
true;
123 kevent_add (pe->fd, EVFILT_WRITE, pe);
127 void zmq::kqueue_t::reset_pollout (handle_t handle_)
130 poll_entry_t *pe = (poll_entry_t *) handle_;
131 if (
likely (pe->flag_pollout)) {
132 pe->flag_pollout =
false;
133 kevent_delete (pe->fd, EVFILT_WRITE);
137 void zmq::kqueue_t::stop ()
141 int zmq::kqueue_t::max_fds ()
146 void zmq::kqueue_t::loop ()
150 int timeout = (int) execute_timers ();
152 if (get_load () == 0) {
177 for (
int i = 0;
i <
n;
i++) {
178 poll_entry_t *pe = (poll_entry_t *) ev_buf[
i].udata;
182 if (ev_buf[
i].
flags & EV_EOF)
183 pe->reactor->in_event ();
186 if (ev_buf[
i].
filter == EVFILT_WRITE)
187 pe->reactor->out_event ();
190 if (ev_buf[
i].
filter == EVFILT_READ)
191 pe->reactor->in_event ();
195 for (retired_t::iterator
it = retired.begin ();
it != retired.end ();