]> code.delx.au - gnu-emacs/commitdiff
Prefer SOCK_NONBLOCK to O_NONBLOCK
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 May 2016 00:04:44 +0000 (17:04 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 May 2016 00:05:25 +0000 (17:05 -0700)
* 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.

src/process.c

index 4bb3f0b9d6d7b19d97bb614290e088eafc9cefef..fbb517d91a727d972e31dfd1efb6deda551755e5 100644 (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);