source: mainline/uspace/lib/c/include/async.h@ cd1e3fc0

Last change on this file since cd1e3fc0 was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 3 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 14.7 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2006 Ondrej Palkovsky
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/** @addtogroup libc
8 * @{
9 */
10/** @file
11 */
12
13#if ((defined(_LIBC_IPC_H_)) && (!defined(_LIBC_ASYNC_C_)))
14#error Do not intermix low-level IPC interface and async framework
15#endif
16
17#ifndef _LIBC_ASYNC_H_
18#define _LIBC_ASYNC_H_
19
20#include <ipc/common.h>
21#include <time.h>
22#include <stdbool.h>
23#include <abi/proc/task.h>
24#include <abi/ddi/irq.h>
25#include <abi/ipc/event.h>
26#include <abi/ipc/interfaces.h>
27#include <abi/cap.h>
28
29#include <_bits/__noreturn.h>
30
31typedef sysarg_t aid_t;
32typedef sysarg_t port_id_t;
33
34typedef void *(*async_client_data_ctor_t)(void);
35typedef void (*async_client_data_dtor_t)(void *);
36
37/** Port connection handler
38 *
39 * @param call Incoming call or NULL if connection initiated from inside
40 * using async_create_callback_port()
41 * @param arg Local argument.
42 *
43 */
44typedef void (*async_port_handler_t)(ipc_call_t *, void *);
45
46/** Notification handler */
47typedef void (*async_notification_handler_t)(ipc_call_t *, void *);
48
49/** Exchange management style
50 *
51 */
52typedef enum {
53 /** No explicit exchange management
54 *
55 * Suitable for protocols which use a single
56 * IPC message per exchange only.
57 *
58 */
59 EXCHANGE_ATOMIC = 0,
60
61 /** Exchange management via mutual exclusion
62 *
63 * Suitable for any kind of client/server communication,
64 * but can limit parallelism.
65 *
66 */
67 EXCHANGE_SERIALIZE = 1,
68
69 /** Exchange management via phone cloning
70 *
71 * Suitable for servers which support client
72 * data tracking by task hashes and do not
73 * mind cloned phones.
74 *
75 */
76 EXCHANGE_PARALLEL = 2
77} exch_mgmt_t;
78
79/** Forward declarations */
80struct async_exch;
81struct async_sess;
82
83typedef struct async_sess async_sess_t;
84typedef struct async_exch async_exch_t;
85
86extern __noreturn void async_manager(void);
87
88extern bool async_get_call(ipc_call_t *);
89extern bool async_get_call_timeout(ipc_call_t *, usec_t);
90
91extern aid_t async_send_0(async_exch_t *, sysarg_t, ipc_call_t *);
92extern aid_t async_send_1(async_exch_t *, sysarg_t, sysarg_t, ipc_call_t *);
93extern aid_t async_send_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
94 ipc_call_t *);
95extern aid_t async_send_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
96 sysarg_t, ipc_call_t *);
97extern aid_t async_send_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
98 sysarg_t, sysarg_t, ipc_call_t *);
99extern aid_t async_send_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
100 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
101
102extern void async_wait_for(aid_t, errno_t *);
103extern errno_t async_wait_timeout(aid_t, errno_t *, usec_t);
104extern void async_forget(aid_t);
105
106extern void async_set_client_data_constructor(async_client_data_ctor_t);
107extern void async_set_client_data_destructor(async_client_data_dtor_t);
108extern void *async_get_client_data(void);
109extern void *async_get_client_data_by_id(task_id_t);
110extern void async_put_client_data_by_id(task_id_t);
111
112extern errno_t async_create_port(iface_t, async_port_handler_t, void *,
113 port_id_t *);
114extern void async_set_fallback_port_handler(async_port_handler_t, void *);
115extern errno_t async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
116 sysarg_t, async_port_handler_t, void *, port_id_t *);
117
118extern errno_t async_irq_subscribe(int, async_notification_handler_t, void *,
119 const irq_code_t *, cap_irq_handle_t *);
120extern errno_t async_irq_unsubscribe(cap_irq_handle_t);
121
122extern errno_t async_event_subscribe(event_type_t, async_notification_handler_t,
123 void *);
124extern errno_t async_event_task_subscribe(event_task_type_t,
125 async_notification_handler_t, void *);
126extern errno_t async_event_unsubscribe(event_type_t);
127extern errno_t async_event_task_unsubscribe(event_task_type_t);
128extern errno_t async_event_unmask(event_type_t);
129extern errno_t async_event_task_unmask(event_task_type_t);
130
131/*
132 * Wrappers for simple communication.
133 */
134
135extern void async_msg_0(async_exch_t *, sysarg_t);
136extern void async_msg_1(async_exch_t *, sysarg_t, sysarg_t);
137extern void async_msg_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
138extern void async_msg_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
139extern void async_msg_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
140 sysarg_t);
141extern void async_msg_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
142 sysarg_t, sysarg_t);
143
144/*
145 * Wrappers for answer routines.
146 */
147
148extern errno_t async_answer_0(ipc_call_t *, errno_t);
149extern errno_t async_answer_1(ipc_call_t *, errno_t, sysarg_t);
150extern errno_t async_answer_2(ipc_call_t *, errno_t, sysarg_t, sysarg_t);
151extern errno_t async_answer_3(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
152 sysarg_t);
153extern errno_t async_answer_4(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
154 sysarg_t, sysarg_t);
155extern errno_t async_answer_5(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
156 sysarg_t, sysarg_t, sysarg_t);
157
158/*
159 * Wrappers for forwarding routines.
160 */
161
162extern errno_t async_forward_0(ipc_call_t *, async_exch_t *, sysarg_t,
163 unsigned int);
164extern errno_t async_forward_1(ipc_call_t *, async_exch_t *, sysarg_t,
165 sysarg_t, unsigned int);
166extern errno_t async_forward_2(ipc_call_t *, async_exch_t *, sysarg_t,
167 sysarg_t, sysarg_t, unsigned int);
168extern errno_t async_forward_3(ipc_call_t *, async_exch_t *, sysarg_t,
169 sysarg_t, sysarg_t, sysarg_t, unsigned int);
170extern errno_t async_forward_4(ipc_call_t *, async_exch_t *, sysarg_t,
171 sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
172extern errno_t async_forward_5(ipc_call_t *, async_exch_t *, sysarg_t,
173 sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
174
175/*
176 * User-friendly wrappers for async_req_*_*().
177 * The functions are in the form async_req_m_n(), where m is the number of
178 * payload arguments and n is the number of return arguments.
179 */
180
181extern errno_t async_req_0_0(async_exch_t *, sysarg_t);
182extern errno_t async_req_0_1(async_exch_t *, sysarg_t, sysarg_t *);
183extern errno_t async_req_0_2(async_exch_t *, sysarg_t, sysarg_t *, sysarg_t *);
184extern errno_t async_req_0_3(async_exch_t *, sysarg_t, sysarg_t *, sysarg_t *,
185 sysarg_t *);
186extern errno_t async_req_0_4(async_exch_t *, sysarg_t, sysarg_t *, sysarg_t *,
187 sysarg_t *, sysarg_t *);
188extern errno_t async_req_0_5(async_exch_t *, sysarg_t, sysarg_t *, sysarg_t *,
189 sysarg_t *, sysarg_t *, sysarg_t *);
190extern errno_t async_req_1_0(async_exch_t *, sysarg_t, sysarg_t);
191extern errno_t async_req_1_1(async_exch_t *, sysarg_t, sysarg_t, sysarg_t *);
192extern errno_t async_req_1_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t *,
193 sysarg_t *);
194extern errno_t async_req_1_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t *,
195 sysarg_t *, sysarg_t *);
196extern errno_t async_req_1_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t *,
197 sysarg_t *, sysarg_t *, sysarg_t *);
198extern errno_t async_req_1_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t *,
199 sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
200extern errno_t async_req_2_0(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
201extern errno_t async_req_2_1(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
202 sysarg_t *);
203extern errno_t async_req_2_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
204 sysarg_t *, sysarg_t *);
205extern errno_t async_req_2_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
206 sysarg_t *, sysarg_t *, sysarg_t *);
207extern errno_t async_req_2_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
208 sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
209extern errno_t async_req_2_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
210 sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
211extern errno_t async_req_3_0(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
212 sysarg_t);
213extern errno_t async_req_3_1(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
214 sysarg_t, sysarg_t *);
215extern errno_t async_req_3_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
216 sysarg_t, sysarg_t *, sysarg_t *);
217extern errno_t async_req_3_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
218 sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *);
219extern errno_t async_req_3_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
220 sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
221extern errno_t async_req_3_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
222 sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
223extern errno_t async_req_4_0(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
224 sysarg_t, sysarg_t);
225extern errno_t async_req_4_1(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
226 sysarg_t, sysarg_t, sysarg_t *);
227extern errno_t async_req_4_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
228 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *);
229extern errno_t async_req_4_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
230 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *);
231extern errno_t async_req_4_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
232 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
233extern errno_t async_req_4_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
234 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *,
235 sysarg_t *);
236extern errno_t async_req_5_0(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
237 sysarg_t, sysarg_t, sysarg_t);
238extern errno_t async_req_5_1(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
239 sysarg_t, sysarg_t, sysarg_t, sysarg_t *);
240extern errno_t async_req_5_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
241 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *);
242extern errno_t async_req_5_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
243 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *);
244extern errno_t async_req_5_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
245 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *,
246 sysarg_t *);
247extern errno_t async_req_5_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
248 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *,
249 sysarg_t *, sysarg_t *);
250
251extern errno_t async_accept_0(ipc_call_t *);
252extern sysarg_t async_get_label(void);
253
254extern async_sess_t *async_connect_me_to(async_exch_t *, iface_t, sysarg_t,
255 sysarg_t, errno_t *);
256extern async_sess_t *async_connect_me_to_blocking(async_exch_t *, iface_t,
257 sysarg_t, sysarg_t, errno_t *);
258extern async_sess_t *async_connect_kbox(task_id_t, errno_t *);
259
260extern errno_t async_connect_to_me(async_exch_t *, iface_t, sysarg_t, sysarg_t);
261
262extern void async_hangup(async_sess_t *);
263
264extern async_exch_t *async_exchange_begin(async_sess_t *);
265extern void async_exchange_end(async_exch_t *);
266
267/*
268 * FIXME These functions just work around problems with parallel exchange
269 * management. Proper solution needs to be implemented.
270 */
271extern void async_sess_args_set(async_sess_t *, iface_t, sysarg_t, sysarg_t);
272
273/*
274 * User-friendly wrappers for async_share_in_start().
275 */
276
277extern errno_t async_share_in_start_0_0(async_exch_t *, size_t, void **);
278extern errno_t async_share_in_start_0_1(async_exch_t *, size_t,
279 unsigned int *, void **);
280extern errno_t async_share_in_start_1_0(async_exch_t *, size_t, sysarg_t,
281 void **);
282extern errno_t async_share_in_start_1_1(async_exch_t *, size_t, sysarg_t,
283 unsigned int *, void **);
284
285extern bool async_share_in_receive(ipc_call_t *, size_t *);
286extern errno_t async_share_in_finalize(ipc_call_t *, void *, unsigned int);
287
288extern errno_t async_share_out_start(async_exch_t *, void *, unsigned int);
289extern bool async_share_out_receive(ipc_call_t *, size_t *, unsigned int *);
290extern errno_t async_share_out_finalize(ipc_call_t *, void **);
291
292extern errno_t async_data_read_forward_0_0(async_exch_t *, sysarg_t);
293extern errno_t async_data_read_forward_1_0(async_exch_t *, sysarg_t, sysarg_t);
294extern errno_t async_data_read_forward_2_0(async_exch_t *, sysarg_t, sysarg_t,
295 sysarg_t);
296extern errno_t async_data_read_forward_3_0(async_exch_t *, sysarg_t, sysarg_t,
297 sysarg_t, sysarg_t);
298extern errno_t async_data_read_forward_4_0(async_exch_t *, sysarg_t, sysarg_t,
299 sysarg_t, sysarg_t, sysarg_t);
300
301extern errno_t async_data_read_forward_0_1(async_exch_t *, sysarg_t,
302 ipc_call_t *);
303extern errno_t async_data_read_forward_1_1(async_exch_t *, sysarg_t, sysarg_t,
304 ipc_call_t *);
305extern errno_t async_data_read_forward_2_1(async_exch_t *, sysarg_t, sysarg_t,
306 sysarg_t, ipc_call_t *);
307extern errno_t async_data_read_forward_3_1(async_exch_t *, sysarg_t, sysarg_t,
308 sysarg_t, sysarg_t, ipc_call_t *);
309extern errno_t async_data_read_forward_4_1(async_exch_t *, sysarg_t, sysarg_t,
310 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
311
312extern aid_t async_data_read(async_exch_t *, void *, size_t, ipc_call_t *);
313extern errno_t async_data_read_start(async_exch_t *, void *, size_t);
314extern bool async_data_read_receive(ipc_call_t *, size_t *);
315extern errno_t async_data_read_finalize(ipc_call_t *, const void *, size_t);
316
317extern errno_t async_data_write_forward_0_0(async_exch_t *, sysarg_t);
318extern errno_t async_data_write_forward_1_0(async_exch_t *, sysarg_t, sysarg_t);
319extern errno_t async_data_write_forward_2_0(async_exch_t *, sysarg_t, sysarg_t,
320 sysarg_t);
321extern errno_t async_data_write_forward_3_0(async_exch_t *, sysarg_t, sysarg_t,
322 sysarg_t, sysarg_t);
323extern errno_t async_data_write_forward_4_0(async_exch_t *, sysarg_t, sysarg_t,
324 sysarg_t, sysarg_t, sysarg_t);
325
326extern errno_t async_data_write_forward_0_1(async_exch_t *, sysarg_t,
327 ipc_call_t *);
328extern errno_t async_data_write_forward_1_1(async_exch_t *, sysarg_t, sysarg_t,
329 ipc_call_t *);
330extern errno_t async_data_write_forward_2_1(async_exch_t *, sysarg_t, sysarg_t,
331 sysarg_t, ipc_call_t *);
332extern errno_t async_data_write_forward_3_1(async_exch_t *, sysarg_t, sysarg_t,
333 sysarg_t, sysarg_t, ipc_call_t *);
334extern errno_t async_data_write_forward_4_1(async_exch_t *, sysarg_t, sysarg_t,
335 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
336
337extern errno_t async_data_write_start(async_exch_t *, const void *, size_t);
338extern bool async_data_write_receive(ipc_call_t *, size_t *);
339extern errno_t async_data_write_finalize(ipc_call_t *, void *, size_t);
340
341extern errno_t async_data_write_accept(void **, const bool, const size_t,
342 const size_t, const size_t, size_t *);
343extern void async_data_write_void(errno_t);
344
345extern async_sess_t *async_callback_receive(exch_mgmt_t);
346extern async_sess_t *async_callback_receive_start(exch_mgmt_t, ipc_call_t *);
347
348extern errno_t async_state_change_start(async_exch_t *, sysarg_t, sysarg_t,
349 sysarg_t, async_exch_t *);
350extern bool async_state_change_receive(ipc_call_t *);
351extern errno_t async_state_change_finalize(ipc_call_t *, async_exch_t *);
352
353extern void *async_remote_state_acquire(async_sess_t *);
354extern void async_remote_state_update(async_sess_t *, void *);
355extern void async_remote_state_release(async_sess_t *);
356extern void async_remote_state_release_exchange(async_exch_t *);
357
358extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *,
359 sysarg_t, sysarg_t, sysarg_t);
360
361errno_t async_spawn_notification_handler(void);
362
363#endif
364
365/** @}
366 */
Note: See TracBrowser for help on using the repository browser.