From: Eric Marsden Date: Wed, 11 Dec 2024 15:59:45 +0000 (+0100) Subject: Add support for TCP_NODELAY on network streams X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=08455a6ec951ba01afc55d7cb4078724360d2a1d;p=emacs.git Add support for TCP_NODELAY on network streams * 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) --- diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi index 850e9c197e3..2d25a16317c 100644 --- a/doc/lispref/processes.texi +++ b/doc/lispref/processes.texi @@ -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 diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index e7a63b97ac4..38ef8e4ede1 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -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) diff --git a/src/process.c b/src/process.c index b71ba3daf2d..cd1378f07ad 100644 --- a/src/process.c +++ b/src/process.c @@ -38,6 +38,7 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include #include #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.