X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-socket.c;h=c0b670ff074c178ab538411853d48bcebc23bb22;hp=a3adebff2e0892cb8723b6ccf25cd112ca97887d;hb=c2d4d247b3fe28f7c191fbc3644c8e011e1a4fea;hpb=951fce6496397a6d8c11e15ab5b60b46abc43467 diff --git a/src/zoom-socket.c b/src/zoom-socket.c index a3adebf..c0b670f 100644 --- a/src/zoom-socket.c +++ b/src/zoom-socket.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2010 Index Data * See the file LICENSE for details. - * - * $Id: zoom-socket.c,v 1.1 2007-01-09 13:56:48 adam Exp $ */ /** * \file zoom-socket.c @@ -15,6 +13,7 @@ #include #include +#include #if HAVE_SYS_TYPES_H #include @@ -22,114 +21,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 +#include 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(yp); return r; } -#endif ZOOM_API(int) ZOOM_event(int no, ZOOM_connection *cs) { int r; - r = ZOOM_process_event(no, cs); + 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 - return ZOOM_process_event(no, cs); + 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