8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man5 / cancellation.5
blob87fc77a389495fb252c64b966ae3ddde0aa965a3
1 '\" te
2 .\" Copyright (c) 2008, Sun Microsystems, Inc.  All Rights Reserved.
3 .\" Portions Copyright (c) 2001, the Institute of Electrical and Electronics Engineers, Inc. and The Open Group. All Rights Reserved.
4 .\" Portions Copyright (c) 1995 IEEE.  All Rights Reserved.
5 .\" 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/.
6 .\" 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
7 .\" are reprinted and reproduced in electronic form in the Sun OS 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
8 .\" 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.
9 .\"  This notice shall appear on any product containing this material.
10 .\" 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.
11 .\"  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
12 .\" the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
13 .TH CANCELLATION 5 "Oct 4, 2005"
14 .SH NAME
15 cancellation \- overview of concepts related to POSIX thread cancellation
16 .SH DESCRIPTION
17 .sp
19 .sp
20 .TS
21 box;
22 c | c
23 l | l .
24 FUNCTION        ACTION
26 \fBpthread_cancel()\fR  Cancels thread execution.
27 \fBpthread_setcancelstate()\fR  Sets the cancellation \fIstate\fR of a thread.
28 \fBpthread_setcanceltype()\fR   Sets the cancellation \fItype\fR of a thread.
29 \fBpthread_testcancel()\fR      T{
30 Creates a cancellation point in the calling thread.
32 \fBpthread_cleanup_push()\fR    Pushes a cleanup handler routine.
33 \fBpthread_cleanup_pop()\fR     Pops a cleanup handler routine.
34 .TE
36 .SS "Cancellation"
37 .sp
38 .LP
39 Thread cancellation allows a thread to terminate the execution of  any
40 application thread in the process. Cancellation is useful when further
41 operations of one or more threads are undesirable or unnecessary.
42 .sp
43 .LP
44 An example of a situation that could benefit from using cancellation is an
45 asynchronously-generated cancel condition such as a user requesting to close or
46 exit some running operation. Another example is the completion of a task
47 undertaken by a number of threads, such as solving a maze. While many threads
48 search for the solution, one of the threads might solve the puzzle while the
49 others continue to operate. Since they are serving no purpose at that point,
50 they should all be canceled.
51 .SS "Planning Steps"
52 .sp
53 .LP
54 Planning and programming for most cancellations follow this pattern:
55 .RS +4
56 .TP
58 Identify which threads you want to cancel, and insert
59 \fBpthread_cancel\fR(3C) statements.
60 .RE
61 .RS +4
62 .TP
64 Identify system-defined cancellation points where a thread that might be
65 canceled could have changed system or program state that should be restored.
66 See the \fBCancellation Points\fR for a list.
67 .RE
68 .RS +4
69 .TP
71 When a thread changes the system or program state just before a cancellation
72 point, and should restore that state before the thread is canceled, place a
73 cleanup handler before the cancellation point with
74 \fBpthread_cleanup_push\fR(3C). Wherever a thread restores the changed state,
75 pop the cleanup handler from the cleanup stack with
76 \fBpthread_cleanup_pop\fR(3C).
77 .RE
78 .RS +4
79 .TP
81 Know whether the threads you are canceling call into cancel-unsafe
82 libraries, and disable cancellation with \fBpthread_setcancelstate\fR(3C)
83 before the call into the library.  See \fBCancellation State\fR and
84 \fBCancel-Safe\fR.
85 .RE
86 .RS +4
87 .TP
89 To cancel a thread in a procedure that contains no cancellation points,
90 insert your own cancellation points with \fBpthread_testcancel\fR(3C). This
91 function creates cancellation points by testing for pending cancellations and
92 performing those cancellations if they are found. Push and pop cleanup handlers
93 around the cancellation point, if necessary (see Step 3, above).
94 .RE
95 .SS "Cancellation Points"
96 .sp
97 .LP
98 The system defines certain points at which cancellation can occur (cancellation
99 points), and you can create additional cancellation points in your application
100 with \fBpthread_testcancel()\fR.
103 The following cancellation points are  defined by the system (system-defined
104 cancellation points): \fBcreat\fR(2), \fBaio_suspend\fR(3C), \fBclose\fR(2),
105 \fBcreat\fR(2), \fBgetmsg\fR(2), \fBgetpmsg\fR(2), \fBlockf\fR(3C),
106 \fBmq_receive\fR(3C), \fBmq_send\fR(3C), \fBmsgrcv\fR(2), \fBmsgsnd\fR(2),
107 \fBmsync\fR(3C), \fBnanosleep\fR(3C), \fBopen\fR(2), \fBpause\fR(2),
108 \fBpoll\fR(2), \fBpread\fR(2), \fBpthread_cond_timedwait\fR(3C),
109 \fBpthread_cond_wait\fR(3C), \fBpthread_join\fR(3C),
110 \fBpthread_testcancel\fR(3C), \fBputmsg\fR(2), \fBputpmsg\fR(2),
111 \fBpwrite\fR(2), \fBread\fR(2), \fBreadv\fR(2), \fBselect\fR(3C),
112 \fBsem_wait\fR(3C), \fBsigpause\fR(3C), \fBsigwaitinfo\fR(3C),
113 \fBsigsuspend\fR(2), \fBsigtimedwait\fR(3C), \fBsigwait\fR(2), \fBsleep\fR(3C),
114 \fBsync\fR(2), \fBsystem\fR(3C), \fBtcdrain\fR(3C), \fBusleep\fR(3C),
115 \fBwait\fR(3C), \fBwaitid\fR(2), \fBwait3\fR(3C), \fBwaitpid\fR(3C),
116 \fBwrite\fR(2), \fBwritev\fR(2), and  \fBfcntl\fR(2), when specifying
117 \fBF_SETLKW\fR as the command.
120 When cancellation is asynchronous, cancellation can occur at any time (before,
121 during, or after the execution of the function defined as the cancellation
122 point). When cancellation is deferred (the default case), cancellation occurs
123 only within the scope of a function defined as a cancellation point (after the
124 function is called and before the function returns). See \fBCancellation
125 Type\fR for more information about deferred and asynchronous cancellation.
128 Choosing where to place cancellation points and understanding how cancellation
129 affects your program depend upon your understanding of both your application
130 and of cancellation mechanics.
133 Typically, any call that might require a long wait should be a cancellation
134 point.  Operations need to check for pending cancellation requests when the
135 operation is about to block indefinitely. This includes threads waiting in
136 \fBpthread_cond_wait()\fR and \fBpthread_cond_timedwait()\fR, threads waiting
137 for the termination of another thread in \fBpthread_join()\fR, and threads
138 blocked on \fBsigwait()\fR.
141 A mutex is explicitly not a cancellation point and should be held for only the
142 minimal essential time.
145 Most of the dangers in performing cancellations deal with properly restoring
146 invariants and freeing shared resources. For example, a carelessly canceled
147 thread might leave a mutex in a locked state, leading to a deadlock. Or it
148 might leave a region of memory allocated with no way to identify it and
149 therefore no way to free it.
150 .SS "Cleanup Handlers"
153 When a thread is canceled, it should release resources and clean up the state
154 that is shared with other threads. So, whenever a thread that might be canceled
155 changes the state of the system or of the program, be sure to push a cleanup
156 handler with \fBpthread_cleanup_push\fR(3C) before the cancellation point.
159 When a thread is canceled, all the currently-stacked cleanup handlers are
160 executed in last-in-first-out (LIFO) order. Each handler is run in the scope in
161 which it was pushed. When the last cleanup handler returns, the thread-specific
162 data destructor functions are called. Thread execution terminates when the last
163 destructor function returns.
166 When, in the normal course of the program, an uncanceled thread restores state
167 that it had previously changed, be sure to pop the cleanup handler (that you
168 had set up where the change took place) using \fBpthread_cleanup_pop\fR(3C).
169 That way, if the thread is canceled later, only currently-changed state will be
170 restored by the handlers that are left in the stack.
173 The \fBpthread_cleanup_push()\fR and \fBpthread_cleanup_pop()\fR functions can
174 be implemented as macros. The application must ensure that they appear as
175 statements, and in pairs within the same lexical scope (that is, the
176 \fBpthread_cleanup_push()\fR macro can be thought to expand to a token list
177 whose first token is '{' with \fBpthread_cleanup_pop()\fR expanding to a token
178 list whose last token is the corresponding '}').
181 The effect of the use of \fBreturn\fR, \fBbreak\fR, \fBcontinue\fR, and
182 \fBgoto\fR to prematurely leave a code block described by a pair of
183 \fBpthread_cleanup_push()\fR and \fBpthread_cleanup_pop()\fR function calls is
184 undefined.
185 .SS "Cancellation State"
188 Most programmers will use only the default cancellation state of
189 \fBPTHREAD_CANCEL_ENABLE\fR, but can choose to change the state by using
190 \fBpthread_setcancelstate\fR(3C), which determines whether a thread is
191 cancelable at all. With the default \fIstate\fR of
192 \fBPTHREAD_CANCEL_ENABLE\fR, cancellation is enabled and the thread is
193 cancelable at points determined by its cancellation \fItype\fR. See
194 \fBCancellation Type\fR.
197 If the \fIstate\fR is \fBPTHREAD_CANCEL_DISABLE\fR, cancellation is disabled,
198 the thread is not cancelable at any point, and all cancellation requests to it
199 are held pending.
202 You might want to disable cancellation before a call to a cancel-unsafe
203 library, restoring the old cancel state when the call returns from the library.
204 See  \fBCancel-Safe\fR for explanations of cancel safety.
205 .SS "Cancellation Type"
208 A thread's cancellation \fBtype\fR is set with \fBpthread_setcanceltype\fR(3C),
209 and determines whether the thread can be canceled anywhere in its execution or
210 only at cancellation points.
213 With the default \fItype\fR of  \fBPTHREAD_CANCEL_DEFERRED\fR, the thread is
214 cancelable only at cancellation points, and then only when cancellation is
215 enabled.
218 If the \fItype\fR is \fBPTHREAD_CANCEL_ASYNCHRONOUS\fR, the thread is
219 cancelable at any point in its execution (assuming, of course, that
220 cancellation is enabled). Try to limit regions of asynchronous cancellation to
221 sequences with no external dependencies that could result in dangling resources
222 or unresolved state conditions. Using asynchronous cancellation is discouraged
223 because of the danger involved in trying to guarantee correct cleanup handling
224 at absolutely every point in the program.
229 box;
230 c | c | c
231 l | l | l .
232 Cancellation Type/State Table
233 Type    State
234         Enabled (Default)       Disabled
236 Deferred (Default)      T{
237 Cancellation occurs when the target thread reaches a cancellation point and a cancel is pending. (Default)
238 T}      T{
239 All cancellation requests to the target thread are held pending.
241 Asynchronous    T{
242 Receipt of a \fBpthread_cancel()\fR call causes immediate cancellation.
243 T}      T{
244 All cancellation requests to the target thread are held pending; as soon as cancellation is re-enabled, pending cancellations are executedimmediately.
248 .SS "Cancel-Safe"
251 With the arrival of POSIX cancellation, the Cancel-Safe level has been added to
252 the list of MT-Safety levels. See \fBattributes\fR(5). An application or
253 library is Cancel-Safe whenever it has arranged for cleanup handlers to restore
254 system or program state wherever cancellation can occur. The application or
255 library is specifically Deferred-Cancel-Safe when it is Cancel-Safe for threads
256 whose cancellation type is \fBPTHREAD_CANCEL_DEFERRED\fR. See \fBCancellation
257 State\fR. It is specifically Asynchronous-Cancel-Safe when it is Cancel-Safe
258 for threads whose cancellation type is \fBPTHREAD_CANCEL_ASYNCHRONOUS\fR.
261 It is easier to arrange for deferred cancel safety, as this requires system and
262 program state protection only around cancellation points. In general, expect
263 that most applications and libraries are not Asynchronous-Cancel-Safe.
264 .SS "POSIX Threads Only"
267 The cancellation functions described in this manual page are available for
268 POSIX threads, only (the Solaris threads interfaces do not provide cancellation
269 functions).
270 .SH EXAMPLES
272 \fBExample 1 \fRCancellation example
275 The following short C++ example shows the pushing/popping of cancellation
276 handlers, the disabling/enabling of cancellation, the use of
277 \fBpthread_testcancel()\fR, and so on. The \fBfree_res()\fR cancellation
278 handler in this example is a dummy function that simply prints a message, but
279 that would free resources in a real application. The function \fBf2()\fR is
280 called from the main thread, and goes deep into its call stack by calling
281 itself recursively.
285 Before \fBf2()\fR starts running, the newly created thread has probably posted
286 a cancellation on the main thread since the main thread calls \fBthr_yield()\fR
287 right after creating thread2.  Because cancellation was initially disabled in
288 the main thread, through a call to \fBpthread_setcancelstate()\fR, the call to
289 \fBf2()\fR from  \fBmain()\fR continues and constructs X at each recursive
290 call,  even though the main thread has a pending cancellation.
294 When \fBf2()\fR is called for the fifty-first time (when \fB"i == 50"\fR),
295 \fBf2()\fR enables cancellation by calling \fBpthread_setcancelstate()\fR. It
296 then establishes a cancellation point for itself by calling
297 \fBpthread_testcancel()\fR. (Because a cancellation is pending, a call to a
298 cancellation point such as  \fBread\fR(2) or  \fBwrite\fR(2) would also cancel
299 the caller here.)
303 After the \fBmain()\fR thread is canceled at the fifty-first iteration, all the
304 cleanup handlers that were pushed are called in sequence; this is indicated by
305 the calls to  \fBfree_res()\fR and the calls to the destructor for \fIX\fR. At
306 each level, the C++ runtime calls the destructor for \fIX\fR and then the
307 cancellation handler,  \fBfree_res()\fR. The print messages from
308 \fBfree_res()\fR and \fIX\fR's destructor show the sequence of calls.
312 At the end, the main thread is joined by thread2. Because the main thread was
313 canceled, its return status from  \fBpthread_join()\fR is
314 \fBPTHREAD_CANCELED\fR. After the status is printed, thread2 returns, killing
315 the  process (since it is the last thread in the process).
318 .in +2
320 #include <pthread.h>
321 #include <sched.h>
322 extern "C" void thr_yield(void);
324 extern "C" void printf(...);
326 struct X {
327         int x;
328         X(int i){x = i; printf("X(%d) constructed.\en", i);}
329         ~X(){ printf("X(%d) destroyed.\en", x);}
332 void
333 free_res(void *i)
335         printf("Freeing `%d`\en",i);
338 char* f2(int i)
340         try {
341         X dummy(i);
342         pthread_cleanup_push(free_res, (void *)i);
343         if (i == 50) {
344                pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
345             pthread_testcancel();
346         }
347         f2(i+1);
348         pthread_cleanup_pop(0);
349         }
350         catch (int) {
351         printf("Error: In handler.\en");
352         }
353         return "f2";
356 void *
357 thread2(void *tid)
359         void *sts;
361         printf("I am new thread :%d\en", pthread_self());
363         pthread_cancel((pthread_t)tid);
365         pthread_join((pthread_t)tid, &sts);
367         printf("main thread cancelled due to %d\en", sts);
369         return (sts);
372 main()
374         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
375         pthread_create(NULL, NULL, thread2, (void *)pthread_self());
376         thr_yield();
377         printf("Returned from %s\en",f2(0));
380 .in -2
382 .SH ATTRIBUTES
385 See \fBattributes\fR(5) for descriptions of the following attributes:
390 box;
391 c | c
392 l | l .
393 ATTRIBUTE TYPE  ATTRIBUTE VALUE
395 MT-Level        MT-Safe
398 .SH SEE ALSO
401 \fBread\fR(2), \fBsigwait\fR(2), \fBwrite\fR(2), \fBIntro\fR(3),
402 \fBcondition\fR(5), \fBpthread_cleanup_pop\fR(3C),
403 \fBpthread_cleanup_push\fR(3C), \fBpthread_exit\fR(3C), \fBpthread_join\fR(3C),
404 \fBpthread_setcancelstate\fR(3C), \fBpthread_setcanceltype\fR(3C),
405 \fBpthread_testcancel\fR(3C), \fBsetjmp\fR(3C), \fBattributes\fR(5),
406 \fBstandards\fR(5)