summaryrefslogtreecommitdiff
path: root/src/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/process.c')
-rw-r--r--src/process.c247
1 files changed, 176 insertions, 71 deletions
diff --git a/src/process.c b/src/process.c
index 08a02ad9423..5804b3a3bef 100644
--- a/src/process.c
+++ b/src/process.c
@@ -48,7 +48,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#ifdef HAVE_SETRLIMIT
# include <sys/resource.h>
-/* If NOFILE_LIMIT.rlim_cur is greater than FD_SETSIZE, then
+/* If NOFILE_LIMIT.rlim_cur is greater than EMACS_MAX_FD, then
NOFILE_LIMIT is the initial limit on the number of open files,
which should be restored in child processes. */
static struct rlimit nofile_limit;
@@ -299,7 +299,7 @@ static void child_signal_read (int, void *);
static void child_signal_notify (void);
/* Indexed by descriptor, gives the process (if any) for that descriptor. */
-static Lisp_Object chan_process[FD_SETSIZE];
+static Lisp_Object chan_process[EMACS_MAX_FD];
static void wait_for_socket_fds (Lisp_Object, char const *);
/* Alist of elements (NAME . PROCESS). */
@@ -311,18 +311,18 @@ static Lisp_Object Vprocess_alist;
output from the process is to read at least one char.
Always -1 on systems that support FIONREAD. */
-static int proc_buffered_char[FD_SETSIZE];
+static int proc_buffered_char[EMACS_MAX_FD];
/* Table of `struct coding-system' for each process. */
-static struct coding_system *proc_decode_coding_system[FD_SETSIZE];
-static struct coding_system *proc_encode_coding_system[FD_SETSIZE];
+static struct coding_system *proc_decode_coding_system[EMACS_MAX_FD];
+static struct coding_system *proc_encode_coding_system[EMACS_MAX_FD];
#ifdef DATAGRAM_SOCKETS
/* Table of `partner address' for datagram sockets. */
static struct sockaddr_and_len {
struct sockaddr *sa;
ptrdiff_t len;
-} datagram_address[FD_SETSIZE];
+} datagram_address[EMACS_MAX_FD];
#define DATAGRAM_CHAN_P(chan) (datagram_address[chan].sa != 0)
#define DATAGRAM_CONN_P(proc) \
(PROCESSP (proc) && \
@@ -460,8 +460,113 @@ static struct fd_callback_data
/* If this fd is currently being selected on by a thread, this
points to the thread. Otherwise it is NULL. */
struct thread_state *waiting_thread;
-} fd_callback_info[FD_SETSIZE];
+} fd_callback_info[EMACS_MAX_FD];
+#ifdef USE_POLL
+struct pollfd pollfds[EMACS_MAX_FD];
+
+/* Convert a read set and a write set to the corresponding array of
+ struct pollfd. maxfds is the highest fd set in the sets. Returns
+ the number of file descriptors set in the array. rset and wset can
+ be NULL, in which case they will be treated as if they were empty
+ sets. */
+
+int
+fd_sets_to_pollfds (emacs_fd_set *rset, emacs_fd_set *wset, int maxfds)
+{
+ int poll_idx = 0;
+ emacs_fd_set dummy_rset;
+ emacs_fd_set dummy_wset;
+
+ if (!rset)
+ {
+ FD_ZERO (&dummy_rset);
+ rset = &dummy_rset;
+ }
+ if (!wset)
+ {
+ FD_ZERO (&dummy_wset);
+ wset = &dummy_wset;
+ }
+ for (int i = 0; i < maxfds; i++)
+ {
+ short flag = 0;
+ if (FD_ISSET (i, rset))
+ flag |= POLLIN;
+ if (FD_ISSET (i, wset))
+ flag |= POLLOUT;
+ if (flag != 0)
+ {
+ pollfds[poll_idx].fd = i;
+ pollfds[poll_idx].events = flag;
+ poll_idx++;
+ }
+ }
+ return poll_idx;
+}
+
+/* Convert an array of struct pollfd to the corresponding read and
+ write fd_sets. poll_count is the number of file descriptors set in
+ the array. rset and wset can be NULL, in which case they're
+ treated as if they were empty. */
+
+void
+pollfds_to_fd_sets (emacs_fd_set *rset, emacs_fd_set *wset, int poll_count)
+{
+ emacs_fd_set dummy_rset;
+ emacs_fd_set dummy_wset;
+
+ if (!rset)
+ rset = &dummy_rset;
+ FD_ZERO (rset);
+ if (!wset)
+ wset = &dummy_wset;
+ FD_ZERO (wset);
+ for (int i = 0; i < poll_count; i++)
+ {
+ if (pollfds[i].revents & (POLLIN|POLLHUP))
+ FD_SET (pollfds[i].fd, rset);
+ if (pollfds[i].revents & POLLOUT)
+ FD_SET (pollfds[i].fd, wset);
+ }
+}
+
+/* Convert a struct timespec to the corresponding timeout in
+ milliseconds. A NULL timespec is treated as infinity. */
+
+int
+timespec_to_timeout (const struct timespec *ts)
+{
+ if (!ts)
+ return -1;
+ return (ts->tv_sec * 1000 + ts->tv_nsec / 1000000);
+}
+
+/* Wrapper around `poll' with the calling convention of pselect.
+ Converts arguments as appropriate. The sigmask argument is not
+ handled, since Emacs doesn't actually use it. */
+int
+emacs_pselect (int nfds, emacs_fd_set *readfds, emacs_fd_set *writefds,
+ emacs_fd_set *errorfds, const struct timespec *timeout,
+ const sigset_t *sigmask)
+{
+ int ret;
+ int poll_count;
+
+ poll_count = fd_sets_to_pollfds (readfds, writefds, nfds);
+ ret = poll (pollfds, poll_count, timespec_to_timeout (timeout));
+ if (ret > 0)
+ pollfds_to_fd_sets(readfds, writefds, poll_count);
+ else
+ {
+ if (readfds)
+ FD_ZERO (readfds);
+ if (writefds)
+ FD_ZERO (writefds);
+ }
+ return ret;
+}
+#endif /* USE_POLL */
/* Add a file descriptor FD to be monitored for when read is possible.
When read is possible, call FUNC with argument DATA. */
@@ -471,7 +576,7 @@ add_read_fd (int fd, fd_callback func, void *data)
{
add_keyboard_wait_descriptor (fd);
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
fd_callback_info[fd].func = func;
fd_callback_info[fd].data = data;
}
@@ -486,14 +591,14 @@ add_non_keyboard_read_fd (int fd, fd_callback func, void *data)
static void
add_process_read_fd (int fd)
{
- eassert (fd >= 0 && fd < FD_SETSIZE);
+ eassert (fd >= 0 && fd < EMACS_MAX_FD);
eassert (fd_callback_info[fd].func == NULL);
fd_callback_info[fd].flags &= ~KEYBOARD_FD;
fd_callback_info[fd].flags |= FOR_READ;
if (fd > max_desc)
max_desc = fd;
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
fd_callback_info[fd].flags |= PROCESS_FD;
}
@@ -504,7 +609,7 @@ delete_read_fd (int fd)
{
delete_keyboard_wait_descriptor (fd);
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
if (fd_callback_info[fd].flags == 0)
{
fd_callback_info[fd].func = 0;
@@ -518,7 +623,7 @@ delete_read_fd (int fd)
void
add_write_fd (int fd, fd_callback func, void *data)
{
- eassert (fd >= 0 && fd < FD_SETSIZE);
+ eassert (fd >= 0 && fd < EMACS_MAX_FD);
fd_callback_info[fd].func = func;
fd_callback_info[fd].data = data;
@@ -530,7 +635,7 @@ add_write_fd (int fd, fd_callback func, void *data)
static void
add_non_blocking_write_fd (int fd)
{
- eassert (fd >= 0 && fd < FD_SETSIZE);
+ eassert (fd >= 0 && fd < EMACS_MAX_FD);
eassert (fd_callback_info[fd].func == NULL);
fd_callback_info[fd].flags |= FOR_WRITE | NON_BLOCKING_CONNECT_FD;
@@ -544,7 +649,7 @@ recompute_max_desc (void)
{
int fd;
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = max_desc; fd >= 0; --fd)
{
if (fd_callback_info[fd].flags != 0)
@@ -553,7 +658,7 @@ recompute_max_desc (void)
break;
}
}
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
}
/* Stop monitoring file descriptor FD for when write is possible. */
@@ -561,7 +666,7 @@ recompute_max_desc (void)
void
delete_write_fd (int fd)
{
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
if ((fd_callback_info[fd].flags & NON_BLOCKING_CONNECT_FD) != 0)
{
if (--num_pending_connects < 0)
@@ -584,7 +689,7 @@ compute_input_wait_mask (fd_set *mask)
int fd;
FD_ZERO (mask);
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].thread != NULL
@@ -607,7 +712,7 @@ compute_non_process_wait_mask (fd_set *mask)
int fd;
FD_ZERO (mask);
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].thread != NULL
@@ -631,7 +736,7 @@ compute_non_keyboard_wait_mask (fd_set *mask)
int fd;
FD_ZERO (mask);
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].thread != NULL
@@ -655,7 +760,7 @@ compute_write_mask (fd_set *mask)
int fd;
FD_ZERO (mask);
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].thread != NULL
@@ -677,7 +782,7 @@ clear_waiting_thread_info (void)
{
int fd;
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; ++fd)
{
if (fd_callback_info[fd].waiting_thread == current_thread)
@@ -969,10 +1074,10 @@ update_processes_for_thread_death (Lisp_Object dying_thread)
struct Lisp_Process *proc = XPROCESS (process);
pset_thread (proc, Qnil);
- eassert (proc->infd < FD_SETSIZE);
+ eassert (proc->infd < EMACS_MAX_FD);
if (proc->infd >= 0)
fd_callback_info[proc->infd].thread = NULL;
- eassert (proc->outfd < FD_SETSIZE);
+ eassert (proc->outfd < EMACS_MAX_FD);
if (proc->outfd >= 0)
fd_callback_info[proc->outfd].thread = NULL;
}
@@ -1413,10 +1518,10 @@ If THREAD is nil, the process is unlocked. */)
proc = XPROCESS (process);
pset_thread (proc, thread);
- eassert (proc->infd < FD_SETSIZE);
+ eassert (proc->infd < EMACS_MAX_FD);
if (proc->infd >= 0)
fd_callback_info[proc->infd].thread = tstate;
- eassert (proc->outfd < FD_SETSIZE);
+ eassert (proc->outfd < EMACS_MAX_FD);
if (proc->outfd >= 0)
fd_callback_info[proc->outfd].thread = tstate;
@@ -2144,7 +2249,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
}
}
- if (FD_SETSIZE <= inchannel || FD_SETSIZE <= outchannel)
+ if (EMACS_MAX_FD <= inchannel || EMACS_MAX_FD <= outchannel)
report_file_errno ("Creating pipe", Qnil, EMFILE);
#ifndef WINDOWSNT
@@ -2156,7 +2261,7 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
fcntl (outchannel, F_SETFL, O_NONBLOCK);
/* Record this as an active process, with its channels. */
- eassert (0 <= inchannel && inchannel < FD_SETSIZE);
+ eassert (0 <= inchannel && inchannel < EMACS_MAX_FD);
chan_process[inchannel] = process;
p->infd = inchannel;
p->outfd = outchannel;
@@ -2251,7 +2356,7 @@ create_pty (Lisp_Object process)
if (pty_fd >= 0)
{
p->open_fd[SUBPROCESS_STDIN] = pty_fd;
- if (FD_SETSIZE <= pty_fd)
+ if (EMACS_MAX_FD <= pty_fd)
report_file_errno ("Opening pty", Qnil, EMFILE);
#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
/* On most USG systems it does not work to open the pty's tty here,
@@ -2274,7 +2379,7 @@ create_pty (Lisp_Object process)
/* Record this as an active process, with its channels.
As a result, child_setup will close Emacs's side of the pipes. */
- eassert (0 <= pty_fd && pty_fd < FD_SETSIZE);
+ eassert (0 <= pty_fd && pty_fd < EMACS_MAX_FD);
chan_process[pty_fd] = process;
p->infd = pty_fd;
p->outfd = pty_fd;
@@ -2360,7 +2465,7 @@ usage: (make-pipe-process &rest ARGS) */)
outchannel = p->open_fd[WRITE_TO_SUBPROCESS];
inchannel = p->open_fd[READ_FROM_SUBPROCESS];
- if (FD_SETSIZE <= inchannel || FD_SETSIZE <= outchannel)
+ if (EMACS_MAX_FD <= inchannel || EMACS_MAX_FD <= outchannel)
report_file_errno ("Creating pipe", Qnil, EMFILE);
fcntl (inchannel, F_SETFL, O_NONBLOCK);
@@ -2371,7 +2476,7 @@ usage: (make-pipe-process &rest ARGS) */)
#endif
/* Record this as an active process, with its channels. */
- eassert (0 <= inchannel && inchannel < FD_SETSIZE);
+ eassert (0 <= inchannel && inchannel < EMACS_MAX_FD);
chan_process[inchannel] = proc;
p->infd = inchannel;
p->outfd = outchannel;
@@ -2702,7 +2807,7 @@ set up yet, this function will block until socket setup has completed. */)
return Qnil;
channel = XPROCESS (process)->infd;
- eassert (0 <= channel && channel < FD_SETSIZE);
+ eassert (0 <= channel && channel < EMACS_MAX_FD);
return conv_sockaddr_to_lisp (datagram_address[channel].sa,
datagram_address[channel].len);
}
@@ -2731,7 +2836,7 @@ set up yet, this function will block until socket setup has completed. */)
channel = XPROCESS (process)->infd;
len = get_lisp_to_sockaddr_size (address, &family);
- eassert (0 <= channel && channel < FD_SETSIZE);
+ eassert (0 <= channel && channel < EMACS_MAX_FD);
if (len == 0 || datagram_address[channel].len != len)
return Qnil;
conv_lisp_to_sockaddr (family, address, datagram_address[channel].sa, len);
@@ -3105,13 +3210,13 @@ usage: (make-serial-process &rest ARGS) */)
fd = serial_open (port);
p->open_fd[SUBPROCESS_STDIN] = fd;
- if (FD_SETSIZE <= fd)
+ if (EMACS_MAX_FD <= fd)
report_file_errno ("Opening serial port", port, EMFILE);
p->infd = fd;
p->outfd = fd;
if (fd > max_desc)
max_desc = fd;
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
chan_process[fd] = proc;
buffer = Fplist_get (contact, QCbuffer);
@@ -3283,7 +3388,7 @@ finish_after_tls_connection (Lisp_Object proc)
Fplist_get (contact, QChost),
Fplist_get (contact, QCservice));
- eassert (p->outfd < FD_SETSIZE);
+ eassert (p->outfd < EMACS_MAX_FD);
if (NILP (result))
{
pset_status (p, list2 (Qfailed,
@@ -3329,7 +3434,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
if (!NILP (use_external_socket_p))
{
socket_to_use = external_sock_fd;
- eassert (socket_to_use < FD_SETSIZE);
+ eassert (socket_to_use < EMACS_MAX_FD);
/* Ensure we don't consume the external socket twice. */
external_sock_fd = -1;
@@ -3372,7 +3477,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
continue;
}
/* Reject file descriptors that would be too large. */
- if (FD_SETSIZE <= s)
+ if (EMACS_MAX_FD <= s)
{
emacs_close (s);
s = -1;
@@ -3510,7 +3615,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
if (errno == EINTR)
goto retry_select;
else
- report_file_error ("Failed select", Qnil);
+ report_file_error ("Failed select/poll", Qnil);
}
eassert (sc > 0);
@@ -3543,7 +3648,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
#ifdef DATAGRAM_SOCKETS
if (p->socktype == SOCK_DGRAM)
{
- eassert (0 <= s && s < FD_SETSIZE);
+ eassert (0 <= s && s < EMACS_MAX_FD);
if (datagram_address[s].sa)
emacs_abort ();
@@ -3608,7 +3713,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
inch = s;
outch = s;
- eassert (0 <= inch && inch < FD_SETSIZE);
+ eassert (0 <= inch && inch < EMACS_MAX_FD);
chan_process[inch] = proc;
fcntl (inch, F_SETFL, O_NONBLOCK);
@@ -3635,7 +3740,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
if (! (connecting_status (p->status)
&& EQ (XCDR (p->status), addrinfos)))
pset_status (p, Fcons (Qconnect, addrinfos));
- eassert (0 <= inch && inch < FD_SETSIZE);
+ eassert (0 <= inch && inch < EMACS_MAX_FD);
if ((fd_callback_info[inch].flags & NON_BLOCKING_CONNECT_FD) == 0)
add_non_blocking_write_fd (inch);
}
@@ -4703,7 +4808,7 @@ deactivate_process (Lisp_Object proc)
close_process_fd (&p->open_fd[i]);
inchannel = p->infd;
- eassert (inchannel < FD_SETSIZE);
+ eassert (inchannel < EMACS_MAX_FD);
if (inchannel >= 0)
{
p->infd = -1;
@@ -4839,7 +4944,7 @@ server_accept_connection (Lisp_Object server, int channel)
s = accept4 (channel, &saddr.sa, &len, SOCK_CLOEXEC);
- if (FD_SETSIZE <= s)
+ if (EMACS_MAX_FD <= s)
{
emacs_close (s);
s = -1;
@@ -4943,7 +5048,7 @@ server_accept_connection (Lisp_Object server, int channel)
Lisp_Object name = Fformat (nargs, args);
Lisp_Object proc = make_process (name);
- eassert (0 <= s && s < FD_SETSIZE);
+ eassert (0 <= s && s < EMACS_MAX_FD);
chan_process[s] = proc;
fcntl (s, F_SETFL, O_NONBLOCK);
@@ -5226,7 +5331,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell)))
break;
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
#if defined HAVE_GETADDRINFO_A || defined HAVE_GNUTLS
{
@@ -5359,7 +5464,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
because otherwise we wouldn't run into a timeout
below. */
int fd = child_signal_read_fd;
- eassert (fd < FD_SETSIZE);
+ eassert (fd < EMACS_MAX_FD);
if (0 <= fd)
FD_CLR (fd, &Atemp);
@@ -5453,7 +5558,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
an asynchronous process. Otherwise this might deadlock if we
receive a SIGCHLD during `pselect'. */
int child_fd = child_signal_read_fd;
- eassert (child_fd < FD_SETSIZE);
+ eassert (child_fd < EMACS_MAX_FD);
if (0 <= child_fd)
FD_SET (child_fd, &Available);
@@ -5563,7 +5668,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
And if so, we need to skip the select which could block. */
FD_ZERO (&tls_available);
tls_nfds = 0;
- for (channel = 0; channel < FD_SETSIZE; ++channel)
+ for (channel = 0; channel < EMACS_MAX_FD; ++channel)
if (! NILP (chan_process[channel])
&& FD_ISSET (channel, &Available))
{
@@ -5625,7 +5730,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
else if (nfds > 0)
/* Slow path, merge one by one. Note: nfds does not need
to be accurate, just positive is enough. */
- for (channel = 0; channel < FD_SETSIZE; ++channel)
+ for (channel = 0; channel < EMACS_MAX_FD; ++channel)
if (FD_ISSET(channel, &tls_available))
FD_SET(channel, &Available);
}
@@ -6019,7 +6124,7 @@ read_process_output (Lisp_Object proc, int channel)
{
ssize_t nbytes;
struct Lisp_Process *p = XPROCESS (proc);
- eassert (0 <= channel && channel < FD_SETSIZE);
+ eassert (0 <= channel && channel < EMACS_MAX_FD);
struct coding_system *coding = proc_decode_coding_system[channel];
int carryover = p->decoding_carryover;
ptrdiff_t readmax = clip_to_bounds (1, read_process_output_max, PTRDIFF_MAX);
@@ -6184,7 +6289,7 @@ read_and_dispose_of_process_output (struct Lisp_Process *p, char *chars,
proc_encode_coding_system[p->outfd] surely points to a
valid memory because p->outfd will be changed once EOF is
sent to the process. */
- eassert (p->outfd < FD_SETSIZE);
+ eassert (p->outfd < EMACS_MAX_FD);
if (NILP (p->encode_coding_system) && p->outfd >= 0
&& proc_encode_coding_system[p->outfd])
{
@@ -6415,7 +6520,7 @@ send_process (Lisp_Object proc, const char *buf, ptrdiff_t len,
if (p->outfd < 0)
error ("Output file descriptor of %s is closed", SDATA (p->name));
- eassert (p->outfd < FD_SETSIZE);
+ eassert (p->outfd < EMACS_MAX_FD);
coding = proc_encode_coding_system[p->outfd];
Vlast_coding_system_used = CODING_ID_NAME (coding->id);
@@ -6528,7 +6633,7 @@ send_process (Lisp_Object proc, const char *buf, ptrdiff_t len,
if (outfd < 0)
error ("Output file descriptor of %s is closed",
SDATA (p->name));
- eassert (0 <= outfd && outfd < FD_SETSIZE);
+ eassert (0 <= outfd && outfd < EMACS_MAX_FD);
#ifdef DATAGRAM_SOCKETS
if (DATAGRAM_CHAN_P (outfd))
{
@@ -6980,7 +7085,7 @@ traffic. */)
struct Lisp_Process *p;
p = XPROCESS (process);
- eassert (p->infd < FD_SETSIZE);
+ eassert (p->infd < EMACS_MAX_FD);
if (EQ (p->command, Qt)
&& p->infd >= 0
&& (!EQ (p->filter, Qt) || EQ (p->status, Qlisten)))
@@ -7124,7 +7229,7 @@ process has been transmitted to the serial port. */)
outfd = XPROCESS (proc)->outfd;
- eassert (outfd < FD_SETSIZE);
+ eassert (outfd < EMACS_MAX_FD);
if (outfd >= 0)
coding = proc_encode_coding_system[outfd];
@@ -7172,13 +7277,13 @@ process has been transmitted to the serial port. */)
p->open_fd[WRITE_TO_SUBPROCESS] = new_outfd;
p->outfd = new_outfd;
- eassert (0 <= new_outfd && new_outfd < FD_SETSIZE);
+ eassert (0 <= new_outfd && new_outfd < EMACS_MAX_FD);
if (!proc_encode_coding_system[new_outfd])
proc_encode_coding_system[new_outfd]
= xmalloc (sizeof (struct coding_system));
if (old_outfd >= 0)
{
- eassert (old_outfd < FD_SETSIZE);
+ eassert (old_outfd < EMACS_MAX_FD);
*proc_encode_coding_system[new_outfd]
= *proc_encode_coding_system[old_outfd];
memset (proc_encode_coding_system[old_outfd], 0,
@@ -7251,7 +7356,7 @@ child_signal_init (void)
int fds[2];
if (emacs_pipe (fds) < 0)
report_file_error ("Creating pipe for child signal", Qnil);
- if (FD_SETSIZE <= fds[0])
+ if (EMACS_MAX_FD <= fds[0])
{
/* Since we need to `pselect' on the read end, it has to fit
into an `fd_set'. */
@@ -7723,7 +7828,7 @@ DEFUN ("process-filter-multibyte-p", Fprocess_filter_multibyte_p,
struct Lisp_Process *p = XPROCESS (process);
if (p->infd < 0)
return Qnil;
- eassert (p->infd < FD_SETSIZE);
+ eassert (p->infd < EMACS_MAX_FD);
struct coding_system *coding = proc_decode_coding_system[p->infd];
return (CODING_FOR_UNIBYTE (coding) ? Qnil : Qt);
}
@@ -7757,7 +7862,7 @@ keyboard_bit_set (fd_set *mask)
{
int fd;
- eassert (max_desc < FD_SETSIZE);
+ eassert (max_desc < EMACS_MAX_FD);
for (fd = 0; fd <= max_desc; fd++)
if (FD_ISSET (fd, mask)
&& ((fd_callback_info[fd].flags & (FOR_READ | KEYBOARD_FD))
@@ -8005,7 +8110,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
void
add_timer_wait_descriptor (int fd)
{
- eassert (0 <= fd && fd < FD_SETSIZE);
+ eassert (0 <= fd && fd < EMACS_MAX_FD);
add_read_fd (fd, timerfd_callback, NULL);
fd_callback_info[fd].flags &= ~KEYBOARD_FD;
}
@@ -8031,7 +8136,7 @@ void
add_keyboard_wait_descriptor (int desc)
{
#ifdef subprocesses /* Actually means "not MSDOS". */
- eassert (desc >= 0 && desc < FD_SETSIZE);
+ eassert (desc >= 0 && desc < EMACS_MAX_FD);
fd_callback_info[desc].flags &= ~PROCESS_FD;
fd_callback_info[desc].flags |= (FOR_READ | KEYBOARD_FD);
if (desc > max_desc)
@@ -8045,7 +8150,7 @@ void
delete_keyboard_wait_descriptor (int desc)
{
#ifdef subprocesses
- eassert (desc >= 0 && desc < FD_SETSIZE);
+ eassert (desc >= 0 && desc < EMACS_MAX_FD);
fd_callback_info[desc].flags &= ~(FOR_READ | KEYBOARD_FD | PROCESS_FD);
@@ -8068,7 +8173,7 @@ setup_process_coding_systems (Lisp_Object process)
if (inch < 0 || outch < 0)
return;
- eassert (0 <= inch && inch < FD_SETSIZE);
+ eassert (0 <= inch && inch < EMACS_MAX_FD);
if (!proc_decode_coding_system[inch])
proc_decode_coding_system[inch] = xmalloc (sizeof (struct coding_system));
coding_system = p->decode_coding_system;
@@ -8080,7 +8185,7 @@ setup_process_coding_systems (Lisp_Object process)
}
setup_coding_system (coding_system, proc_decode_coding_system[inch]);
- eassert (0 <= outch && outch < FD_SETSIZE);
+ eassert (0 <= outch && outch < EMACS_MAX_FD);
if (!proc_encode_coding_system[outch])
proc_encode_coding_system[outch] = xmalloc (sizeof (struct coding_system));
setup_coding_system (p->encode_coding_system,
@@ -8322,7 +8427,7 @@ void
restore_nofile_limit (void)
{
#ifdef HAVE_SETRLIMIT
- if (FD_SETSIZE < nofile_limit.rlim_cur)
+ if (EMACS_MAX_FD < nofile_limit.rlim_cur)
setrlimit (RLIMIT_NOFILE, &nofile_limit);
#endif
}
@@ -8383,13 +8488,13 @@ init_process_emacs (int sockfd)
}
#ifdef HAVE_SETRLIMIT
- /* Don't allocate more than FD_SETSIZE file descriptors for Emacs itself. */
+ /* Don't allocate more than EMACS_MAX_FD file descriptors for Emacs itself. */
if (getrlimit (RLIMIT_NOFILE, &nofile_limit) != 0)
nofile_limit.rlim_cur = 0;
- else if (FD_SETSIZE < nofile_limit.rlim_cur)
+ else if (EMACS_MAX_FD < nofile_limit.rlim_cur)
{
struct rlimit rlim = nofile_limit;
- rlim.rlim_cur = FD_SETSIZE;
+ rlim.rlim_cur = EMACS_MAX_FD;
if (setrlimit (RLIMIT_NOFILE, &rlim) != 0)
nofile_limit.rlim_cur = 0;
}
@@ -8425,7 +8530,7 @@ init_process_emacs (int sockfd)
Vprocess_alist = Qnil;
deleted_pid_list = Qnil;
- for (i = 0; i < FD_SETSIZE; i++)
+ for (i = 0; i < EMACS_MAX_FD; i++)
{
chan_process[i] = Qnil;
proc_buffered_char[i] = -1;