Do not handle EINTR in yaz_poll.
authorAdam Dickmeiss <adam@indexdata.dk>
Sat, 10 Nov 2007 08:59:31 +0000 (08:59 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Sat, 10 Nov 2007 08:59:31 +0000 (08:59 +0000)
Change yaz_poll so that it does not loop around select/poll if
errno=EINTR is set. This sitution is handled in caller, such
as event_loop used by GFS which must take further action if EINTR
is set. If EINTR is handled by yaz_poll it does not get caught.

src/poll.c
src/zoom-socket.c

index f404c4f..4bd35c0 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: poll.c,v 1.2 2007-11-09 22:08:14 adam Exp $
+ * $Id: poll.c,v 1.3 2007-11-10 08:59:31 adam Exp $
  */
 /**
  * \file 
@@ -48,8 +48,7 @@
   cases, e.g. when running IRSpy on a large target database.  So you
   should ensure that YAZ uses ZOOM_yaz_poll_poll() when possible.
 */
-static int yaz_poll_select(struct yaz_poll_fd *fds, int num_fds,
-                           int sec, int nsec)
+int yaz_poll_select(struct yaz_poll_fd *fds, int num_fds, int sec, int nsec)
 {
     struct timeval tv;
     fd_set input, output, except;
@@ -77,35 +76,33 @@ static int yaz_poll_select(struct yaz_poll_fd *fds, int num_fds,
     }
     tv.tv_sec = sec;
     tv.tv_usec = nsec / 1000;
-
-    while ((r = select(max_fd+1, &input, &output, &except,
-                       (sec == -1 ? 0 : &tv))) < 0 && errno == EINTR)
-    {
-        ;
-    }
-    for (i = 0; i < num_fds; i++)
+    
+    r = select(max_fd+1, &input, &output, &except, (sec == -1 ? 0 : &tv));
+    if (r >= 0)
     {
-        enum yaz_poll_mask mask = 0;
-        int fd = fds[i].fd;
-        if (!r)
-            mask += yaz_poll_timeout;
-        else
+        for (i = 0; i < num_fds; i++)
         {
-            if (FD_ISSET(fd, &input))
-                mask += yaz_poll_read;
-            if (FD_ISSET(fd, &output))
-                mask += yaz_poll_write;
-            if (FD_ISSET(fd, &except))
-                mask += yaz_poll_except;
+            enum yaz_poll_mask mask = 0;
+            int fd = fds[i].fd;
+            if (!r)
+                mask += yaz_poll_timeout;
+            else
+            {
+                if (FD_ISSET(fd, &input))
+                    mask += yaz_poll_read;
+                if (FD_ISSET(fd, &output))
+                    mask += yaz_poll_write;
+                if (FD_ISSET(fd, &except))
+                    mask += yaz_poll_except;
+            }
+            fds[i].output_mask = mask;
         }
-        fds[i].output_mask = mask;
     }
     return r;
 }
 
 #if HAVE_SYS_POLL_H
-static int yaz_poll_poll(struct yaz_poll_fd *fds, int num_fds,
-                         int sec, int nsec)
+int yaz_poll_poll(struct yaz_poll_fd *fds, int num_fds, int sec, int nsec)
 {
     int r;
     struct pollfd *pollfds = (struct pollfd *) 
@@ -129,12 +126,7 @@ static int yaz_poll_poll(struct yaz_poll_fd *fds, int num_fds,
         pollfds[i].events = poll_events;
         pollfds[i].revents = 0;
     }
-    while ((r = poll(pollfds, num_fds,
-                     (sec == -1 ? -1 : sec*1000 + nsec/1000000))) < 0
-           && errno == EINTR)
-    {
-        ;
-    }
+    r = poll(pollfds, num_fds, sec == -1 ? -1 : sec*1000 + nsec/1000000);
     if (r >= 0)
     {
         for (i = 0; i < num_fds; i++)
index 119d680..9299884 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2007, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: zoom-socket.c,v 1.6 2007-11-09 22:08:14 adam Exp $
+ * $Id: zoom-socket.c,v 1.7 2007-11-10 08:59:31 adam Exp $
  */
 /**
  * \file zoom-socket.c
@@ -102,7 +102,8 @@ ZOOM_API(int)
     r = ZOOM_event_nonblock(no, cs);
     if (r)
         return r;
-    ZOOM_event_sys_yaz_poll(no, cs);
+    while (ZOOM_event_sys_yaz_poll(no, cs) < 0 && errno == EINTR)
+        ;
     return ZOOM_event_nonblock(no, cs);
 }