int r = ZOOM_connection_exec_task(co->link);
if (!r)
yaz_log(YLOG_WARN, "No task was executed for connection");
+ iochan_setflags(co->iochan, ZOOM_connection_get_mask(co->link));
+ iochan_setfd(co->iochan, ZOOM_connection_get_socket(co->link));
}
static void connection_handler(IOCHAN iochan, int event)
non_block_events(co);
client_unlock(cl);
+
+ if (co->link)
+ {
+ iochan_setflags(iochan, ZOOM_connection_get_mask(co->link));
+ iochan_setfd(iochan, ZOOM_connection_get_socket(co->link));
+ }
}
}
return con->host;
}
-// Callback for use by event loop
-// We do this because ZOOM connections don't always have (the same) sockets
-static int socketfun(IOCHAN c)
-{
- struct connection *co = iochan_getdata(c);
- if (!co->link)
- return -1;
- return ZOOM_connection_get_socket(co->link);
-}
-
-// Because ZOOM always knows what events it is interested in; we may not
-static int maskfun(IOCHAN c)
-{
- struct connection *co = iochan_getdata(c);
- if (!co->link)
- return 0;
-
- // This is cheating a little, and assuming that eventl mask IDs are always
- // the same as ZOOM-C's.
- return ZOOM_connection_get_mask(co->link);
-}
-
static int connection_connect(struct connection *con, iochan_man_t iochan_man)
{
ZOOM_connection link = 0;
con->state = Conn_Connecting;
iochan_settimeout(con->iochan, con->operation_timeout);
iochan_setdata(con->iochan, con);
- iochan_setsocketfun(con->iochan, socketfun);
- iochan_setmaskfun(con->iochan, maskfun);
iochan_add(iochan_man, con->iochan);
/* this fragment is bad DRY: from client_prep_connection */
new_iochan->fd = fd;
new_iochan->flags = flags;
new_iochan->fun = cb;
- new_iochan->socketfun = NULL;
- new_iochan->maskfun = NULL;
new_iochan->last_event = new_iochan->max_idle = 0;
new_iochan->next = NULL;
new_iochan->man = 0;
{
if (p->thread_users > 0)
continue;
- if (p->maskfun)
- p->flags = (*p->maskfun)(p);
- if (p->socketfun)
- p->fd = (*p->socketfun)(p);
if (p->max_idle && p->max_idle < to.tv_sec)
to.tv_sec = p->max_idle;
if (p->fd < 0)
struct iochan;
typedef void (*IOC_CALLBACK)(struct iochan *i, int event);
-typedef int (*IOC_SOCKETFUN)(struct iochan *i);
-typedef int (*IOC_MASKFUN)(struct iochan *i);
typedef struct iochan_man_s *iochan_man_t;
#define EVENT_EXCEPT 0x04
#define EVENT_TIMEOUT 0x08
IOC_CALLBACK fun;
- IOC_SOCKETFUN socketfun;
- IOC_MASKFUN maskfun;
void *data;
int destroyed;
time_t last_event;
#define iochan_destroy(i) (void)((i)->destroyed = 1)
#define iochan_getfd(i) ((i)->fd)
+#define iochan_setfd(i, d) ((i)->fd = d)
#define iochan_getdata(i) ((i)->data)
#define iochan_setdata(i, d) ((i)->data = d)
#define iochan_setflags(i, d) ((i)->flags = d)
#define iochan_getflag(i, d) ((i)->flags & d ? 1 : 0)
#define iochan_settimeout(i, t) ((i)->max_idle = (t), (i)->last_event = time(0))
#define iochan_activity(i) ((i)->last_event = time(0))
-#define iochan_setsocketfun(i, f) ((i)->socketfun = (f))
-#define iochan_getsocketfun(i) ((i)->socketfun)
-#define iochan_setmaskfun(i, f) ((i)->maskfun = (f))
-#define iochan_getmaskfun(i) ((i)->maskfun)
IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags, const char *name);