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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b688fd8 was b688fd8, checked in by Martin Decky <martin@…>, 10 years ago

gradually introduce async ports, initial phase

The initial phase is to reimplement the traditional async client connections as an untyped fallback port. This creates the possibility to introduce ports typed by interface type gradually in later changesets.

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