/*
- * Copyright (c) 1995-2003, Index Data
+ * Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
*
- * $Id: eventl.c,v 1.1 2003-10-27 12:21:30 adam Exp $
+ * $Id: eventl.c,v 1.8 2005-03-01 20:37:01 adam Exp $
+ */
+
+/**
+ * \file eventl.c
+ * \brief Implements event loop handling for GFS.
+ *
+ * This source implements the main event loop for the Generic Frontend
+ * Server. It uses select(2).
*/
-#include <stdio.h>
#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
#ifdef WIN32
#include <winsock.h>
-#else
+#endif
+#if HAVE_UNISTD_H
#include <unistd.h>
#endif
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
#include <yaz/yconfig.h>
#include <yaz/log.h>
#define YAZ_EV_SELECT select
#endif
-IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags)
+static int log_level=0;
+static int log_level_initialized=0;
+
+IOCHAN iochan_create(int fd, IOC_CALLBACK cb, int flags, int chan_id)
{
IOCHAN new_iochan;
+ if (!log_level_initialized)
+ {
+ log_level=yaz_log_module_level("eventl");
+ log_level_initialized=1;
+ }
+
if (!(new_iochan = (IOCHAN)xmalloc(sizeof(*new_iochan))))
return 0;
new_iochan->destroyed = 0;
new_iochan->force_event = 0;
new_iochan->last_event = new_iochan->max_idle = 0;
new_iochan->next = NULL;
+ new_iochan->chan_id = chan_id;
return new_iochan;
}
for (p = *iochans; p; p = p->next)
{
time_t w, ftime;
- yaz_log(LOG_DEBUG, "fd=%d flags=%d force_event=%d",
+ yaz_log(log_level, "fd=%d flags=%d force_event=%d",
p->fd, p->flags, p->force_event);
if (p->force_event)
to.tv_sec = 0; /* polling select */
to.tv_sec = w;
}
}
- yaz_log(LOG_DEBUG, "select start %ld", (long) to.tv_sec);
+ yaz_log(log_level, "select start %ld", (long) to.tv_sec);
res = YAZ_EV_SELECT(max + 1, &in, &out, &except, &to);
- yaz_log(LOG_DEBUG, "select end");
+ yaz_log(log_level, "select end");
if (res < 0)
{
if (yaz_errno() == EINTR)
cs_close(conn);
destroy_association(assoc);
iochan_destroy(*iochans);
- yaz_log(LOG_DEBUG, "error select, destroying iochan %p",
+ yaz_log(log_level, "error select, destroying iochan %p",
*iochans);
}
}