From: Richard Palethorpe <rpalethorpe@suse.de>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v2] fzsync: revoke thread_B when parent hit accidental break
Date: Wed, 09 Jan 2019 12:06:10 +0100 [thread overview]
Message-ID: <874laim6ot.fsf@rpws.prws.suse.cz> (raw)
In-Reply-To: <CAEemH2csXcj4jwUNmJAR9jXRZaE+sYNmSJxeU9YqjdgoFcckcA@mail.gmail.com>
Hello,
Li Wang <liwang@redhat.com> writes:
> Cyril Hrubis <chrubis@suse.cz> wrote:
>
>> > +static void sighandler(int sig)
>> > +{
>> > + if (sig == SIGUSR1)
>> > + pthread_exit(NULL);
>> > +}
>>
>> As far as I can tell pthread_exit() is not async-signal-safe, so it
>> shouldn't be called from signal context.
>
> Right! This is really a good reminder. Maybe we could use _exit() as
> a replacement?
>
>> > +/**
>> > + * Wrap run_b for tst_fzsync_pair_reset to set the singal handler
>> > + * at the start of the thread B.
>> > + */
>> > +static void *wrap_run_b(void * run_b)
>> > +{
>> > + void *(*real_run_b)(void *) = run_b;
>> > +
>> > + if (real_run_b) {
>> > + SAFE_SIGNAL(SIGUSR1, sighandler);
>> > + (*real_run_b)(NULL);
>> > + }
>> > +
>> > + return NULL;
>> > +}
>>
>> As far as I can tell the call to signal() will set the signal handler
>> for all threads in the process, so there is no point in wrapping the run
>> function like that, we can as well set up the signal handler before we
>> start the b thread.
>
> To wrap 'run_b' and set up signal handler only for that one thread is
> to make things more precise, but as you pointed out it seems made an
> unnecessary wrapping. Currently I don't have a perfect idea for
> solving that and need thinking for a while. Anyway, if someone can
> come up with a better solution that'd be appreciated.
Actually I think the correct way to kill a thread is with
pthread_cancel.
AFAICT we could call:
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS)
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE)
at the start of thread B, then call:
pthread_cancel(<thread_b_pid>)
in thread A if we can't rely on setting the exit flag to work
There are other ways to use pthread_cancel, but this looks like the
simplest for our use case.
--
Thank you,
Richard.
next prev parent reply other threads:[~2019-01-09 11:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-08 13:26 [LTP] [PATCH v2] fzsync: revoke thread_B when parent hit accidental break Li Wang
2019-01-08 13:48 ` Cyril Hrubis
2019-01-09 5:18 ` Li Wang
2019-01-09 11:06 ` Richard Palethorpe [this message]
2019-01-09 12:01 ` Cyril Hrubis
2019-01-09 13:32 ` [LTP] [PATCH] Check recvmmsg exists before entering fuzzy loop Richard Palethorpe
2019-01-10 3:39 ` Li Wang
2019-01-10 9:50 ` Richard Palethorpe
2019-01-10 9:59 ` [LTP] [PATCH v2] " Richard Palethorpe
2019-01-11 5:57 ` Li Wang
2019-01-11 11:58 ` Cyril Hrubis
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=874laim6ot.fsf@rpws.prws.suse.cz \
--to=rpalethorpe@suse.de \
--cc=ltp@lists.linux.it \
/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