Changes in uspace/lib/c/generic/async.c [36e2b55:f302586] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
r36e2b55 rf302586 118 118 #define CONN_HASH_TABLE_BUCKETS 32 119 119 120 /** Session data */ 121 struct 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 */ 154 struct 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 120 168 /** Async framework global futex */ 121 169 atomic_t async_futex = FUTEX_INITIALIZER; … … 134 182 ipc_call_t call; 135 183 } msg_t; 184 185 /** Message data */ 186 typedef 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; 136 197 137 198 /* Client connection data */ … … 196 257 void async_set_client_data_constructor(async_client_data_ctor_t ctor) 197 258 { 259 assert(async_client_data_create == default_client_data_constructor); 198 260 async_client_data_create = ctor; 199 261 } … … 201 263 void async_set_client_data_destructor(async_client_data_dtor_t dtor) 202 264 { 265 assert(async_client_data_destroy == default_client_data_destructor); 203 266 async_client_data_destroy = dtor; 204 267 } … … 242 305 void async_set_client_connection(async_client_conn_t conn) 243 306 { 307 assert(client_connection == default_client_connection); 244 308 client_connection = conn; 245 309 } … … 1787 1851 1788 1852 int rc = async_hangup_internal(sess->phone); 1789 if (rc == EOK)1790 free(sess);1791 1853 1792 1854 while (!list_empty(&sess->exch_list)) { … … 1800 1862 free(exch); 1801 1863 } 1864 1865 free(sess); 1802 1866 1803 1867 fibril_mutex_unlock(&async_sess_mutex); … … 1937 2001 * 1938 2002 * @param exch Exchange for sending the message. 1939 * @param dst Destination address space area base.1940 2003 * @param size Size of the destination address space area. 1941 2004 * @param arg User defined argument. 1942 2005 * @param flags Storage for the received flags. Can be NULL. 2006 * @param dst Destination address space area base. Cannot be NULL. 1943 2007 * 1944 2008 * @return Zero on success or a negative error code from errno.h. 1945 2009 * 1946 2010 */ 1947 int async_share_in_start(async_exch_t *exch, void *dst, size_t size,1948 sysarg_t arg, unsigned int *flags)2011 int async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg, 2012 unsigned int *flags, void **dst) 1949 2013 { 1950 2014 if (exch == NULL) 1951 2015 return ENOENT; 1952 2016 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); 1956 2021 1957 2022 if (flags) 1958 *flags = (unsigned int) tmp_flags; 1959 2023 *flags = (unsigned int) _flags; 2024 2025 *dst = (void *) _dst; 1960 2026 return res; 1961 2027 } … … 1986 2052 return false; 1987 2053 1988 *size = (size_t) IPC_GET_ARG 2(data);2054 *size = (size_t) IPC_GET_ARG1(data); 1989 2055 return true; 1990 2056 } … … 1992 2058 /** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework. 1993 2059 * 1994 * This wrapper only makes it more comfortable to answer IPC_M_ DATA_READ2060 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN 1995 2061 * calls so that the user doesn't have to remember the meaning of each IPC 1996 2062 * argument. … … 2070 2136 * 2071 2137 */ 2072 int async_share_out_finalize(ipc_callid_t callid, void * dst)2138 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2073 2139 { 2074 2140 return ipc_share_out_finalize(callid, dst);
Note:
See TracChangeset
for help on using the changeset viewer.