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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 514d561 was 514d561, checked in by Jiří Zárevúcky <jiri.zarevucky@…>, 7 years ago

Fibril/async implementation overhaul.

This commit marks the move towards treating the fibril library as a mere
implementation of a generic threading interface. Understood as a layer that
wraps the kernel threads, we not only have to wrap threading itself, but also
every syscall that blocks the kernel thread (by blocking, we mean thread not
doing useful work until an external event happens — e.g. locking a kernel
mutex or thread sleep is understood as blocking, but an as_area_create() is not,
despite potentially taking a long time to complete).

Consequently, we implement fibril_ipc_wait() as a fibril-native wrapper for
kernel's ipc_wait(), and also implement timer functionality like timeouts
as part of the fibril library. This removes the interdependency between fibril
implementation and the async framework — in theory, the fibril API could be
reimplemented as a simple 1:1 shim, and the async framework would continue
working normally (note that the current implementation of loader complicates
this).

To better isolate the fibril internals from the implementation of high-level
synchronization, a fibril_event_t is added. This object conceptually acts
like a single slot wait queue. All other synchronization is implemented in
terms of this primitive.

  • Property mode set to 100644
File size: 19.3 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/** @file
33 */
34
35#if ((defined(LIBC_IPC_H_)) && (!defined(LIBC_ASYNC_C_)))
36#error Do not intermix low-level IPC interface and async framework
37#endif
38
39#ifndef LIBC_ASYNC_H_
40#define LIBC_ASYNC_H_
41
42#include <ipc/common.h>
43#include <fibril.h>
44#include <sys/time.h>
45#include <atomic.h>
46#include <stdbool.h>
47#include <abi/proc/task.h>
48#include <abi/ddi/irq.h>
49#include <abi/ipc/event.h>
50#include <abi/ipc/interfaces.h>
51#include <abi/cap.h>
52
53#include <_bits/__noreturn.h>
54
55typedef sysarg_t aid_t;
56typedef sysarg_t port_id_t;
57
58typedef void *(*async_client_data_ctor_t)(void);
59typedef void (*async_client_data_dtor_t)(void *);
60
61/** Port connection handler
62 *
63 * @param call Incoming call or NULL if connection initiated from inside
64 * using async_create_callback_port()
65 * @param arg Local argument.
66 *
67 */
68typedef void (*async_port_handler_t)(ipc_call_t *, void *);
69
70/** Notification handler */
71typedef void (*async_notification_handler_t)(ipc_call_t *, void *);
72
73/** Exchange management style
74 *
75 */
76typedef enum {
77 /** No explicit exchange management
78 *
79 * Suitable for protocols which use a single
80 * IPC message per exchange only.
81 *
82 */
83 EXCHANGE_ATOMIC = 0,
84
85 /** Exchange management via mutual exclusion
86 *
87 * Suitable for any kind of client/server communication,
88 * but can limit parallelism.
89 *
90 */
91 EXCHANGE_SERIALIZE = 1,
92
93 /** Exchange management via phone cloning
94 *
95 * Suitable for servers which support client
96 * data tracking by task hashes and do not
97 * mind cloned phones.
98 *
99 */
100 EXCHANGE_PARALLEL = 2
101} exch_mgmt_t;
102
103/** Forward declarations */
104struct async_exch;
105struct async_sess;
106
107typedef struct async_sess async_sess_t;
108typedef struct async_exch async_exch_t;
109
110extern __noreturn void async_manager(void);
111
112#define async_get_call(data) \
113 async_get_call_timeout(data, 0)
114
115extern bool async_get_call_timeout(ipc_call_t *, suseconds_t);
116
117/*
118 * User-friendly wrappers for async_send_fast() and async_send_slow(). The
119 * macros are in the form async_send_m(), where m denotes the number of payload
120 * arguments. Each macros chooses between the fast and the slow version based
121 * on m.
122 */
123
124#define async_send_0(exch, method, dataptr) \
125 async_send_fast(exch, method, 0, 0, 0, 0, dataptr)
126#define async_send_1(exch, method, arg1, dataptr) \
127 async_send_fast(exch, method, arg1, 0, 0, 0, dataptr)
128#define async_send_2(exch, method, arg1, arg2, dataptr) \
129 async_send_fast(exch, method, arg1, arg2, 0, 0, dataptr)
130#define async_send_3(exch, method, arg1, arg2, arg3, dataptr) \
131 async_send_fast(exch, method, arg1, arg2, arg3, 0, dataptr)
132#define async_send_4(exch, method, arg1, arg2, arg3, arg4, dataptr) \
133 async_send_fast(exch, method, arg1, arg2, arg3, arg4, dataptr)
134#define async_send_5(exch, method, arg1, arg2, arg3, arg4, arg5, dataptr) \
135 async_send_slow(exch, method, arg1, arg2, arg3, arg4, arg5, dataptr)
136
137extern aid_t async_send_fast(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
138 sysarg_t, sysarg_t, ipc_call_t *);
139extern aid_t async_send_slow(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
140 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
141
142extern void async_wait_for(aid_t, errno_t *);
143extern errno_t async_wait_timeout(aid_t, errno_t *, suseconds_t);
144extern void async_forget(aid_t);
145
146extern void async_set_client_data_constructor(async_client_data_ctor_t);
147extern void async_set_client_data_destructor(async_client_data_dtor_t);
148extern void *async_get_client_data(void);
149extern void *async_get_client_data_by_id(task_id_t);
150extern void async_put_client_data_by_id(task_id_t);
151
152extern errno_t async_create_port(iface_t, async_port_handler_t, void *,
153 port_id_t *);
154extern void async_set_fallback_port_handler(async_port_handler_t, void *);
155extern errno_t async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
156 sysarg_t, async_port_handler_t, void *, port_id_t *);
157
158extern errno_t async_irq_subscribe(int, async_notification_handler_t, void *,
159 const irq_code_t *, cap_irq_handle_t *);
160extern errno_t async_irq_unsubscribe(cap_irq_handle_t);
161
162extern errno_t async_event_subscribe(event_type_t, async_notification_handler_t,
163 void *);
164extern errno_t async_event_task_subscribe(event_task_type_t,
165 async_notification_handler_t, void *);
166extern errno_t async_event_unsubscribe(event_type_t);
167extern errno_t async_event_task_unsubscribe(event_task_type_t);
168extern errno_t async_event_unmask(event_type_t);
169extern errno_t async_event_task_unmask(event_task_type_t);
170
171/*
172 * Wrappers for simple communication.
173 */
174
175extern void async_msg_0(async_exch_t *, sysarg_t);
176extern void async_msg_1(async_exch_t *, sysarg_t, sysarg_t);
177extern void async_msg_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
178extern void async_msg_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
179extern void async_msg_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
180 sysarg_t);
181extern void async_msg_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
182 sysarg_t, sysarg_t);
183
184/*
185 * Wrappers for answer routines.
186 */
187
188extern errno_t async_answer_0(ipc_call_t *, errno_t);
189extern errno_t async_answer_1(ipc_call_t *, errno_t, sysarg_t);
190extern errno_t async_answer_2(ipc_call_t *, errno_t, sysarg_t, sysarg_t);
191extern errno_t async_answer_3(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
192 sysarg_t);
193extern errno_t async_answer_4(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
194 sysarg_t, sysarg_t);
195extern errno_t async_answer_5(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
196 sysarg_t, sysarg_t, sysarg_t);
197
198/*
199 * Wrappers for forwarding routines.
200 */
201
202extern errno_t async_forward_fast(ipc_call_t *, async_exch_t *, sysarg_t,
203 sysarg_t, sysarg_t, unsigned int);
204extern errno_t async_forward_slow(ipc_call_t *, async_exch_t *, sysarg_t,
205 sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
206
207/*
208 * User-friendly wrappers for async_req_fast() and async_req_slow(). The macros
209 * are in the form async_req_m_n(), where m is the number of payload arguments
210 * and n is the number of return arguments. The macros decide between the fast
211 * and slow verion based on m.
212 */
213
214#define async_req_0_0(exch, method) \
215 async_req_fast(exch, method, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
216#define async_req_0_1(exch, method, r1) \
217 async_req_fast(exch, method, 0, 0, 0, 0, r1, NULL, NULL, NULL, NULL)
218#define async_req_0_2(exch, method, r1, r2) \
219 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, NULL, NULL, NULL)
220#define async_req_0_3(exch, method, r1, r2, r3) \
221 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, NULL, NULL)
222#define async_req_0_4(exch, method, r1, r2, r3, r4) \
223 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, r4, NULL)
224#define async_req_0_5(exch, method, r1, r2, r3, r4, r5) \
225 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, r4, r5)
226
227#define async_req_1_0(exch, method, arg1) \
228 async_req_fast(exch, method, arg1, 0, 0, 0, NULL, NULL, NULL, NULL, \
229 NULL)
230#define async_req_1_1(exch, method, arg1, rc1) \
231 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, NULL, NULL, NULL, \
232 NULL)
233#define async_req_1_2(exch, method, arg1, rc1, rc2) \
234 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, NULL, NULL, \
235 NULL)
236#define async_req_1_3(exch, method, arg1, rc1, rc2, rc3) \
237 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, NULL, \
238 NULL)
239#define async_req_1_4(exch, method, arg1, rc1, rc2, rc3, rc4) \
240 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, rc4, \
241 NULL)
242#define async_req_1_5(exch, method, arg1, rc1, rc2, rc3, rc4, rc5) \
243 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, rc4, \
244 rc5)
245
246#define async_req_2_0(exch, method, arg1, arg2) \
247 async_req_fast(exch, method, arg1, arg2, 0, 0, NULL, NULL, NULL, \
248 NULL, NULL)
249#define async_req_2_1(exch, method, arg1, arg2, rc1) \
250 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, NULL, NULL, \
251 NULL, NULL)
252#define async_req_2_2(exch, method, arg1, arg2, rc1, rc2) \
253 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, NULL, NULL, \
254 NULL)
255#define async_req_2_3(exch, method, arg1, arg2, rc1, rc2, rc3) \
256 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, NULL, \
257 NULL)
258#define async_req_2_4(exch, method, arg1, arg2, rc1, rc2, rc3, rc4) \
259 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, rc4, \
260 NULL)
261#define async_req_2_5(exch, method, arg1, arg2, rc1, rc2, rc3, rc4, rc5) \
262 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, rc4, \
263 rc5)
264
265#define async_req_3_0(exch, method, arg1, arg2, arg3) \
266 async_req_fast(exch, method, arg1, arg2, arg3, 0, NULL, NULL, NULL, \
267 NULL, NULL)
268#define async_req_3_1(exch, method, arg1, arg2, arg3, rc1) \
269 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, NULL, NULL, \
270 NULL, NULL)
271#define async_req_3_2(exch, method, arg1, arg2, arg3, rc1, rc2) \
272 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, NULL, \
273 NULL, NULL)
274#define async_req_3_3(exch, method, arg1, arg2, arg3, rc1, rc2, rc3) \
275 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
276 NULL, NULL)
277#define async_req_3_4(exch, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4) \
278 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
279 rc4, NULL)
280#define async_req_3_5(exch, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4, \
281 rc5) \
282 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
283 rc4, rc5)
284
285#define async_req_4_0(exch, method, arg1, arg2, arg3, arg4) \
286 async_req_fast(exch, method, arg1, arg2, arg3, arg4, NULL, NULL, \
287 NULL, NULL, NULL)
288#define async_req_4_1(exch, method, arg1, arg2, arg3, arg4, rc1) \
289 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, NULL, \
290 NULL, NULL, NULL)
291#define async_req_4_2(exch, method, arg1, arg2, arg3, arg4, rc1, rc2) \
292 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, NULL, \
293 NULL, NULL)
294#define async_req_4_3(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3) \
295 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
296 NULL, NULL)
297#define async_req_4_4(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
298 rc4) \
299 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
300 rc4, NULL)
301#define async_req_4_5(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
302 rc4, rc5) \
303 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
304 rc4, rc5)
305
306#define async_req_5_0(exch, method, arg1, arg2, arg3, arg4, arg5) \
307 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, NULL, \
308 NULL, NULL, NULL, NULL)
309#define async_req_5_1(exch, method, arg1, arg2, arg3, arg4, arg5, rc1) \
310 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, \
311 NULL, NULL, NULL, NULL)
312#define async_req_5_2(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2) \
313 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
314 NULL, NULL, NULL)
315#define async_req_5_3(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
316 rc3) \
317 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
318 rc3, NULL, NULL)
319#define async_req_5_4(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
320 rc3, rc4) \
321 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
322 rc3, rc4, NULL)
323#define async_req_5_5(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
324 rc3, rc4, rc5) \
325 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
326 rc3, rc4, rc5)
327
328extern errno_t async_req_fast(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
329 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *,
330 sysarg_t *);
331extern errno_t async_req_slow(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
332 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *,
333 sysarg_t *, sysarg_t *);
334
335extern async_sess_t *async_connect_me_to(async_exch_t *, iface_t, sysarg_t,
336 sysarg_t);
337extern async_sess_t *async_connect_me_to_blocking(async_exch_t *, iface_t,
338 sysarg_t, sysarg_t);
339extern async_sess_t *async_connect_kbox(task_id_t);
340
341extern errno_t async_connect_to_me(async_exch_t *, iface_t, sysarg_t, sysarg_t);
342
343extern errno_t async_hangup(async_sess_t *);
344
345extern async_exch_t *async_exchange_begin(async_sess_t *);
346extern void async_exchange_end(async_exch_t *);
347
348/*
349 * FIXME These functions just work around problems with parallel exchange
350 * management. Proper solution needs to be implemented.
351 */
352void async_sess_args_set(async_sess_t *sess, iface_t, sysarg_t, sysarg_t);
353
354/*
355 * User-friendly wrappers for async_share_in_start().
356 */
357
358#define async_share_in_start_0_0(exch, size, dst) \
359 async_share_in_start(exch, size, 0, NULL, dst)
360#define async_share_in_start_0_1(exch, size, flags, dst) \
361 async_share_in_start(exch, size, 0, flags, dst)
362#define async_share_in_start_1_0(exch, size, arg, dst) \
363 async_share_in_start(exch, size, arg, NULL, dst)
364#define async_share_in_start_1_1(exch, size, arg, flags, dst) \
365 async_share_in_start(exch, size, arg, flags, dst)
366
367extern errno_t async_share_in_start(async_exch_t *, size_t, sysarg_t,
368 unsigned int *, void **);
369extern bool async_share_in_receive(ipc_call_t *, size_t *);
370extern errno_t async_share_in_finalize(ipc_call_t *, void *, unsigned int);
371
372extern errno_t async_share_out_start(async_exch_t *, void *, unsigned int);
373extern bool async_share_out_receive(ipc_call_t *, size_t *, unsigned int *);
374extern errno_t async_share_out_finalize(ipc_call_t *, void **);
375
376/*
377 * User-friendly wrappers for async_data_read_forward_fast().
378 */
379
380#define async_data_read_forward_0_0(exch, method, answer) \
381 async_data_read_forward_fast(exch, method, 0, 0, 0, 0, NULL)
382#define async_data_read_forward_0_1(exch, method, answer) \
383 async_data_read_forward_fast(exch, method, 0, 0, 0, 0, answer)
384#define async_data_read_forward_1_0(exch, method, arg1, answer) \
385 async_data_read_forward_fast(exch, method, arg1, 0, 0, 0, NULL)
386#define async_data_read_forward_1_1(exch, method, arg1, answer) \
387 async_data_read_forward_fast(exch, method, arg1, 0, 0, 0, answer)
388#define async_data_read_forward_2_0(exch, method, arg1, arg2, answer) \
389 async_data_read_forward_fast(exch, method, arg1, arg2, 0, 0, NULL)
390#define async_data_read_forward_2_1(exch, method, arg1, arg2, answer) \
391 async_data_read_forward_fast(exch, method, arg1, arg2, 0, 0, answer)
392#define async_data_read_forward_3_0(exch, method, arg1, arg2, arg3, answer) \
393 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, 0, NULL)
394#define async_data_read_forward_3_1(exch, method, arg1, arg2, arg3, answer) \
395 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, 0, \
396 answer)
397#define async_data_read_forward_4_0(exch, method, arg1, arg2, arg3, arg4, \
398 answer) \
399 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
400 NULL)
401#define async_data_read_forward_4_1(exch, method, arg1, arg2, arg3, arg4, \
402 answer) \
403 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
404 answer)
405
406extern aid_t async_data_read(async_exch_t *, void *, size_t, ipc_call_t *);
407extern errno_t async_data_read_start(async_exch_t *, void *, size_t);
408extern bool async_data_read_receive(ipc_call_t *, size_t *);
409extern errno_t async_data_read_finalize(ipc_call_t *, const void *, size_t);
410
411extern errno_t async_data_read_forward_fast(async_exch_t *, sysarg_t, sysarg_t,
412 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
413
414/*
415 * User-friendly wrappers for async_data_write_forward_fast().
416 */
417
418#define async_data_write_forward_0_0(exch, method, answer) \
419 async_data_write_forward_fast(exch, method, 0, 0, 0, 0, NULL)
420#define async_data_write_forward_0_1(exch, method, answer) \
421 async_data_write_forward_fast(exch, method, 0, 0, 0, 0, answer)
422#define async_data_write_forward_1_0(exch, method, arg1, answer) \
423 async_data_write_forward_fast(exch, method, arg1, 0, 0, 0, NULL)
424#define async_data_write_forward_1_1(exch, method, arg1, answer) \
425 async_data_write_forward_fast(exch, method, arg1, 0, 0, 0, answer)
426#define async_data_write_forward_2_0(exch, method, arg1, arg2, answer) \
427 async_data_write_forward_fast(exch, method, arg1, arg2, 0, 0, NULL)
428#define async_data_write_forward_2_1(exch, method, arg1, arg2, answer) \
429 async_data_write_forward_fast(exch, method, arg1, arg2, 0, 0, answer)
430#define async_data_write_forward_3_0(exch, method, arg1, arg2, arg3, answer) \
431 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, 0, \
432 NULL)
433#define async_data_write_forward_3_1(exch, method, arg1, arg2, arg3, answer) \
434 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, 0, \
435 answer)
436#define async_data_write_forward_4_0(exch, method, arg1, arg2, arg3, arg4, \
437 answer) \
438 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
439 NULL)
440#define async_data_write_forward_4_1(exch, method, arg1, arg2, arg3, arg4, \
441 answer) \
442 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
443 answer)
444
445extern errno_t async_data_write_start(async_exch_t *, const void *, size_t);
446extern bool async_data_write_receive(ipc_call_t *, size_t *);
447extern errno_t async_data_write_finalize(ipc_call_t *, void *, size_t);
448
449extern errno_t async_data_write_accept(void **, const bool, const size_t,
450 const size_t, const size_t, size_t *);
451extern void async_data_write_void(errno_t);
452
453extern errno_t async_data_write_forward_fast(async_exch_t *, sysarg_t, sysarg_t,
454 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
455
456extern async_sess_t *async_callback_receive(exch_mgmt_t);
457extern async_sess_t *async_callback_receive_start(exch_mgmt_t, ipc_call_t *);
458
459extern errno_t async_state_change_start(async_exch_t *, sysarg_t, sysarg_t,
460 sysarg_t, async_exch_t *);
461extern bool async_state_change_receive(ipc_call_t *);
462extern errno_t async_state_change_finalize(ipc_call_t *, async_exch_t *);
463
464extern void *async_remote_state_acquire(async_sess_t *);
465extern void async_remote_state_update(async_sess_t *, void *);
466extern void async_remote_state_release(async_sess_t *);
467extern void async_remote_state_release_exchange(async_exch_t *);
468
469extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *,
470 sysarg_t, sysarg_t, sysarg_t);
471
472errno_t async_spawn_notification_handler(void);
473fid_t async_create_manager(void);
474
475#endif
476
477/** @}
478 */
Note: See TracBrowser for help on using the repository browser.