+static void
+vcl_epoll_swap_lt_lists (vcl_worker_t *wrk)
+{
+ u32 *le;
+
+ le = wrk->ep_level_evts;
+ wrk->ep_level_evts = wrk->ep_level_evts_fl;
+ wrk->ep_level_evts_fl = le;
+}
+
+static void
+vcl_epoll_wait_handle_lt (vcl_worker_t *wrk, struct epoll_event *events,
+ int maxevents, u32 *n_evts)
+{
+ u32 *sid, add_event = 0, *le = wrk->ep_level_evts_fl;
+ vcl_session_t *s;
+ u64 evt_data;
+
+ if (*n_evts >= maxevents)
+ {
+ vec_add (wrk->ep_level_evts, le, vec_len (le));
+ vec_reset_length (wrk->ep_level_evts_fl);
+ return;
+ }
+
+ vec_foreach (sid, le)
+ {
+ s = vcl_session_get (wrk, sid[0]);
+ if (!s)
+ continue;
+ if ((s->vep.ev.events & EPOLLIN) && vcl_session_read_ready (s))
+ {
+ add_event = 1;
+ events[*n_evts].events |= EPOLLIN;
+ evt_data = s->vep.ev.data.u64;
+ }
+ if ((s->vep.ev.events & EPOLLOUT) && vcl_session_write_ready (s))
+ {
+ add_event = 1;
+ events[*n_evts].events |= EPOLLOUT;
+ evt_data = s->vep.ev.data.u64;
+ }
+ if (add_event)
+ {
+ events[*n_evts].data.u64 = evt_data;
+ *n_evts += 1;
+ add_event = 0;
+ vec_add1 (wrk->ep_level_evts, sid[0]);
+ if (*n_evts == maxevents)
+ {
+ u32 pos = (sid - le) + 1;
+ vec_add (wrk->ep_level_evts, &le[pos], vec_len (le) - pos);
+ break;
+ }
+ }
+ }
+
+ vec_reset_length (wrk->ep_level_evts_fl);
+}
+