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 20:23:14 +0200 [thread overview]
Message-ID: <ZLWHEroTkcgTZUcc@calimero.vinschen.de> (raw)
In-Reply-To: <ZLVhNJE83tlKMTEi@calimero.vinschen.de>
On Jul 17 17:41, Corinna Vinschen wrote:
> On Jul 17 16:21, Corinna Vinschen wrote:
> > On Jul 17 12:51, Jon Turney wrote:
> > > On 17/07/2023 12:05, Corinna Vinschen wrote:
> > > > 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,
> >
> Actually, it seems we actually *have* to do this. I just searched
> for more info on that problem and, to my surprise, I found this in the
> most obvious piece of documentation:
>
> https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_exit.html
>
> Quote:
>
> As the meaning of the status is determined by the application (except
> when the thread has been canceled, in which case it is
> PTHREAD_CANCELED), [...]
FTR, apparently I have overinterpreted this sentence.
I performed the following crude test on Linux,, the idea being
to call pthread_cancel and then pthread_exit without hitting a
cancallation point in between.
cat > pt.c <<EOF
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>
int marker = 0;
void *
thread (void *arg)
{
int oldval;
pthread_setcanceltype (PTHREAD_CANCEL_DEFERRED, &oldval);
pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &oldval);
marker = 1;
while (marker < 2)
;
pthread_exit ((void *) 42);
}
int
main ()
{
int error;
pthread_t pt;
void *retval;
if ((error = pthread_create (&pt, NULL, thread, NULL)))
{
printf ("pthread_create: %d %s\n", error, strerror (error));
return 1;
}
while (marker < 1)
;
if ((error = pthread_cancel (pt)))
{
marker = 2;
printf ("pthread_cancel: %d %s\n", error, strerror (error));
pthread_detach (pt);
return 1;
}
marker = 2;
if ((error = pthread_join (pt, &retval)))
{
printf ("pthread_join: %d %s\n", error, strerror (error));
pthread_detach (pt);
return 1;
}
printf ("retval = %ld (%d)\n", (uintptr_t) retval, retval == PTHREAD_CANCELED);
return 0;
}
EOF
$ gcc -g -o pt pt.c -lpthread
$ ./pt
retval = 42 (0)
So retval is the one set by the application, not PTHREAD_CANCELED,
despite the pthread_cancel call. Looks like handling cancellation
inside pthread_exit is really not the right thing to do...
Corinna
next prev parent reply other threads:[~2023-07-17 18:23 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
2023-07-17 15:41 ` Corinna Vinschen
2023-07-17 18:23 ` Corinna Vinschen [this message]
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=ZLWHEroTkcgTZUcc@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).