public inbox for cygwin-patches@cygwin.com
 help / color / mirror / Atom feed
From: Corinna Vinschen <corinna-cygwin@cygwin.com>
To: cygwin-patches@cygwin.com
Subject: Re: [PATCH 08/11] Cygwin: testsuite: Busy-wait in cancel3 and cancel5
Date: Mon, 17 Jul 2023 16:21:57 +0200	[thread overview]
Message-ID: <ZLVOhclITbZyDOhF@calimero.vinschen.de> (raw)
In-Reply-To: <b132e96c-8767-e5b9-1152-c92cd5ad200e@dronecode.org.uk>

On Jul 17 12:51, Jon Turney wrote:
> On 17/07/2023 12:05, Corinna Vinschen wrote:
> > On Jul 14 20:57, Corinna Vinschen wrote:
> > > What if Cygwin checks for a deferred cancellation in pthread::exit,
> > > too?  It needs to do this by its own, not calling pthread::testcancel,
> > > otherwise we're in an infinite loop.  Since cancel is basically like
> > > exit, just with a PTHREAD_CANCELED return value, the only additional
> > > action would be to set retval to PTHREAD_CANCELED explicitely.
> > 
> > Kind of like this:
> > 
> > diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
> > index f614e01c42f6..fceb9bda1806 100644
> > --- a/winsup/cygwin/thread.cc
> > +++ b/winsup/cygwin/thread.cc
> > @@ -546,6 +546,13 @@ pthread::exit (void *value_ptr)
> >     class pthread *thread = this;
> >     _cygtls *tls = cygtls;	/* Save cygtls before deleting this. */
> > +  /* Deferred cancellation still pending? */
> > +  if (canceled)
> > +    {
> > +      WaitForSingleObject (cancel_event, INFINITE);
> > +      value_ptr = PTHREAD_CANCELED;
> > +    }
> > +
> >     // run cleanup handlers
> >     pop_all_cleanup_handlers ();
> > What do you think?
> 
> I mean, by your own interpretation of the standard, this isn't required,
> because we're allowed to take arbitrarily long to deliver the async
> cancellation, and in this case, we took so long that the thread exited
> before it happened, too bad...

True enough!

> It doesn't seem a bad addition,

On second thought...

One thing bugging me is this:

Looking into pthread::cancel we have this order of things:

    // cancel deferred
    mutex.unlock ();
    canceled = true;
    SetEvent (cancel_event);
    return 0; 

The canceled var is set before the SetEvent call.
What if the thread is terminated after canceled is set to true but
before SetEvent is called?

pthread::testcancel claims:

  We check for the canceled flag first. [...]
  Only if the thread is marked as canceled, we wait for cancel_event
  being really set, on the off-chance that pthread_cancel gets
  interrupted before calling SetEvent.

Neat idea to speed up the code, but doesn't that mean we have a
potential deadlock, especially given that pthread::testcancel calls WFSO
with an INFINITE timeout?

And if so, how do we fix this?  Theoretically, the most simple
solution might be to call SetEvent before setting the canceled
variable, but in fact we would have to make setting canceld
and cancel_event an atomic operation.

Another idea is never to wait for an INFINITE time.  Logically, if
canceled is set and cancel_event isn't, the thread just hasn't been
canceled yet.

Any better idea?

> but this turns pthread_exit() into a
> deferred cancellation point as well, so it should be added to the list of
> "an implementation may also mark other functions not specified in the
> standard as cancellation points" in our documentation^W the huge comment in
> threads.cc.

Yes, indeed.


Thanks,
Corinna

  reply	other threads:[~2023-07-17 14:21 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
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 [this message]
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=ZLVOhclITbZyDOhF@calimero.vinschen.de \
    --to=corinna-cygwin@cygwin.com \
    --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).