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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since e6bab27b was 3b1cc8d, checked in by GitHub <noreply@…>, 7 years ago

Add notification queue to the async framework. (#40)

Instead of running notification handlers in the same fibril that received it,
forcing us to allocate a new fibril when the handler blocks, we instead queue
the notifications, and allow an arbitrary but fixed number of dedicated fibrils
handle them.

Although a service can increase the number of handler fibrils to reduce latency,
there are now no dynamic allocations due to received notifications.
When the same notification is received again while the older instance is still
in queue, the new notification overwrites the old and increments a counter
of received notifications.

The counter is currently unused, because passing it to the handler would
require extensive changes to user code, but it should be straightforward
to make use of it should the need arise.

  • Property mode set to 100644
File size: 20.2 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
53typedef sysarg_t aid_t;
54typedef sysarg_t port_id_t;
55
56typedef void *(*async_client_data_ctor_t)(void);
57typedef void (*async_client_data_dtor_t)(void *);
58
59/** Port connection handler
60 *
61 * @param chandle Handle of the incoming call or CAP_NIL if connection
62 * initiated from inside using async_create_callback_port()
63 * @param call Incoming call or 0 if connection initiated from inside
64 * using async_create_callback_port()
65 * @param arg Local argument.
66 *
67 */
68typedef void (*async_port_handler_t)(cap_call_handle_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
110#define async_manager() \
111 do { \
112 futex_down(&async_futex); \
113 fibril_switch(FIBRIL_FROM_DEAD); \
114 } while (0)
115
116#define async_get_call(data) \
117 async_get_call_timeout(data, 0)
118
119extern cap_call_handle_t async_get_call_timeout(ipc_call_t *, suseconds_t);
120
121/*
122 * User-friendly wrappers for async_send_fast() and async_send_slow(). The
123 * macros are in the form async_send_m(), where m denotes the number of payload
124 * arguments. Each macros chooses between the fast and the slow version based
125 * on m.
126 */
127
128#define async_send_0(exch, method, dataptr) \
129 async_send_fast(exch, method, 0, 0, 0, 0, dataptr)
130#define async_send_1(exch, method, arg1, dataptr) \
131 async_send_fast(exch, method, arg1, 0, 0, 0, dataptr)
132#define async_send_2(exch, method, arg1, arg2, dataptr) \
133 async_send_fast(exch, method, arg1, arg2, 0, 0, dataptr)
134#define async_send_3(exch, method, arg1, arg2, arg3, dataptr) \
135 async_send_fast(exch, method, arg1, arg2, arg3, 0, dataptr)
136#define async_send_4(exch, method, arg1, arg2, arg3, arg4, dataptr) \
137 async_send_fast(exch, method, arg1, arg2, arg3, arg4, dataptr)
138#define async_send_5(exch, method, arg1, arg2, arg3, arg4, arg5, dataptr) \
139 async_send_slow(exch, method, arg1, arg2, arg3, arg4, arg5, dataptr)
140
141extern aid_t async_send_fast(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
142 sysarg_t, sysarg_t, ipc_call_t *);
143extern aid_t async_send_slow(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
144 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
145
146extern void async_wait_for(aid_t, errno_t *);
147extern errno_t async_wait_timeout(aid_t, errno_t *, suseconds_t);
148extern void async_forget(aid_t);
149
150extern void async_usleep(suseconds_t);
151extern void async_sleep(unsigned int);
152
153extern void async_create_manager(void);
154extern void async_destroy_manager(void);
155
156extern void async_set_client_data_constructor(async_client_data_ctor_t);
157extern void async_set_client_data_destructor(async_client_data_dtor_t);
158extern void *async_get_client_data(void);
159extern void *async_get_client_data_by_id(task_id_t);
160extern void async_put_client_data_by_id(task_id_t);
161
162extern errno_t async_create_port(iface_t, async_port_handler_t, void *,
163 port_id_t *);
164extern void async_set_fallback_port_handler(async_port_handler_t, void *);
165extern errno_t async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
166 sysarg_t, async_port_handler_t, void *, port_id_t *);
167
168extern errno_t async_irq_subscribe(int, async_notification_handler_t, void *,
169 const irq_code_t *, cap_irq_handle_t *);
170extern errno_t async_irq_unsubscribe(cap_irq_handle_t);
171
172extern errno_t async_event_subscribe(event_type_t, async_notification_handler_t,
173 void *);
174extern errno_t async_event_task_subscribe(event_task_type_t,
175 async_notification_handler_t, void *);
176extern errno_t async_event_unsubscribe(event_type_t);
177extern errno_t async_event_task_unsubscribe(event_task_type_t);
178extern errno_t async_event_unmask(event_type_t);
179extern errno_t async_event_task_unmask(event_task_type_t);
180
181/*
182 * Wrappers for simple communication.
183 */
184
185extern void async_msg_0(async_exch_t *, sysarg_t);
186extern void async_msg_1(async_exch_t *, sysarg_t, sysarg_t);
187extern void async_msg_2(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
188extern void async_msg_3(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
189extern void async_msg_4(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
190 sysarg_t);
191extern void async_msg_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
192 sysarg_t, sysarg_t);
193
194/*
195 * Wrappers for answer routines.
196 */
197
198extern errno_t async_answer_0(cap_call_handle_t, errno_t);
199extern errno_t async_answer_1(cap_call_handle_t, errno_t, sysarg_t);
200extern errno_t async_answer_2(cap_call_handle_t, errno_t, sysarg_t, sysarg_t);
201extern errno_t async_answer_3(cap_call_handle_t, errno_t, sysarg_t, sysarg_t,
202 sysarg_t);
203extern errno_t async_answer_4(cap_call_handle_t, errno_t, sysarg_t, sysarg_t,
204 sysarg_t, sysarg_t);
205extern errno_t async_answer_5(cap_call_handle_t, errno_t, sysarg_t, sysarg_t,
206 sysarg_t, sysarg_t, sysarg_t);
207
208/*
209 * Wrappers for forwarding routines.
210 */
211
212extern errno_t async_forward_fast(cap_call_handle_t, async_exch_t *, sysarg_t,
213 sysarg_t, sysarg_t, unsigned int);
214extern errno_t async_forward_slow(cap_call_handle_t, async_exch_t *, sysarg_t,
215 sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
216
217/*
218 * User-friendly wrappers for async_req_fast() and async_req_slow(). The macros
219 * are in the form async_req_m_n(), where m is the number of payload arguments
220 * and n is the number of return arguments. The macros decide between the fast
221 * and slow verion based on m.
222 */
223
224#define async_req_0_0(exch, method) \
225 async_req_fast(exch, method, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)
226#define async_req_0_1(exch, method, r1) \
227 async_req_fast(exch, method, 0, 0, 0, 0, r1, NULL, NULL, NULL, NULL)
228#define async_req_0_2(exch, method, r1, r2) \
229 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, NULL, NULL, NULL)
230#define async_req_0_3(exch, method, r1, r2, r3) \
231 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, NULL, NULL)
232#define async_req_0_4(exch, method, r1, r2, r3, r4) \
233 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, r4, NULL)
234#define async_req_0_5(exch, method, r1, r2, r3, r4, r5) \
235 async_req_fast(exch, method, 0, 0, 0, 0, r1, r2, r3, r4, r5)
236
237#define async_req_1_0(exch, method, arg1) \
238 async_req_fast(exch, method, arg1, 0, 0, 0, NULL, NULL, NULL, NULL, \
239 NULL)
240#define async_req_1_1(exch, method, arg1, rc1) \
241 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, NULL, NULL, NULL, \
242 NULL)
243#define async_req_1_2(exch, method, arg1, rc1, rc2) \
244 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, NULL, NULL, \
245 NULL)
246#define async_req_1_3(exch, method, arg1, rc1, rc2, rc3) \
247 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, NULL, \
248 NULL)
249#define async_req_1_4(exch, method, arg1, rc1, rc2, rc3, rc4) \
250 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, rc4, \
251 NULL)
252#define async_req_1_5(exch, method, arg1, rc1, rc2, rc3, rc4, rc5) \
253 async_req_fast(exch, method, arg1, 0, 0, 0, rc1, rc2, rc3, rc4, \
254 rc5)
255
256#define async_req_2_0(exch, method, arg1, arg2) \
257 async_req_fast(exch, method, arg1, arg2, 0, 0, NULL, NULL, NULL, \
258 NULL, NULL)
259#define async_req_2_1(exch, method, arg1, arg2, rc1) \
260 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, NULL, NULL, \
261 NULL, NULL)
262#define async_req_2_2(exch, method, arg1, arg2, rc1, rc2) \
263 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, NULL, NULL, \
264 NULL)
265#define async_req_2_3(exch, method, arg1, arg2, rc1, rc2, rc3) \
266 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, NULL, \
267 NULL)
268#define async_req_2_4(exch, method, arg1, arg2, rc1, rc2, rc3, rc4) \
269 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, rc4, \
270 NULL)
271#define async_req_2_5(exch, method, arg1, arg2, rc1, rc2, rc3, rc4, rc5) \
272 async_req_fast(exch, method, arg1, arg2, 0, 0, rc1, rc2, rc3, rc4, \
273 rc5)
274
275#define async_req_3_0(exch, method, arg1, arg2, arg3) \
276 async_req_fast(exch, method, arg1, arg2, arg3, 0, NULL, NULL, NULL, \
277 NULL, NULL)
278#define async_req_3_1(exch, method, arg1, arg2, arg3, rc1) \
279 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, NULL, NULL, \
280 NULL, NULL)
281#define async_req_3_2(exch, method, arg1, arg2, arg3, rc1, rc2) \
282 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, NULL, \
283 NULL, NULL)
284#define async_req_3_3(exch, method, arg1, arg2, arg3, rc1, rc2, rc3) \
285 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
286 NULL, NULL)
287#define async_req_3_4(exch, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4) \
288 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
289 rc4, NULL)
290#define async_req_3_5(exch, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4, \
291 rc5) \
292 async_req_fast(exch, method, arg1, arg2, arg3, 0, rc1, rc2, rc3, \
293 rc4, rc5)
294
295#define async_req_4_0(exch, method, arg1, arg2, arg3, arg4) \
296 async_req_fast(exch, method, arg1, arg2, arg3, arg4, NULL, NULL, \
297 NULL, NULL, NULL)
298#define async_req_4_1(exch, method, arg1, arg2, arg3, arg4, rc1) \
299 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, NULL, \
300 NULL, NULL, NULL)
301#define async_req_4_2(exch, method, arg1, arg2, arg3, arg4, rc1, rc2) \
302 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, NULL, \
303 NULL, NULL)
304#define async_req_4_3(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3) \
305 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
306 NULL, NULL)
307#define async_req_4_4(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
308 rc4) \
309 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
310 rc4, NULL)
311#define async_req_4_5(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
312 rc4, rc5) \
313 async_req_fast(exch, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
314 rc4, rc5)
315
316#define async_req_5_0(exch, method, arg1, arg2, arg3, arg4, arg5) \
317 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, NULL, \
318 NULL, NULL, NULL, NULL)
319#define async_req_5_1(exch, method, arg1, arg2, arg3, arg4, arg5, rc1) \
320 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, \
321 NULL, NULL, NULL, NULL)
322#define async_req_5_2(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2) \
323 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
324 NULL, NULL, NULL)
325#define async_req_5_3(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
326 rc3) \
327 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
328 rc3, NULL, NULL)
329#define async_req_5_4(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
330 rc3, rc4) \
331 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
332 rc3, rc4, NULL)
333#define async_req_5_5(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
334 rc3, rc4, rc5) \
335 async_req_slow(exch, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
336 rc3, rc4, rc5)
337
338extern errno_t async_req_fast(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
339 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *,
340 sysarg_t *);
341extern errno_t async_req_slow(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
342 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *,
343 sysarg_t *, sysarg_t *);
344
345extern async_sess_t *async_connect_me_to(exch_mgmt_t, async_exch_t *, sysarg_t,
346 sysarg_t, sysarg_t);
347extern async_sess_t *async_connect_me_to_iface(async_exch_t *, iface_t,
348 sysarg_t, sysarg_t);
349extern async_sess_t *async_connect_me_to_blocking(exch_mgmt_t, async_exch_t *,
350 sysarg_t, sysarg_t, sysarg_t);
351extern async_sess_t *async_connect_me_to_blocking_iface(async_exch_t *, iface_t,
352 sysarg_t, sysarg_t);
353extern async_sess_t *async_connect_kbox(task_id_t);
354
355extern errno_t async_connect_to_me(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
356
357extern errno_t async_hangup(async_sess_t *);
358extern void async_poke(void);
359
360extern async_exch_t *async_exchange_begin(async_sess_t *);
361extern void async_exchange_end(async_exch_t *);
362
363/*
364 * FIXME These functions just work around problems with parallel exchange
365 * management. Proper solution needs to be implemented.
366 */
367void async_sess_args_set(async_sess_t *sess, sysarg_t, sysarg_t, sysarg_t);
368
369/*
370 * User-friendly wrappers for async_share_in_start().
371 */
372
373#define async_share_in_start_0_0(exch, size, dst) \
374 async_share_in_start(exch, size, 0, NULL, dst)
375#define async_share_in_start_0_1(exch, size, flags, dst) \
376 async_share_in_start(exch, size, 0, flags, dst)
377#define async_share_in_start_1_0(exch, size, arg, dst) \
378 async_share_in_start(exch, size, arg, NULL, dst)
379#define async_share_in_start_1_1(exch, size, arg, flags, dst) \
380 async_share_in_start(exch, size, arg, flags, dst)
381
382extern errno_t async_share_in_start(async_exch_t *, size_t, sysarg_t,
383 unsigned int *, void **);
384extern bool async_share_in_receive(cap_call_handle_t *, size_t *);
385extern errno_t async_share_in_finalize(cap_call_handle_t, void *, unsigned int);
386
387extern errno_t async_share_out_start(async_exch_t *, void *, unsigned int);
388extern bool async_share_out_receive(cap_call_handle_t *, size_t *,
389 unsigned int *);
390extern errno_t async_share_out_finalize(cap_call_handle_t, void **);
391
392/*
393 * User-friendly wrappers for async_data_read_forward_fast().
394 */
395
396#define async_data_read_forward_0_0(exch, method, answer) \
397 async_data_read_forward_fast(exch, method, 0, 0, 0, 0, NULL)
398#define async_data_read_forward_0_1(exch, method, answer) \
399 async_data_read_forward_fast(exch, method, 0, 0, 0, 0, answer)
400#define async_data_read_forward_1_0(exch, method, arg1, answer) \
401 async_data_read_forward_fast(exch, method, arg1, 0, 0, 0, NULL)
402#define async_data_read_forward_1_1(exch, method, arg1, answer) \
403 async_data_read_forward_fast(exch, method, arg1, 0, 0, 0, answer)
404#define async_data_read_forward_2_0(exch, method, arg1, arg2, answer) \
405 async_data_read_forward_fast(exch, method, arg1, arg2, 0, 0, NULL)
406#define async_data_read_forward_2_1(exch, method, arg1, arg2, answer) \
407 async_data_read_forward_fast(exch, method, arg1, arg2, 0, 0, answer)
408#define async_data_read_forward_3_0(exch, method, arg1, arg2, arg3, answer) \
409 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, 0, NULL)
410#define async_data_read_forward_3_1(exch, method, arg1, arg2, arg3, answer) \
411 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, 0, \
412 answer)
413#define async_data_read_forward_4_0(exch, method, arg1, arg2, arg3, arg4, \
414 answer) \
415 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
416 NULL)
417#define async_data_read_forward_4_1(exch, method, arg1, arg2, arg3, arg4, \
418 answer) \
419 async_data_read_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
420 answer)
421
422extern aid_t async_data_read(async_exch_t *, void *, size_t, ipc_call_t *);
423extern errno_t async_data_read_start(async_exch_t *, void *, size_t);
424extern bool async_data_read_receive(cap_call_handle_t *, size_t *);
425extern bool async_data_read_receive_call(cap_call_handle_t *, ipc_call_t *,
426 size_t *);
427extern errno_t async_data_read_finalize(cap_call_handle_t, const void *,
428 size_t);
429
430extern errno_t async_data_read_forward_fast(async_exch_t *, sysarg_t, sysarg_t,
431 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
432
433/*
434 * User-friendly wrappers for async_data_write_forward_fast().
435 */
436
437#define async_data_write_forward_0_0(exch, method, answer) \
438 async_data_write_forward_fast(exch, method, 0, 0, 0, 0, NULL)
439#define async_data_write_forward_0_1(exch, method, answer) \
440 async_data_write_forward_fast(exch, method, 0, 0, 0, 0, answer)
441#define async_data_write_forward_1_0(exch, method, arg1, answer) \
442 async_data_write_forward_fast(exch, method, arg1, 0, 0, 0, NULL)
443#define async_data_write_forward_1_1(exch, method, arg1, answer) \
444 async_data_write_forward_fast(exch, method, arg1, 0, 0, 0, answer)
445#define async_data_write_forward_2_0(exch, method, arg1, arg2, answer) \
446 async_data_write_forward_fast(exch, method, arg1, arg2, 0, 0, NULL)
447#define async_data_write_forward_2_1(exch, method, arg1, arg2, answer) \
448 async_data_write_forward_fast(exch, method, arg1, arg2, 0, 0, answer)
449#define async_data_write_forward_3_0(exch, method, arg1, arg2, arg3, answer) \
450 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, 0, \
451 NULL)
452#define async_data_write_forward_3_1(exch, method, arg1, arg2, arg3, answer) \
453 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, 0, \
454 answer)
455#define async_data_write_forward_4_0(exch, method, arg1, arg2, arg3, arg4, \
456 answer) \
457 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
458 NULL)
459#define async_data_write_forward_4_1(exch, method, arg1, arg2, arg3, arg4, \
460 answer) \
461 async_data_write_forward_fast(exch, method, arg1, arg2, arg3, arg4, \
462 answer)
463
464extern errno_t async_data_write_start(async_exch_t *, const void *, size_t);
465extern bool async_data_write_receive(cap_call_handle_t *, size_t *);
466extern bool async_data_write_receive_call(cap_call_handle_t *, ipc_call_t *,
467 size_t *);
468extern errno_t async_data_write_finalize(cap_call_handle_t, void *, size_t);
469
470extern errno_t async_data_write_accept(void **, const bool, const size_t,
471 const size_t, const size_t, size_t *);
472extern void async_data_write_void(errno_t);
473
474extern errno_t async_data_write_forward_fast(async_exch_t *, sysarg_t, sysarg_t,
475 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
476
477extern async_sess_t *async_callback_receive(exch_mgmt_t);
478extern async_sess_t *async_callback_receive_start(exch_mgmt_t, ipc_call_t *);
479
480extern errno_t async_state_change_start(async_exch_t *, sysarg_t, sysarg_t,
481 sysarg_t, async_exch_t *);
482extern bool async_state_change_receive(cap_call_handle_t *, sysarg_t *,
483 sysarg_t *, sysarg_t *);
484extern errno_t async_state_change_finalize(cap_call_handle_t, async_exch_t *);
485
486extern void *async_remote_state_acquire(async_sess_t *);
487extern void async_remote_state_update(async_sess_t *, void *);
488extern void async_remote_state_release(async_sess_t *);
489extern void async_remote_state_release_exchange(async_exch_t *);
490
491extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *,
492 sysarg_t, sysarg_t, sysarg_t);
493
494errno_t async_spawn_notification_handler(void);
495
496#endif
497
498/** @}
499 */
Note: See TracBrowser for help on using the repository browser.