Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/async.h

    r8e80d3f r63f8966  
    3333 */
    3434
    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 
    3935#ifndef LIBC_ASYNC_H_
    4036#define LIBC_ASYNC_H_
    4137
    42 #include <ipc/common.h>
    43 #include <async_sess.h>
     38#include <ipc/ipc.h>
    4439#include <fibril.h>
    4540#include <sys/time.h>
    4641#include <atomic.h>
    4742#include <bool.h>
    48 #include <task.h>
    4943
    5044typedef ipc_callid_t aid_t;
    51 
    52 typedef void *(*async_client_data_ctor_t)(void);
    53 typedef void (*async_client_data_dtor_t)(void *);
    54 
    55 typedef void (*async_client_conn_t)(ipc_callid_t, ipc_call_t *);
     45typedef void (*async_client_conn_t)(ipc_callid_t callid, ipc_call_t *call);
     46
     47extern atomic_t async_futex;
    5648
    5749extern atomic_t threads_in_ipc_wait;
    5850
    59 #define async_manager() \
    60         fibril_switch(FIBRIL_TO_MANAGER)
    61 
    62 #define async_get_call(data) \
    63         async_get_call_timeout(data, 0)
    64 
    65 extern ipc_callid_t async_get_call_timeout(ipc_call_t *, suseconds_t);
     51extern int __async_init(void);
     52extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs);
     53
     54static inline ipc_callid_t async_get_call(ipc_call_t *data)
     55{
     56        return async_get_call_timeout(data, 0);
     57}
     58
     59static inline void async_manager(void)
     60{
     61        fibril_switch(FIBRIL_TO_MANAGER);
     62}
    6663
    6764/*
     
    8784            (arg5), (dataptr))
    8885
    89 extern aid_t async_send_fast(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    90     sysarg_t, ipc_call_t *);
    91 extern aid_t async_send_slow(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    92     sysarg_t, sysarg_t, ipc_call_t *);
    93 extern void async_wait_for(aid_t, sysarg_t *);
    94 extern int async_wait_timeout(aid_t, sysarg_t *, suseconds_t);
    95 
    96 extern fid_t async_new_connection(sysarg_t, sysarg_t, ipc_callid_t,
    97     ipc_call_t *, void (*)(ipc_callid_t, ipc_call_t *));
    98 extern void async_usleep(suseconds_t);
     86extern aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     87    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr);
     88extern aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     89    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5,
     90    ipc_call_t *dataptr);
     91extern void async_wait_for(aid_t amsgid, ipcarg_t *result);
     92extern int async_wait_timeout(aid_t amsgid, ipcarg_t *retval,
     93    suseconds_t timeout);
     94
     95extern fid_t async_new_connection(ipcarg_t in_phone_hash, ipc_callid_t callid,
     96    ipc_call_t *call, void (*cthread)(ipc_callid_t, ipc_call_t *));
     97extern void async_usleep(suseconds_t timeout);
    9998extern void async_create_manager(void);
    10099extern void async_destroy_manager(void);
    101100
    102 extern void async_set_client_data_constructor(async_client_data_ctor_t);
    103 extern void async_set_client_data_destructor(async_client_data_dtor_t);
    104 
    105 extern void *async_client_data_get(void);
    106 
    107 extern void async_set_client_connection(async_client_conn_t);
    108 extern void async_set_interrupt_received(async_client_conn_t);
    109 
    110 /*
    111  * Wrappers for simple communication.
    112  */
    113 
    114 extern void async_msg_0(int, sysarg_t);
    115 extern void async_msg_1(int, sysarg_t, sysarg_t);
    116 extern void async_msg_2(int, sysarg_t, sysarg_t, sysarg_t);
    117 extern void async_msg_3(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
    118 extern void async_msg_4(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
    119 extern void async_msg_5(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    120     sysarg_t);
    121 
    122 /*
    123  * Wrappers for answer routines.
    124  */
    125 
    126 extern sysarg_t async_answer_0(ipc_callid_t, sysarg_t);
    127 extern sysarg_t async_answer_1(ipc_callid_t, sysarg_t, sysarg_t);
    128 extern sysarg_t async_answer_2(ipc_callid_t, sysarg_t, sysarg_t, sysarg_t);
    129 extern sysarg_t async_answer_3(ipc_callid_t, sysarg_t, sysarg_t, sysarg_t,
    130     sysarg_t);
    131 extern sysarg_t async_answer_4(ipc_callid_t, sysarg_t, sysarg_t, sysarg_t,
    132     sysarg_t, sysarg_t);
    133 extern sysarg_t async_answer_5(ipc_callid_t, sysarg_t, sysarg_t, sysarg_t,
    134     sysarg_t, sysarg_t, sysarg_t);
    135 
    136 /*
    137  * Wrappers for forwarding routines.
    138  */
    139 
    140 extern int async_forward_fast(ipc_callid_t, int, sysarg_t, sysarg_t, sysarg_t,
    141     unsigned int);
    142 extern int async_forward_slow(ipc_callid_t, int, sysarg_t, sysarg_t, sysarg_t,
    143     sysarg_t, sysarg_t, sysarg_t, unsigned int);
     101extern void async_set_client_connection(async_client_conn_t conn);
     102extern void async_set_interrupt_received(async_client_conn_t conn);
     103
     104/* Wrappers for simple communication */
     105#define async_msg_0(phone, method) \
     106        ipc_call_async_0((phone), (method), NULL, NULL, true)
     107#define async_msg_1(phone, method, arg1) \
     108        ipc_call_async_1((phone), (method), (arg1), NULL, NULL, \
     109            true)
     110#define async_msg_2(phone, method, arg1, arg2) \
     111        ipc_call_async_2((phone), (method), (arg1), (arg2), NULL, NULL, \
     112            true)
     113#define async_msg_3(phone, method, arg1, arg2, arg3) \
     114        ipc_call_async_3((phone), (method), (arg1), (arg2), (arg3), NULL, NULL, \
     115            true)
     116#define async_msg_4(phone, method, arg1, arg2, arg3, arg4) \
     117        ipc_call_async_4((phone), (method), (arg1), (arg2), (arg3), (arg4), NULL, \
     118            NULL, true)
     119#define async_msg_5(phone, method, arg1, arg2, arg3, arg4, arg5) \
     120        ipc_call_async_5((phone), (method), (arg1), (arg2), (arg3), (arg4), \
     121            (arg5), NULL, NULL, true)
    144122
    145123/*
     
    149127 * and slow verion based on m.
    150128 */
    151 
    152129#define async_req_0_0(phoneid, method) \
    153130        async_req_fast((phoneid), (method), 0, 0, 0, 0, NULL, NULL, NULL, NULL, \
     
    265242            (arg5), (rc1), (rc2), (rc3), (rc4), (rc5))
    266243
    267 extern sysarg_t async_req_fast(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    268     sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *);
    269 extern sysarg_t async_req_slow(int, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    270     sysarg_t, sysarg_t, sysarg_t *, sysarg_t *, sysarg_t *, sysarg_t *,
    271     sysarg_t *);
     244extern ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     245    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2,
     246    ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5);
     247extern ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     248    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1,
     249    ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5);
    272250
    273251static inline void async_serialize_start(void)
     
    281259}
    282260
    283 extern int async_connect_to_me(int, sysarg_t, sysarg_t, sysarg_t,
    284     async_client_conn_t);
    285 extern int async_connect_me_to(int, sysarg_t, sysarg_t, sysarg_t);
    286 extern int async_connect_me_to_blocking(int, sysarg_t, sysarg_t, sysarg_t);
    287 extern int async_connect_kbox(task_id_t);
    288 extern int async_hangup(int);
    289 extern void async_poke(void);
     261extern int async_connect_me_to(int, ipcarg_t, ipcarg_t, ipcarg_t);
     262extern int async_connect_me_to_blocking(int, ipcarg_t, ipcarg_t, ipcarg_t);
    290263
    291264/*
    292265 * User-friendly wrappers for async_share_in_start().
    293266 */
    294 
    295267#define async_share_in_start_0_0(phoneid, dst, size) \
    296268        async_share_in_start((phoneid), (dst), (size), 0, NULL)
     
    302274        async_share_in_start((phoneid), (dst), (size), (arg), (flags))
    303275
    304 extern int async_share_in_start(int, void *, size_t, sysarg_t, unsigned int *);
    305 extern bool async_share_in_receive(ipc_callid_t *, size_t *);
    306 extern int async_share_in_finalize(ipc_callid_t, void *, unsigned int);
    307 
    308 extern int async_share_out_start(int, void *, unsigned int);
    309 extern bool async_share_out_receive(ipc_callid_t *, size_t *, unsigned int *);
     276extern int async_share_in_start(int, void *, size_t, ipcarg_t, int *);
     277extern int async_share_in_receive(ipc_callid_t *, size_t *);
     278extern int async_share_in_finalize(ipc_callid_t, void *, int );
     279extern int async_share_out_start(int, void *, int);
     280extern int async_share_out_receive(ipc_callid_t *, size_t *, int *);
    310281extern int async_share_out_finalize(ipc_callid_t, void *);
    311282
     
    313284 * User-friendly wrappers for async_data_read_forward_fast().
    314285 */
    315 
    316286#define async_data_read_forward_0_0(phoneid, method, answer) \
    317287        async_data_read_forward_fast((phoneid), (method), 0, 0, 0, 0, NULL)
     
    340310            (arg4), (answer))
    341311
    342 #define async_data_read_start(p, buf, len) \
    343         async_data_read_start_generic((p), (buf), (len), IPC_XF_NONE)
    344 
    345 extern int async_data_read_start_generic(int, void *, size_t, int);
    346 extern bool async_data_read_receive(ipc_callid_t *, size_t *);
     312extern int async_data_read_start(int, void *, size_t);
     313extern int async_data_read_receive(ipc_callid_t *, size_t *);
    347314extern int async_data_read_finalize(ipc_callid_t, const void *, size_t);
    348315
    349 extern int async_data_read_forward_fast(int, sysarg_t, sysarg_t, sysarg_t,
    350     sysarg_t, sysarg_t, ipc_call_t *);
     316extern int async_data_read_forward_fast(int, ipcarg_t, ipcarg_t, ipcarg_t,
     317    ipcarg_t, ipcarg_t, ipc_call_t *);
    351318
    352319/*
    353320 * User-friendly wrappers for async_data_write_forward_fast().
    354321 */
    355 
    356322#define async_data_write_forward_0_0(phoneid, method, answer) \
    357323        async_data_write_forward_fast((phoneid), (method), 0, 0, 0, 0, NULL)
     
    382348            (arg4), (answer))
    383349
    384 #define async_data_write_start(p, buf, len) \
    385         async_data_write_start_generic((p), (buf), (len), IPC_XF_NONE)
    386 
    387 extern int async_data_write_start_generic(int, const void *, size_t, int);
    388 extern bool async_data_write_receive(ipc_callid_t *, size_t *);
     350extern int async_data_write_start(int, const void *, size_t);
     351extern int async_data_write_receive(ipc_callid_t *, size_t *);
    389352extern int async_data_write_finalize(ipc_callid_t, void *, size_t);
    390353
    391354extern int async_data_write_accept(void **, const bool, const size_t,
    392355    const size_t, const size_t, size_t *);
    393 extern void async_data_write_void(sysarg_t);
    394 
    395 extern int async_data_write_forward_fast(int, sysarg_t, sysarg_t, sysarg_t,
    396     sysarg_t, sysarg_t, ipc_call_t *);
     356extern void async_data_write_void(const int);
     357
     358extern int async_data_write_forward_fast(int, ipcarg_t, ipcarg_t, ipcarg_t,
     359    ipcarg_t, ipcarg_t, ipc_call_t *);
    397360
    398361#endif
Note: See TracChangeset for help on using the changeset viewer.