From: Loic Domaigne <tech-Z4JMKDdsf89Wk0Htik3J/w@public.gmane.org>
To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
josv-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org,
Bert Wesarg <bert.wesarg-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>,
Karsten Weiss
<K.Weiss-Pt+Xe7GJXK+P2YhJcF5u+nqWYbMAw+HU@public.gmane.org>
Subject: Re: For review: pthread_cancel.3
Date: Mon, 17 Nov 2008 20:41:52 +0100 [thread overview]
Message-ID: <4921C900.6040302@domaigne.com> (raw)
In-Reply-To: <cfd18e0f0811140917q5340504akc53d7ffa3eea483-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
Gidday Michael,
one more review. The page rocks!
Cheers,
Loïc.
--
>
> .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk
> .\" <mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> .\"
> .\" Permission is granted to make and distribute verbatim copies of this
> .\" manual provided the copyright notice and this permission notice are
> .\" preserved on all copies.
> .\"
> .\" Permission is granted to copy and distribute modified versions of this
> .\" manual under the conditions for verbatim copying, provided that the
> .\" entire resulting derived work is distributed under the terms of a
> .\" permission notice identical to this one.
> .\"
> .\" Since the Linux kernel and libraries are constantly changing, this
> .\" manual page may be incorrect or out-of-date. The author(s) assume no
> .\" responsibility for errors or omissions, or for damages resulting from
> .\" the use of the information contained herein. The author(s) may not
> .\" have taken the same level of care in the production of this manual,
> .\" which is licensed free of charge, as they might when working
> .\" professionally.
> .\"
> .\" Formatted or processed versions of this manual, if unaccompanied by
> .\" the source, must acknowledge the copyright and authors of this work.
> .\"
> .TH PTHREAD_CANCEL 3 2008-11-14 "Linux" "Linux Programmer's Manual"
> .SH NAME
> pthread_cancel \- send a cancellation request to a thread
> .SH SYNOPSIS
> .nf
> .B #include <pthread.h>
>
> .BI "int pthread_(pthread_t " thread );
pthread_cancel ;-)
> .sp
> Compile and link with \fI\-pthread\fP.
> .SH DESCRIPTION
> The
> .BR pthread_cancel ()
> function sends a cancellation request to the thread
> .IR thread .
> Whether and when the target thread
> reacts to the cancellation request depends on
> two attributes that are under the control of that thread:
> its cancelability \fIstate\fP and \fItype\fP.
>
> A thread's cancelability state, determined by
> .BR pthread_setcancelstate (3),
> can be
> .I enabled
> or
> .IR disabled .
> If a thread has disabled cancellation,
> then a cancellation request remains queued until the thread
> enables cancellation.
> If a thread has enabled cancellation,
> then its cancelability type determines when cancellation occurs.
>
> A thread's cancellation type, determined by
> .BR pthread_setcanceltype (3),
> may be either
> .IR asynchronous
> or
> .IR deferred .
> Asynchronous cancelability
> means that the thread can be canceled at any time
> (usually immediately, but the system does not guarantee this).
> Deferred cancelability means that cancellation will be delayed until
> the thread next calls a function that is a
> .IR "cancellation point" .
> A list of functions that are or may be cancellation points is provided in
> .IR pthreads (7).
It is very important to document the list of functions that are/are not
CP in the "may be a CP" list: this is system specific and belongs to the
system documentation.
Furthermore we should perhaps add a sentence about the fact that when a
trace is created, cancellation is enabled and deferred by default ? (I
have noticed that you mention this fact in pthread_setcancelstate.3 )
> When a cancellation requested is acted on, the following steps occur for
> .IR thread
> (in this order):
> .IP 1. 3
> Cancellation clean-up handlers are popped
> (in the reverse of the order in which they were pushed) and called.
> (See
> .BR pthread_cleanup_push (3).)
> .IP 2.
> Thread-specific data destructors are called,
> in an unspecified order.
> (See
> .BR pthread_key_create (3).)
> .IP 3.
> The thread is terminated.
> (See
> .BR pthread_exit (3).)
> .PP
> The above steps happen asynchronously with respect to the
> .BR pthread_cancel ()
> call;
> the return status of
> .BR pthread_cancel ()
> merely informs the caller whether the cancellation request
> was successfully queued.
> .PP
> After a canceled thread has terminated,
> a join with that thread using
> .BR pthread_join (3)
> obtains
> .B PTHREAD_CANCELED
> as the thread's exit status.
Joining the canceled thread is the only way to know that cancellation
has completed.
> .SH RETURN VALUE
> On success,
> .BR pthread_cancel ()
> returns 0;
> on error, it returns a non-zero error number.
> .SH ERRORS
> .TP
> .B ESRCH
> Could not find a thread matching the ID
> .IR thread .
> .\" .SH VERSIONS
> .\" Available since glibc 2.0
> .SH CONFORMING TO
> POSIX.1-2001.
> .SH NOTES
> On Linux, cancellation is implemented using signals.
> Under the NPTL threading implementation,
> the first real-time signal (i.e., signal 32) is used for this purpose.
Hmmm... You are right: NPTL uses the first real-time signal (32)
provided by the *kernel*. As a matter of fact, Glibc reserves kernel
real-time signals 32 and 33 for NPTL; real-time queued signals available
to the application ranges from SIGRTMIN (34) to SIGRTMAX(64).
> On LinuxThreads, the second real-time signal is used,
> if real-time signals are available, otherwise
> .B SIGUSR2
> is used.
IIRC, this was true on 'older LinuxThreads'. Never used real-time queued
signals as well ? (To verify...)
> .SH EXAMPLE
> The program below creates a thread and then cancels it.
> The main thread joins with the canceled thread to check
> that its exit status was
> .BR PTHREAD_CANCELED .
> The following shell session shows what happens when we run the program:
>
> .in +4n
> .nf
> $ ./a.out
> thread_func(): started; cancellation disabled
> main(): sending cancellation request
> thread_func(): about to enable cancellation
> main(): thread was canceled
> .fi
> .in
> .SS Program source
> \&
> .nf
> #include <pthread.h>
> #include <stdio.h>
> #include <errno.h>
> #include <stdlib.h>
> #include <unistd.h>
>
> #define handle_error_en(en, msg) \\
> do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
>
> static void *
> thread_func(void *ignored_argument)
> {
> int s;
>
> /* Disable cancellation for a while, so that we don\(aqt
> immediately react to a cancellation request */
>
> s = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
> if (s != 0)
> handle_error_en(s, "pthread_setcancelstate");
>
> printf("thread_func(): started; cancellation disabled\\n");
> sleep(5);
> printf("thread_func(): about to enable cancellation\\n");
>
> s = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
> if (s != 0)
> handle_error_en(s, "pthread_setcancelstate");
>
> /* sleep() is a cancellation point */
>
> sleep(1000); /* Should get canceled while we sleep */
>
> /* Should never get here */
>
> printf("thread_func(): not canceled!\\n");
> return NULL;
> }
>
> int
> main(void)
> {
> pthread_t thr;
> void *res;
> int s;
>
> /* Start a thread and then send it a cancellation request */
>
> s = pthread_create(&thr, NULL, &thread_func, NULL);
> if (s != 0)
> handle_error_en(s, "pthread_create");
>
> sleep(2); /* Give thread a chance to get started */
>
> printf("main(): sending cancellation request\\n");
> s = pthread_cancel(thr);
> if (s != 0)
> handle_error_en(s, "pthread_cancel");
>
> /* Join with thread to see what its exit status was */
>
> s = pthread_join(thr, &res);
> if (s != 0)
> handle_error_en(s, "pthread_join");
>
> if (res == PTHREAD_CANCELED)
> printf("main(): thread was canceled\\n");
> else
> printf("main(): thread wasn\(aqt canceled (shouldn\(aqt happen!)\\n");
> exit(EXIT_SUCCESS);
> }
sleep(3) is a CP on Linux (AFAIR, sleep is a "may be CP").
> .fi
> .SH SEE ALSO
> .BR pthread_cleanup_push (3),
> .BR pthread_create (3),
> .BR pthread_exit (3),
> .BR pthread_join (3),
> .BR pthread_key_create (3),
> .BR pthread_setcancelstate (3),
> .BR pthread_setcanceltype (3),
> .BR pthread_testcancel (3),
> .BR pthreads (7)
>
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2008-11-17 19:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-14 17:17 For review: pthread_cancel.3 Michael Kerrisk
[not found] ` <cfd18e0f0811140917q5340504akc53d7ffa3eea483-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-11-14 18:01 ` Bert Wesarg
[not found] ` <36ca99e90811141001s4b8eb58fnee18ff3b14f4977e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-11-14 18:37 ` Michael Kerrisk
2008-11-17 19:41 ` Loic Domaigne [this message]
[not found] ` <4921C900.6040302-Z4JMKDdsf89Wk0Htik3J/w@public.gmane.org>
2008-11-18 13:55 ` Michael Kerrisk
[not found] ` <4922C93D.1010804-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2008-11-22 6:52 ` Loic Domaigne
[not found] ` <4927AC30.6030107-Z4JMKDdsf89Wk0Htik3J/w@public.gmane.org>
2008-11-24 17:30 ` Michael Kerrisk
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=4921C900.6040302@domaigne.com \
--to=tech-z4jmkddsf89wk0htik3j/w@public.gmane.org \
--cc=K.Weiss-Pt+Xe7GJXK+P2YhJcF5u+nqWYbMAw+HU@public.gmane.org \
--cc=bert.wesarg-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org \
--cc=josv-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/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