2 * Copyright (C) 1995-2007, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: poll.c,v 1.1 2007-11-09 16:46:43 adam Exp $
9 * \brief Select, poll wrapper
17 #include <yaz/xmalloc.h>
21 #include <sys/types.h>
30 #include <sys/select.h>
34 #define FD_SETSIZE 512
40 Note that yaz_poll_select is limited as to how many file
41 descriptors it can multiplex due to its use of select() which in
42 turn uses the statically defined fd_set type to be a bitmap of the
43 file descriptors to check. On Ubuntu 6.06 (and almost certainly on
44 Debian, and probably on all Linuxes, and maybe all Unixes) this is
45 by default set to 1024 (though it may be possible to override this
46 using a #define before including <sys/select.h> -- I've not tried
47 this). 1024 file descriptors is a lot, but not enough in all
48 cases, e.g. when running IRSpy on a large target database. So you
49 should ensure that YAZ uses ZOOM_yaz_poll_poll() when possible.
51 int yaz_poll_select(struct yaz_poll_fd *fds, int num_fds, int timeout)
54 fd_set input, output, except;
63 for (i = 0; i < num_fds; i++)
65 enum yaz_poll_mask mask = fds[i].input_mask;
68 if (mask & yaz_poll_read)
70 if (mask & yaz_poll_write)
72 if (mask & yaz_poll_except)
80 while ((r = select(max_fd+1, &input, &output, &except,
81 (timeout == -1 ? 0 : &tv))) < 0 && errno == EINTR)
85 for (i = 0; i < num_fds; i++)
87 enum yaz_poll_mask mask = 0;
90 mask += yaz_poll_timeout;
93 if (FD_ISSET(fd, &input))
94 mask += yaz_poll_read;
95 if (FD_ISSET(fd, &output))
96 mask += yaz_poll_write;
97 if (FD_ISSET(fd, &except))
98 mask += yaz_poll_except;
100 fds[i].output_mask = mask;
106 int yaz_poll_poll(struct yaz_poll_fd *fds, int num_fds, int timeout)
109 struct pollfd *pollfds = (struct pollfd *)
110 xmalloc(num_fds * sizeof *pollfds);
114 for (i = 0; i < num_fds; i++)
116 enum yaz_poll_mask mask = fds[i].input_mask;
118 short poll_events = 0;
120 if (mask & yaz_poll_read)
121 poll_events += POLLIN;
122 if (mask & yaz_poll_write)
123 poll_events += POLLOUT;
124 if (mask & yaz_poll_except)
125 poll_events += POLLERR;
127 pollfds[i].events = poll_events;
128 pollfds[i].revents = 0;
130 while ((r = poll(pollfds, num_fds,
131 (timeout == -1 ? -1 : timeout * 1000))) < 0
138 for (i = 0; i < num_fds; i++)
140 enum yaz_poll_mask mask = 0;
142 mask += yaz_poll_timeout;
145 if (pollfds[i].revents & POLLIN)
146 mask += yaz_poll_read;
147 if (pollfds[i].revents & POLLOUT)
148 mask += yaz_poll_write;
149 if (pollfds[i].revents & POLLERR)
150 mask += yaz_poll_except;
152 fds[i].output_mask = mask;
160 int yaz_poll(struct yaz_poll_fd *fds, int num_fds, int timeout)
162 #if YAZ_HAVE_SYS_POLL_H
163 return yaz_poll_poll(fds, num_fds, timeout);
165 return yaz_poll_select(fds, num_fds, timeout);
172 * indent-tabs-mode: nil
174 * vim: shiftwidth=4 tabstop=8 expandtab