1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

Prefer SOCK_NONBLOCK to O_NONBLOCK

* src/process.c (SOCK_NONBLOCK): Define to 0 if not already defined.
(connect_network_socket): Create the socket with SOCK_NONBLOCK, to
avoid an fcntl with O_NONBLOCK if SOCK_NONBLOCK works.  Put the
SOCK_DGRAM check a bit later, to keep the logic cleaner, as
the order does not matter here.
This commit is contained in:
Paul Eggert 2016-05-21 17:04:44 -07:00
parent e5015c5d96
commit f2d0333481

View file

@ -150,6 +150,9 @@ bool inhibit_sentinels;
#ifndef SOCK_CLOEXEC
# define SOCK_CLOEXEC 0
#endif
#ifndef SOCK_NONBLOCK
# define SOCK_NONBLOCk 0
#endif
/* True if ERRNUM represents an error where the system call would
block if a blocking variant were used. */
@ -3141,7 +3144,10 @@ connect_network_socket (Lisp_Object proc, Lisp_Object ip_addresses,
s = socket_to_use;
if (s < 0)
{
s = socket (family, p->socktype | SOCK_CLOEXEC, p->ai_protocol);
int socktype = p->socktype | SOCK_CLOEXEC;
if (p->is_non_blocking_client)
socktype |= SOCK_NONBLOCK;
s = socket (family, socktype, p->ai_protocol);
if (s < 0)
{
xerrno = errno;
@ -3149,12 +3155,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object ip_addresses,
}
}
#ifdef DATAGRAM_SOCKETS
if (!p->is_server && p->socktype == SOCK_DGRAM)
break;
#endif /* DATAGRAM_SOCKETS */
if (p->is_non_blocking_client)
if (p->is_non_blocking_client && ! (SOCK_NONBLOCK && socket_to_use < 0))
{
ret = fcntl (s, F_SETFL, O_NONBLOCK);
if (ret < 0)
@ -3166,6 +3167,11 @@ connect_network_socket (Lisp_Object proc, Lisp_Object ip_addresses,
}
}
#ifdef DATAGRAM_SOCKETS
if (!p->is_server && p->socktype == SOCK_DGRAM)
break;
#endif /* DATAGRAM_SOCKETS */
/* Make us close S if quit. */
record_unwind_protect_int (close_file_unwind, s);