2 * Copyright (C) 1995-2007, Index Data ApS
3 * See the file LICENSE for details.
5 * $Id: poll.c,v 1.5 2008-01-21 13:09:07 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 sec, int nsec)
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)
78 tv.tv_usec = nsec / 1000;
80 r = select(max_fd+1, &input, &output, &except, (sec == -1 ? 0 : &tv));
83 for (i = 0; i < num_fds; i++)
85 enum yaz_poll_mask mask = yaz_poll_none;
88 yaz_poll_add(mask, yaz_poll_timeout);
91 if (FD_ISSET(fd, &input))
92 yaz_poll_add(mask, yaz_poll_read);
93 if (FD_ISSET(fd, &output))
94 yaz_poll_add(mask, yaz_poll_write);
95 if (FD_ISSET(fd, &except))
96 yaz_poll_add(mask, yaz_poll_except);
98 fds[i].output_mask = mask;
105 int yaz_poll_poll(struct yaz_poll_fd *fds, int num_fds, int sec, int nsec)
108 struct pollfd *pollfds = (struct pollfd *)
109 xmalloc(num_fds * sizeof *pollfds);
113 for (i = 0; i < num_fds; i++)
115 enum yaz_poll_mask mask = fds[i].input_mask;
117 short poll_events = 0;
119 if (mask & yaz_poll_read)
120 poll_events += POLLIN;
121 if (mask & yaz_poll_write)
122 poll_events += POLLOUT;
123 if (mask & yaz_poll_except)
124 poll_events += POLLERR;
126 pollfds[i].events = poll_events;
127 pollfds[i].revents = 0;
129 r = poll(pollfds, num_fds, sec == -1 ? -1 : sec*1000 + nsec/1000000);
132 for (i = 0; i < num_fds; i++)
134 enum yaz_poll_mask mask = yaz_poll_none;
136 yaz_poll_add(mask, yaz_poll_timeout);
139 if (pollfds[i].revents & POLLIN)
140 yaz_poll_add(mask, yaz_poll_read);
141 if (pollfds[i].revents & POLLOUT)
142 yaz_poll_add(mask, yaz_poll_write);
143 if (pollfds[i].revents & ~(POLLIN | POLLOUT))
145 yaz_poll_add(mask, yaz_poll_except);
148 fds[i].output_mask = mask;
156 int yaz_poll(struct yaz_poll_fd *fds, int num_fds, int sec, int nsec)
158 #if YAZ_HAVE_SYS_POLL_H
159 return yaz_poll_poll(fds, num_fds, sec, nsec);
161 return yaz_poll_select(fds, num_fds, sec, nsec);
168 * indent-tabs-mode: nil
170 * vim: shiftwidth=4 tabstop=8 expandtab