public inbox for linux-man@vger.kernel.org
 help / color / mirror / Atom feed
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

  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