1.. _api_terms:
2
3API Terminology
4###############
5
6The following terms may be used as shorthand API tags to indicate the
7allowed calling context (thread, ISR, pre-kernel), the effect of a call
8on the current thread state, and other behavioral characteristics.
9
10:ref:`api_term_reschedule`
11   if executing the function reaches a reschedule point
12:ref:`api_term_sleep`
13   if executing the function can cause the invoking thread to sleep
14:ref:`api_term_no-wait`
15   if a parameter to the function can prevent the invoking thread from
16   trying to sleep
17:ref:`api_term_isr-ok`
18   if the function can be safely called and will have its specified
19   effect whether invoked from interrupt or thread context
20:ref:`api_term_pre-kernel-ok`
21   if the function can be safely called before the kernel has been fully
22   initialized and will have its specified effect when invoked from that
23   context.
24:ref:`api_term_async`
25   if the function may return before the operation it initializes is
26   complete (i.e. function return and operation completion are
27   asynchronous)
28:ref:`api_term_supervisor`
29   if the calling thread must have supervisor privileges to execute the
30   function
31
32Details on the behavioral impact of each attribute are in the following
33sections.
34
35.. _api_term_reschedule:
36
37reschedule
38==========
39
40The reschedule attribute is used on a function that can reach a
41:ref:`reschedule point <scheduling_v2>` within its execution.
42
43Details
44-------
45
46The significance of this attribute is that when a rescheduling function
47is invoked by a thread it is possible for that thread to be suspended as
48a consequence of a higher-priority thread being made ready.  Whether the
49suspension actually occurs depends on the operation associated with the
50reschedule point and the relative priorities of the invoking thread and
51the head of the ready queue.
52
53Note that in the case of timeslicing, or reschedule points executed from
54interrupts, any thread may be suspended in any function.
55
56Functions that are not **reschedule** may be invoked from either thread
57or interrupt context.
58
59Functions that are **reschedule** may be invoked from thread context.
60
61Functions that are **reschedule** but not **sleep** may be invoked from
62interrupt context.
63
64.. _api_term_sleep:
65
66sleep
67=====
68
69The sleep attribute is used on a function that can cause the invoking
70thread to :ref:`sleep <scheduling_v2>`.
71
72Explanation
73-----------
74
75This attribute is of relevance specifically when considering
76applications that use only non-preemptible threads, because the kernel
77will not replace a running cooperative-only thread at a reschedule point
78unless that thread has explicitly invoked an operation that caused it to
79sleep.
80
81This attribute does not imply the function will sleep unconditionally,
82but that the operation may require an invoking thread that would have to
83suspend, wait, or invoke :c:func:`k_yield` before it can complete
84its operation.  This behavior may be mediated by **no-wait**.
85
86Functions that are **sleep** are implicitly **reschedule**.
87
88Functions that are **sleep** may be invoked from thread context.
89
90Functions that are **sleep** may be invoked from interrupt and
91pre-kernel contexts if and only if invoked in **no-wait** mode.
92
93.. _api_term_no-wait:
94
95no-wait
96=======
97
98The no-wait attribute is used on a function that is also **sleep** to
99indicate that a parameter to the function can force an execution path
100that will not cause the invoking thread to sleep.
101
102Explanation
103-----------
104
105The paradigmatic case of a no-wait function is a function that takes a
106timeout, to which :c:macro:`K_NO_WAIT` can be passed.  The semantics of
107this special timeout value are to execute the function's operation as
108long as it can be completed immediately, and to return an error code
109rather than sleep if it cannot.
110
111It is use of the no-wait feature that allows functions like
112:c:func:`k_sem_take` to be invoked from ISRs, since it is not
113permitted to sleep in interrupt context.
114
115A function with a no-wait path does not imply that taking that path
116guarantees the function is synchronous.
117
118Functions with this attribute may be invoked from interrupt and
119pre-kernel contexts only when the parameter selects the no-wait path.
120
121.. _api_term_isr-ok:
122
123isr-ok
124======
125
126The isr-ok attribute is used on a function to indicate that it works
127whether it is being invoked from interrupt or thread context.
128
129Explanation
130-----------
131
132Any function that is not **sleep** is inherently **isr-ok**.  Functions
133that are **sleep** are **isr-ok** if the implementation ensures that the
134documented behavior is implemented even if called from an interrupt
135context.  This may be achieved by having the implementation detect the
136calling context and transfer the operation that would sleep to a thread,
137or by documenting that when invoked from a non-thread context the
138function will return a specific error (generally ``-EWOULDBLOCK``).
139
140Note that a function that is **no-wait** is safe to call from interrupt
141context only when the no-wait path is selected.  **isr-ok** functions
142need not provide a no-wait path.
143
144.. _api_term_pre-kernel-ok:
145
146pre-kernel-ok
147=============
148
149The pre-kernel-ok attribute is used on a function to indicate that it
150works as documented even when invoked before the kernel main thread has
151been started.
152
153Explanation
154-----------
155
156This attribute is similar to **isr-ok** in function, but is intended for
157use by any API that is expected to be called in :c:macro:`DEVICE_DEFINE()`
158or :c:macro:`SYS_INIT()` calls that may be invoked with ``PRE_KERNEL_1``
159or ``PRE_KERNEL_2`` initialization levels.
160
161Generally a function that is **pre-kernel-ok** checks
162:c:func:`k_is_pre_kernel` when determining whether it can fulfill its
163required behavior.  In many cases it would also check
164:c:func:`k_is_in_isr` so it can be **isr-ok** as well.
165
166.. _api_term_async:
167
168async
169=====
170
171A function is **async** (i.e. asynchronous) if it may return before the
172operation it initiates has completed.  An asynchronous function will
173generally provide a mechanism by which operation completion is reported,
174e.g. a callback or event.
175
176A function that is not asynchronous is synchronous, i.e. the operation
177will always be complete when the function returns.  As most functions
178are synchronous this behavior does not have a distinct attribute to
179identify it.
180
181Explanation
182-----------
183
184Be aware that **async** is orthogonal to context-switching.  Some APIs
185may provide completion information through a callback, but may suspend
186while waiting for the resource necessary to initiate the operation; an
187example is :c:func:`spi_transceive_signal`.
188
189If a function is both **no-wait** and **async** then selecting the
190no-wait path only guarantees that the function will not sleep.  It does
191not affect whether the operation will be completed before the function
192returns.
193
194.. _api_term_supervisor:
195
196supervisor
197==========
198
199The supervisor attribute is relevant only in user-mode applications, and
200indicates that the function cannot be invoked from user mode.
201