X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-socket.c;h=2d9d6863ade846a01d3cb97f954e1546ae99ac54;hb=689ff444ffea343f202398ee3eacf5a4cf94154e;hp=8eb9733b490eaed512f8395bb3639cfa79d2f10d;hpb=0982c13b874d79d950800b62ea22d91d943f3036;p=yaz-moved-to-github.git diff --git a/src/zoom-socket.c b/src/zoom-socket.c index 8eb9733..2d9d686 100644 --- a/src/zoom-socket.c +++ b/src/zoom-socket.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-socket.c,v 1.2 2007-01-12 21:03:31 adam Exp $ + * $Id: zoom-socket.c,v 1.8 2007-11-30 11:44:47 adam Exp $ */ /** * \file zoom-socket.c @@ -15,6 +15,7 @@ #include #include +#include #if HAVE_SYS_TYPES_H #include @@ -22,114 +23,18 @@ #if HAVE_SYS_TIME_H #include #endif -#if HAVE_SYS_POLL_H -#include -#endif -#if HAVE_SYS_SELECT_H -#include -#endif -#ifdef WIN32 -#if FD_SETSIZE < 512 -#define FD_SETSIZE 512 -#endif -#include -#endif - - -ZOOM_API(int) - ZOOM_event_sys_select(int no, ZOOM_connection *cs) -{ - struct timeval tv; - fd_set input, output, except; - int i, r; - int max_fd = 0; - int timeout = 30; - int nfds = 0; - - FD_ZERO(&input); - FD_ZERO(&output); - FD_ZERO(&except); - - for (i = 0; i - while ((r = select(max_fd+1, &input, &output, &except, - (timeout == -1 ? 0 : &tv))) < 0 && errno == EINTR) - { - ; - } - if (r < 0) - { - yaz_log(YLOG_WARN|YLOG_ERRNO, "ZOOM_event_sys_select"); - return r; - } - - for (i = 0; i= 0) { - ZOOM_connection c = poll_cs[i]; - if (r) + for (i = 0; i < nfds; i++) { - int mask = 0; - if (pollfds[i].revents & POLLIN) - mask += ZOOM_SELECT_READ; - if (pollfds[i].revents & POLLOUT) - mask += ZOOM_SELECT_WRITE; - if (pollfds[i].revents & POLLERR) - mask += ZOOM_SELECT_EXCEPT; - ZOOM_connection_fire_event_socket(c, mask); + ZOOM_connection c = (ZOOM_connection) yp[i].client_data; + enum yaz_poll_mask output_mask = yp[i].output_mask; + if (output_mask & yaz_poll_timeout) + ZOOM_connection_fire_event_timeout(c); + else + { + int mask = 0; + if (output_mask & yaz_poll_read) + mask += ZOOM_SELECT_READ; + if (output_mask & yaz_poll_write) + mask += ZOOM_SELECT_WRITE; + if (output_mask & yaz_poll_except) + mask += ZOOM_SELECT_EXCEPT; + ZOOM_connection_fire_event_socket(c, mask); + } } - else - ZOOM_connection_fire_event_timeout(c); } + xfree(yp); return r; } -#endif ZOOM_API(int) ZOOM_event(int no, ZOOM_connection *cs) @@ -201,11 +102,8 @@ ZOOM_API(int) r = ZOOM_event_nonblock(no, cs); if (r) return r; -#if HAVE_SYS_POLL_H - ZOOM_event_sys_poll(no, cs); -#else - ZOOM_event_sys_select(no, cs); -#endif + while (ZOOM_event_sys_yaz_poll(no, cs) < 0 && errno == EINTR) + ; return ZOOM_event_nonblock(no, cs); }