emacs-devel
[Top][All Lists]
Advanced

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

Re: Asynchronous DNS


From: Alain Schneble
Subject: Re: Asynchronous DNS
Date: Sun, 14 Feb 2016 00:47:27 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (windows-nt)

Lars Ingebrigtsen <address@hidden> writes:

> Eli Zaretskii <address@hidden> writes:
>
>>> From: Lars Ingebrigtsen <address@hidden>
>>> 
>>> Is there a process list somewhere?
>>
>> See Vprocess_alist.
>
> Thanks.  I don't know how I missed it..  It's even the next-to-last
> statement in make_process, that I thought I had read:
>
>   Vprocess_alist = Fcons (Fcons (name, val), Vprocess_alist);

The following patch removes the separate dns_processes list in favour of
reusing Vprocess_alist.  The latter list is now used to loop over all
processes -- to check if pending DNS requests have completed.

Do you agree whith this change?

>From 4967cb5b9f8b9342cae02ae9e2949474606a7fb3 Mon Sep 17 00:00:00 2001
From: Alain Schneble <address@hidden>
Date: Sun, 14 Feb 2016 00:21:22 +0100
Subject: [PATCH] Get rid of separate dns_processes list

* src/process.c: Remove declaration/definition of dns_processes list.
* src/process.c (wait_reading_process_output): Loop over all processes in
Vprocess_alist instead of dns_processes, to check for completed DNS
requests.
---
 src/process.c | 90 ++++++++++++++++++++++-------------------------------------
 1 file changed, 34 insertions(+), 56 deletions(-)

diff --git a/src/process.c b/src/process.c
index 497b069..ec123e9 100644
--- a/src/process.c
+++ b/src/process.c
@@ -281,10 +281,6 @@ static int max_input_desc;
 
 /* Indexed by descriptor, gives the process (if any) for that descriptor.  */
 static Lisp_Object chan_process[FD_SETSIZE];
-#ifdef HAVE_GETADDRINFO_A
-/* Pending DNS requests. */
-static Lisp_Object dns_processes;
-#endif
 
 /* Alist of elements (NAME . PROCESS).  */
 static Lisp_Object Vprocess_alist;
@@ -3881,7 +3877,6 @@ usage: (make-network-process &rest ARGS)  */)
     {
       p->dns_requests = dns_requests;
       p->status = Qconnect;
-      dns_processes = Fcons (proc, dns_processes);
     }
   else
     {
@@ -4778,51 +4773,41 @@ wait_reading_process_output (intmax_t time_limit, int 
nsecs, int read_kbd,
        break;
 
 #ifdef HAVE_GETADDRINFO_A
-      if (!NILP (dns_processes))
-       {
-         Lisp_Object dns_list = dns_processes, dns, ip_addresses,
-           answers = Qnil, answer, new = Qnil;
-         struct Lisp_Process *p;
-
-         /* This is programmed in a somewhat awkward fashion because
-         calling connect_network_socket might make us end up back
-         here again, and we would have a race condition with
-         segfaults.  So first go through all pending requests and see
-         whether we got any answers. */
-         while (!NILP (dns_list))
-           {
-             dns = XCAR (dns_list);
-             dns_list = XCDR (dns_list);
-             p = XPROCESS (dns);
-             if (p && p->dns_requests)
-               {
-                 if (! wait_proc || p == wait_proc)
-                   {
-                     ip_addresses = check_for_dns (dns);
-                     if (EQ (ip_addresses, Qt))
-                       new = Fcons (dns, new);
-                     else
-                       answers = Fcons (Fcons (dns, ip_addresses), answers);
-                   }
-                 else
-                   new = Fcons (dns, new);
-               }
-           }
-
-         /* Replace with the list of DNS requests still not responded
-            to. */
-         dns_processes = new;
+      {
+       Lisp_Object ip_addresses, answers = Qnil, answer;
+       Lisp_Object process_list_head, async_dns_process_candidate;
+       struct Lisp_Process *p;
+         
+       /* This is programmed in a somewhat awkward fashion because
+          calling connect_network_socket might make us end up back
+          here again, and we would have a race condition with
+          segfaults.  So first go through all pending requests and see
+          whether we got any answers. */
+       FOR_EACH_PROCESS(process_list_head, async_dns_process_candidate)
+         {
+           p = XPROCESS (async_dns_process_candidate);
+             
+           if (p->dns_requests)
+             {
+               if (! wait_proc || p == wait_proc)
+                 {
+                   ip_addresses = check_for_dns (async_dns_process_candidate);
+                   if (!EQ (ip_addresses, Qt))
+                     answers = Fcons (Fcons (async_dns_process_candidate, 
ip_addresses), answers);
+                 }
+             }
+         }
 
-         /* Then continue the connection for the successful
-            requests. */
-         while (!NILP (answers))
-           {
-             answer = XCAR (answers);
-             answers = XCDR (answers);
-             if (!NILP (XCDR (answer)))
-               connect_network_socket (XCAR (answer), XCDR (answer));
-           }
-       }
+       /* Then continue the connection for the successful
+          requests. */
+       while (!NILP (answers))
+         {
+           answer = XCAR (answers);
+           answers = XCDR (answers);
+           if (!NILP (XCDR (answer)))
+             connect_network_socket (XCAR (answer), XCDR (answer));
+         }
+      }
 #endif /* HAVE_GETADDRINFO_A */
 
       /* Compute time from now till when time limit is up.  */
@@ -7684,9 +7669,6 @@ init_process_emacs (void)
 #ifdef DATAGRAM_SOCKETS
   memset (datagram_address, 0, sizeof datagram_address);
 #endif
-#ifdef HAVE_GETADDRINFO_A
-  dns_processes = Qnil;
-#endif
 
 #if defined (DARWIN_OS)
   /* PTYs are broken on Darwin < 6, but are sometimes useful for interactive
@@ -7774,10 +7756,6 @@ syms_of_process (void)
 
   staticpro (&Vprocess_alist);
   staticpro (&deleted_pid_list);
-#ifdef HAVE_GETADDRINFO_A
-  staticpro (&dns_processes);
-#endif
-
 #endif /* subprocesses */
 
   DEFSYM (QCname, ":name");
-- 
2.6.2.windows.1


reply via email to

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