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

Last change on this file since d7f7a4a 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
RevLine 
[c594489]1/*
[d7f7a4a]2 * SPDX-FileCopyrightText: 2006 Ondrej Palkovsky
[c594489]3 *
[d7f7a4a]4 * SPDX-License-Identifier: BSD-3-Clause
[c594489]5 */
6
[fadd381]7/** @addtogroup libc
[b2951e2]8 * @{
9 */
10/** @file
11 */
12
[4805495]13#if ((defined(_LIBC_IPC_H_)) && (!defined(_LIBC_ASYNC_C_)))
[5b0cf63]14#error Do not intermix low-level IPC interface and async framework
[64d2b10]15#endif
16
[4805495]17#ifndef _LIBC_ASYNC_H_
18#define _LIBC_ASYNC_H_
[630c3a9]19
[64d2b10]20#include <ipc/common.h>
[bd41ac52]21#include <time.h>
[3e6a98c5]22#include <stdbool.h>
[1c635d6]23#include <abi/proc/task.h>
[8820544]24#include <abi/ddi/irq.h>
25#include <abi/ipc/event.h>
[abf2dfd]26#include <abi/ipc/interfaces.h>
[01c3bb4]27#include <abi/cap.h>
[630c3a9]28
[6b96dc06]29#include <_bits/__noreturn.h>
30
[01c3bb4]31typedef sysarg_t aid_t;
[abf2dfd]32typedef sysarg_t port_id_t;
[46eec3b]33
34typedef void *(*async_client_data_ctor_t)(void);
35typedef void (*async_client_data_dtor_t)(void *);
36
[b688fd8]37/** Port connection handler
[9934f7d]38 *
[984a9ba]39 * @param call Incoming call or NULL if connection initiated from inside
40 * using async_create_callback_port()
41 * @param arg Local argument.
[f9b2cb4c]42 *
[9934f7d]43 */
[984a9ba]44typedef void (*async_port_handler_t)(ipc_call_t *, void *);
[9934f7d]45
[8820544]46/** Notification handler */
[01c3bb4]47typedef void (*async_notification_handler_t)(ipc_call_t *, void *);
[9db9b10]48
[79ae36dd]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,
[a35b458]60
[f9b2cb4c]61 /** Exchange management via mutual exclusion
[79ae36dd]62 *
[f9b2cb4c]63 * Suitable for any kind of client/server communication,
64 * but can limit parallelism.
[79ae36dd]65 *
66 */
[f9b2cb4c]67 EXCHANGE_SERIALIZE = 1,
[a35b458]68
[f9b2cb4c]69 /** Exchange management via phone cloning
[79ae36dd]70 *
[f9b2cb4c]71 * Suitable for servers which support client
72 * data tracking by task hashes and do not
73 * mind cloned phones.
[79ae36dd]74 *
75 */
[f9b2cb4c]76 EXCHANGE_PARALLEL = 2
[79ae36dd]77} exch_mgmt_t;
78
[b76a7329]79/** Forward declarations */
[5da7199]80struct async_exch;
81struct async_sess;
[b76a7329]82
[5da7199]83typedef struct async_sess async_sess_t;
84typedef struct async_exch async_exch_t;
[79ae36dd]85
[6b96dc06]86extern __noreturn void async_manager(void);
[9db9b10]87
[4f13e19]88extern bool async_get_call(ipc_call_t *);
[bd41ac52]89extern bool async_get_call_timeout(ipc_call_t *, usec_t);
[db24058]90
[4f13e19]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,
[11bb813]98 sysarg_t, sysarg_t, ipc_call_t *);
[4f13e19]99extern aid_t async_send_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
[79ae36dd]100 sysarg_t, sysarg_t, sysarg_t, ipc_call_t *);
101
[b7fd2a0]102extern void async_wait_for(aid_t, errno_t *);
[bd41ac52]103extern errno_t async_wait_timeout(aid_t, errno_t *, usec_t);
[47c9a8c]104extern void async_forget(aid_t);
[440cff5]105
[46eec3b]106extern void async_set_client_data_constructor(async_client_data_ctor_t);
107extern void async_set_client_data_destructor(async_client_data_dtor_t);
[79ae36dd]108extern void *async_get_client_data(void);
[e2ab36f1]109extern void *async_get_client_data_by_id(task_id_t);
110extern void async_put_client_data_by_id(task_id_t);
[23882034]111
[b7fd2a0]112extern errno_t async_create_port(iface_t, async_port_handler_t, void *,
[566992e1]113 port_id_t *);
[b688fd8]114extern void async_set_fallback_port_handler(async_port_handler_t, void *);
[b7fd2a0]115extern errno_t async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
[78bb04b]116 sysarg_t, async_port_handler_t, void *, port_id_t *);
117
[b7fd2a0]118extern errno_t async_irq_subscribe(int, async_notification_handler_t, void *,
[eadaeae8]119 const irq_code_t *, cap_irq_handle_t *);
120extern errno_t async_irq_unsubscribe(cap_irq_handle_t);
[8820544]121
[b7fd2a0]122extern errno_t async_event_subscribe(event_type_t, async_notification_handler_t,
[8820544]123 void *);
[b7fd2a0]124extern errno_t async_event_task_subscribe(event_task_type_t,
[8820544]125 async_notification_handler_t, void *);
[b7fd2a0]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);
[0cc4313]130
[64d2b10]131/*
132 * Wrappers for simple communication.
133 */
134
[79ae36dd]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,
[64d2b10]140 sysarg_t);
[79ae36dd]141extern void async_msg_5(async_exch_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
142 sysarg_t, sysarg_t);
[64d2b10]143
144/*
145 * Wrappers for answer routines.
146 */
147
[984a9ba]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,
[64d2b10]152 sysarg_t);
[984a9ba]153extern errno_t async_answer_4(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
[64d2b10]154 sysarg_t, sysarg_t);
[984a9ba]155extern errno_t async_answer_5(ipc_call_t *, errno_t, sysarg_t, sysarg_t,
[64d2b10]156 sysarg_t, sysarg_t, sysarg_t);
157
158/*
159 * Wrappers for forwarding routines.
160 */
161
[4f13e19]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,
[eadaeae8]167 sysarg_t, sysarg_t, unsigned int);
[4f13e19]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,
[eadaeae8]173 sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
[0cc4313]174
175/*
[4f13e19]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.
[0cc4313]179 */
[64d2b10]180
[4f13e19]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,
[11bb813]234 sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *,
235 sysarg_t *);
[4f13e19]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,
[79ae36dd]248 sysarg_t, sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *,
249 sysarg_t *, sysarg_t *);
[085bd54]250
[beb83c1]251extern errno_t async_accept_0(ipc_call_t *);
[6769005]252extern sysarg_t async_get_label(void);
253
[914c693]254extern async_sess_t *async_connect_me_to(async_exch_t *, iface_t, sysarg_t,
[01900b6]255 sysarg_t, errno_t *);
[914c693]256extern async_sess_t *async_connect_me_to_blocking(async_exch_t *, iface_t,
[01900b6]257 sysarg_t, sysarg_t, errno_t *);
258extern async_sess_t *async_connect_kbox(task_id_t, errno_t *);
[fc42b28]259
[9b1baac]260extern errno_t async_connect_to_me(async_exch_t *, iface_t, sysarg_t, sysarg_t);
[79ae36dd]261
[622e7c9]262extern void async_hangup(async_sess_t *);
[f74392f]263
[79ae36dd]264extern async_exch_t *async_exchange_begin(async_sess_t *);
265extern void async_exchange_end(async_exch_t *);
266
[93ad49a8]267/*
268 * FIXME These functions just work around problems with parallel exchange
269 * management. Proper solution needs to be implemented.
270 */
[efa3136]271extern void async_sess_args_set(async_sess_t *, iface_t, sysarg_t, sysarg_t);
[93ad49a8]272
[0da4e41]273/*
274 * User-friendly wrappers for async_share_in_start().
275 */
[64d2b10]276
[4f13e19]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,
[fbcdeb8]279 unsigned int *, void **);
[4f13e19]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
[984a9ba]285extern bool async_share_in_receive(ipc_call_t *, size_t *);
286extern errno_t async_share_in_finalize(ipc_call_t *, void *, unsigned int);
[47b7006]287
[b7fd2a0]288extern errno_t async_share_out_start(async_exch_t *, void *, unsigned int);
[984a9ba]289extern bool async_share_out_receive(ipc_call_t *, size_t *, unsigned int *);
290extern errno_t async_share_out_finalize(ipc_call_t *, void **);
[b4cbef1]291
[4f13e19]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);
[64d2b10]300
[4f13e19]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 *);
[79ae36dd]311
312extern aid_t async_data_read(async_exch_t *, void *, size_t, ipc_call_t *);
[b7fd2a0]313extern errno_t async_data_read_start(async_exch_t *, void *, size_t);
[984a9ba]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);
[eda925a]316
[4f13e19]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);
[64d2b10]325
[4f13e19]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 *);
[79ae36dd]336
[b7fd2a0]337extern errno_t async_data_write_start(async_exch_t *, const void *, size_t);
[984a9ba]338extern bool async_data_write_receive(ipc_call_t *, size_t *);
339extern errno_t async_data_write_finalize(ipc_call_t *, void *, size_t);
[eda925a]340
[b7fd2a0]341extern errno_t async_data_write_accept(void **, const bool, const size_t,
[eda925a]342 const size_t, const size_t, size_t *);
[b7fd2a0]343extern void async_data_write_void(errno_t);
[eda925a]344
[79ae36dd]345extern async_sess_t *async_callback_receive(exch_mgmt_t);
[8869f7b]346extern async_sess_t *async_callback_receive_start(exch_mgmt_t, ipc_call_t *);
[8aa42e3]347
[b7fd2a0]348extern errno_t async_state_change_start(async_exch_t *, sysarg_t, sysarg_t,
[2c4aa39]349 sysarg_t, async_exch_t *);
[984a9ba]350extern bool async_state_change_receive(ipc_call_t *);
351extern errno_t async_state_change_finalize(ipc_call_t *, async_exch_t *);
[2c4aa39]352
[58cbf8d5]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
[ae6021d]358extern void *async_as_area_create(void *, size_t, unsigned int, async_sess_t *,
359 sysarg_t, sysarg_t, sysarg_t);
[101516d]360
[3b1cc8d]361errno_t async_spawn_notification_handler(void);
362
[630c3a9]363#endif
[b2951e2]364
[fadd381]365/** @}
[b2951e2]366 */
Note: See TracBrowser for help on using the repository browser.