+static void work_handler(void *work_data)
+{
+ IOCHAN p = work_data;
+
+ yaz_log(p->man->log_level, "eventl: work begin chan=%p name=%s event=%d",
+ p, p->name ? p->name : "", p->this_event);
+
+ if (!p->destroyed && (p->this_event & EVENT_TIMEOUT))
+ (*p->fun)(p, EVENT_TIMEOUT);
+ if (!p->destroyed && (p->this_event & EVENT_INPUT))
+ (*p->fun)(p, EVENT_INPUT);
+ if (!p->destroyed && (p->this_event & EVENT_OUTPUT))
+ (*p->fun)(p, EVENT_OUTPUT);
+ if (!p->destroyed && (p->this_event & EVENT_EXCEPT))
+ (*p->fun)(p, EVENT_EXCEPT);
+
+ yaz_log(p->man->log_level, "eventl: work end chan=%p name=%s event=%d",
+ p, p->name ? p->name : "", p->this_event);
+}
+
+static void run_fun(iochan_man_t man, IOCHAN p)
+{
+ if (p->this_event)
+ {
+ if (man->sel_thread)
+ {
+ yaz_log(man->log_level, "eventl: work add chan=%p name=%s event=%d",
+ p, p->name ? p->name : "", p->this_event);
+ p->thread_users++;
+ sel_thread_add(man->sel_thread, p);
+ }
+ else
+ work_handler(p);
+ }
+}
+
+static IOCHAN iochan_man_get_first(struct iochan_man_iter *iter, iochan_man_t man) {
+ iter->man = man;
+ iter->first = 1;
+ yaz_mutex_enter(man->iochan_mutex);
+ iter->current = man->channel_list;
+ yaz_log(man->log_level, "iochan_man_get_first : chan=%p ", iter->current);
+ if (!iter->current)
+ yaz_mutex_leave(man->iochan_mutex);
+ return iter->current;
+}
+
+static IOCHAN iochan_man_get_next(struct iochan_man_iter *iter) {
+ IOCHAN current = NULL, next = NULL;
+ current = iter->current;
+ assert(current);
+ if (current) {
+ next = current->next;
+ iter->current = iter->current->next;
+ if (iter->first) {
+ yaz_log(iter->man->log_level, "iochan_man_get_next : chan=%p next=%p", current, next);
+ iter->first = 0;
+ yaz_mutex_leave(iter->man->iochan_mutex);
+ }
+ }
+ return iter->current;
+}
+
+static int event_loop(iochan_man_t man, IOCHAN *iochans)