From: Eric Abrahamsen <eric@ericabrahamsen.net>
To: emacs-devel@gnu.org
Subject: Re: [RFC] Gnus generalized search, part II
Date: Sat, 22 Apr 2017 15:50:16 -0700 [thread overview]
Message-ID: <8737d0ukev.fsf@ericabrahamsen.net> (raw)
In-Reply-To: 83shl0p5pw.fsf@gnu.org
Eli Zaretskii <eliz@gnu.org> writes:
[...]
>> Ideally there would be a message noting which search process was
>> abandoned, which is another reason to use condition-case.
>
> You mean condition-case in the thread function?
My original assumptions about how things work have mostly turned out
wrong. So sure, inside the thread function! I need to set up some dummy
shell programs and test this.
>> accept-process-output is given no timeout. So when we hit the first
>> `thread-join', we wait for the first accept-process-output to return
>> completely, putting all its output in its process buffer. While it's
>> doing that, output from the second and third thread processes is also
>> arriving on the wire, but it's being buffered in C code or in the
>> process itself or in some other special non-Lisp place (I'm making this
>> part up, I have no idea).
>
> Not exactly. While the first thread waits for output, we let some
> other thread run, until that other thread starts waiting as well. The
> first thread whose wait is over will become active again, because the
> main thread is waiting for thread-join. IOW, the main thread waits in
> thread-join, whereas the other threads wait in accept-process-output.
> I think.
[...]
> The first thread runs when the first thread-join is called by the main
> thread. The second thread gets run when the first thread calls
> accept-process-output. Etc. with the other threads.
Okay so this was a key point of confusion for me, and I think I've
finally got it, thank you. I'd misunderstood what Noam was telling me
about the scope of the "results" variable: I thought it needed to be
visible because the thread function started execution immediately, but
he was telling me it needed to be visible because it was captured in the
thread-function closure. Execution doesn't start until the main thread
yields.
So under normal circumstances (processes that take a non-negligible
amount of time to return) we'd do the first thread-join, then all three
threads would end up waiting in accept-process-output. What happens next
could depend on whether thread two or three came out of
accept-process-output before thread one did. As you say:
> I think there could be a problem if a thread finishes accepting its
> output before its thread-join was called.
It shouldn't be too hard to create this test condition.
>> Realistically, the user would be unlikely to quit unless one of the
>> processes was taking a very long time, at which point that would be the
>> only running thread, and probably the right thing would happen.
>
> The problematic scenario is when the main thread gets the C-g. I'm
> not sure this couldn't happen in your setup.
That could happen if the quit came between two of the calls to
`thread-join', yes? I suppose I could do something with inhibit-quit
around the mapc, but that's getting ahead of myself a bit.
Thanks again,
Eric
next prev parent reply other threads:[~2017-04-22 22:50 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-21 21:35 [RFC] Gnus generalized search, part II Eric Abrahamsen
2017-04-22 0:16 ` Andrew Cohen
2017-04-22 5:27 ` Eric Abrahamsen
2017-04-22 8:08 ` Eli Zaretskii
2017-04-22 15:08 ` Eric Abrahamsen
2017-04-22 15:17 ` Eli Zaretskii
2017-04-22 15:25 ` Eli Zaretskii
2017-04-22 19:25 ` Eric Abrahamsen
2017-04-22 20:06 ` Eli Zaretskii
2017-04-22 22:50 ` Eric Abrahamsen [this message]
2017-04-30 17:46 ` Eric Abrahamsen
2017-04-24 17:17 ` Stephen Leake
2017-04-26 9:42 ` Eli Zaretskii
2017-04-22 16:00 ` Noam Postavsky
2017-04-22 7:50 ` Eli Zaretskii
2017-04-22 8:00 ` Andrew Cohen
2017-04-22 19:53 ` Lars Ingebrigtsen
2017-04-22 20:26 ` Eric Abrahamsen
2017-04-24 20:30 ` Eric Abrahamsen
2017-04-26 4:41 ` Andrew Cohen
2017-04-26 9:21 ` Joakim Jalap
2017-04-26 8:18 ` Andrew Cohen
2017-04-26 8:22 ` Andrew Cohen
2017-04-23 13:48 ` Dan Christensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8737d0ukev.fsf@ericabrahamsen.net \
--to=eric@ericabrahamsen.net \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).