git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Erik Faye-Lund <kusmabite@gmail.com>
To: Jeff King <peff@peff.net>
Cc: Johannes Sixt <j6t@kdbg.org>, git@vger.kernel.org
Subject: Re: [PATCH 5/4] run-command: implement abort_async for pthreads
Date: Sat, 2 Apr 2011 14:27:57 +0200	[thread overview]
Message-ID: <AANLkTikN=fSNvgmJfT8grBL=zb9fU680=K6H5h6dzWpf@mail.gmail.com> (raw)
In-Reply-To: <20110401211649.GA16787@sigill.intra.peff.net>

On Fri, Apr 1, 2011 at 11:16 PM, Jeff King <peff@peff.net> wrote:
> On Fri, Apr 01, 2011 at 10:31:42PM +0200, Erik Faye-Lund wrote:
>
>> On Fri, Apr 1, 2011 at 10:18 PM, Johannes Sixt <j6t@kdbg.org> wrote:
>> > On Freitag, 1. April 2011, Erik Faye-Lund wrote:
>> >> On Fri, Apr 1, 2011 at 9:42 PM, Johannes Sixt <j6t@kdbg.org> wrote:
>> >> > But this does not help the case at hand in any way. How would you
>> >> > interrupt a thread that is blocked in ReadFile()? The point of
>> >> > pthread_cancel() is that it interrupts blocked system calls
>> >>
>> >> There is no mention of such a guarantee in POSIX (section 2.9.5 Thread
>> >> Cancellation), so relying on that is undefined behavior.
>> >
>> > In the paragraph before the bulleted list at the end of "Cancellation Points":
>> >
>> > "...If a thread has cancelability enabled and a cancellation request is made
>> > with the thread as a target while the thread is suspended at a cancellation
>> > point, the thread shall be awakened and the cancellation request shall be
>> > acted upon..."
>> >
>>
>> A blocking thread and a suspended are two different matters. A
>> suspended thread is a thread that has been explicitly suspended by
>> wait, waitpid, sleep, pause etc. These functions explicitly say that
>> they suspend the thread ("shall suspend the calling thread until"),
>> while read etc does not ("shall block the calling thread until").
>>
>> Similarly, making a blocking read/write fail (or terminate mid-way) is
>> not the same thing as awakening the thread.
>>
>> I see how some people can read something like this into this section,
>> but I think it's pretty clear - this is not what it's talking about.
>> In fact, the more I read the relevant texts, the more convinced I get
>> that implementations that does terminate read/write strictly speaking
>> is in violation of the standard.
>
> What about the text right before the bit that Johannes quoted:
>
>  The side effects of acting upon a cancellation request while suspended
>  during a call of a function are the same as the side effects that may
>  be seen in a single-threaded program when a call to a function is
>  interrupted by a signal and the given function returns [EINTR]. Any
>  such side effects occur before any cancellation cleanup handlers are
>  called.
>

Yeah, this is much closer, because it explicitly defines the behavior
to "fail" in the same way as when a signal interrupts a wait (which is
not simply awakening the thread). The text has the same problem for
this purpose as the one Johannes quoted; it talks about suspension,
not necessarily blocking. But it's mention of side-effects makes me
suspect that they mean blocking when they say suspension in this case,
because none of the functions that are documented as "blocking" seems
to have any side-effects in this case.

So yes, I think this is the most reasonable interpretation of this
paragraph. Thanks for making me re-read it :)

> I agree it would be nicer if it explicitly said "when you are in a
> function which is a cancellation point, pending cancellation requests
> which are delivered are acuted upon immediately".
>
> But it is implied to me by the surrounding text, and it's the only
> sensible behavior IMHO.

I tend to agree with you on this.

> Plus it seems to be what at least glibc pthreads
> does on Linux, so I'm going to assume that people smarter than me
> thought about it and came up with the same interpretation.
>
> My test program was:
>
> -- >8 --
> #include <pthread.h>
> #include <unistd.h>
> #include <stdio.h>
>
> void *child(void *data)
> {
>  char buf[32];
>  int r;
>
>  fprintf(stderr, "child reading from stdin...\n");
>  r = read(0, buf, sizeof(buf));
>  fprintf(stderr, "child read returned %d\n", r);
>  return NULL;
> }
>
> int main(void)
> {
>  pthread_t t;
>  void *r;
>
>  pthread_create(&t, NULL, child, NULL);
>  sleep(3);
>  pthread_cancel(t);
>
>  pthread_join(t, &r);
>  if (r == PTHREAD_CANCELED)
>    fprintf(stderr, "thread was canceled\n");
>  else
>    fprintf(stderr, "thread returned %p\n", r);
>
>  return 0;
> }
> -- >8 --
>
> If you input something before 3 seconds is up, the thread prints its
> message and returns NULL. But if you let it go, the cancel interrupts
> the read().
>

I'm not sure I agree that measured behavior is the same as defined
operation. But it does support the best theory we have.

So now we're left to figure out how to safely terminate a blocking
read on versions of Windows earlier than Windows Vista. Perhaps just
letting it time-out (assuming it does), and handle the cancellation at
the end of read() is acceptable (when there's no support for
CancelSynchronousIo, that is)? After all, this deadlock hasn't been
observed on threaded implementations making this issue kind of
theoretical on Windows, no? Also, this seems to be roughly how
pthreads-win32 implements cancellation...

  reply	other threads:[~2011-04-02 12:28 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-31 18:42 [PATCH 0/4] fix hang in git push when pack-objects fails Jeff King
2011-03-31 18:43 ` [PATCH 1/4] teach wait_or_whine a "quiet" mode Jeff King
2011-03-31 20:56   ` Johannes Sixt
2011-04-01  1:35     ` Jeff King
2011-03-31 18:44 ` [PATCH 2/4] finish_async: be quiet when waiting for async process Jeff King
2011-03-31 18:44 ` [PATCH 3/4] run-command: allow aborting async code prematurely Jeff King
2011-04-01  9:36   ` Erik Faye-Lund
2011-04-01 13:59     ` Jeff King
2011-03-31 18:44 ` [PATCH 4/4] send-pack: abort sideband demuxer on pack-objects error Jeff King
2011-04-13 19:53   ` Johannes Sixt
2011-04-14 13:54     ` Jeff King
2011-04-14 19:36       ` Johannes Sixt
2011-04-14 20:21         ` Jeff King
2011-04-14 20:43           ` Johannes Sixt
2011-04-14 20:51             ` Jeff King
2011-04-14 21:05               ` Johannes Sixt
2011-04-14 21:21               ` Junio C Hamano
2011-04-24 20:42                 ` [PATCH/RFC 1/2] send-pack --stateless-rpc: properly close the outgoing channel Johannes Sixt
2011-04-24 20:49                   ` [PATCH 2/2] send-pack: avoid deadlock when pack-object dies early Johannes Sixt
2011-04-25 16:50                     ` Jeff King
2011-04-25 17:41                       ` Johannes Sixt
2011-04-25 17:51                         ` Junio C Hamano
2011-04-25 21:04                       ` [PATCH v2] " Johannes Sixt
2011-04-26  8:23                         ` Jeff King
2011-04-25 16:40                   ` [PATCH/RFC 1/2] send-pack --stateless-rpc: properly close the outgoing channel Jeff King
2011-03-31 18:45 ` [PATCH 5/4] run-command: implement abort_async for pthreads Jeff King
2011-04-01  9:41   ` Erik Faye-Lund
2011-04-01 10:15     ` Erik Faye-Lund
2011-04-01 17:27       ` Johannes Sixt
2011-04-01 17:38         ` Jeff King
2011-04-01 19:26         ` Erik Faye-Lund
2011-04-01 19:33           ` Erik Faye-Lund
2011-04-01 19:42           ` Johannes Sixt
2011-04-01 19:57             ` Erik Faye-Lund
2011-04-01 20:05               ` Jeff King
2011-04-01 20:13                 ` Erik Faye-Lund
2011-04-01 20:17                   ` Jeff King
2011-04-01 20:18                     ` Jeff King
2011-04-01 20:34                     ` Erik Faye-Lund
2011-04-01 20:36                   ` Johannes Sixt
2011-04-01 20:41                     ` Erik Faye-Lund
2011-04-01 20:18               ` Johannes Sixt
2011-04-01 20:31                 ` Erik Faye-Lund
2011-04-01 21:16                   ` Jeff King
2011-04-02 12:27                     ` Erik Faye-Lund [this message]
2011-04-01 14:00     ` Jeff King
2011-03-31 20:45 ` [PATCH 0/4] fix hang in git push when pack-objects fails Johannes Sixt
2011-04-01  1:34   ` Jeff King

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: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='AANLkTikN=fSNvgmJfT8grBL=zb9fU680=K6H5h6dzWpf@mail.gmail.com' \
    --to=kusmabite@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    --cc=peff@peff.net \
    /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://80x24.org/mirrors/git.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).