]> git.eshelyaron.com Git - emacs.git/commitdiff
Add support for TCP_NODELAY on network streams
authorEric Marsden <eric.marsden@risk-engineering.org>
Wed, 11 Dec 2024 15:59:45 +0000 (16:59 +0100)
committerEshel Yaron <me@eshelyaron.com>
Sun, 15 Dec 2024 16:37:35 +0000 (17:37 +0100)
* src/process.c (socket_options): add entry for TCP_NODELAY.
* lisp/emacs-lisp/bytecomp.el: add :nodelay to valid keywords
  for make-network-process compiler-macro.
* doc/lispref/processes.texi: document :nodelay keyword argument
  to set-network-process-option and make-network-process.

(Bug#74793)

(cherry picked from commit c265febd97e940e6580ae42aa648358a0a2ed830)

doc/lispref/processes.texi
lisp/emacs-lisp/bytecomp.el
src/process.c

index 850e9c197e37353a7cc0ae68a0ba4fc277aa026a..2d25a16317cdd329f4bd5090663b3a3a4b0395e9 100644 (file)
@@ -3088,6 +3088,13 @@ listening on that port.  If @var{reuseaddr-flag} is @code{nil}, there
 may be a period of time after the last use of that port (by any
 process on the host) where it is not possible to make a new server on
 that port.
+
+@item :nodelay @var{nodelay-flag}
+If @var{nodelay-flag} is non-@code{nil}, the @code{TCP_NODELAY} option
+is enabled on the socket.  This disables the Nagle algorithm, meaning
+that network segments are sent as soon as possible, even when they
+contain little data.  This reduces network latency on the network
+connection, but can lead to many small packets being sent.
 @end table
 
 @defun set-network-process-option process option value &optional no-error
index e7a63b97ac46a5988c17b504074f2fb07e99213c..38ef8e4ede18bbed64101852306824d050548c2c 100644 (file)
@@ -6069,8 +6069,8 @@ and corresponding effects."
             :buffer :host :service :type :family :local :remote :coding
             :nowait :noquery :stop :filter :filter-multibyte :sentinel
             :log :plist :tls-parameters :server :broadcast :dontroute
-            :keepalive :linger :oobinline :priority :reuseaddr :bindtodevice
-            :use-external-socket)
+            :keepalive :linger :oobinline :priority :reuseaddr :nodelay
+            :bindtodevice :use-external-socket)
           '(:name :service))))
 
 (defun bytecomp--check-funcall-args (form &optional f &rest _args)
index b71ba3daf2da94e54984befa1f693a716b5cc82f..cd1378f07ad04a6a57dd771a311c4141a4579eac 100644 (file)
@@ -38,6 +38,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <sys/socket.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <netinet/tcp.h>
 #include <arpa/inet.h>
 
 #else
@@ -2860,6 +2861,9 @@ static const struct socket_options {
 #endif
 #ifdef SO_REUSEADDR
     { ":reuseaddr", SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL, OPIX_REUSEADDR },
+#endif
+#ifdef TCP_NODELAY
+    { ":nodelay", IPPROTO_TCP, TCP_NODELAY, SOPT_BOOL, OPIX_MISC },
 #endif
     { 0, 0, 0, SOPT_UNKNOWN, OPIX_NONE }
   };
@@ -3899,6 +3903,7 @@ The following network options can be specified for this connection:
 :broadcast BOOL    -- Allow send and receive of datagram broadcasts.
 :dontroute BOOL    -- Only send to directly connected hosts.
 :keepalive BOOL    -- Send keep-alive messages on network stream.
+:nodelay BOOL      -- Set TCP_NODELAY on the network socket.
 :linger BOOL or TIMEOUT -- Send queued messages before closing.
 :oobinline BOOL    -- Place out-of-band data in receive data stream.
 :priority INT      -- Set protocol defined priority for sent packets.