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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6769005 was 6769005, checked in by Jakub Jermar <jakub@…>, 7 years ago

Use user-defined labels instead of phone hashes

This commit changes the way how the async framework maps incomming calls
to connections. Instead of abusing the kernel addresses of attached
phones as identifiers, the IPC_M_CONNECT_TO_ME and IPC_M_CONNECT_ME_TO
messages allow the server to specify an arbitrary label which is
remembered in the connected phone and consequently imprinted on each
call which is routed through this phone.

The async framework uses the address of the connection structure as the
label. This removes the need for a connection hash table because each
incoming call already remembers the connection in its label.

To disambiguate this new label and the other user-defined label used for
answers, the call structure now has the request_label member for the
former and answer_label member for the latter.

This commit also moves the kernel definition of ipc_data_t to abi/ and
removes the uspace redefinition thereof. Finally, when forwarding the
IPC_M_CONNECT_TO_ME call, the phone capability and the kernel object
allocated in request_process are now correctly disposed of.

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