xref: /xnu-8792.81.2/osfmk/man/thread_switch.html (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions<h2>thread_switch</h2>
2*19c3b8c2SApple OSS Distributions<hr>
3*19c3b8c2SApple OSS Distributions<p>
4*19c3b8c2SApple OSS Distributions<strong>Function</strong> - Cause context switch with options.
5*19c3b8c2SApple OSS Distributions<h3>SYNOPSIS</h3>
6*19c3b8c2SApple OSS Distributions<pre>
7*19c3b8c2SApple OSS Distributions<strong>kern_return_t   thread_switch</strong>
8*19c3b8c2SApple OSS Distributions                <strong>(mach_port_t</strong>                         <var>new_thread</var>,
9*19c3b8c2SApple OSS Distributions                 <strong>int</strong>                                     <var>option</var>,
10*19c3b8c2SApple OSS Distributions                 <strong>mach_msg_timeout_t</strong>                        <var>time</var><strong>);</strong>
11*19c3b8c2SApple OSS Distributions</pre>
12*19c3b8c2SApple OSS Distributions<h3>PARAMETERS</h3>
13*19c3b8c2SApple OSS Distributions<dl>
14*19c3b8c2SApple OSS Distributions<p>
15*19c3b8c2SApple OSS Distributions<dt> <var>new_thread</var>
16*19c3b8c2SApple OSS Distributions<dd>
17*19c3b8c2SApple OSS Distributions[in thread send right]
18*19c3b8c2SApple OSS DistributionsThread to which the processor should switch
19*19c3b8c2SApple OSS Distributionscontext.
20*19c3b8c2SApple OSS Distributions<p>
21*19c3b8c2SApple OSS Distributions<dt> <var>option</var>
22*19c3b8c2SApple OSS Distributions<dd>
23*19c3b8c2SApple OSS Distributions[in scalar]
24*19c3b8c2SApple OSS DistributionsOptions applicable to the context switch.
25*19c3b8c2SApple OSS Distributions<p>
26*19c3b8c2SApple OSS Distributions<dt> <var>time</var>
27*19c3b8c2SApple OSS Distributions<dd>
28*19c3b8c2SApple OSS Distributions[in scalar]
29*19c3b8c2SApple OSS DistributionsTime duration during which the thread should be affected by
30*19c3b8c2SApple OSS Distributions<var>option</var>.
31*19c3b8c2SApple OSS Distributions</dl>
32*19c3b8c2SApple OSS Distributions<h3>DESCRIPTION</h3>
33*19c3b8c2SApple OSS Distributions<p>
34*19c3b8c2SApple OSS DistributionsThe <strong>thread_switch</strong> function provides low-level access
35*19c3b8c2SApple OSS Distributionsto the scheduler's
36*19c3b8c2SApple OSS Distributionscontext switching code.  <var>new_thread</var> is a hint that implements
37*19c3b8c2SApple OSS Distributionshand-off scheduling.
38*19c3b8c2SApple OSS DistributionsThe operating system will attempt to switch directly to the new thread
39*19c3b8c2SApple OSS Distributions(bypassing the normal logic that selects the next thread to run)
40*19c3b8c2SApple OSS Distributionsif possible.  Since this is a hint, it may be incorrect; it is ignored if it
41*19c3b8c2SApple OSS Distributionsdoesn't specify a thread on the same host as the current thread or if
42*19c3b8c2SApple OSS Distributionsthe scheduler cannot switch to that thread (i.e.,
43*19c3b8c2SApple OSS Distributionsnot runable or already running on another processor).  In this
44*19c3b8c2SApple OSS Distributionscase, the normal
45*19c3b8c2SApple OSS Distributionslogic to select the next thread to run is used; the current thread
46*19c3b8c2SApple OSS Distributionsmay continue
47*19c3b8c2SApple OSS Distributionsrunning if there is no other appropriate thread to run.
48*19c3b8c2SApple OSS Distributions<p>
49*19c3b8c2SApple OSS DistributionsThe <var>option</var> argument specifies the interpretation and use of <var>time</var>.
50*19c3b8c2SApple OSS DistributionsThe possible values (from \*L<mach/thread_switch.h>\*O) are:
51*19c3b8c2SApple OSS Distributions<dl>
52*19c3b8c2SApple OSS Distributions<dt> <strong>SWITCH_OPTION_NONE</strong>
53*19c3b8c2SApple OSS Distributions<dd>
54*19c3b8c2SApple OSS DistributionsThe <var>time</var> argument is ignored.
55*19c3b8c2SApple OSS Distributions<dt> <strong>SWITCH_OPTION_WAIT</strong>
56*19c3b8c2SApple OSS Distributions<dd>
57*19c3b8c2SApple OSS DistributionsThe thread is blocked for the specified <var>time</var>.  This wait cannot be
58*19c3b8c2SApple OSS Distributionscanceled by <strong>thread_resume</strong>;
59*19c3b8c2SApple OSS Distributionsonly <strong>thread_abort</strong> can terminate this wait.
60*19c3b8c2SApple OSS Distributions<dt> <strong>SWITCH_OPTION_DEPRESS</strong>
61*19c3b8c2SApple OSS Distributions<dd>
62*19c3b8c2SApple OSS DistributionsThe thread's scheduling attributes are temporarily set so as to provide
63*19c3b8c2SApple OSS Distributionsit with the lowest possible service for duration <var>time</var>.  The scheduling
64*19c3b8c2SApple OSS Distributionsdepression is aborted when <var>time</var> has passed, when the current thread is
65*19c3b8c2SApple OSS Distributionsnext run (either via hand-off scheduling or because the processor set
66*19c3b8c2SApple OSS Distributionshas nothing better to do), or when <strong>thread_abort</strong> or
67*19c3b8c2SApple OSS Distributions<strong>thread_depress_abort</strong> is applied to the current thread.
68*19c3b8c2SApple OSS DistributionsChanging the thread's scheduling attributes (via <strong>thread_policy</strong>)
69*19c3b8c2SApple OSS Distributionswill not affect this depression.
70*19c3b8c2SApple OSS Distributions<dt> <strong>SWITCH_OPTION_IDLE</strong>
71*19c3b8c2SApple OSS Distributions<dd>
72*19c3b8c2SApple OSS DistributionsThis option is similar to <strong>SWITCH_OPTION_DEPRESS</strong> however, the
73*19c3b8c2SApple OSS Distributionsthread's scheduling attributes are temporarily set so as to place it
74*19c3b8c2SApple OSS Distributionsat a service level that is below all runnable threads for
75*19c3b8c2SApple OSS Distributionsduration <var>time</var>.  The scheduling depression is aborted
76*19c3b8c2SApple OSS Distributionswhen <var>time</var> has passed, when the current thread is
77*19c3b8c2SApple OSS Distributionsnext run (either via hand-off scheduling or because the processor set
78*19c3b8c2SApple OSS Distributionshas nothing better to do), or when <strong>thread_abort</strong> or
79*19c3b8c2SApple OSS Distributions<strong>thread_depress_abort</strong> is applied to the current thread.
80*19c3b8c2SApple OSS DistributionsChanging the thread's scheduling attributes (via <strong>thread_policy</strong>)
81*19c3b8c2SApple OSS Distributionswill not affect this depression.
82*19c3b8c2SApple OSS Distributions</dl>
83*19c3b8c2SApple OSS Distributions<p>
84*19c3b8c2SApple OSS DistributionsThe minimum time and units of time can be obtained as the <var>min_timeout</var>
85*19c3b8c2SApple OSS Distributionsvalue from the <strong>HOST_SCHED_INFO</strong> flavor of <strong>host_info</strong>.
86*19c3b8c2SApple OSS Distributions<h3>NOTES</h3>
87*19c3b8c2SApple OSS Distributions<p>
88*19c3b8c2SApple OSS Distributions<strong>thread_switch</strong> is often called when the current thread
89*19c3b8c2SApple OSS Distributionscan proceed no further
90*19c3b8c2SApple OSS Distributionsfor some reason; the various options and arguments allow information about
91*19c3b8c2SApple OSS Distributionsthis reason to be transmitted to the kernel.  The <var>new_thread</var>
92*19c3b8c2SApple OSS Distributionsargument (hand-off
93*19c3b8c2SApple OSS Distributionsscheduling) is useful when the identity of the thread that must make progress
94*19c3b8c2SApple OSS Distributionsbefore the current thread runs again is known.  The <strong>SWITCH_OPTION_WAIT</strong>
95*19c3b8c2SApple OSS Distributionsoption is used when the amount of time that the current thread
96*19c3b8c2SApple OSS Distributionsmust wait before it
97*19c3b8c2SApple OSS Distributionscan do anything useful can be estimated and is fairly short,
98*19c3b8c2SApple OSS Distributionsespecially when the
99*19c3b8c2SApple OSS Distributionsidentity of the thread for which this thread must wait is not known.
100*19c3b8c2SApple OSS Distributions<h3>CAUTIONS</h3>
101*19c3b8c2SApple OSS Distributions<p>
102*19c3b8c2SApple OSS DistributionsUsers should beware of calling <strong>thread_switch</strong> with an
103*19c3b8c2SApple OSS Distributionsinvalid hint (e.g., <strong>THREAD_NULL</strong>) and no option.
104*19c3b8c2SApple OSS DistributionsBecause the time-sharing scheduler varies the
105*19c3b8c2SApple OSS Distributionspriority of threads based on usage, this may result in a waste
106*19c3b8c2SApple OSS Distributionsof CPU time if the
107*19c3b8c2SApple OSS Distributionsthread that must be run is of lower priority.  The use of the
108*19c3b8c2SApple OSS Distributions<strong>SWITCH_OPTION_DEPRESS</strong> option in this situation is highly recommended.
109*19c3b8c2SApple OSS Distributions<p>
110*19c3b8c2SApple OSS Distributions<strong>thread_switch</strong> ignores policies.  Users relying on the
111*19c3b8c2SApple OSS Distributionspreemption semantics of a
112*19c3b8c2SApple OSS Distributionsfixed time policy should be aware that <strong>thread_switch</strong>
113*19c3b8c2SApple OSS Distributionsignores these semantics;
114*19c3b8c2SApple OSS Distributionsit will run the specified <var>new_thread</var> independent of its scheduling
115*19c3b8c2SApple OSS Distributionsattributes and
116*19c3b8c2SApple OSS Distributionsthose of any threads that could run instead.
117*19c3b8c2SApple OSS Distributions<h3>RETURN VALUES</h3>
118*19c3b8c2SApple OSS Distributions<p>
119*19c3b8c2SApple OSS DistributionsOnly generic errors apply.
120*19c3b8c2SApple OSS Distributions<h3>RELATED INFORMATION</h3>
121*19c3b8c2SApple OSS Distributions<p>
122*19c3b8c2SApple OSS DistributionsFunctions:
123*19c3b8c2SApple OSS Distributions<a href="thread_abort.html"><strong>thread_abort</strong></a>,
124*19c3b8c2SApple OSS Distributions<a href="thread_depress_abort.html"><strong>thread_depress_abort</strong></a>.
125