diff options
Diffstat (limited to 'src/sysselect.h')
| -rw-r--r-- | src/sysselect.h | 38 |
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 | |||
| 57 | typedef 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 | |||
| 66 | INLINE void | 98 | INLINE void |
| 67 | fd_CLR (int fd, fd_set *set) | 99 | fd_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 | ||
| 73 | INLINE bool | 105 | INLINE bool |
| 74 | fd_ISSET (int fd, fd_set *set) | 106 | fd_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 | ||
| 80 | INLINE void | 112 | INLINE void |
| 81 | fd_SET (int fd, fd_set *set) | 113 | fd_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 | ||