xref: /xnu-10063.121.3/osfmk/man/thread_abort_safely.html (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1*2c2f96dcSApple OSS Distributions<h2>thread_abort_safely</h2>
2*2c2f96dcSApple OSS Distributions<hr>
3*2c2f96dcSApple OSS Distributions<p>
4*2c2f96dcSApple OSS Distributions<strong>Function</strong> - Abort a thread, restartably.
5*2c2f96dcSApple OSS Distributions<h3>SYNOPSIS</h3>
6*2c2f96dcSApple OSS Distributions<pre>
7*2c2f96dcSApple OSS Distributions<strong>kern_return_t   thread_abort_safely</strong>
8*2c2f96dcSApple OSS Distributions                <strong>(thread_act_t</strong>                     <var>target_thread</var><strong>);</strong>
9*2c2f96dcSApple OSS Distributions</pre>
10*2c2f96dcSApple OSS Distributions<h3>PARAMETERS</h3>
11*2c2f96dcSApple OSS Distributions<dl>
12*2c2f96dcSApple OSS Distributions<p>
13*2c2f96dcSApple OSS Distributions<dt> <var>target_thread</var>
14*2c2f96dcSApple OSS Distributions<dd>
15*2c2f96dcSApple OSS Distributions[in thread send right]
16*2c2f96dcSApple OSS DistributionsThe thread to be aborted.
17*2c2f96dcSApple OSS Distributions</dl>
18*2c2f96dcSApple OSS Distributions<h3>DESCRIPTION</h3>
19*2c2f96dcSApple OSS Distributions<p>
20*2c2f96dcSApple OSS DistributionsThe <strong>thread_abort_safely</strong> function aborts page faults and any message
21*2c2f96dcSApple OSS Distributionsprimitive calls in use by <var>target_thread</var>.  Scheduling depressions
22*2c2f96dcSApple OSS Distributionsand clock sleeps are
23*2c2f96dcSApple OSS Distributionsalso aborted.  The call returns a code indicating that it was
24*2c2f96dcSApple OSS Distributionsinterrupted.  The call
25*2c2f96dcSApple OSS Distributionsis interrupted even if the thread (or the task containing it)
26*2c2f96dcSApple OSS Distributionsis suspended.  If it is
27*2c2f96dcSApple OSS Distributionssuspended, the thread receives the interrupt when it resumes.
28*2c2f96dcSApple OSS Distributions<p>
29*2c2f96dcSApple OSS DistributionsIf its state is not modified before it resumes, the thread will
30*2c2f96dcSApple OSS Distributionsretry an aborted
31*2c2f96dcSApple OSS Distributionspage fault.  The Mach message trap returns either
32*2c2f96dcSApple OSS Distributions<strong>MACH_SEND_INTERRUPTED</strong> or <strong>MACH_RCV_INTERRUPTED</strong>, depending
33*2c2f96dcSApple OSS Distributionson whether the send or the
34*2c2f96dcSApple OSS Distributionsreceive side was interrupted.  Note, though, that the Mach message trap is
35*2c2f96dcSApple OSS Distributionscontained within the <strong>mach_msg</strong> library routine, which,
36*2c2f96dcSApple OSS Distributionsby default, retries
37*2c2f96dcSApple OSS Distributionsinterrupted message calls.
38*2c2f96dcSApple OSS Distributions<p>
39*2c2f96dcSApple OSS DistributionsThe basic purpose of <strong>thread_abort_safely</strong> is to let
40*2c2f96dcSApple OSS Distributionsone thread cleanly stop
41*2c2f96dcSApple OSS Distributionsanother thread (<var>target_thread</var>).  The target thread is stopped
42*2c2f96dcSApple OSS Distributionsin such a manner that
43*2c2f96dcSApple OSS Distributionsits future execution can be controlled in a predictable way.  When
44*2c2f96dcSApple OSS Distributions<strong>thread_abort_safely</strong> returns (if successful), the target
45*2c2f96dcSApple OSS Distributionsthread will appear to have just
46*2c2f96dcSApple OSS Distributionsreturned from the kernel (if it had been in kernel mode).
47*2c2f96dcSApple OSS Distributions<h3>NOTES</h3>
48*2c2f96dcSApple OSS Distributions<p>
49*2c2f96dcSApple OSS DistributionsBy way of comparison, the <strong>thread_suspend</strong> function keeps
50*2c2f96dcSApple OSS Distributionsthe target thread
51*2c2f96dcSApple OSS Distributionsfrom executing any further instructions at the user level, including
52*2c2f96dcSApple OSS Distributionsthe return
53*2c2f96dcSApple OSS Distributionsfrom a system call.  The <strong>thread_get_state</strong> function
54*2c2f96dcSApple OSS Distributionsreturns the thread's user
55*2c2f96dcSApple OSS Distributionsstate, while <strong>thread_set_state</strong> allows modification of the user state.
56*2c2f96dcSApple OSS Distributions<p>
57*2c2f96dcSApple OSS DistributionsA problem occurs if a suspended thread had been executing within a system
58*2c2f96dcSApple OSS Distributionscall.  In this case, the thread has, not only a user state, but
59*2c2f96dcSApple OSS Distributionsan associated kernel
60*2c2f96dcSApple OSS Distributionsstate. (The kernel state cannot be changed with <strong>thread_set_state</strong>.)
61*2c2f96dcSApple OSS DistributionsAs a result,
62*2c2f96dcSApple OSS Distributionswhen the thread resumes, the system call can return, producing a change in the
63*2c2f96dcSApple OSS Distributionsuser state and, possibly, user memory.
64*2c2f96dcSApple OSS Distributions<p>
65*2c2f96dcSApple OSS DistributionsFor a thread executing within a system call, <strong>thread_abort_safely</strong>
66*2c2f96dcSApple OSS Distributionsaborts the
67*2c2f96dcSApple OSS Distributionskernel call from the thread's point of view.  Specifically, it
68*2c2f96dcSApple OSS Distributionsresets the kernel state so
69*2c2f96dcSApple OSS Distributionsthat the thread will resume execution at the system call return,
70*2c2f96dcSApple OSS Distributionswith the return
71*2c2f96dcSApple OSS Distributionscode value set to one of the interrupted codes.  The system call itself may
72*2c2f96dcSApple OSS Distributionscompleted entirely, aborted entirely or be partially completed,
73*2c2f96dcSApple OSS Distributionsdepending on when
74*2c2f96dcSApple OSS Distributionsthe abort is received.  As a result, if the thread's user state
75*2c2f96dcSApple OSS Distributionshas been modified by
76*2c2f96dcSApple OSS Distributions<strong>thread_set_state</strong>, it will not be altered un-predictably
77*2c2f96dcSApple OSS Distributionsby any unexpected
78*2c2f96dcSApple OSS Distributionssystem call side effects.
79*2c2f96dcSApple OSS Distributions<p>
80*2c2f96dcSApple OSS DistributionsFor example, to simulate a POSIX signal, use the following sequence of calls:
81*2c2f96dcSApple OSS Distributions<dl>
82*2c2f96dcSApple OSS Distributions<dd>
83*2c2f96dcSApple OSS Distributions<strong>thread_suspend</strong>\(emTo stop the thread.
84*2c2f96dcSApple OSS Distributions<dd>
85*2c2f96dcSApple OSS Distributions<strong>thread_abort_safely</strong>\(emTo interrupt any system call in
86*2c2f96dcSApple OSS Distributionsprogress and set the
87*2c2f96dcSApple OSS Distributionsreturn value to "interrupted".  Because the thread is already stopped, it will
88*2c2f96dcSApple OSS Distributionsnot return to user code.
89*2c2f96dcSApple OSS Distributions<dd>
90*2c2f96dcSApple OSS Distributions<strong>thread_set_state</strong>\(emTo modify the thread's user state to simulate a
91*2c2f96dcSApple OSS Distributionsprocedure call to the signal handler.
92*2c2f96dcSApple OSS Distributions<dd>
93*2c2f96dcSApple OSS Distributions<strong>thread_resume</strong>\(emTo resume execution at the signal handler.
94*2c2f96dcSApple OSS DistributionsIf the thread's
95*2c2f96dcSApple OSS Distributionsstack is set up correctly, the thread can return to the interrupted
96*2c2f96dcSApple OSS Distributionssystem call.
97*2c2f96dcSApple OSS DistributionsNote that the code to push an extra stack frame and change the registers is
98*2c2f96dcSApple OSS Distributionshighly machine dependent.
99*2c2f96dcSApple OSS Distributions</dl>
100*2c2f96dcSApple OSS Distributions<h3>CAUTIONS</h3>
101*2c2f96dcSApple OSS Distributions<p>
102*2c2f96dcSApple OSS DistributionsAs a rule, do not use <strong>thread_abort_safely</strong> on a non-suspended
103*2c2f96dcSApple OSS Distributionsthread.  This
104*2c2f96dcSApple OSS Distributionsoperation is very risky because it is difficult to know which
105*2c2f96dcSApple OSS Distributionssystem trap, if any, is
106*2c2f96dcSApple OSS Distributionsexecuting and whether an interrupt return will result in some useful action by
107*2c2f96dcSApple OSS Distributionsthe thread.
108*2c2f96dcSApple OSS Distributions<p>
109*2c2f96dcSApple OSS Distributions<strong>thread_abort_safely</strong> will not abort any non-atomic operation
110*2c2f96dcSApple OSS Distributions(such as a
111*2c2f96dcSApple OSS Distributionsmulti-page <strong>memory_object_data_supply</strong> or exception processing)
112*2c2f96dcSApple OSS Distributionsbut will return an
113*2c2f96dcSApple OSS Distributionserror instead.  The caller of this function must then allow the
114*2c2f96dcSApple OSS Distributionsthread to resume
115*2c2f96dcSApple OSS Distributionsand attempt to abort it later.  If the thread must be aborted,
116*2c2f96dcSApple OSS Distributionseven if doing so
117*2c2f96dcSApple OSS Distributionswould abort any non-atomic operations, <strong>thread_abort</strong> would be used.
118*2c2f96dcSApple OSS Distributions<h3>RETURN VALUES</h3>
119*2c2f96dcSApple OSS Distributions<dl>
120*2c2f96dcSApple OSS Distributions<p>
121*2c2f96dcSApple OSS Distributions<dt> <strong>KERN_FAILURE</strong>
122*2c2f96dcSApple OSS Distributions<dd>
123*2c2f96dcSApple OSS DistributionsThe thread is in the middle of a non-restartable operation.
124*2c2f96dcSApple OSS Distributions</dl>
125*2c2f96dcSApple OSS Distributions<h3>RELATED INFORMATION</h3>
126*2c2f96dcSApple OSS Distributions<p>
127*2c2f96dcSApple OSS DistributionsFunctions:
128*2c2f96dcSApple OSS Distributions<a href="mach_msg.html"><strong>mach_msg</strong></a>,
129*2c2f96dcSApple OSS Distributions<a href="thread_get_state.html"><strong>thread_get_state</strong></a>,
130*2c2f96dcSApple OSS Distributions<a href="thread_info.html"><strong>thread_info</strong></a>,
131*2c2f96dcSApple OSS Distributions<a href="thread_set_state.html"><strong>thread_set_state</strong></a>,
132*2c2f96dcSApple OSS Distributions<a href="thread_suspend.html"><strong>thread_suspend</strong></a>,
133*2c2f96dcSApple OSS Distributions<a href="thread_terminate.html"><strong>thread_terminate</strong></a>,
134*2c2f96dcSApple OSS Distributions<a href="thread_abort.html"><strong>thread_abort</strong></a>.
135