X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-socket.c;h=36a5f15768509e3a1177f8d2d6db668bab362dbe;hp=5950baa0315dd3af6e2d01d1059cc57f1d547c80;hb=f36abe0a776fa52b972a3fec1b46b94e26814f22;hpb=fe507b6b15788a3a8e58063d9dae52532a5229a5 diff --git a/src/zoom-socket.c b/src/zoom-socket.c index 5950baa..36a5f15 100644 --- a/src/zoom-socket.c +++ b/src/zoom-socket.c @@ -1,13 +1,14 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: zoom-socket.c,v 1.4 2007-05-06 20:12:20 adam Exp $ */ /** * \file zoom-socket.c * \brief Implements ZOOM C socket interface. */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -23,131 +24,22 @@ #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 +#include -/* - * Note that ZOOM_event_sys_select() is limited as to how many file - * descriptors it can multiplex due to its use of select() which in - * turn uses the statically defined fd_set type to be a bitmap of the - * file descriptors to check. On Ubuntu 6.06 (and almost certainly on - * Debian, and probably on all Linuxes, and maybe all Unixes) this is - * by default set to 1024 (though it may be possible to override this - * using a #define before including -- I've not tried - * this). 1024 file descriptors is a lot, but not enough in all - * cases, e.g. when running IRSpy on a large target database. So you - * should ensure that YAZ uses ZOOM_event_sys_poll() when possible. - */ ZOOM_API(int) - ZOOM_event_sys_select(int no, ZOOM_connection *cs) + ZOOM_event_sys_yaz_poll(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= 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(pollfds); - xfree(poll_cs); + xfree(yp); return r; } -#endif ZOOM_API(int) ZOOM_event(int no, ZOOM_connection *cs) @@ -222,17 +103,15 @@ 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); } /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab