Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async.c

    r36e2b55 rf302586  
    118118#define CONN_HASH_TABLE_BUCKETS    32
    119119
     120/** Session data */
     121struct async_sess {
     122        /** List of inactive exchanges */
     123        list_t exch_list;
     124       
     125        /** Exchange management style */
     126        exch_mgmt_t mgmt;
     127       
     128        /** Session identification */
     129        int phone;
     130       
     131        /** First clone connection argument */
     132        sysarg_t arg1;
     133       
     134        /** Second clone connection argument */
     135        sysarg_t arg2;
     136       
     137        /** Third clone connection argument */
     138        sysarg_t arg3;
     139       
     140        /** Exchange mutex */
     141        fibril_mutex_t mutex;
     142       
     143        /** Number of opened exchanges */
     144        atomic_t refcnt;
     145       
     146        /** Mutex for stateful connections */
     147        fibril_mutex_t remote_state_mtx;
     148       
     149        /** Data for stateful connections */
     150        void *remote_state_data;
     151};
     152
     153/** Exchange data */
     154struct async_exch {
     155        /** Link into list of inactive exchanges */
     156        link_t sess_link;
     157       
     158        /** Link into global list of inactive exchanges */
     159        link_t global_link;
     160       
     161        /** Session pointer */
     162        async_sess_t *sess;
     163       
     164        /** Exchange identification */
     165        int phone;
     166};
     167
    120168/** Async framework global futex */
    121169atomic_t async_futex = FUTEX_INITIALIZER;
     
    134182        ipc_call_t call;
    135183} msg_t;
     184
     185/** Message data */
     186typedef struct {
     187        awaiter_t wdata;
     188       
     189        /** If reply was received. */
     190        bool done;
     191       
     192        /** Pointer to where the answer data is stored. */
     193        ipc_call_t *dataptr;
     194       
     195        sysarg_t retval;
     196} amsg_t;
    136197
    137198/* Client connection data */
     
    196257void async_set_client_data_constructor(async_client_data_ctor_t ctor)
    197258{
     259        assert(async_client_data_create == default_client_data_constructor);
    198260        async_client_data_create = ctor;
    199261}
     
    201263void async_set_client_data_destructor(async_client_data_dtor_t dtor)
    202264{
     265        assert(async_client_data_destroy == default_client_data_destructor);
    203266        async_client_data_destroy = dtor;
    204267}
     
    242305void async_set_client_connection(async_client_conn_t conn)
    243306{
     307        assert(client_connection == default_client_connection);
    244308        client_connection = conn;
    245309}
     
    17871851       
    17881852        int rc = async_hangup_internal(sess->phone);
    1789         if (rc == EOK)
    1790                 free(sess);
    17911853       
    17921854        while (!list_empty(&sess->exch_list)) {
     
    18001862                free(exch);
    18011863        }
     1864
     1865        free(sess);
    18021866       
    18031867        fibril_mutex_unlock(&async_sess_mutex);
     
    19372001 *
    19382002 * @param exch  Exchange for sending the message.
    1939  * @param dst   Destination address space area base.
    19402003 * @param size  Size of the destination address space area.
    19412004 * @param arg   User defined argument.
    19422005 * @param flags Storage for the received flags. Can be NULL.
     2006 * @param dst   Destination address space area base. Cannot be NULL.
    19432007 *
    19442008 * @return Zero on success or a negative error code from errno.h.
    19452009 *
    19462010 */
    1947 int async_share_in_start(async_exch_t *exch, void *dst, size_t size,
    1948     sysarg_t arg, unsigned int *flags)
     2011int async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg,
     2012    unsigned int *flags, void **dst)
    19492013{
    19502014        if (exch == NULL)
    19512015                return ENOENT;
    19522016       
    1953         sysarg_t tmp_flags;
    1954         int res = async_req_3_2(exch, IPC_M_SHARE_IN, (sysarg_t) dst,
    1955             (sysarg_t) size, arg, NULL, &tmp_flags);
     2017        sysarg_t _flags = 0;
     2018        sysarg_t _dst = (sysarg_t) -1;
     2019        int res = async_req_2_4(exch, IPC_M_SHARE_IN, (sysarg_t) size,
     2020            arg, NULL, &_flags, NULL, &_dst);
    19562021       
    19572022        if (flags)
    1958                 *flags = (unsigned int) tmp_flags;
    1959        
     2023                *flags = (unsigned int) _flags;
     2024       
     2025        *dst = (void *) _dst;
    19602026        return res;
    19612027}
     
    19862052                return false;
    19872053       
    1988         *size = (size_t) IPC_GET_ARG2(data);
     2054        *size = (size_t) IPC_GET_ARG1(data);
    19892055        return true;
    19902056}
     
    19922058/** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework.
    19932059 *
    1994  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ
     2060 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN
    19952061 * calls so that the user doesn't have to remember the meaning of each IPC
    19962062 * argument.
     
    20702136 *
    20712137 */
    2072 int async_share_out_finalize(ipc_callid_t callid, void *dst)
     2138int async_share_out_finalize(ipc_callid_t callid, void **dst)
    20732139{
    20742140        return ipc_share_out_finalize(callid, dst);
Note: See TracChangeset for help on using the changeset viewer.