Changeset 00aece0 in mainline for uspace/lib/c/generic/async.c


Ignore:
Timestamp:
2012-02-18T16:47:38Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4449c6c
Parents:
bd5f3b7 (diff), f943dd3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rbd5f3b7 r00aece0  
    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}
     
    17771841int async_hangup(async_sess_t *sess)
    17781842{
     1843        async_exch_t *exch;
     1844       
    17791845        assert(sess);
    17801846       
     
    17821848                return EBUSY;
    17831849       
     1850        fibril_mutex_lock(&async_sess_mutex);
     1851       
    17841852        int rc = async_hangup_internal(sess->phone);
    1785         if (rc == EOK)
    1786                 free(sess);
     1853       
     1854        while (!list_empty(&sess->exch_list)) {
     1855                exch = (async_exch_t *)
     1856                    list_get_instance(list_first(&sess->exch_list),
     1857                    async_exch_t, sess_link);
     1858               
     1859                list_remove(&exch->sess_link);
     1860                list_remove(&exch->global_link);
     1861                async_hangup_internal(exch->phone);
     1862                free(exch);
     1863        }
     1864
     1865        free(sess);
     1866       
     1867        fibril_mutex_unlock(&async_sess_mutex);
    17871868       
    17881869        return rc;
     
    19202001 *
    19212002 * @param exch  Exchange for sending the message.
    1922  * @param dst   Destination address space area base.
    19232003 * @param size  Size of the destination address space area.
    19242004 * @param arg   User defined argument.
    19252005 * @param flags Storage for the received flags. Can be NULL.
     2006 * @param dst   Destination address space area base. Cannot be NULL.
    19262007 *
    19272008 * @return Zero on success or a negative error code from errno.h.
    19282009 *
    19292010 */
    1930 int async_share_in_start(async_exch_t *exch, void *dst, size_t size,
    1931     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)
    19322013{
    19332014        if (exch == NULL)
    19342015                return ENOENT;
    19352016       
    1936         sysarg_t tmp_flags;
    1937         int res = async_req_3_2(exch, IPC_M_SHARE_IN, (sysarg_t) dst,
    1938             (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);
    19392021       
    19402022        if (flags)
    1941                 *flags = (unsigned int) tmp_flags;
    1942        
     2023                *flags = (unsigned int) _flags;
     2024       
     2025        *dst = (void *) _dst;
    19432026        return res;
    19442027}
     
    19692052                return false;
    19702053       
    1971         *size = (size_t) IPC_GET_ARG2(data);
     2054        *size = (size_t) IPC_GET_ARG1(data);
    19722055        return true;
    19732056}
     
    19752058/** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework.
    19762059 *
    1977  * 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
    19782061 * calls so that the user doesn't have to remember the meaning of each IPC
    19792062 * argument.
     
    20532136 *
    20542137 */
    2055 int async_share_out_finalize(ipc_callid_t callid, void *dst)
     2138int async_share_out_finalize(ipc_callid_t callid, void **dst)
    20562139{
    20572140        return ipc_share_out_finalize(callid, dst);
Note: See TracChangeset for help on using the changeset viewer.