Changeset 0cc4313 in mainline for uspace/lib/libc/include/async.h


Ignore:
Timestamp:
2007-11-22T15:50:24Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d40a8ff
Parents:
8498915
Message:

Modify the async framework to make use of all six syscall arguments.
Supply user-friendly macros as in previous cases.

File:
1 edited

Legend:

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

    r8498915 r0cc4313  
    4040#include <sys/time.h>
    4141#include <atomic.h>
     42#include <bool.h>
    4243
    4344typedef ipc_callid_t aid_t;
     
    5556}
    5657
    57 aid_t async_send_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
     58/*
     59 * User-friendly wrappers for async_send_fast() and async_send_slow(). The
     60 * macros are in the form async_send_m(), where m denotes the number of payload
     61 * arguments.  Each macros chooses between the fast and the slow version based
     62 * on m.
     63 */
     64
     65#define async_send_0(phoneid, method, dataptr) \
     66    async_send_fast((phoneid), (method), 0, 0, 0, 0, (dataptr))
     67#define async_send_1(phoneid, method, arg1, dataptr) \
     68    async_send_fast((phoneid), (method), (arg1), 0, 0, 0, (dataptr))
     69#define async_send_2(phoneid, method, arg1, arg2, dataptr) \
     70    async_send_fast((phoneid), (method), (arg1), (arg2), 0, 0, (dataptr))
     71#define async_send_3(phoneid, method, arg1, arg2, arg3, dataptr) \
     72    async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (dataptr))
     73#define async_send_4(phoneid, method, arg1, arg2, arg3, arg4, dataptr) \
     74    async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     75        (dataptr))
     76#define async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, dataptr) \
     77    async_send_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     78        (arg5), (dataptr))
     79 
     80extern aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     81    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr);
     82extern aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     83    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5,
    5884    ipc_call_t *dataptr);
    59 aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
    60     ipcarg_t arg3, ipc_call_t *dataptr);
    61 void async_wait_for(aid_t amsgid, ipcarg_t *result);
    62 int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout);
    63 
    64 /** Pseudo-synchronous message sending
    65  *
    66  * Send message through IPC, wait in the event loop, until it is received
    67  *
    68  * @return Return code of message
    69  */
    70 static inline ipcarg_t async_req_2(int phoneid, ipcarg_t method, ipcarg_t arg1,
    71     ipcarg_t arg2, ipcarg_t *r1, ipcarg_t *r2)
    72 {
    73         ipc_call_t result;
    74         ipcarg_t rc;
    75 
    76         aid_t eid = async_send_2(phoneid, method, arg1, arg2, &result);
    77         async_wait_for(eid, &rc);
    78         if (r1)
    79                 *r1 = IPC_GET_ARG1(result);
    80         if (r2)
    81                 *r2 = IPC_GET_ARG2(result);
    82         return rc;
    83 }
    84 #define async_req(phoneid, method, arg1, r1) \
    85     async_req_2(phoneid, method, arg1, 0, r1, 0)
    86 
    87 static inline ipcarg_t async_req_3(int phoneid, ipcarg_t method, ipcarg_t arg1,
    88     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t *r1, ipcarg_t *r2, ipcarg_t *r3)
    89 {
    90         ipc_call_t result;
    91         ipcarg_t rc;
    92 
    93         aid_t eid = async_send_3(phoneid, method, arg1, arg2, arg3, &result);
    94         async_wait_for(eid, &rc);
    95         if (r1)
    96                 *r1 = IPC_GET_ARG1(result);
    97         if (r2)
    98                 *r2 = IPC_GET_ARG2(result);
    99         if (r3)
    100                 *r3 = IPC_GET_ARG3(result);
    101         return rc;
    102 }
    103 
     85extern void async_wait_for(aid_t amsgid, ipcarg_t *result);
     86extern int async_wait_timeout(aid_t amsgid, ipcarg_t *retval,
     87    suseconds_t timeout);
    10488
    10589fid_t async_new_connection(ipcarg_t in_phone_hash,ipc_callid_t callid,
     
    10892void async_create_manager(void);
    10993void async_destroy_manager(void);
    110 void async_set_client_connection(async_client_conn_t conn);
    111 void async_set_interrupt_received(async_client_conn_t conn);
    11294int _async_init(void);
    11395
    114 
    115 /* Primitve functions for IPC communication */
    116 void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
    117     ipcarg_t arg3);
    118 void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2);
    119 #define async_msg(ph, m, a1) async_msg_2(ph, m, a1, 0)
     96extern void async_set_client_connection(async_client_conn_t conn);
     97extern void async_set_interrupt_received(async_client_conn_t conn);
     98
     99/* Wrappers for simple communication */
     100#define async_msg_0(phone, method) \
     101    ipc_call_async_0((phone), (method), NULL, NULL, !in_interrupt_handler())
     102#define async_msg_1(phone, method, arg1) \
     103    ipc_call_async_1((phone), (method), (arg1), NULL, NULL, \
     104        !in_interrupt_handler())
     105#define async_msg_2(phone, method, arg1, arg2) \
     106    ipc_call_async_2((phone), (method), (arg1), (arg2), NULL, NULL, \
     107        !in_interrupt_handler())
     108#define async_msg_3(phone, method, arg1, arg2, arg3) \
     109    ipc_call_async_3((phone), (method), (arg1), (arg2), (arg3), NULL, NULL, \
     110        !in_interrupt_handler())
     111#define async_msg_4(phone, method, arg1, arg2, arg3, arg4) \
     112    ipc_call_async_4((phone), (method), (arg1), (arg2), (arg3), (arg4), NULL, \
     113        NULL, !in_interrupt_handler())
     114#define async_msg_5(phone, method, arg1, arg2, arg3, arg4, arg5) \
     115    ipc_call_async_5((phone), (method), (arg1), (arg2), (arg3), (arg4), \
     116        (arg5), NULL, NULL, !in_interrupt_handler())
     117
     118/*
     119 * User-friendly wrappers for async_req_fast() and async_req_slow(). The macros
     120 * are in the form async_req_m_n(), where m is the number of payload arguments
     121 * and n is the number of return arguments. The macros decidce between the fast
     122 * and slow verion based on m.
     123 */
     124#define async_req_0_0(phoneid, method) \
     125    async_req_fast((phoneid), (method), 0, 0, 0, 0, NULL, NULL, NULL, NULL, \
     126        NULL)
     127#define async_req_0_1(phoneid, method, r1) \
     128    async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), NULL, NULL, NULL, \
     129        NULL)
     130#define async_req_0_2(phoneid, method, r1, r2) \
     131    async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), NULL, NULL, \
     132        NULL)
     133#define async_req_0_3(phoneid, method, r1, r2, r3) \
     134    async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), NULL, \
     135        NULL)
     136#define async_req_0_4(phoneid, method, r1, r2, r3, r4) \
     137    async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \
     138        NULL)
     139#define async_req_0_5(phoneid, method, r1, r2, r3, r4, r5) \
     140    async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \
     141        (r5))
     142#define async_req_1_0(phoneid, method, arg1) \
     143    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, NULL, NULL, NULL, \
     144        NULL, NULL)
     145#define async_req_1_1(phoneid, method, arg1, rc1) \
     146    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), NULL, NULL, \
     147        NULL, NULL)
     148#define async_req_1_2(phoneid, method, arg1, rc1, rc2) \
     149    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), NULL, \
     150        NULL, NULL)
     151#define async_req_1_3(phoneid, method, arg1, rc1, rc2, rc3) \
     152    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \
     153        NULL, NULL)
     154#define async_req_1_4(phoneid, method, arg1, rc1, rc2, rc3, rc4) \
     155    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \
     156        (rc4), NULL)
     157#define async_req_1_5(phoneid, method, arg1, rc1, rc2, rc3, rc4, rc5) \
     158    async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \
     159        (rc4), (rc5))
     160#define async_req_2_0(phoneid, method, arg1, arg2) \
     161    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, NULL, NULL, \
     162        NULL, NULL, NULL)
     163#define async_req_2_1(phoneid, method, arg1, arg2, rc1) \
     164    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), NULL, \
     165        NULL, NULL, NULL)
     166#define async_req_2_2(phoneid, method, arg1, arg2, rc1, rc2) \
     167    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \
     168        NULL, NULL, NULL)
     169#define async_req_2_3(phoneid, method, arg1, arg2, rc1, rc2, rc3) \
     170    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \
     171        (rc3), NULL, NULL)
     172#define async_req_2_4(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4) \
     173    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \
     174        (rc3), (rc4), NULL)
     175#define async_req_2_5(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4, rc5) \
     176    async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \
     177        (rc3), (rc4), (rc5))
     178#define async_req_3_0(phoneid, method, arg1, arg2, arg3) \
     179    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, NULL, NULL, \
     180        NULL, NULL, NULL)
     181#define async_req_3_1(phoneid, method, arg1, arg2, arg3, rc1) \
     182    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \
     183        NULL, NULL, NULL, NULL)
     184#define async_req_3_2(phoneid, method, arg1, arg2, arg3, rc1, rc2) \
     185    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \
     186        (rc2), NULL, NULL, NULL)
     187#define async_req_3_3(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3) \
     188    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \
     189        (rc2), (rc3), NULL, NULL)
     190#define async_req_3_4(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4) \
     191    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \
     192        (rc2), (rc3), (rc4), NULL)
     193#define async_req_3_5(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4, \
     194    rc5) \
     195        async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \
     196            (rc2), (rc3), (rc4), (rc5))
     197#define async_req_4_0(phoneid, method, arg1, arg2, arg3, arg4) \
     198    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), NULL, \
     199        NULL, NULL, NULL, NULL)
     200#define async_req_4_1(phoneid, method, arg1, arg2, arg3, arg4, rc1) \
     201    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \
     202        NULL, NULL, NULL, NULL)
     203#define async_req_4_2(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2) \
     204    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \
     205        (rc2), NULL, NULL, NULL)
     206#define async_req_4_3(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3) \
     207    async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \
     208        (rc2), (rc3), NULL, NULL)
     209#define async_req_4_4(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
     210    rc4) \
     211        async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     212            (rc1), (rc2), (rc3), (rc4), NULL)
     213#define async_req_4_5(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \
     214    rc4, rc5) \
     215        async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     216            (rc1), (rc2), (rc3), (rc4), (rc5))
     217#define async_req_5_0(phoneid, method, arg1, arg2, arg3, arg4, arg5) \
     218    async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     219        (arg5), NULL, NULL, NULL, NULL, NULL)
     220#define async_req_5_1(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1) \
     221    async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     222        (arg5), (rc1), NULL, NULL, NULL, NULL)
     223#define async_req_5_2(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2) \
     224    async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     225        (arg5), (rc1), (rc2), NULL, NULL, NULL)
     226#define async_req_5_3(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
     227    rc3) \
     228        async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     229            (arg5), (rc1), (rc2), (rc3), NULL, NULL)
     230#define async_req_5_4(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
     231    rc3, rc4) \
     232        async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     233            (arg5), (rc1), (rc2), (rc3), (rc4), NULL)
     234#define async_req_5_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \
     235    rc3, rc4, rc5) \
     236        async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \
     237            (arg5), (rc1), (rc2), (rc3), (rc4), (rc5))
     238
     239extern ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     240    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2,
     241    ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5);
     242extern ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     243    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1,
     244    ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5);
    120245
    121246static inline void async_serialize_start(void)
     
    129254}
    130255
     256extern bool in_interrupt_handler(void);
     257
    131258extern atomic_t async_futex;
     259
    132260#endif
    133261
Note: See TracChangeset for help on using the changeset viewer.