public inbox for cygwin-patches@cygwin.com
 help / color / mirror / Atom feed
From: Jon Turney <jon.turney@dronecode.org.uk>
To: Cygwin Patches <cygwin-patches@cygwin.com>
Subject: Re: [PATCH 08/11] Cygwin: testsuite: Busy-wait in cancel3 and cancel5
Date: Fri, 14 Jul 2023 14:04:03 +0100	[thread overview]
Message-ID: <5aa21952-a13d-f304-8b63-18ee4885c308@dronecode.org.uk> (raw)
In-Reply-To: <ZLBIJTlbCtRvYlU9@calimero.vinschen.de>

On 13/07/2023 19:53, Corinna Vinschen wrote:
> On Jul 13 20:37, Corinna Vinschen wrote:
>> On Jul 13 20:16, Corinna Vinschen wrote:
>>> On Jul 13 12:39, Jon Turney wrote:
>>>> These tests async thread cancellation of a thread that doesn't have any
>>>> cancellation points.
>>>>
>>>> Unfortunately, since 450f557f the async cancellation silently fails when
>>>> the thread is inside the kernel function Sleep(), so it just exits
>>>
>>> I'm not sure how this patch should be the actual culprit.  It only
>>> handles thread priorities, not thread cancellation.  Isn't this rather
>>> 2b165a453ea7b or some such?

Yeah, I messed up there somehow. I will fix the commit id.

>>>> normally after 10 seconds. (See the commentary in pthread::cancel() in
>>>> thread.cc, where it checks if the target thread is inside the kernel,
>>>> and silently converts the cancellation into a deferred one)
>>>
>>> Nevertheless, I think this is ok to do.  The description of pthread_cancel
>>> contains this:
>>>
>>>    Asynchronous cancelability means that the thread can be canceled at
>>>    any time (usually immediately, but the system does not guarantee this).
>>>
>>> And
>>>
>>>    The above steps happen asynchronously with respect to the
>>>    pthread_cancel() call; the return status of pthread_cancel() merely
>>>    informs the caller whether the cancellation request was successfully
>>>    queued.
>>>
>>> So any assumption *when* the cancallation takes place is may be wrong.

Yeah.

I think the flakiness is when we happen to try to async cancel while in 
the Windows kernel, which implicitly converts to a deferred 
cancellation, but there are no cancellation points in the the thread, so 
it arrives at pthread_exit() and returns a exit code other than 
PTHREAD_CANCELED.

I did consider making the test non-flaky by adding a final call to 
pthread_testcancel(), to notice any failed async cancellation which has 
been converted to a deferred one.

But then that is just the same as the deferred cancellation tests, and 
confirms the cancellation happens, but not that it's async, which is 
part of the point of the test.

I guess this could also check that not all of the threads ran for all 10 
seconds, which would indicate that at least some of them were cancelled 
asynchronously.

>> I wonder, though, if we can't come up with a better solution than just
>> waiting for the next cancellation point.
>>
>> No solution comes to mind if the user code calls a Win32 function, but
>> maybe _sigbe could check if the thread's cancel_event is set?  It's all
>> in assembler, that complicates it a bit, but that would make it at least
>> working for POSIX functions which are no cancellation points.

I think you'd need to record the "pending async cancellation" as 
different to "deferred cancellation" so this doesn't turn everything 
into a cancellation point.

> Alternatively, maybe we can utilize the existing signal handler and
> just send a Cygwin-only signal outside the maskable signal range.
> wait_sig calls sigpacket::process like for any other standard signal,
> The signal handler is basically pthread::static_cancel_self().
> Something like that.
I'm not sure this is worth lots of effort, as thread cancellation seems 
to be regarded as mis-specified in such as way as to make it unsafe for 
serious use.


  reply	other threads:[~2023-07-14 13:04 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-13 11:38 [PATCH 00/11] More testsuite fixes Jon Turney
2023-07-13 11:38 ` [PATCH 01/11] Cygwin: testsuite: Setup test prereqs in 'installation' the tests run in Jon Turney
2023-07-13 11:38 ` [PATCH 02/11] Cygwin: testsuite: Add a simple timeout mechanism Jon Turney
2023-07-13 11:38 ` [PATCH 03/11] Cygwin: testsuite: Remove const from writable string in fcntl07b Jon Turney
2023-07-13 11:38 ` [PATCH 04/11] Cygwin: testsuite: Skip devdsp test when no audio devices present Jon Turney
2023-07-13 11:38 ` [PATCH 05/11] Cygwin: testsuite: Just log result of second open of /dev/dsp Jon Turney
2023-07-13 11:38 ` [PATCH 06/11] Cygwin: testsuite: Also check direct call in systemcall Jon Turney
2023-07-13 11:39 ` [PATCH 07/11] Cygwin: testsuite: Fix for limited thread priority values Jon Turney
2023-07-13 11:39 ` [PATCH 08/11] Cygwin: testsuite: Busy-wait in cancel3 and cancel5 Jon Turney
2023-07-13 11:43   ` Jon Turney
2023-07-13 18:16   ` Corinna Vinschen
2023-07-13 18:37     ` Corinna Vinschen
2023-07-13 18:53       ` Corinna Vinschen
2023-07-14 13:04         ` Jon Turney [this message]
2023-07-14 18:57           ` Corinna Vinschen
2023-07-17 11:05             ` Corinna Vinschen
2023-07-17 11:51               ` Jon Turney
2023-07-17 14:21                 ` Corinna Vinschen
2023-07-17 15:41                   ` Corinna Vinschen
2023-07-17 18:23                     ` Corinna Vinschen
2023-07-18 11:20                     ` Jon Turney
2023-07-18 12:09                       ` Corinna Vinschen
2023-07-18 15:52                         ` Jon Turney
2023-07-17 11:51           ` Jon Turney
2023-07-17 14:04             ` Corinna Vinschen
2023-07-17 14:22               ` Corinna Vinschen
2023-07-13 11:39 ` [PATCH 09/11] Cygwin: testsuite: Fix a buffer overflow in symlink01 Jon Turney
2023-07-13 18:17   ` Corinna Vinschen
2023-07-14 13:04     ` Jon Turney
2023-07-13 11:39 ` [PATCH 10/11] Cygwin: testsuite: Minor fixes to umask03 Jon Turney
2023-07-13 18:18   ` Corinna Vinschen
2023-07-13 11:39 ` [PATCH 11/11] Cygwin: testsuite: Drop Adminstrator privileges while running tests Jon Turney
2023-07-13 18:05 ` [PATCH 00/11] More testsuite fixes Corinna Vinschen
2023-07-17 11:58 ` Jon Turney
2023-07-17 14:02   ` Corinna Vinschen
2023-07-18 13:37     ` Jon Turney
2023-07-18 14:52       ` Corinna Vinschen

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

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

  git send-email \
    --in-reply-to=5aa21952-a13d-f304-8b63-18ee4885c308@dronecode.org.uk \
    --to=jon.turney@dronecode.org.uk \
    --cc=cygwin-patches@cygwin.com \
    /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.
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).