summaryrefslogtreecommitdiff
path: root/src/common/fakepoll.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/fakepoll.h')
-rw-r--r--src/common/fakepoll.h25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/common/fakepoll.h b/src/common/fakepoll.h
index 44fc63d858..3f3d1610bb 100644
--- a/src/common/fakepoll.h
+++ b/src/common/fakepoll.h
@@ -44,7 +44,30 @@ struct pollfd {
#define POLLNVAL 0x0020
#endif
-int tor_poll(struct pollfd *ufds, unsigned int nfds, int timeout);
+#ifdef MS_WINDOWS
+#define MAXCONNECTIONS 10000 /* XXXX copied from or.h */
+/* This trick makes winsock resize fd_set, which defaults to the insanely low
+ * 64. */
+#define FD_SETSIZE MAXCONNECTIONS
+/* XXXX But Windows FD_SET and FD_CLR are tremendously ugly, and linear in
+ * the total number of sockets set! Perhaps we should eventually use
+ * WSAEventSelect and WSAWaitForMultipleEvents instead of select? */
+#endif
+#if defined(MS_WINDOWS) || ! defined(USE_FAKE_POLL)
+/* If we're using poll, we can poll as many sockets as we want.
+ * If we're on Windows, having too many sockets is harmless, since
+ * select stupidly uses an array of sockets rather than a bitfield. */
+#define SOCKET_IS_POLLABLE(fd) ((fd) >= 0)
+#else
+/* If we're using a real Posix select, then in order to be pollable, a socket
+ * must
+ * a) be valid (>= 0)
+ * b) be < FD_SETSIZE.
+ */
+#define SOCKET_IS_POLLABLE(fd) ((fd) >= 0 && (fd) < FD_SETSIZE)
#endif
+int tor_poll(struct pollfd *ufds, unsigned int nfds, int timeout);
+
+#endif