Changes in uspace/lib/c/generic/async.c [569a51a:4d6629f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
r569a51a r4d6629f 77 77 * } 78 78 * 79 * port_handler(ic handle, *icall)79 * port_handler(icallid, *icall) 80 80 * { 81 81 * if (want_refuse) { 82 * async_answer_0(ic handle, ELIMIT);82 * async_answer_0(icallid, ELIMIT); 83 83 * return; 84 84 * } 85 * async_answer_0(ic handle, EOK);86 * 87 * c handle= async_get_call(&call);88 * somehow_handle_the_call(c handle, call);89 * async_answer_2(c handle, 1, 2, 3);90 * 91 * c handle= async_get_call(&call);85 * async_answer_0(icallid, EOK); 86 * 87 * callid = async_get_call(&call); 88 * somehow_handle_the_call(callid, call); 89 * async_answer_2(callid, 1, 2, 3); 90 * 91 * callid = async_get_call(&call); 92 92 * ... 93 93 * } … … 106 106 #include <fibril.h> 107 107 #include <adt/hash_table.h> 108 #include <adt/hash.h>109 108 #include <adt/list.h> 110 109 #include <assert.h> … … 113 112 #include <libarch/barrier.h> 114 113 #include <stdbool.h> 115 #include < stdlib.h>114 #include <malloc.h> 116 115 #include <mem.h> 117 116 #include <stdlib.h> … … 185 184 link_t link; 186 185 187 cap_handle_t chandle;186 ipc_callid_t callid; 188 187 ipc_call_t call; 189 188 } msg_t; … … 237 236 238 237 /** Identification of the opening call. */ 239 cap_handle_t chandle;238 ipc_callid_t callid; 240 239 241 240 /** Call data of the opening call. */ … … 243 242 244 243 /** Identification of the closing call. */ 245 cap_handle_t close_chandle;244 ipc_callid_t close_callid; 246 245 247 246 /** Fibril function that will be used to handle the connection. */ … … 374 373 /** Default fallback fibril function. 375 374 * 376 * This fallback fibril function gets called on incomming connections that do377 * not have a specific handler defined.378 * 379 * @param c handle Handleof the incoming call.380 * @param call 381 * @param arg 382 * 383 */ 384 static void default_fallback_port_handler( cap_handle_t chandle,385 ipc_call_t *call,void *arg)386 { 387 ipc_answer_0(c handle, ENOENT);375 * This fallback fibril function gets called on incomming 376 * connections that do not have a specific handler defined. 377 * 378 * @param callid Hash of the incoming call. 379 * @param call Data of the incoming call. 380 * @param arg Local argument 381 * 382 */ 383 static void default_fallback_port_handler(ipc_callid_t callid, ipc_call_t *call, 384 void *arg) 385 { 386 ipc_answer_0(callid, ENOENT); 388 387 } 389 388 … … 588 587 }; 589 588 590 typedef struct { 591 task_id_t task_id; 592 sysarg_t phone_hash; 593 } conn_key_t; 594 595 /** Compute hash into the connection hash table 596 * 597 * The hash is based on the source task ID and the source phone hash. The task 598 * ID is included in the hash because a phone hash alone might not be unique 599 * while we still track connections for killed tasks due to kernel's recycling 600 * of phone structures. 601 * 602 * @param key Pointer to the connection key structure. 589 /** Compute hash into the connection hash table based on the source phone hash. 590 * 591 * @param key Pointer to source phone hash. 603 592 * 604 593 * @return Index into the connection hash table. … … 607 596 static size_t conn_key_hash(void *key) 608 597 { 609 conn_key_t *ck = (conn_key_t *) key; 610 611 size_t hash = 0; 612 hash = hash_combine(hash, LOWER32(ck->task_id)); 613 hash = hash_combine(hash, UPPER32(ck->task_id)); 614 hash = hash_combine(hash, ck->phone_hash); 615 return hash; 598 sysarg_t in_phone_hash = *(sysarg_t *) key; 599 return in_phone_hash; 616 600 } 617 601 … … 619 603 { 620 604 connection_t *conn = hash_table_get_inst(item, connection_t, link); 621 return conn_key_hash(&(conn_key_t){ 622 .task_id = conn->in_task_id, 623 .phone_hash = conn->in_phone_hash 624 }); 605 return conn_key_hash(&conn->in_phone_hash); 625 606 } 626 607 627 608 static bool conn_key_equal(void *key, const ht_link_t *item) 628 609 { 629 conn_key_t *ck = (conn_key_t *) key;610 sysarg_t in_phone_hash = *(sysarg_t *) key; 630 611 connection_t *conn = hash_table_get_inst(item, connection_t, link); 631 return ((ck->task_id == conn->in_task_id) && 632 (ck->phone_hash == conn->in_phone_hash)); 612 return (in_phone_hash == conn->in_phone_hash); 633 613 } 634 614 … … 715 695 client_t *client = async_client_get(fibril_connection->in_task_id, true); 716 696 if (!client) { 717 ipc_answer_0(fibril_connection->c handle, ENOMEM);697 ipc_answer_0(fibril_connection->callid, ENOMEM); 718 698 return 0; 719 699 } … … 724 704 * Call the connection handler function. 725 705 */ 726 fibril_connection->handler(fibril_connection->c handle,706 fibril_connection->handler(fibril_connection->callid, 727 707 &fibril_connection->call, fibril_connection->data); 728 708 … … 736 716 */ 737 717 futex_down(&async_futex); 738 hash_table_remove(&conn_hash_table, &(conn_key_t){ 739 .task_id = fibril_connection->in_task_id, 740 .phone_hash = fibril_connection->in_phone_hash 741 }); 718 hash_table_remove(&conn_hash_table, &fibril_connection->in_phone_hash); 742 719 futex_up(&async_futex); 743 720 … … 751 728 752 729 list_remove(&msg->link); 753 ipc_answer_0(msg->c handle, EHANGUP);730 ipc_answer_0(msg->callid, EHANGUP); 754 731 free(msg); 755 732 } … … 759 736 * i.e. IPC_M_PHONE_HUNGUP. 760 737 */ 761 if (fibril_connection->close_c handle)762 ipc_answer_0(fibril_connection->close_c handle, EOK);738 if (fibril_connection->close_callid) 739 ipc_answer_0(fibril_connection->close_callid, EOK); 763 740 764 741 free(fibril_connection); … … 768 745 /** Create a new fibril for a new connection. 769 746 * 770 * Create new fibril for connection, fill in connection structures and insert it771 * into the hash table, so that later we can easily do routing of messages to772 * particular fibrils.773 * 774 * @param in_task_id 775 * @param in_phone_hash 776 * @param c handle Handleof the opening IPC_M_CONNECT_ME_TO call.777 * If chandle is CAP_NIL, the connection was opened by778 * 779 * 780 * @param call 781 * @param handler 782 * @param data 783 * 784 * @return 747 * Create new fibril for connection, fill in connection structures 748 * and insert it into the hash table, so that later we can easily 749 * do routing of messages to particular fibrils. 750 * 751 * @param in_task_id Identification of the incoming connection. 752 * @param in_phone_hash Identification of the incoming connection. 753 * @param callid Hash of the opening IPC_M_CONNECT_ME_TO call. 754 * If callid is zero, the connection was opened by 755 * accepting the IPC_M_CONNECT_TO_ME call and this 756 * function is called directly by the server. 757 * @param call Call data of the opening call. 758 * @param handler Connection handler. 759 * @param data Client argument to pass to the connection handler. 760 * 761 * @return New fibril id or NULL on failure. 785 762 * 786 763 */ 787 764 static fid_t async_new_connection(task_id_t in_task_id, sysarg_t in_phone_hash, 788 cap_handle_t chandle, ipc_call_t *call, async_port_handler_t handler,765 ipc_callid_t callid, ipc_call_t *call, async_port_handler_t handler, 789 766 void *data) 790 767 { 791 768 connection_t *conn = malloc(sizeof(*conn)); 792 769 if (!conn) { 793 if (c handle != CAP_NIL)794 ipc_answer_0(c handle, ENOMEM);770 if (callid) 771 ipc_answer_0(callid, ENOMEM); 795 772 796 773 return (uintptr_t) NULL; … … 800 777 conn->in_phone_hash = in_phone_hash; 801 778 list_initialize(&conn->msg_queue); 802 conn->c handle = chandle;803 conn->close_c handle = CAP_NIL;779 conn->callid = callid; 780 conn->close_callid = 0; 804 781 conn->handler = handler; 805 782 conn->data = data; … … 815 792 free(conn); 816 793 817 if (c handle != CAP_NIL)818 ipc_answer_0(c handle, ENOMEM);794 if (callid) 795 ipc_answer_0(callid, ENOMEM); 819 796 820 797 return (uintptr_t) NULL; … … 892 869 893 870 fid_t fid = async_new_connection(answer.in_task_id, phone_hash, 894 CAP_NIL, NULL, handler, data);871 0, NULL, handler, data); 895 872 if (fid == (uintptr_t) NULL) 896 873 return ENOMEM; … … 961 938 * timeouts are unregistered. 962 939 * 963 * @param c handle Handleof the incoming call.964 * @param call 940 * @param callid Hash of the incoming call. 941 * @param call Data of the incoming call. 965 942 * 966 943 * @return False if the call doesn't match any connection. … … 968 945 * 969 946 */ 970 static bool route_call( cap_handle_t chandle, ipc_call_t *call)947 static bool route_call(ipc_callid_t callid, ipc_call_t *call) 971 948 { 972 949 assert(call); … … 974 951 futex_down(&async_futex); 975 952 976 ht_link_t *link = hash_table_find(&conn_hash_table, &(conn_key_t){ 977 .task_id = call->in_task_id, 978 .phone_hash = call->in_phone_hash 979 }); 953 ht_link_t *link = hash_table_find(&conn_hash_table, &call->in_phone_hash); 980 954 if (!link) { 981 955 futex_up(&async_futex); … … 991 965 } 992 966 993 msg->c handle = chandle;967 msg->callid = callid; 994 968 msg->call = *call; 995 969 list_append(&msg->link, &conn->msg_queue); 996 970 997 971 if (IPC_GET_IMETHOD(*call) == IPC_M_PHONE_HUNGUP) 998 conn->close_c handle = chandle;972 conn->close_callid = callid; 999 973 1000 974 /* If the connection fibril is waiting for an event, activate it */ … … 1017 991 /** Process notification. 1018 992 * 993 * @param callid Hash of the incoming call. 1019 994 * @param call Data of the incoming call. 1020 995 * 1021 996 */ 1022 static void process_notification(ipc_call _t *call)997 static void process_notification(ipc_callid_t callid, ipc_call_t *call) 1023 998 { 1024 999 async_notification_handler_t handler = NULL; … … 1041 1016 1042 1017 if (handler) 1043 handler(call , data);1018 handler(callid, call, data); 1044 1019 } 1045 1020 … … 1051 1026 * @param ucode Top-half pseudocode handler. 1052 1027 * 1053 * @param[out] handle IRQ capability handle on success. 1054 * 1028 * @return IRQ capability handle on success. 1055 1029 * @return Negative error code. 1056 1030 * 1057 1031 */ 1058 1032 int async_irq_subscribe(int inr, async_notification_handler_t handler, 1059 void *data, const irq_code_t *ucode , cap_handle_t *handle)1033 void *data, const irq_code_t *ucode) 1060 1034 { 1061 1035 notification_t *notification = … … 1077 1051 futex_up(&async_futex); 1078 1052 1079 cap_handle_t cap; 1080 int rc = ipc_irq_subscribe(inr, imethod, ucode, &cap); 1081 if (rc == EOK && handle != NULL) { 1082 *handle = cap; 1083 } 1084 return rc; 1053 return ipc_irq_subscribe(inr, imethod, ucode); 1085 1054 } 1086 1055 … … 1192 1161 /** Return new incoming message for the current (fibril-local) connection. 1193 1162 * 1194 * @param call Storage where the incoming call data will be stored. 1195 * @param usecs Timeout in microseconds. Zero denotes no timeout. 1196 * 1197 * @return If no timeout was specified, then a handle of the incoming call is 1198 * returned. If a timeout is specified, then a handle of the incoming 1199 * call is returned unless the timeout expires prior to receiving a 1200 * message. In that case zero CAP_NIL is returned. 1201 */ 1202 cap_handle_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs) 1163 * @param call Storage where the incoming call data will be stored. 1164 * @param usecs Timeout in microseconds. Zero denotes no timeout. 1165 * 1166 * @return If no timeout was specified, then a hash of the 1167 * incoming call is returned. If a timeout is specified, 1168 * then a hash of the incoming call is returned unless 1169 * the timeout expires prior to receiving a message. In 1170 * that case zero is returned. 1171 * 1172 */ 1173 ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs) 1203 1174 { 1204 1175 assert(call); … … 1223 1194 /* If nothing in queue, wait until something arrives */ 1224 1195 while (list_empty(&conn->msg_queue)) { 1225 if (conn->close_c handle) {1196 if (conn->close_callid) { 1226 1197 /* 1227 1198 * Handle the case when the connection was already … … 1234 1205 IPC_SET_IMETHOD(*call, IPC_M_PHONE_HUNGUP); 1235 1206 futex_up(&async_futex); 1236 return conn->close_c handle;1207 return conn->close_callid; 1237 1208 } 1238 1209 … … 1259 1230 /* If we timed out -> exit */ 1260 1231 futex_up(&async_futex); 1261 return CAP_NIL;1232 return 0; 1262 1233 } 1263 1234 } … … 1267 1238 list_remove(&msg->link); 1268 1239 1269 cap_handle_t chandle = msg->chandle;1240 ipc_callid_t callid = msg->callid; 1270 1241 *call = msg->call; 1271 1242 free(msg); 1272 1243 1273 1244 futex_up(&async_futex); 1274 return c handle;1245 return callid; 1275 1246 } 1276 1247 … … 1335 1306 * Otherwise the call is routed to its connection fibril. 1336 1307 * 1337 * @param c handle Handleof the incoming call.1338 * @param call 1339 * 1340 */ 1341 static void handle_call( cap_handle_t chandle, ipc_call_t *call)1308 * @param callid Hash of the incoming call. 1309 * @param call Data of the incoming call. 1310 * 1311 */ 1312 static void handle_call(ipc_callid_t callid, ipc_call_t *call) 1342 1313 { 1343 1314 assert(call); 1344 1315 1345 1316 /* Kernel notification */ 1346 if ((c handle == CAP_NIL) && (call->flags & IPC_CALL_NOTIF)) {1317 if ((callid & IPC_CALLID_NOTIFICATION)) { 1347 1318 fibril_t *fibril = (fibril_t *) __tcb_get()->fibril_data; 1348 1319 unsigned oldsw = fibril->switches; 1349 1320 1350 process_notification(call );1321 process_notification(callid, call); 1351 1322 1352 1323 if (oldsw != fibril->switches) { … … 1374 1345 sysarg_t in_phone_hash = IPC_GET_ARG5(*call); 1375 1346 1376 async_ port_handler_t handler = fallback_port_handler;1347 async_notification_handler_t handler = fallback_port_handler; 1377 1348 void *data = fallback_port_data; 1378 1349 … … 1384 1355 } 1385 1356 1386 async_new_connection(call->in_task_id, in_phone_hash, c handle,1357 async_new_connection(call->in_task_id, in_phone_hash, callid, 1387 1358 call, handler, data); 1388 1359 return; … … 1390 1361 1391 1362 /* Try to route the call through the connection hash table */ 1392 if (route_call(c handle, call))1363 if (route_call(callid, call)) 1393 1364 return; 1394 1365 1395 1366 /* Unknown call from unknown phone - hang it up */ 1396 ipc_answer_0(c handle, EHANGUP);1367 ipc_answer_0(callid, EHANGUP); 1397 1368 } 1398 1369 … … 1489 1460 1490 1461 ipc_call_t call; 1491 i nt rc= ipc_wait_cycle(&call, timeout, flags);1462 ipc_callid_t callid = ipc_wait_cycle(&call, timeout, flags); 1492 1463 1493 1464 atomic_dec(&threads_in_ipc_wait); 1494 1465 1495 assert(rc == EOK); 1496 1497 if (call.cap_handle == CAP_NIL) { 1498 if (call.flags == 0) { 1499 /* This neither a notification nor an answer. */ 1500 handle_expired_timeouts(); 1501 continue; 1502 } 1466 if (!callid) { 1467 handle_expired_timeouts(); 1468 continue; 1503 1469 } 1504 1505 if (call .flags & IPC_CALL_ANSWERED)1470 1471 if (callid & IPC_CALLID_ANSWERED) 1506 1472 continue; 1507 1508 handle_call(call .cap_handle, &call);1509 } 1510 1473 1474 handle_call(callid, &call); 1475 } 1476 1511 1477 return 0; 1512 1478 } … … 1639 1605 * @param arg3 Service-defined payload argument. 1640 1606 * @param arg4 Service-defined payload argument. 1641 * @param dataptr If non-NULL, storage where the reply data will be stored. 1607 * @param dataptr If non-NULL, storage where the reply data will be 1608 * stored. 1642 1609 * 1643 1610 * @return Hash of the sent message or 0 on error. … … 1876 1843 } 1877 1844 1878 /** Delay execution for the specified number of seconds1879 *1880 * @param sec Number of seconds to sleep1881 */1882 void async_sleep(unsigned int sec)1883 {1884 /*1885 * Sleep in 1000 second steps to support1886 * full argument range1887 */1888 1889 while (sec > 0) {1890 unsigned int period = (sec > 1000) ? 1000 : sec;1891 1892 async_usleep(period * 1000000);1893 sec -= period;1894 }1895 }1896 1897 1845 /** Pseudo-synchronous message sending - fast version. 1898 1846 * … … 2044 1992 } 2045 1993 2046 sysarg_t async_answer_0( cap_handle_t chandle, sysarg_t retval)2047 { 2048 return ipc_answer_0(c handle, retval);2049 } 2050 2051 sysarg_t async_answer_1( cap_handle_t chandle, sysarg_t retval, sysarg_t arg1)2052 { 2053 return ipc_answer_1(c handle, retval, arg1);2054 } 2055 2056 sysarg_t async_answer_2( cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,1994 sysarg_t async_answer_0(ipc_callid_t callid, sysarg_t retval) 1995 { 1996 return ipc_answer_0(callid, retval); 1997 } 1998 1999 sysarg_t async_answer_1(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1) 2000 { 2001 return ipc_answer_1(callid, retval, arg1); 2002 } 2003 2004 sysarg_t async_answer_2(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1, 2057 2005 sysarg_t arg2) 2058 2006 { 2059 return ipc_answer_2(c handle, retval, arg1, arg2);2060 } 2061 2062 sysarg_t async_answer_3( cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2007 return ipc_answer_2(callid, retval, arg1, arg2); 2008 } 2009 2010 sysarg_t async_answer_3(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1, 2063 2011 sysarg_t arg2, sysarg_t arg3) 2064 2012 { 2065 return ipc_answer_3(c handle, retval, arg1, arg2, arg3);2066 } 2067 2068 sysarg_t async_answer_4( cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2013 return ipc_answer_3(callid, retval, arg1, arg2, arg3); 2014 } 2015 2016 sysarg_t async_answer_4(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1, 2069 2017 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4) 2070 2018 { 2071 return ipc_answer_4(c handle, retval, arg1, arg2, arg3, arg4);2072 } 2073 2074 sysarg_t async_answer_5( cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2019 return ipc_answer_4(callid, retval, arg1, arg2, arg3, arg4); 2020 } 2021 2022 sysarg_t async_answer_5(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1, 2075 2023 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5) 2076 2024 { 2077 return ipc_answer_5(c handle, retval, arg1, arg2, arg3, arg4, arg5);2078 } 2079 2080 int async_forward_fast( cap_handle_t chandle, async_exch_t *exch,2025 return ipc_answer_5(callid, retval, arg1, arg2, arg3, arg4, arg5); 2026 } 2027 2028 int async_forward_fast(ipc_callid_t callid, async_exch_t *exch, 2081 2029 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, unsigned int mode) 2082 2030 { … … 2084 2032 return ENOENT; 2085 2033 2086 return ipc_forward_fast(c handle, exch->phone, imethod, arg1, arg2, mode);2087 } 2088 2089 int async_forward_slow( cap_handle_t chandle, async_exch_t *exch,2034 return ipc_forward_fast(callid, exch->phone, imethod, arg1, arg2, mode); 2035 } 2036 2037 int async_forward_slow(ipc_callid_t callid, async_exch_t *exch, 2090 2038 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, 2091 2039 sysarg_t arg4, sysarg_t arg5, unsigned int mode) … … 2094 2042 return ENOENT; 2095 2043 2096 return ipc_forward_slow(c handle, exch->phone, imethod, arg1, arg2, arg3,2044 return ipc_forward_slow(callid, exch->phone, imethod, arg1, arg2, arg3, 2097 2045 arg4, arg5, mode); 2098 2046 } … … 2129 2077 2130 2078 static int async_connect_me_to_internal(int phone, sysarg_t arg1, sysarg_t arg2, 2131 sysarg_t arg3, sysarg_t arg4 , int *out_phone)2079 sysarg_t arg3, sysarg_t arg4) 2132 2080 { 2133 2081 ipc_call_t result; 2134 2135 // XXX: Workaround for GCC's inability to infer association between2136 // rc == EOK and *out_phone being assigned.2137 *out_phone = -1;2138 2082 2139 2083 amsg_t *msg = amsg_create(); … … 2153 2097 return rc; 2154 2098 2155 *out_phone = (int) IPC_GET_ARG5(result); 2156 return EOK; 2099 return (int) IPC_GET_ARG5(result); 2157 2100 } 2158 2101 … … 2184 2127 } 2185 2128 2186 int phone; 2187 int rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2188 0, &phone); 2189 if (rc != EOK) { 2190 errno = rc; 2129 int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2130 0); 2131 if (phone < 0) { 2132 errno = phone; 2191 2133 free(sess); 2192 2134 return NULL; … … 2237 2179 } 2238 2180 2239 int phone; 2240 int rc = async_connect_me_to_internal(exch->phone, iface, arg2, 2241 arg3, 0, &phone); 2242 if (rc != EOK) { 2243 errno = rc; 2181 int phone = async_connect_me_to_internal(exch->phone, iface, arg2, 2182 arg3, 0); 2183 if (phone < 0) { 2184 errno = phone; 2244 2185 free(sess); 2245 2186 return NULL; … … 2308 2249 } 2309 2250 2310 int phone; 2311 int rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2312 IPC_FLAG_BLOCKING, &phone); 2313 2314 if (rc != EOK) { 2315 errno = rc; 2251 int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2252 IPC_FLAG_BLOCKING); 2253 2254 if (phone < 0) { 2255 errno = phone; 2316 2256 free(sess); 2317 2257 return NULL; … … 2362 2302 } 2363 2303 2364 int phone; 2365 int rc = async_connect_me_to_internal(exch->phone, iface, arg2, 2366 arg3, IPC_FLAG_BLOCKING, &phone); 2367 if (rc != EOK) { 2368 errno = rc; 2304 int phone = async_connect_me_to_internal(exch->phone, iface, arg2, 2305 arg3, IPC_FLAG_BLOCKING); 2306 if (phone < 0) { 2307 errno = phone; 2369 2308 free(sess); 2370 2309 return NULL; … … 2398 2337 } 2399 2338 2400 cap_handle_t phone; 2401 int rc = ipc_connect_kbox(id, &phone); 2402 if (rc != EOK) { 2403 errno = rc; 2339 int phone = ipc_connect_kbox(id); 2340 if (phone < 0) { 2341 errno = phone; 2404 2342 free(sess); 2405 2343 return NULL; … … 2518 2456 } else if (mgmt == EXCHANGE_PARALLEL) { 2519 2457 int phone; 2520 int rc;2521 2458 2522 2459 retry: … … 2524 2461 * Make a one-time attempt to connect a new data phone. 2525 2462 */ 2526 rc= async_connect_me_to_internal(sess->phone, sess->arg1,2527 sess->arg2, sess->arg3, 0 , &phone);2528 if ( rc == EOK) {2463 phone = async_connect_me_to_internal(sess->phone, sess->arg1, 2464 sess->arg2, sess->arg3, 0); 2465 if (phone >= 0) { 2529 2466 exch = (async_exch_t *) malloc(sizeof(async_exch_t)); 2530 2467 if (exch != NULL) { … … 2641 2578 * So far, this wrapper is to be used from within a connection fibril. 2642 2579 * 2643 * @param c handle Storage for the handleof the IPC_M_SHARE_IN call.2644 * @param size 2580 * @param callid Storage for the hash of the IPC_M_SHARE_IN call. 2581 * @param size Destination address space area size. 2645 2582 * 2646 2583 * @return True on success, false on failure. 2647 2584 * 2648 2585 */ 2649 bool async_share_in_receive( cap_handle_t *chandle, size_t *size)2650 { 2651 assert(c handle);2586 bool async_share_in_receive(ipc_callid_t *callid, size_t *size) 2587 { 2588 assert(callid); 2652 2589 assert(size); 2653 2590 2654 2591 ipc_call_t data; 2655 *c handle= async_get_call(&data);2592 *callid = async_get_call(&data); 2656 2593 2657 2594 if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_IN) … … 2668 2605 * argument. 2669 2606 * 2670 * @param c handle Handleof the IPC_M_DATA_READ call to answer.2671 * @param src 2672 * @param flags 2607 * @param callid Hash of the IPC_M_DATA_READ call to answer. 2608 * @param src Source address space base. 2609 * @param flags Flags to be used for sharing. Bits can be only cleared. 2673 2610 * 2674 2611 * @return Zero on success or a value from @ref errno.h on failure. 2675 2612 * 2676 2613 */ 2677 int async_share_in_finalize( cap_handle_t chandle, void *src, unsigned int flags)2678 { 2679 return ipc_answer_3(c handle, EOK, (sysarg_t) src, (sysarg_t) flags,2614 int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 2615 { 2616 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags, 2680 2617 (sysarg_t) __entry); 2681 2618 } … … 2707 2644 * So far, this wrapper is to be used from within a connection fibril. 2708 2645 * 2709 * @param c handleStorage for the hash of the IPC_M_SHARE_OUT call.2710 * @param size 2711 * @param flags 2646 * @param callid Storage for the hash of the IPC_M_SHARE_OUT call. 2647 * @param size Storage for the source address space area size. 2648 * @param flags Storage for the sharing flags. 2712 2649 * 2713 2650 * @return True on success, false on failure. 2714 2651 * 2715 2652 */ 2716 bool async_share_out_receive(cap_handle_t *chandle, size_t *size, 2717 unsigned int *flags) 2718 { 2719 assert(chandle); 2653 bool async_share_out_receive(ipc_callid_t *callid, size_t *size, unsigned int *flags) 2654 { 2655 assert(callid); 2720 2656 assert(size); 2721 2657 assert(flags); 2722 2658 2723 2659 ipc_call_t data; 2724 *c handle= async_get_call(&data);2660 *callid = async_get_call(&data); 2725 2661 2726 2662 if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_OUT) … … 2738 2674 * argument. 2739 2675 * 2740 * @param c handle Handleof the IPC_M_DATA_WRITE call to answer.2741 * @param dst 2742 * 2743 * 2744 * @return 2745 * 2746 */ 2747 int async_share_out_finalize( cap_handle_t chandle, void **dst)2748 { 2749 return ipc_answer_2(c handle, EOK, (sysarg_t) __entry, (sysarg_t) dst);2676 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. 2677 * @param dst Address of the storage for the destination address space area 2678 * base address. 2679 * 2680 * @return Zero on success or a value from @ref errno.h on failure. 2681 * 2682 */ 2683 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2684 { 2685 return ipc_answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t) dst); 2750 2686 } 2751 2687 … … 2793 2729 * So far, this wrapper is to be used from within a connection fibril. 2794 2730 * 2795 * @param c handle Storage for the handleof the IPC_M_DATA_READ.2796 * @param size 2731 * @param callid Storage for the hash of the IPC_M_DATA_READ. 2732 * @param size Storage for the maximum size. Can be NULL. 2797 2733 * 2798 2734 * @return True on success, false on failure. 2799 2735 * 2800 2736 */ 2801 bool async_data_read_receive( cap_handle_t *chandle, size_t *size)2737 bool async_data_read_receive(ipc_callid_t *callid, size_t *size) 2802 2738 { 2803 2739 ipc_call_t data; 2804 return async_data_read_receive_call(c handle, &data, size);2740 return async_data_read_receive_call(callid, &data, size); 2805 2741 } 2806 2742 … … 2813 2749 * So far, this wrapper is to be used from within a connection fibril. 2814 2750 * 2815 * @param c handle Storage for the handleof the IPC_M_DATA_READ.2816 * @param size 2751 * @param callid Storage for the hash of the IPC_M_DATA_READ. 2752 * @param size Storage for the maximum size. Can be NULL. 2817 2753 * 2818 2754 * @return True on success, false on failure. 2819 2755 * 2820 2756 */ 2821 bool async_data_read_receive_call( cap_handle_t *chandle, ipc_call_t *data,2757 bool async_data_read_receive_call(ipc_callid_t *callid, ipc_call_t *data, 2822 2758 size_t *size) 2823 2759 { 2824 assert(c handle);2760 assert(callid); 2825 2761 assert(data); 2826 2762 2827 *c handle= async_get_call(data);2763 *callid = async_get_call(data); 2828 2764 2829 2765 if (IPC_GET_IMETHOD(*data) != IPC_M_DATA_READ) … … 2842 2778 * argument. 2843 2779 * 2844 * @param c handle Handleof the IPC_M_DATA_READ call to answer.2845 * @param src 2846 * @param size 2847 * 2848 * 2849 * @return 2850 * 2851 */ 2852 int async_data_read_finalize( cap_handle_t chandle, const void *src, size_t size)2853 { 2854 return ipc_answer_2(c handle, EOK, (sysarg_t) src, (sysarg_t) size);2780 * @param callid Hash of the IPC_M_DATA_READ call to answer. 2781 * @param src Source address for the IPC_M_DATA_READ call. 2782 * @param size Size for the IPC_M_DATA_READ call. Can be smaller than 2783 * the maximum size announced by the sender. 2784 * 2785 * @return Zero on success or a value from @ref errno.h on failure. 2786 * 2787 */ 2788 int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size) 2789 { 2790 return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) size); 2855 2791 } 2856 2792 … … 2865 2801 return ENOENT; 2866 2802 2867 cap_handle_t chandle;2868 if (!async_data_read_receive(&c handle, NULL)) {2869 ipc_answer_0(c handle, EINVAL);2803 ipc_callid_t callid; 2804 if (!async_data_read_receive(&callid, NULL)) { 2805 ipc_answer_0(callid, EINVAL); 2870 2806 return EINVAL; 2871 2807 } … … 2874 2810 dataptr); 2875 2811 if (msg == 0) { 2876 ipc_answer_0(c handle, EINVAL);2812 ipc_answer_0(callid, EINVAL); 2877 2813 return EINVAL; 2878 2814 } 2879 2815 2880 int retval = ipc_forward_fast(c handle, exch->phone, 0, 0, 0,2816 int retval = ipc_forward_fast(callid, exch->phone, 0, 0, 0, 2881 2817 IPC_FF_ROUTE_FROM_ME); 2882 2818 if (retval != EOK) { 2883 2819 async_forget(msg); 2884 ipc_answer_0(c handle, retval);2820 ipc_answer_0(callid, retval); 2885 2821 return retval; 2886 2822 } … … 2918 2854 * So far, this wrapper is to be used from within a connection fibril. 2919 2855 * 2920 * @param c handle Storage for the handleof the IPC_M_DATA_WRITE.2921 * @param size 2922 * 2923 * @return 2924 * 2925 */ 2926 bool async_data_write_receive( cap_handle_t *chandle, size_t *size)2856 * @param callid Storage for the hash of the IPC_M_DATA_WRITE. 2857 * @param size Storage for the suggested size. May be NULL. 2858 * 2859 * @return True on success, false on failure. 2860 * 2861 */ 2862 bool async_data_write_receive(ipc_callid_t *callid, size_t *size) 2927 2863 { 2928 2864 ipc_call_t data; 2929 return async_data_write_receive_call(c handle, &data, size);2865 return async_data_write_receive_call(callid, &data, size); 2930 2866 } 2931 2867 … … 2938 2874 * So far, this wrapper is to be used from within a connection fibril. 2939 2875 * 2940 * @param c handle Storage for the handleof the IPC_M_DATA_WRITE.2941 * @param data 2942 * @param size 2876 * @param callid Storage for the hash of the IPC_M_DATA_WRITE. 2877 * @param data Storage for the ipc call data. 2878 * @param size Storage for the suggested size. May be NULL. 2943 2879 * 2944 2880 * @return True on success, false on failure. 2945 2881 * 2946 2882 */ 2947 bool async_data_write_receive_call( cap_handle_t *chandle, ipc_call_t *data,2883 bool async_data_write_receive_call(ipc_callid_t *callid, ipc_call_t *data, 2948 2884 size_t *size) 2949 2885 { 2950 assert(c handle);2886 assert(callid); 2951 2887 assert(data); 2952 2888 2953 *c handle= async_get_call(data);2889 *callid = async_get_call(data); 2954 2890 2955 2891 if (IPC_GET_IMETHOD(*data) != IPC_M_DATA_WRITE) … … 2968 2904 * argument. 2969 2905 * 2970 * @param c handle Handleof the IPC_M_DATA_WRITE call to answer.2971 * @param dst 2972 * @param size 2973 * 2974 * @return 2975 * 2976 */ 2977 int async_data_write_finalize( cap_handle_t chandle, void *dst, size_t size)2978 { 2979 return ipc_answer_2(c handle, EOK, (sysarg_t) dst, (sysarg_t) size);2906 * @param callid Hash of the IPC_M_DATA_WRITE call to answer. 2907 * @param dst Final destination address for the IPC_M_DATA_WRITE call. 2908 * @param size Final size for the IPC_M_DATA_WRITE call. 2909 * 2910 * @return Zero on success or a value from @ref errno.h on failure. 2911 * 2912 */ 2913 int async_data_write_finalize(ipc_callid_t callid, void *dst, size_t size) 2914 { 2915 return ipc_answer_2(callid, EOK, (sysarg_t) dst, (sysarg_t) size); 2980 2916 } 2981 2917 … … 3007 2943 assert(data); 3008 2944 3009 cap_handle_t chandle;2945 ipc_callid_t callid; 3010 2946 size_t size; 3011 if (!async_data_write_receive(&c handle, &size)) {3012 ipc_answer_0(c handle, EINVAL);2947 if (!async_data_write_receive(&callid, &size)) { 2948 ipc_answer_0(callid, EINVAL); 3013 2949 return EINVAL; 3014 2950 } 3015 2951 3016 2952 if (size < min_size) { 3017 ipc_answer_0(c handle, EINVAL);2953 ipc_answer_0(callid, EINVAL); 3018 2954 return EINVAL; 3019 2955 } 3020 2956 3021 2957 if ((max_size > 0) && (size > max_size)) { 3022 ipc_answer_0(c handle, EINVAL);2958 ipc_answer_0(callid, EINVAL); 3023 2959 return EINVAL; 3024 2960 } 3025 2961 3026 2962 if ((granularity > 0) && ((size % granularity) != 0)) { 3027 ipc_answer_0(c handle, EINVAL);2963 ipc_answer_0(callid, EINVAL); 3028 2964 return EINVAL; 3029 2965 } … … 3037 2973 3038 2974 if (arg_data == NULL) { 3039 ipc_answer_0(c handle, ENOMEM);2975 ipc_answer_0(callid, ENOMEM); 3040 2976 return ENOMEM; 3041 2977 } 3042 2978 3043 int rc = async_data_write_finalize(c handle, arg_data, size);2979 int rc = async_data_write_finalize(callid, arg_data, size); 3044 2980 if (rc != EOK) { 3045 2981 free(arg_data); … … 3066 3002 void async_data_write_void(sysarg_t retval) 3067 3003 { 3068 cap_handle_t chandle;3069 async_data_write_receive(&c handle, NULL);3070 ipc_answer_0(c handle, retval);3004 ipc_callid_t callid; 3005 async_data_write_receive(&callid, NULL); 3006 ipc_answer_0(callid, retval); 3071 3007 } 3072 3008 … … 3081 3017 return ENOENT; 3082 3018 3083 cap_handle_t chandle;3084 if (!async_data_write_receive(&c handle, NULL)) {3085 ipc_answer_0(c handle, EINVAL);3019 ipc_callid_t callid; 3020 if (!async_data_write_receive(&callid, NULL)) { 3021 ipc_answer_0(callid, EINVAL); 3086 3022 return EINVAL; 3087 3023 } … … 3090 3026 dataptr); 3091 3027 if (msg == 0) { 3092 ipc_answer_0(c handle, EINVAL);3028 ipc_answer_0(callid, EINVAL); 3093 3029 return EINVAL; 3094 3030 } 3095 3031 3096 int retval = ipc_forward_fast(c handle, exch->phone, 0, 0, 0,3032 int retval = ipc_forward_fast(callid, exch->phone, 0, 0, 0, 3097 3033 IPC_FF_ROUTE_FROM_ME); 3098 3034 if (retval != EOK) { 3099 3035 async_forget(msg); 3100 ipc_answer_0(c handle, retval);3036 ipc_answer_0(callid, retval); 3101 3037 return retval; 3102 3038 } … … 3123 3059 /* Accept the phone */ 3124 3060 ipc_call_t call; 3125 cap_handle_t chandle = async_get_call(&call); 3126 cap_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(call); 3127 3128 if ((IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) || (phandle < 0)) { 3129 async_answer_0(chandle, EINVAL); 3061 ipc_callid_t callid = async_get_call(&call); 3062 int phone = (int) IPC_GET_ARG5(call); 3063 3064 if ((IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) || 3065 (phone < 0)) { 3066 async_answer_0(callid, EINVAL); 3130 3067 return NULL; 3131 3068 } … … 3133 3070 async_sess_t *sess = (async_sess_t *) malloc(sizeof(async_sess_t)); 3134 3071 if (sess == NULL) { 3135 async_answer_0(c handle, ENOMEM);3072 async_answer_0(callid, ENOMEM); 3136 3073 return NULL; 3137 3074 } … … 3139 3076 sess->iface = 0; 3140 3077 sess->mgmt = mgmt; 3141 sess->phone = ph andle;3078 sess->phone = phone; 3142 3079 sess->arg1 = 0; 3143 3080 sess->arg2 = 0; … … 3152 3089 3153 3090 /* Acknowledge the connected phone */ 3154 async_answer_0(c handle, EOK);3091 async_answer_0(callid, EOK); 3155 3092 3156 3093 return sess; … … 3173 3110 async_sess_t *async_callback_receive_start(exch_mgmt_t mgmt, ipc_call_t *call) 3174 3111 { 3175 cap_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(*call); 3176 3177 if ((IPC_GET_IMETHOD(*call) != IPC_M_CONNECT_TO_ME) || (phandle < 0)) 3112 int phone = (int) IPC_GET_ARG5(*call); 3113 3114 if ((IPC_GET_IMETHOD(*call) != IPC_M_CONNECT_TO_ME) || 3115 (phone < 0)) 3178 3116 return NULL; 3179 3117 … … 3184 3122 sess->iface = 0; 3185 3123 sess->mgmt = mgmt; 3186 sess->phone = ph andle;3124 sess->phone = phone; 3187 3125 sess->arg1 = 0; 3188 3126 sess->arg2 = 0; … … 3206 3144 } 3207 3145 3208 bool async_state_change_receive( cap_handle_t *chandle, sysarg_t *arg1,3146 bool async_state_change_receive(ipc_callid_t *callid, sysarg_t *arg1, 3209 3147 sysarg_t *arg2, sysarg_t *arg3) 3210 3148 { 3211 assert(c handle);3149 assert(callid); 3212 3150 3213 3151 ipc_call_t call; 3214 *c handle= async_get_call(&call);3152 *callid = async_get_call(&call); 3215 3153 3216 3154 if (IPC_GET_IMETHOD(call) != IPC_M_STATE_CHANGE_AUTHORIZE) … … 3227 3165 } 3228 3166 3229 int async_state_change_finalize( cap_handle_t chandle, async_exch_t *other_exch)3230 { 3231 return ipc_answer_1(c handle, EOK, other_exch->phone);3167 int async_state_change_finalize(ipc_callid_t callid, async_exch_t *other_exch) 3168 { 3169 return ipc_answer_1(callid, EOK, other_exch->phone); 3232 3170 } 3233 3171
Note:
See TracChangeset
for help on using the changeset viewer.