summaryrefslogtreecommitdiff
path: root/config/os/macosx/poll.h
diff options
context:
space:
mode:
Diffstat (limited to 'config/os/macosx/poll.h')
-rw-r--r--config/os/macosx/poll.h233
1 files changed, 118 insertions, 115 deletions
diff --git a/config/os/macosx/poll.h b/config/os/macosx/poll.h
index 6a49e0d..d7445c7 100644
--- a/config/os/macosx/poll.h
+++ b/config/os/macosx/poll.h
@@ -4,13 +4,13 @@
// Warning: a call to this poll() takes about 4K of stack space.
// Greg Parker gparker-web@sealiesoftware.com December 2000
-// This code is in the public domain and may be copied or modified without
-// permission.
+// This code is in the public domain and may be copied or modified without
+// permission.
-// Updated May 2002:
+// Updated May 2002:
// * fix crash when an fd is less than 0
// * set errno=EINVAL if an fd is greater or equal to FD_SETSIZE
-// * don't set POLLIN or POLLOUT in revents if it wasn't requested
+// * don't set POLLIN or POLLOUT in revents if it wasn't requested
// in events (only happens when an fd is in the poll set twice)
#ifndef _FAKE_POLL_H
@@ -24,9 +24,9 @@
#include <errno.h>
typedef struct pollfd {
- int fd; /* file desc to poll */
- short events; /* events of interest on fd */
- short revents; /* events that occurred on fd */
+ int fd; /* file desc to poll */
+ short events; /* events of interest on fd */
+ short revents; /* events that occurred on fd */
} pollfd_t;
@@ -47,116 +47,119 @@ typedef struct pollfd {
#define POLLHUP 0x0010
#define POLLNVAL 0x0020
-static inline int
-poll(struct pollfd *pollSet, int pollCount, int pollTimeout)
+static inline int
+poll (struct pollfd *pollSet, int pollCount, int pollTimeout)
{
- struct timeval tv;
- struct timeval *tvp;
- fd_set readFDs, writeFDs, exceptFDs;
- fd_set *readp, *writep, *exceptp;
- struct pollfd *pollEnd, *p;
- int selected;
- int result;
- int maxFD;
-
- if (!pollSet) {
- pollEnd = NULL;
- readp = NULL;
- writep = NULL;
- exceptp = NULL;
- maxFD = 0;
- }
- else {
- pollEnd = pollSet + pollCount;
- readp = &readFDs;
- writep = &writeFDs;
- exceptp = &exceptFDs;
-
- FD_ZERO(readp);
- FD_ZERO(writep);
- FD_ZERO(exceptp);
-
- // Find the biggest fd in the poll set
- maxFD = 0;
- for (p = pollSet; p < pollEnd; p++) {
- if (p->fd > maxFD) maxFD = p->fd;
- }
-
- if (maxFD >= FD_SETSIZE) {
- // At least one fd is too big
- errno = EINVAL;
- return -1;
- }
-
- // Transcribe flags from the poll set to the fd sets
- for (p = pollSet; p < pollEnd; p++) {
- if (p->fd < 0) {
- // Negative fd checks nothing and always reports zero
- } else {
- if (p->events & POLLIN) FD_SET(p->fd, readp);
- if (p->events & POLLOUT) FD_SET(p->fd, writep);
- if (p->events != 0) {
- FD_SET(p->fd, exceptp);
- }
- // POLLERR is never set coming in; poll() always reports errors
- // But don't report if we're not listening to anything at all.
- }
- }
- }
-
- // poll timeout is in milliseconds. Convert to struct timeval.
- // poll timeout == -1 : wait forever : select timeout of NULL
- // poll timeout == 0 : return immediately : select timeout of zero
- if (pollTimeout >= 0) {
- tv.tv_sec = pollTimeout / 1000;
- tv.tv_usec = (pollTimeout % 1000) * 1000;
- tvp = &tv;
- } else {
- tvp = NULL;
- }
-
- selected = select(maxFD+1, readp, writep, exceptp, tvp);
-
- if (selected < 0) {
- // Error during select
- result = -1;
- }
- else if (selected > 0) {
- // Select found something
- // Transcribe result from fd sets to poll set.
- // Also count the number of selected fds. poll returns the
- // number of ready fds; select returns the number of bits set.
- int polled = 0;
- for (p = pollSet; p < pollEnd; p++) {
- p->revents = 0;
- if (p->fd < 0) {
- // Negative fd always reports zero
- } else {
- if ((p->events & POLLIN) && FD_ISSET(p->fd, readp)) {
- p->revents |= POLLIN;
- }
- if ((p->events & POLLOUT) && FD_ISSET(p->fd, writep)) {
- p->revents |= POLLOUT;
- }
- if ((p->events != 0) && FD_ISSET(p->fd, exceptp)) {
- p->revents |= POLLERR;
- }
-
- if (p->revents) polled++;
- }
+ struct timeval tv;
+ struct timeval *tvp;
+ fd_set readFDs, writeFDs, exceptFDs;
+ fd_set *readp, *writep, *exceptp;
+ struct pollfd *pollEnd, *p;
+ int selected;
+ int result;
+ int maxFD;
+
+ if (!pollSet) {
+ pollEnd = NULL;
+ readp = NULL;
+ writep = NULL;
+ exceptp = NULL;
+ maxFD = 0;
+ } else {
+ pollEnd = pollSet + pollCount;
+ readp = &readFDs;
+ writep = &writeFDs;
+ exceptp = &exceptFDs;
+
+ FD_ZERO (readp);
+ FD_ZERO (writep);
+ FD_ZERO (exceptp);
+
+ // Find the biggest fd in the poll set
+ maxFD = 0;
+ for (p = pollSet; p < pollEnd; p++)
+ if (p->fd > maxFD) {
+ maxFD = p->fd;
+ }
+
+ if (maxFD >= FD_SETSIZE) {
+ // At least one fd is too big
+ errno = EINVAL;
+ return -1;
+ }
+
+ // Transcribe flags from the poll set to the fd sets
+ for (p = pollSet; p < pollEnd; p++) {
+ if (p->fd < 0) {
+ // Negative fd checks nothing and always reports zero
+ } else {
+ if (p->events & POLLIN) {
+ FD_SET (p->fd, readp);
+ }
+ if (p->events & POLLOUT) {
+ FD_SET (p->fd, writep);
+ }
+ if (p->events != 0) {
+ FD_SET (p->fd, exceptp);
+ }
+ // POLLERR is never set coming in; poll() always reports errors
+ // But don't report if we're not listening to anything at all.
+ }
+ }
}
- result = polled;
- }
- else {
- // selected == 0, select timed out before anything happened
- // Clear all result bits and return zero.
- for (p = pollSet; p < pollEnd; p++) {
- p->revents = 0;
- }
- result = 0;
- }
-
- return result;
+
+ // poll timeout is in milliseconds. Convert to struct timeval.
+ // poll timeout == -1 : wait forever : select timeout of NULL
+ // poll timeout == 0 : return immediately : select timeout of zero
+ if (pollTimeout >= 0) {
+ tv.tv_sec = pollTimeout / 1000;
+ tv.tv_usec = (pollTimeout % 1000) * 1000;
+ tvp = &tv;
+ } else {
+ tvp = NULL;
+ }
+
+ selected = select (maxFD + 1, readp, writep, exceptp, tvp);
+
+ if (selected < 0) {
+ // Error during select
+ result = -1;
+ } else if (selected > 0) {
+ // Select found something
+ // Transcribe result from fd sets to poll set.
+ // Also count the number of selected fds. poll returns the
+ // number of ready fds; select returns the number of bits set.
+ int polled = 0;
+ for (p = pollSet; p < pollEnd; p++) {
+ p->revents = 0;
+ if (p->fd < 0) {
+ // Negative fd always reports zero
+ } else {
+ if ((p->events & POLLIN) && FD_ISSET (p->fd, readp)) {
+ p->revents |= POLLIN;
+ }
+ if ((p->events & POLLOUT) && FD_ISSET (p->fd, writep)) {
+ p->revents |= POLLOUT;
+ }
+ if ((p->events != 0) && FD_ISSET (p->fd, exceptp)) {
+ p->revents |= POLLERR;
+ }
+
+ if (p->revents) {
+ polled++;
+ }
+ }
+ }
+ result = polled;
+ } else {
+ // selected == 0, select timed out before anything happened
+ // Clear all result bits and return zero.
+ for (p = pollSet; p < pollEnd; p++)
+ p->revents = 0;
+ result = 0;
+ }
+
+ return result;
}
#endif