aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysselect.h
diff options
context:
space:
mode:
authorRobert Pluim2022-05-04 17:09:07 +0200
committerRobert Pluim2022-05-05 19:30:15 +0200
commit2087e5eb2bf6cfefe74b6b589c215c2144ed9fb0 (patch)
tree27b4865f176452535ec02666b16331ecf44445d7 /src/sysselect.h
parentaebff74af27157b60a0d6549be718d85a809b985 (diff)
downloademacs-feature/more-fds.tar.gz
emacs-feature/more-fds.zip
Allow the use of poll instead of selectfeature/more-fds
Increase the maximum number of open files allowed to 10 x FD_SETSIZE (which is what poll is limited to on macOS). * configure.ac (--with-poll): New option, default off, for requesting 'poll' support. Check for "sys/poll.h" header. (USE_POLL): New variable. (EMACS_CONFIG_FEATURES): Add USE_POLL. * etc/NEWS: Document --with-poll. * src/sysselect.h: New define EMACS_MAX_FD, defaulting to FD_SETSIZE, for the maximum number of file descriptors Emacs can use. * src/process.c: * src/sysdep.c: * src/nsterm.m (ns_select_1): (applicationDidFinishLaunching): Use EMACS_MAX_FD instead of FD_SETSIZE everywhere. * src/syspoll.h (SYSPOLL_H): New file for definitions related to use of 'poll'. * src/sysselect.h [USE_POLL]: Set EMACS_MAX_FD to 10 x FD_SETSIZE. (emacs_fd_set) [USE_POLL]: New type, used for bitsets of file descriptors. (FD_CLR, FD_ISSET, FD_SET, FD_ZERO) [USE_POLL]: Macros for manipulating bitsets. [USE_POLL]: Include "syspoll.h". * src/process.c (fd_sets_to_pollfds) [USE_POLL]: New function. Converts two 'emacs_fd_set' to an array of 'struct pollfd' (pollfds_to_fd_sets) [USE_POLL]: New function. Converts from an array of 'struct pollfd' to two 'emacs_fd_set'. (timespec_to_timeout) [USE_POLL]: New function, converts a 'struct timespec' to a timeout in milliseconds. (emacs_pselect) [USE_POLL]: Replacement for 'pselect' that calls 'poll' and does the appropriate conversions. Does not support sigmask.
Diffstat (limited to 'src/sysselect.h')
-rw-r--r--src/sysselect.h38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/sysselect.h b/src/sysselect.h
index 45cc22bc4cb..029a913f324 100644
--- a/src/sysselect.h
+++ b/src/sysselect.h
@@ -29,6 +29,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
29 where w32 needs it, but not where sysselect.h is included. The w32 29 where w32 needs it, but not where sysselect.h is included. The w32
30 definitions in w32.h are incompatible with the below. */ 30 definitions in w32.h are incompatible with the below. */
31#ifndef WINDOWSNT 31#ifndef WINDOWSNT
32#ifndef USE_POLL
32#ifdef FD_SET 33#ifdef FD_SET
33#ifndef FD_SETSIZE 34#ifndef FD_SETSIZE
34#define FD_SETSIZE 64 35#define FD_SETSIZE 64
@@ -43,6 +44,37 @@ typedef int fd_set;
43#define FD_ISSET(n, p) (*(p) & (1 << (n))) 44#define FD_ISSET(n, p) (*(p) & (1 << (n)))
44#define FD_ZERO(p) (*(p) = 0) 45#define FD_ZERO(p) (*(p) = 0)
45#endif /* no FD_SET */ 46#endif /* no FD_SET */
47#define EMACS_MAX_FD FD_SETSIZE
48#else /* no USE_POLL */
49#define EMACS_MAX_FD (10 * FD_SETSIZE)
50#define fd_set emacs_fd_set
51#define pselect emacs_pselect
52#undef FD_CLR
53#undef FD_ISSET
54#undef FD_SET
55#undef FD_ZERO
56
57typedef struct {
58 EMACS_UINT bits[EMACS_MAX_FD / EMACS_UINT_WIDTH];
59} emacs_fd_set;
60
61/* standard access macros */
62#define FD_SET(n, p) \
63 do { \
64 if ((n) < EMACS_MAX_FD) { \
65 (p)->bits[(n)/EMACS_UINT_WIDTH] |= (1 << (n)%EMACS_UINT_WIDTH); \
66 } \
67 } while (0)
68#define FD_CLR(n, p) \
69 do { \
70 if ((n) < EMACS_MAX_FD) { \
71 (p)->bits[(n)/EMACS_UINT_WIDTH] &= ~(1 << (n)%EMACS_UINT_WIDTH); \
72 } \
73 } while (0)
74#define FD_ISSET(n, p) ((n) < EMACS_MAX_FD ? ((p)->bits[(n)/EMACS_UINT_WIDTH] & (1 << (n)%EMACS_UINT_WIDTH)) : 0)
75#define FD_ZERO(p) memset((p), 0, sizeof(emacs_fd_set))
76#include "syspoll.h"
77#endif /* no USE_POLL */
46#endif /* not WINDOWSNT */ 78#endif /* not WINDOWSNT */
47 79
48#if !defined (HAVE_SELECT) 80#if !defined (HAVE_SELECT)
@@ -66,21 +98,21 @@ INLINE_HEADER_BEGIN
66INLINE void 98INLINE void
67fd_CLR (int fd, fd_set *set) 99fd_CLR (int fd, fd_set *set)
68{ 100{
69 eassume (0 <= fd && fd < FD_SETSIZE); 101 eassume (0 <= fd && fd < EMACS_MAX_FD);
70 FD_CLR (fd, set); 102 FD_CLR (fd, set);
71} 103}
72 104
73INLINE bool 105INLINE bool
74fd_ISSET (int fd, fd_set *set) 106fd_ISSET (int fd, fd_set *set)
75{ 107{
76 eassume (0 <= fd && fd < FD_SETSIZE); 108 eassume (0 <= fd && fd < EMACS_MAX_FD);
77 return FD_ISSET (fd, set) != 0; 109 return FD_ISSET (fd, set) != 0;
78} 110}
79 111
80INLINE void 112INLINE void
81fd_SET (int fd, fd_set *set) 113fd_SET (int fd, fd_set *set)
82{ 114{
83 eassume (0 <= fd && fd < FD_SETSIZE); 115 eassume (0 <= fd && fd < EMACS_MAX_FD);
84 FD_SET (fd, set); 116 FD_SET (fd, set);
85} 117}
86 118