summaryrefslogtreecommitdiff
path: root/usr/src/man/man5/cancellation.5
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man5/cancellation.5')
-rw-r--r--usr/src/man/man5/cancellation.5429
1 files changed, 0 insertions, 429 deletions
diff --git a/usr/src/man/man5/cancellation.5 b/usr/src/man/man5/cancellation.5
deleted file mode 100644
index 8cd2eb8f62..0000000000
--- a/usr/src/man/man5/cancellation.5
+++ /dev/null
@@ -1,429 +0,0 @@
-.\"
-.\" Sun Microsystems, Inc. gratefully acknowledges The Open Group for
-.\" permission to reproduce portions of its copyrighted documentation.
-.\" Original documentation from The Open Group can be obtained online at
-.\" http://www.opengroup.org/bookstore/.
-.\"
-.\" The Institute of Electrical and Electronics Engineers and The Open
-.\" Group, have given us permission to reprint portions of their
-.\" documentation.
-.\"
-.\" In the following statement, the phrase ``this text'' refers to portions
-.\" of the system documentation.
-.\"
-.\" Portions of this text are reprinted and reproduced in electronic form
-.\" in the SunOS Reference Manual, from IEEE Std 1003.1, 2004 Edition,
-.\" Standard for Information Technology -- Portable Operating System
-.\" Interface (POSIX), The Open Group Base Specifications Issue 6,
-.\" Copyright (C) 2001-2004 by the Institute of Electrical and Electronics
-.\" Engineers, Inc and The Open Group. In the event of any discrepancy
-.\" between these versions and the original IEEE and The Open Group
-.\" Standard, the original IEEE and The Open Group Standard is the referee
-.\" document. The original Standard can be obtained online at
-.\" http://www.opengroup.org/unix/online.html.
-.\"
-.\" This notice shall appear on any product containing this material.
-.\"
-.\" The contents of this file are subject to the terms of the
-.\" Common Development and Distribution License (the "License").
-.\" You may not use this file except in compliance with the License.
-.\"
-.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-.\" or http://www.opensolaris.org/os/licensing.
-.\" See the License for the specific language governing permissions
-.\" and limitations under the License.
-.\"
-.\" When distributing Covered Code, include this CDDL HEADER in each
-.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-.\" If applicable, add the following below this CDDL HEADER, with the
-.\" fields enclosed by brackets "[]" replaced with your own identifying
-.\" information: Portions Copyright [yyyy] [name of copyright owner]
-.\"
-.\"
-.\" Portions Copyright (c) 1995 IEEE. All Rights Reserved.
-.\" Copyright (c) 2001, The IEEE and The Open Group. All Rights Reserved.
-.\" Copyright (c) 2008, Sun Microsystems, Inc. All Rights Reserved.
-.\"
-.TH CANCELLATION 5 "Oct 4, 2005"
-.SH NAME
-cancellation \- overview of concepts related to POSIX thread cancellation
-.SH DESCRIPTION
-.TS
-box;
-c | c
-l | l .
-FUNCTION ACTION
-_
-\fBpthread_cancel()\fR Cancels thread execution.
-\fBpthread_setcancelstate()\fR Sets the cancellation \fIstate\fR of a thread.
-\fBpthread_setcanceltype()\fR Sets the cancellation \fItype\fR of a thread.
-\fBpthread_testcancel()\fR T{
-Creates a cancellation point in the calling thread.
-T}
-\fBpthread_cleanup_push()\fR Pushes a cleanup handler routine.
-\fBpthread_cleanup_pop()\fR Pops a cleanup handler routine.
-.TE
-
-.SS "Cancellation"
-.LP
-Thread cancellation allows a thread to terminate the execution of any
-application thread in the process. Cancellation is useful when further
-operations of one or more threads are undesirable or unnecessary.
-.sp
-.LP
-An example of a situation that could benefit from using cancellation is an
-asynchronously-generated cancel condition such as a user requesting to close or
-exit some running operation. Another example is the completion of a task
-undertaken by a number of threads, such as solving a maze. While many threads
-search for the solution, one of the threads might solve the puzzle while the
-others continue to operate. Since they are serving no purpose at that point,
-they should all be canceled.
-.SS "Planning Steps"
-.LP
-Planning and programming for most cancellations follow this pattern:
-.RS +4
-.TP
-1.
-Identify which threads you want to cancel, and insert
-\fBpthread_cancel\fR(3C) statements.
-.RE
-.RS +4
-.TP
-2.
-Identify system-defined cancellation points where a thread that might be
-canceled could have changed system or program state that should be restored.
-See the \fBCancellation Points\fR for a list.
-.RE
-.RS +4
-.TP
-3.
-When a thread changes the system or program state just before a cancellation
-point, and should restore that state before the thread is canceled, place a
-cleanup handler before the cancellation point with
-\fBpthread_cleanup_push\fR(3C). Wherever a thread restores the changed state,
-pop the cleanup handler from the cleanup stack with
-\fBpthread_cleanup_pop\fR(3C).
-.RE
-.RS +4
-.TP
-4.
-Know whether the threads you are canceling call into cancel-unsafe
-libraries, and disable cancellation with \fBpthread_setcancelstate\fR(3C)
-before the call into the library. See \fBCancellation State\fR and
-\fBCancel-Safe\fR.
-.RE
-.RS +4
-.TP
-5.
-To cancel a thread in a procedure that contains no cancellation points,
-insert your own cancellation points with \fBpthread_testcancel\fR(3C). This
-function creates cancellation points by testing for pending cancellations and
-performing those cancellations if they are found. Push and pop cleanup handlers
-around the cancellation point, if necessary (see Step 3, above).
-.RE
-.SS "Cancellation Points"
-.LP
-The system defines certain points at which cancellation can occur (cancellation
-points), and you can create additional cancellation points in your application
-with \fBpthread_testcancel()\fR.
-.sp
-.LP
-The following cancellation points are defined by the system (system-defined
-cancellation points): \fBcreat\fR(2), \fBaio_suspend\fR(3C), \fBclose\fR(2),
-\fBcreat\fR(2), \fBgetmsg\fR(2), \fBgetpmsg\fR(2), \fBlockf\fR(3C),
-\fBmq_receive\fR(3C), \fBmq_send\fR(3C), \fBmsgrcv\fR(2), \fBmsgsnd\fR(2),
-\fBmsync\fR(3C), \fBnanosleep\fR(3C), \fBopen\fR(2), \fBpause\fR(2),
-\fBpoll\fR(2), \fBpread\fR(2), \fBpthread_cond_timedwait\fR(3C),
-\fBpthread_cond_wait\fR(3C), \fBpthread_join\fR(3C),
-\fBpthread_testcancel\fR(3C), \fBputmsg\fR(2), \fBputpmsg\fR(2),
-\fBpwrite\fR(2), \fBread\fR(2), \fBreadv\fR(2), \fBselect\fR(3C),
-\fBsem_wait\fR(3C), \fBsigpause\fR(3C), \fBsigwaitinfo\fR(3C),
-\fBsigsuspend\fR(2), \fBsigtimedwait\fR(3C), \fBsigwait\fR(2), \fBsleep\fR(3C),
-\fBsync\fR(2), \fBsystem\fR(3C), \fBtcdrain\fR(3C), \fBusleep\fR(3C),
-\fBwait\fR(3C), \fBwaitid\fR(2), \fBwait3\fR(3C), \fBwaitpid\fR(3C),
-\fBwrite\fR(2), \fBwritev\fR(2), and \fBfcntl\fR(2), when specifying
-\fBF_SETLKW\fR as the command.
-.sp
-.LP
-When cancellation is asynchronous, cancellation can occur at any time (before,
-during, or after the execution of the function defined as the cancellation
-point). When cancellation is deferred (the default case), cancellation occurs
-only within the scope of a function defined as a cancellation point (after the
-function is called and before the function returns). See \fBCancellation
-Type\fR for more information about deferred and asynchronous cancellation.
-.sp
-.LP
-Choosing where to place cancellation points and understanding how cancellation
-affects your program depend upon your understanding of both your application
-and of cancellation mechanics.
-.sp
-.LP
-Typically, any call that might require a long wait should be a cancellation
-point. Operations need to check for pending cancellation requests when the
-operation is about to block indefinitely. This includes threads waiting in
-\fBpthread_cond_wait()\fR and \fBpthread_cond_timedwait()\fR, threads waiting
-for the termination of another thread in \fBpthread_join()\fR, and threads
-blocked on \fBsigwait()\fR.
-.sp
-.LP
-A mutex is explicitly not a cancellation point and should be held for only the
-minimal essential time.
-.sp
-.LP
-Most of the dangers in performing cancellations deal with properly restoring
-invariants and freeing shared resources. For example, a carelessly canceled
-thread might leave a mutex in a locked state, leading to a deadlock. Or it
-might leave a region of memory allocated with no way to identify it and
-therefore no way to free it.
-.SS "Cleanup Handlers"
-.LP
-When a thread is canceled, it should release resources and clean up the state
-that is shared with other threads. So, whenever a thread that might be canceled
-changes the state of the system or of the program, be sure to push a cleanup
-handler with \fBpthread_cleanup_push\fR(3C) before the cancellation point.
-.sp
-.LP
-When a thread is canceled, all the currently-stacked cleanup handlers are
-executed in last-in-first-out (LIFO) order. Each handler is run in the scope in
-which it was pushed. When the last cleanup handler returns, the thread-specific
-data destructor functions are called. Thread execution terminates when the last
-destructor function returns.
-.sp
-.LP
-When, in the normal course of the program, an uncanceled thread restores state
-that it had previously changed, be sure to pop the cleanup handler (that you
-had set up where the change took place) using \fBpthread_cleanup_pop\fR(3C).
-That way, if the thread is canceled later, only currently-changed state will be
-restored by the handlers that are left in the stack.
-.sp
-.LP
-The \fBpthread_cleanup_push()\fR and \fBpthread_cleanup_pop()\fR functions can
-be implemented as macros. The application must ensure that they appear as
-statements, and in pairs within the same lexical scope (that is, the
-\fBpthread_cleanup_push()\fR macro can be thought to expand to a token list
-whose first token is '{' with \fBpthread_cleanup_pop()\fR expanding to a token
-list whose last token is the corresponding '}').
-.sp
-.LP
-The effect of the use of \fBreturn\fR, \fBbreak\fR, \fBcontinue\fR, and
-\fBgoto\fR to prematurely leave a code block described by a pair of
-\fBpthread_cleanup_push()\fR and \fBpthread_cleanup_pop()\fR function calls is
-undefined.
-.SS "Cancellation State"
-.LP
-Most programmers will use only the default cancellation state of
-\fBPTHREAD_CANCEL_ENABLE\fR, but can choose to change the state by using
-\fBpthread_setcancelstate\fR(3C), which determines whether a thread is
-cancelable at all. With the default \fIstate\fR of
-\fBPTHREAD_CANCEL_ENABLE\fR, cancellation is enabled and the thread is
-cancelable at points determined by its cancellation \fItype\fR. See
-\fBCancellation Type\fR.
-.sp
-.LP
-If the \fIstate\fR is \fBPTHREAD_CANCEL_DISABLE\fR, cancellation is disabled,
-the thread is not cancelable at any point, and all cancellation requests to it
-are held pending.
-.sp
-.LP
-You might want to disable cancellation before a call to a cancel-unsafe
-library, restoring the old cancel state when the call returns from the library.
-See \fBCancel-Safe\fR for explanations of cancel safety.
-.SS "Cancellation Type"
-.LP
-A thread's cancellation \fBtype\fR is set with \fBpthread_setcanceltype\fR(3C),
-and determines whether the thread can be canceled anywhere in its execution or
-only at cancellation points.
-.sp
-.LP
-With the default \fItype\fR of \fBPTHREAD_CANCEL_DEFERRED\fR, the thread is
-cancelable only at cancellation points, and then only when cancellation is
-enabled.
-.sp
-.LP
-If the \fItype\fR is \fBPTHREAD_CANCEL_ASYNCHRONOUS\fR, the thread is
-cancelable at any point in its execution (assuming, of course, that
-cancellation is enabled). Try to limit regions of asynchronous cancellation to
-sequences with no external dependencies that could result in dangling resources
-or unresolved state conditions. Using asynchronous cancellation is discouraged
-because of the danger involved in trying to guarantee correct cleanup handling
-at absolutely every point in the program.
-.sp
-
-.sp
-.TS
-box;
-c | c | c
-l | l | l .
-Cancellation Type/State Table
-Type State
- Enabled (Default) Disabled
-_
-Deferred (Default) T{
-Cancellation occurs when the target thread reaches a cancellation point and a cancel is pending. (Default)
-T} T{
-All cancellation requests to the target thread are held pending.
-T}
-Asynchronous T{
-Receipt of a \fBpthread_cancel()\fR call causes immediate cancellation.
-T} T{
-All cancellation requests to the target thread are held pending; as
-soon as cancellation is re-enabled, pending cancellations are executed
-immediately.
-T}
-.TE
-
-.SS "Cancel-Safe"
-.LP
-With the arrival of POSIX cancellation, the Cancel-Safe level has been added to
-the list of MT-Safety levels. See \fBattributes\fR(5). An application or
-library is Cancel-Safe whenever it has arranged for cleanup handlers to restore
-system or program state wherever cancellation can occur. The application or
-library is specifically Deferred-Cancel-Safe when it is Cancel-Safe for threads
-whose cancellation type is \fBPTHREAD_CANCEL_DEFERRED\fR. See \fBCancellation
-State\fR. It is specifically Asynchronous-Cancel-Safe when it is Cancel-Safe
-for threads whose cancellation type is \fBPTHREAD_CANCEL_ASYNCHRONOUS\fR.
-.sp
-.LP
-It is easier to arrange for deferred cancel safety, as this requires system and
-program state protection only around cancellation points. In general, expect
-that most applications and libraries are not Asynchronous-Cancel-Safe.
-.SS "POSIX Threads Only"
-.LP
-The cancellation functions described in this manual page are available for
-POSIX threads, only (the Solaris threads interfaces do not provide cancellation
-functions).
-.SH EXAMPLES
-.LP
-\fBExample 1 \fRCancellation example
-.sp
-.LP
-The following short C++ example shows the pushing/popping of cancellation
-handlers, the disabling/enabling of cancellation, the use of
-\fBpthread_testcancel()\fR, and so on. The \fBfree_res()\fR cancellation
-handler in this example is a dummy function that simply prints a message, but
-that would free resources in a real application. The function \fBf2()\fR is
-called from the main thread, and goes deep into its call stack by calling
-itself recursively.
-
-.sp
-.LP
-Before \fBf2()\fR starts running, the newly created thread has probably posted
-a cancellation on the main thread since the main thread calls \fBthr_yield()\fR
-right after creating thread2. Because cancellation was initially disabled in
-the main thread, through a call to \fBpthread_setcancelstate()\fR, the call to
-\fBf2()\fR from \fBmain()\fR continues and constructs X at each recursive
-call, even though the main thread has a pending cancellation.
-
-.sp
-.LP
-When \fBf2()\fR is called for the fifty-first time (when \fB"i == 50"\fR),
-\fBf2()\fR enables cancellation by calling \fBpthread_setcancelstate()\fR. It
-then establishes a cancellation point for itself by calling
-\fBpthread_testcancel()\fR. (Because a cancellation is pending, a call to a
-cancellation point such as \fBread\fR(2) or \fBwrite\fR(2) would also cancel
-the caller here.)
-
-.sp
-.LP
-After the \fBmain()\fR thread is canceled at the fifty-first iteration, all the
-cleanup handlers that were pushed are called in sequence; this is indicated by
-the calls to \fBfree_res()\fR and the calls to the destructor for \fIX\fR. At
-each level, the C++ runtime calls the destructor for \fIX\fR and then the
-cancellation handler, \fBfree_res()\fR. The print messages from
-\fBfree_res()\fR and \fIX\fR's destructor show the sequence of calls.
-
-.sp
-.LP
-At the end, the main thread is joined by thread2. Because the main thread was
-canceled, its return status from \fBpthread_join()\fR is
-\fBPTHREAD_CANCELED\fR. After the status is printed, thread2 returns, killing
-the process (since it is the last thread in the process).
-
-.sp
-.in +2
-.nf
-#include <pthread.h>
-#include <sched.h>
-extern "C" void thr_yield(void);
-
-extern "C" void printf(...);
-
-struct X {
- int x;
- X(int i){x = i; printf("X(%d) constructed.\en", i);}
- ~X(){ printf("X(%d) destroyed.\en", x);}
-};
-
-void
-free_res(void *i)
-{
- printf("Freeing `%d`\en",i);
-}
-
-char* f2(int i)
-{
- try {
- X dummy(i);
- pthread_cleanup_push(free_res, (void *)i);
- if (i == 50) {
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
- pthread_testcancel();
- }
- f2(i+1);
- pthread_cleanup_pop(0);
- }
- catch (int) {
- printf("Error: In handler.\en");
- }
- return "f2";
-}
-
-void *
-thread2(void *tid)
-{
- void *sts;
-
- printf("I am new thread :%d\en", pthread_self());
-
- pthread_cancel((pthread_t)tid);
-
- pthread_join((pthread_t)tid, &sts);
-
- printf("main thread cancelled due to %d\en", sts);
-
- return (sts);
-}
-
-main()
-{
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
- pthread_create(NULL, NULL, thread2, (void *)pthread_self());
- thr_yield();
- printf("Returned from %s\en",f2(0));
-}
-.fi
-.in -2
-
-.SH ATTRIBUTES
-.LP
-See \fBattributes\fR(5) for descriptions of the following attributes:
-.sp
-
-.sp
-.TS
-box;
-c | c
-l | l .
-ATTRIBUTE TYPE ATTRIBUTE VALUE
-_
-MT-Level MT-Safe
-.TE
-
-.SH SEE ALSO
-.LP
-\fBread\fR(2), \fBsigwait\fR(2), \fBwrite\fR(2), \fBIntro\fR(3),
-\fBcondition\fR(5), \fBpthread_cleanup_pop\fR(3C),
-\fBpthread_cleanup_push\fR(3C), \fBpthread_exit\fR(3C), \fBpthread_join\fR(3C),
-\fBpthread_setcancelstate\fR(3C), \fBpthread_setcanceltype\fR(3C),
-\fBpthread_testcancel\fR(3C), \fBsetjmp\fR(3C), \fBattributes\fR(5),
-\fBstandards\fR(5)