[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
- Re: Asynchronous DNS, (continued)
- Re: Asynchronous DNS, Eli Zaretskii, 2016/02/02
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/02
- Re: Asynchronous DNS, Eli Zaretskii, 2016/02/03
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/03
- Re: Asynchronous DNS, Alain Schneble, 2016/02/04
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/04
- Re: Asynchronous DNS, Alain Schneble, 2016/02/04
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/04
- Re: Asynchronous DNS, Eli Zaretskii, 2016/02/05
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/05
- Re: Asynchronous DNS,
Alain Schneble <=
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/13
- Re: Asynchronous DNS, Alain Schneble, 2016/02/14
- Re: Asynchronous DNS, Eli Zaretskii, 2016/02/14
- Re: Asynchronous DNS, Alain Schneble, 2016/02/16
- Re: Asynchronous DNS, Lars Ingebrigtsen, 2016/02/19
- Re: Asynchronous DNS, Paul Eggert, 2016/02/20
- Re: Asynchronous DNS, Alain Schneble, 2016/02/20
- Re: Asynchronous DNS, Paul Eggert, 2016/02/20
- Re: Asynchronous DNS, Alain Schneble, 2016/02/21
- Re: Asynchronous DNS, YAMAMOTO Mitsuharu, 2016/02/26