SOAP, SRW codecs and HTTP transport for YAZ using libxml2.
[yaz-moved-to-github.git] / server / eventl.c
index 0ba7f4a..541bba4 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * Copyright (c) 1995-2001, Index Data
+ * Copyright (c) 1995-2003, Index Data
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Id: eventl.c,v 1.32 2002-09-25 12:37:07 adam Exp $
+ * $Id: eventl.c,v 1.35 2003-02-12 15:06:43 adam Exp $
  */
 
 #include <stdio.h>
@@ -60,6 +60,11 @@ int event_loop(IOCHAN *iochans)
        static struct timeval nullto = {0, 0}, to;
        struct timeval *timeout;
 
+        if (statserv_must_terminate())
+        {
+            for (p = *iochans; p; p = p->next)
+                p->force_event = EVENT_TIMEOUT;
+        }
        FD_ZERO(&in);
        FD_ZERO(&out);
        FD_ZERO(&except);
@@ -69,6 +74,8 @@ int event_loop(IOCHAN *iochans)
        max = 0;
        for (p = *iochans; p; p = p->next)
        {
+            yaz_log(LOG_LOG, "fd=%d flags=%d force_event=%d",
+                    p->fd, p->flags, p->force_event);
            if (p->force_event)
                timeout = &nullto;        /* polling select */
            if (p->flags & EVENT_INPUT)
@@ -80,11 +87,20 @@ int event_loop(IOCHAN *iochans)
            if (p->fd > max)
                max = p->fd;
        }
+        yaz_log(LOG_LOG, "select start");
        res = YAZ_EV_SELECT(max + 1, &in, &out, &except, timeout);
+        yaz_log(LOG_LOG, "select end");
        if (res < 0)
        {
            if (yaz_errno() == EINTR)
-               continue;
+            {
+                if (statserv_must_terminate())
+                {
+                    for (p = *iochans; p; p = p->next)
+                        p->force_event = EVENT_TIMEOUT;
+                }
+                continue;
+            }
             else
             {
                 /* Destroy the first member in the chain, and try again */