#include <yaz/sock_man.h>
+#include <yaz/log.h>
#include <yaz/nmem.h>
#include <assert.h>
#include <sys/epoll.h>
yaz_sock_chan_t next;
yaz_sock_chan_t prev;
int fd;
- unsigned mask;
+ unsigned input_mask;
unsigned output_mask;
int max_idle;
void *data;
man->maxevents = 30;
man->event_no = 0;
man->event_ret = 0;
- man->timeout = 0;
+ man->timeout = -1;
man->rescan = 0;
man->events = nmem_malloc(nmem, man->maxevents * sizeof(*man->events));
if (man->epoll_handle == -1)
{
if (man)
{
+ while (man->chan_list)
+ {
+ yaz_log(YLOG_WARN, "yaz_sock_man_destroy: closing %p",
+ man->chan_list);
+ yaz_sock_chan_destroy(man->chan_list);
+ }
if (man->epoll_handle != -1)
close(man->epoll_handle);
- assert(man->chan_list == 0);
nmem_destroy(man->nmem);
}
}
struct epoll_event event;
event.events = 0;
- if (p->mask & yaz_poll_read)
+ if (p->input_mask & yaz_poll_read)
event.events |= EPOLLIN;
- if (p->mask & yaz_poll_write)
+ if (p->input_mask & yaz_poll_write)
event.events |= EPOLLOUT;
- if (p->mask & yaz_poll_except)
+ if (p->input_mask & yaz_poll_except)
event.events |= EPOLLERR;
event.data.ptr = p;
srv->chan_list = p;
p->fd = fd;
- p->mask = 0;
+ p->input_mask = mask;
+ p->output_mask = 0;
p->data = data;
- p->max_idle = 0;
+ p->max_idle = -1;
p->man = srv;
poll_ctl(EPOLL_CTL_ADD, p);
{
if (man->rescan)
{
- int timeout = 0;
+ int timeout = -1;
yaz_sock_chan_t p;
for (p = man->chan_list; p; p = p->next)
- if (p->max_idle && (timeout == 0 || p->max_idle < timeout))
+ if (p->max_idle != -1 && (timeout == -1 || p->max_idle < timeout))
timeout = p->max_idle;
man->timeout = timeout;
man->rescan = 0;
}
}
-void yaz_sock_chan_destroy(yaz_sock_man_t srv, yaz_sock_chan_t p)
+void yaz_sock_chan_destroy(yaz_sock_chan_t p)
{
+ yaz_sock_man_t srv = p->man;
if (p->prev)
p->prev->next = p->next;
else
}
man->timeout_list = 0; /* no more timeout events */
}
- assert(man->timeout_list = 0);
+ assert(man->timeout_list == 0);
assert(man->event_no <= man->event_ret);
if (man->event_no == man->event_ret)
{ /* must wait again */
void yaz_sock_chan_set_mask(yaz_sock_chan_t chan, unsigned mask)
{
- if (chan->mask != mask)
+ if (chan->input_mask != mask)
{
- chan->mask = mask;
+ chan->input_mask = mask;
poll_ctl(EPOLL_CTL_MOD, chan);
}
}
unsigned yaz_sock_get_mask(yaz_sock_chan_t chan)
{
- return chan->mask;
+ return chan->output_mask;
}
void *yaz_sock_chan_get_data(yaz_sock_chan_t chan)