emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 40a03df: Fix socketd fd startup bug that I introduc


From: Paul Eggert
Subject: [Emacs-diffs] master 40a03df: Fix socketd fd startup bug that I introduced
Date: Tue, 26 Apr 2016 16:13:11 +0000

branch: master
commit 40a03df45353692f73364e488c962f1a7cf2e8bc
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Fix socketd fd startup bug that I introduced
    
    Problem reported by Matthew Leach in:
    http://lists.gnu.org/archive/html/emacs-devel/2016-04/msg00778.html
    * src/emacs.c (main): Indicate more clearly the coupling between
    the --daemon option and init_process_emacs.
    * src/lisp.h: Adjust to API changes.
    * src/process.c (set_external_socket_descriptor):
    Remove, replacing by ...
    (init_process_emacs): ... passing the socket FD here instead.
    All uses changed.
---
 src/emacs.c   |    7 +++++--
 src/lisp.h    |    3 +--
 src/process.c |   22 ++++++++--------------
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/src/emacs.c b/src/emacs.c
index a738bac..a7cbb32 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -971,6 +971,9 @@ main (int argc, char **argv)
   w32_daemon_event = NULL;
 #endif
 
+
+  int sockfd = -1;
+
   if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
       || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, 
&skip_args))
     {
@@ -1016,7 +1019,7 @@ main (int argc, char **argv)
       else if (systemd_socket == 1
               && (0 < sd_is_socket (SD_LISTEN_FDS_START,
                                     AF_UNSPEC, SOCK_STREAM, 1)))
-        set_external_socket_descriptor (SD_LISTEN_FDS_START);
+       sockfd = SD_LISTEN_FDS_START;
 #endif /* HAVE_LIBSYSTEMD */
 
 #ifndef DAEMON_MUST_EXEC
@@ -1575,7 +1578,7 @@ Using an Emacs configured with --with-x-toolkit=lucid 
does not have this problem
   /* This can create a thread that may call getenv, so it must follow
      all calls to putenv and setenv.  Also, this sets up
      add_keyboard_wait_descriptor, which init_display uses.  */
-  init_process_emacs ();
+  init_process_emacs (sockfd);
 
   init_keyboard ();    /* This too must precede init_sys_modes.  */
   if (!noninteractive)
diff --git a/src/lisp.h b/src/lisp.h
index c6f8bb8..1fc6130 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4181,10 +4181,9 @@ extern void delete_keyboard_wait_descriptor (int);
 extern void add_gpm_wait_descriptor (int);
 extern void delete_gpm_wait_descriptor (int);
 #endif
-extern void init_process_emacs (void);
+extern void init_process_emacs (int);
 extern void syms_of_process (void);
 extern void setup_process_coding_systems (Lisp_Object);
-extern void set_external_socket_descriptor (int);
 
 /* Defined in callproc.c.  */
 #ifndef DOS_NT
diff --git a/src/process.c b/src/process.c
index a222a5b..0dfe162 100644
--- a/src/process.c
+++ b/src/process.c
@@ -267,7 +267,10 @@ static int max_process_desc;
 /* The largest descriptor currently in use for input; -1 if none.  */
 static int max_input_desc;
 
-/* The descriptor of any socket passed to Emacs; -1 if none. */
+/* Set the external socket descriptor for Emacs to use when
+   `make-network-process' is called with a non-nil
+   `:use-external-socket' option.  The value should be either -1, or
+   the file descriptor of a socket that is already bound.  */
 static int external_sock_fd;
 
 /* Indexed by descriptor, gives the process (if any) for that descriptor.  */
@@ -7733,24 +7736,14 @@ catch_child_signal (void)
 }
 #endif /* subprocesses */
 
-/* Set the external socket descriptor for Emacs to use when
-   `make-network-process' is called with a non-nil
-   `:use-external-socket' option.  The fd should have been checked to
-   ensure it is a valid socket and is already bound.  */
-void
-set_external_socket_descriptor (int fd)
-{
-  external_sock_fd = fd;
-}
-
 
 /* This is not called "init_process" because that is the name of a
    Mach system call, so it would cause problems on Darwin systems.  */
 void
-init_process_emacs (void)
+init_process_emacs (int sockfd)
 {
 #ifdef subprocesses
-  register int i;
+  int i;
 
   inhibit_sentinels = 0;
 
@@ -7772,7 +7765,8 @@ init_process_emacs (void)
   FD_ZERO (&non_keyboard_wait_mask);
   FD_ZERO (&non_process_wait_mask);
   FD_ZERO (&write_mask);
-  max_process_desc = max_input_desc = external_sock_fd = -1;
+  max_process_desc = max_input_desc = -1;
+  external_sock_fd = sockfd;
   memset (fd_callback_info, 0, sizeof (fd_callback_info));
 
   FD_ZERO (&connect_wait_mask);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]