log tv_sec in call to yaz_poll
[pazpar2-moved-to-github.git] / src / eventl.c
index e200e03..40dfeb4 100644 (file)
 #include <stdio.h>
 #include <assert.h>
 
-#ifdef WIN32
-#include <winsock.h>
-#else
+#if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#if HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
 
 #include <stdlib.h>
 #include <errno.h>
@@ -229,12 +224,10 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
         IOCHAN start;
         IOCHAN inv_start;
         int res;
-        static struct timeval to;
         struct yaz_poll_fd *fds;
         int i, no_fds = 0;
         int connection_fired = 0;
-        to.tv_sec = 300;
-        to.tv_usec = 0;
+        int tv_sec = 300;
 
         yaz_mutex_enter(man->iochan_mutex);
         start = man->channel_list;
@@ -260,13 +253,14 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
         }
         for (p = start; p; p = p->next, i++)
         {
+            p->poll_offset = i;
             fds[i].client_data = p;
-            fds[i].fd = p->fd;
+            fds[i].fd = -1;
             fds[i].input_mask = 0;
             if (p->thread_users > 0)
                 continue;
-            if (p->max_idle && p->max_idle < to.tv_sec)
-                to.tv_sec = p->max_idle;
+            if (p->max_idle && p->max_idle < tv_sec)
+                tv_sec = p->max_idle;
             if (p->fd < 0)
                 continue;
             if (p->flags & EVENT_INPUT)
@@ -275,9 +269,13 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
                 fds[i].input_mask |= yaz_poll_write;
             if (p->flags & EVENT_EXCEPT)
                 fds[i].input_mask |= yaz_poll_except;
+            if (fds[i].input_mask)
+                fds[i].fd = p->fd;
         }
-        yaz_log(man->log_level, "yaz_poll begin nofds=%d", no_fds);
-        res = yaz_poll(fds, no_fds, to.tv_sec, 0);
+        assert(i == no_fds);
+        yaz_log(man->log_level, "yaz_poll begin tv_sec=%d nofds=%d", tv_sec,
+                no_fds);
+        res = yaz_poll(fds, no_fds, tv_sec, 0);
         yaz_log(man->log_level, "yaz_poll returned res=%d", res);
         if (res < 0)
         {
@@ -286,12 +284,12 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
             else
             {
                 yaz_log(YLOG_ERRNO | YLOG_WARN, "poll");
-                return 0;
+                abort();
             }
         }
-        i = 0;
         if (man->sel_fd != -1)
         {
+            i = 0;
             assert(fds[i].fd == man->sel_fd);
             if (fds[i].output_mask)
             {
@@ -307,7 +305,6 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
                     chan->thread_users--;
                 }
             }
-            i++;
         }
         if (man->log_level)
         {
@@ -316,10 +313,10 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
                 no++;
             yaz_log(man->log_level, "%d channels", no);
         }
-        for (; i < no_fds; i++)
+        for (p = start; p; p = p->next)
         {
             time_t now = time(0);
-            p = fds[i].client_data;
+            i = p->poll_offset;
 
             if (p->destroyed)
             {
@@ -341,7 +338,7 @@ static int event_loop(iochan_man_t man, IOCHAN *iochans)
                 p->last_event = now;
                 p->this_event |= EVENT_TIMEOUT;
             }
-            if (fds[i].fd >= 0)
+            if (fds[i].fd >= 0 && p->fd == fds[i].fd)
             {
                 if (fds[i].output_mask & yaz_poll_read)
                 {
@@ -402,18 +399,6 @@ void iochan_man_events(iochan_man_t man)
     event_loop(man, &man->channel_list);
 }
 
-void pazpar2_sleep(double d)
-{
-#ifdef WIN32
-    Sleep( (DWORD) (d * 1000));
-#else
-    struct timeval tv;
-    tv.tv_sec = floor(d);
-    tv.tv_usec = (d - floor(d)) * 1000000;
-    select(0, 0, 0, 0, &tv);
-#endif
-}
-
 /*
  * Local variables:
  * c-basic-offset: 4