Changes in uspace/lib/c/generic/async.c [addbce4:b7fd2a0] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
raddbce4 rb7fd2a0 205 205 ipc_call_t *dataptr; 206 206 207 sysarg_t retval;207 errno_t retval; 208 208 } amsg_t; 209 209 … … 332 332 msg->destroyed = false; 333 333 msg->dataptr = NULL; 334 msg->retval = (sysarg_t)EINVAL;334 msg->retval = EINVAL; 335 335 awaiter_initialize(&msg->wdata); 336 336 } … … 511 511 static FIBRIL_CONDVAR_INITIALIZE(avail_phone_cv); 512 512 513 int async_create_port(iface_t iface, async_port_handler_t handler,513 errno_t async_create_port(iface_t iface, async_port_handler_t handler, 514 514 void *data, port_id_t *port_id) 515 515 { … … 698 698 * 699 699 */ 700 static int connection_fibril(void *arg)700 static errno_t connection_fibril(void *arg) 701 701 { 702 702 assert(arg); … … 763 763 764 764 free(fibril_connection); 765 return 0;765 return EOK; 766 766 } 767 767 … … 844 844 * @param port_id ID of the newly created port. 845 845 * 846 * @return Zero on success or a negativeerror code.847 * 848 */ 849 int async_create_callback_port(async_exch_t *exch, iface_t iface, sysarg_t arg1,846 * @return Zero on success or an error code. 847 * 848 */ 849 errno_t async_create_callback_port(async_exch_t *exch, iface_t iface, sysarg_t arg1, 850 850 sysarg_t arg2, async_port_handler_t handler, void *data, port_id_t *port_id) 851 851 { … … 860 860 &answer); 861 861 862 sysarg_t ret;862 errno_t ret; 863 863 async_wait_for(req, &ret); 864 864 if (ret != EOK) 865 return ( int) ret;865 return (errno_t) ret; 866 866 867 867 sysarg_t phone_hash = IPC_GET_ARG5(answer); … … 1051 1051 * @param ucode Top-half pseudocode handler. 1052 1052 * 1053 * @return IRQ capability handle on success. 1054 * @return Negative error code. 1055 * 1056 */ 1057 int async_irq_subscribe(int inr, async_notification_handler_t handler, 1058 void *data, const irq_code_t *ucode) 1053 * @param[out] handle IRQ capability handle on success. 1054 * 1055 * @return An error code. 1056 * 1057 */ 1058 errno_t async_irq_subscribe(int inr, async_notification_handler_t handler, 1059 void *data, const irq_code_t *ucode, cap_handle_t *handle) 1059 1060 { 1060 1061 notification_t *notification = … … 1076 1077 futex_up(&async_futex); 1077 1078 1078 return ipc_irq_subscribe(inr, imethod, ucode); 1079 cap_handle_t cap; 1080 errno_t rc = ipc_irq_subscribe(inr, imethod, ucode, &cap); 1081 if (rc == EOK && handle != NULL) { 1082 *handle = cap; 1083 } 1084 return rc; 1079 1085 } 1080 1086 … … 1083 1089 * @param cap IRQ capability handle. 1084 1090 * 1085 * @return Zero on success or a negativeerror code.1086 * 1087 */ 1088 int async_irq_unsubscribe(int cap)1091 * @return Zero on success or an error code. 1092 * 1093 */ 1094 errno_t async_irq_unsubscribe(int cap) 1089 1095 { 1090 1096 // TODO: Remove entry from hash table … … 1100 1106 * @param data Notification handler client data. 1101 1107 * 1102 * @return Zero on success or a negativeerror code.1103 * 1104 */ 1105 int async_event_subscribe(event_type_t evno,1108 * @return Zero on success or an error code. 1109 * 1110 */ 1111 errno_t async_event_subscribe(event_type_t evno, 1106 1112 async_notification_handler_t handler, void *data) 1107 1113 { … … 1133 1139 * @param data Notification handler client data. 1134 1140 * 1135 * @return Zero on success or a negativeerror code.1136 * 1137 */ 1138 int async_event_task_subscribe(event_task_type_t evno,1141 * @return Zero on success or an error code. 1142 * 1143 */ 1144 errno_t async_event_task_subscribe(event_task_type_t evno, 1139 1145 async_notification_handler_t handler, void *data) 1140 1146 { … … 1167 1173 * 1168 1174 */ 1169 int async_event_unmask(event_type_t evno)1175 errno_t async_event_unmask(event_type_t evno) 1170 1176 { 1171 1177 return ipc_event_unmask(evno); … … 1179 1185 * 1180 1186 */ 1181 int async_event_task_unmask(event_task_type_t evno)1187 errno_t async_event_task_unmask(event_task_type_t evno) 1182 1188 { 1183 1189 return ipc_event_task_unmask(evno); … … 1431 1437 * 1432 1438 */ 1433 static int async_manager_worker(void)1439 static errno_t async_manager_worker(void) 1434 1440 { 1435 1441 while (true) { … … 1483 1489 1484 1490 ipc_call_t call; 1485 cap_handle_t chandle= ipc_wait_cycle(&call, timeout, flags);1491 errno_t rc = ipc_wait_cycle(&call, timeout, flags); 1486 1492 1487 1493 atomic_dec(&threads_in_ipc_wait); 1488 1494 1489 assert(chandle >= 0); 1490 1491 if (chandle == CAP_NIL) { 1492 if (call.flags == 0) { 1493 /* This neither a notification nor an answer. */ 1495 assert(rc == EOK); 1496 1497 if (call.cap_handle == CAP_NIL) { 1498 if ((call.flags & 1499 (IPC_CALL_NOTIF | IPC_CALL_ANSWERED)) == 0) { 1500 /* Neither a notification nor an answer. */ 1494 1501 handle_expired_timeouts(); 1495 1502 continue; … … 1500 1507 continue; 1501 1508 1502 handle_call(c handle, &call);1509 handle_call(call.cap_handle, &call); 1503 1510 } 1504 1511 … … 1514 1521 * 1515 1522 */ 1516 static int async_manager_fibril(void *arg)1523 static errno_t async_manager_fibril(void *arg) 1517 1524 { 1518 1525 futex_up(&async_futex); … … 1590 1597 * 1591 1598 */ 1592 void reply_received(void *arg, int retval, ipc_call_t *data)1599 void reply_received(void *arg, errno_t retval, ipc_call_t *data) 1593 1600 { 1594 1601 assert(arg); … … 1702 1709 * 1703 1710 */ 1704 void async_wait_for(aid_t amsgid, sysarg_t *retval)1711 void async_wait_for(aid_t amsgid, errno_t *retval) 1705 1712 { 1706 1713 assert(amsgid); … … 1748 1755 * 1749 1756 */ 1750 int async_wait_timeout(aid_t amsgid, sysarg_t *retval, suseconds_t timeout)1757 errno_t async_wait_timeout(aid_t amsgid, errno_t *retval, suseconds_t timeout) 1751 1758 { 1752 1759 assert(amsgid); … … 1908 1915 * @param r5 If non-NULL, storage for the 5th reply argument. 1909 1916 * 1910 * @return Return code of the reply or a negativeerror code.1911 * 1912 */ 1913 sysarg_t async_req_fast(async_exch_t *exch, sysarg_t imethod, sysarg_t arg1,1917 * @return Return code of the reply or an error code. 1918 * 1919 */ 1920 errno_t async_req_fast(async_exch_t *exch, sysarg_t imethod, sysarg_t arg1, 1914 1921 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t *r1, sysarg_t *r2, 1915 1922 sysarg_t *r3, sysarg_t *r4, sysarg_t *r5) … … 1922 1929 &result); 1923 1930 1924 sysarg_t rc;1931 errno_t rc; 1925 1932 async_wait_for(aid, &rc); 1926 1933 … … 1960 1967 * @param r5 If non-NULL, storage for the 5th reply argument. 1961 1968 * 1962 * @return Return code of the reply or a negativeerror code.1963 * 1964 */ 1965 sysarg_t async_req_slow(async_exch_t *exch, sysarg_t imethod, sysarg_t arg1,1969 * @return Return code of the reply or an error code. 1970 * 1971 */ 1972 errno_t async_req_slow(async_exch_t *exch, sysarg_t imethod, sysarg_t arg1, 1966 1973 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, sysarg_t *r1, 1967 1974 sysarg_t *r2, sysarg_t *r3, sysarg_t *r4, sysarg_t *r5) … … 1974 1981 &result); 1975 1982 1976 sysarg_t rc;1983 errno_t rc; 1977 1984 async_wait_for(aid, &rc); 1978 1985 … … 2038 2045 } 2039 2046 2040 sysarg_t async_answer_0(cap_handle_t chandle, sysarg_t retval)2047 errno_t async_answer_0(cap_handle_t chandle, errno_t retval) 2041 2048 { 2042 2049 return ipc_answer_0(chandle, retval); 2043 2050 } 2044 2051 2045 sysarg_t async_answer_1(cap_handle_t chandle, sysarg_t retval, sysarg_t arg1)2052 errno_t async_answer_1(cap_handle_t chandle, errno_t retval, sysarg_t arg1) 2046 2053 { 2047 2054 return ipc_answer_1(chandle, retval, arg1); 2048 2055 } 2049 2056 2050 sysarg_t async_answer_2(cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2057 errno_t async_answer_2(cap_handle_t chandle, errno_t retval, sysarg_t arg1, 2051 2058 sysarg_t arg2) 2052 2059 { … … 2054 2061 } 2055 2062 2056 sysarg_t async_answer_3(cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2063 errno_t async_answer_3(cap_handle_t chandle, errno_t retval, sysarg_t arg1, 2057 2064 sysarg_t arg2, sysarg_t arg3) 2058 2065 { … … 2060 2067 } 2061 2068 2062 sysarg_t async_answer_4(cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2069 errno_t async_answer_4(cap_handle_t chandle, errno_t retval, sysarg_t arg1, 2063 2070 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4) 2064 2071 { … … 2066 2073 } 2067 2074 2068 sysarg_t async_answer_5(cap_handle_t chandle, sysarg_t retval, sysarg_t arg1,2075 errno_t async_answer_5(cap_handle_t chandle, errno_t retval, sysarg_t arg1, 2069 2076 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5) 2070 2077 { … … 2072 2079 } 2073 2080 2074 int async_forward_fast(cap_handle_t chandle, async_exch_t *exch,2081 errno_t async_forward_fast(cap_handle_t chandle, async_exch_t *exch, 2075 2082 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, unsigned int mode) 2076 2083 { … … 2081 2088 } 2082 2089 2083 int async_forward_slow(cap_handle_t chandle, async_exch_t *exch,2090 errno_t async_forward_slow(cap_handle_t chandle, async_exch_t *exch, 2084 2091 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, 2085 2092 sysarg_t arg4, sysarg_t arg5, unsigned int mode) … … 2101 2108 * @param arg3 User defined argument. 2102 2109 * 2103 * @return Zero on success or a negativeerror code.2104 * 2105 */ 2106 int async_connect_to_me(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2,2110 * @return Zero on success or an error code. 2111 * 2112 */ 2113 errno_t async_connect_to_me(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2, 2107 2114 sysarg_t arg3) 2108 2115 { … … 2114 2121 &answer); 2115 2122 2116 sysarg_t rc;2123 errno_t rc; 2117 2124 async_wait_for(req, &rc); 2118 2125 if (rc != EOK) 2119 return ( int) rc;2126 return (errno_t) rc; 2120 2127 2121 2128 return EOK; 2122 2129 } 2123 2130 2124 static int async_connect_me_to_internal(int phone, sysarg_t arg1, sysarg_t arg2,2125 sysarg_t arg3, sysarg_t arg4 )2131 static errno_t async_connect_me_to_internal(int phone, sysarg_t arg1, sysarg_t arg2, 2132 sysarg_t arg3, sysarg_t arg4, int *out_phone) 2126 2133 { 2127 2134 ipc_call_t result; 2135 2136 // XXX: Workaround for GCC's inability to infer association between 2137 // rc == EOK and *out_phone being assigned. 2138 *out_phone = -1; 2128 2139 2129 2140 amsg_t *msg = amsg_create(); … … 2137 2148 msg, reply_received); 2138 2149 2139 sysarg_t rc;2150 errno_t rc; 2140 2151 async_wait_for((aid_t) msg, &rc); 2141 2152 … … 2143 2154 return rc; 2144 2155 2145 return (int) IPC_GET_ARG5(result); 2156 *out_phone = (int) IPC_GET_ARG5(result); 2157 return EOK; 2146 2158 } 2147 2159 … … 2173 2185 } 2174 2186 2175 int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2176 0); 2177 if (phone < 0) { 2178 errno = phone; 2187 int phone; 2188 errno_t rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2189 0, &phone); 2190 if (rc != EOK) { 2191 errno = rc; 2179 2192 free(sess); 2180 2193 return NULL; … … 2225 2238 } 2226 2239 2227 int phone = async_connect_me_to_internal(exch->phone, iface, arg2, 2228 arg3, 0); 2229 if (phone < 0) { 2230 errno = phone; 2240 int phone; 2241 errno_t rc = async_connect_me_to_internal(exch->phone, iface, arg2, 2242 arg3, 0, &phone); 2243 if (rc != EOK) { 2244 errno = rc; 2231 2245 free(sess); 2232 2246 return NULL; … … 2295 2309 } 2296 2310 2297 int phone = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2298 IPC_FLAG_BLOCKING); 2299 2300 if (phone < 0) { 2301 errno = phone; 2311 int phone; 2312 errno_t rc = async_connect_me_to_internal(exch->phone, arg1, arg2, arg3, 2313 IPC_FLAG_BLOCKING, &phone); 2314 2315 if (rc != EOK) { 2316 errno = rc; 2302 2317 free(sess); 2303 2318 return NULL; … … 2348 2363 } 2349 2364 2350 int phone = async_connect_me_to_internal(exch->phone, iface, arg2, 2351 arg3, IPC_FLAG_BLOCKING); 2352 if (phone < 0) { 2353 errno = phone; 2365 int phone; 2366 errno_t rc = async_connect_me_to_internal(exch->phone, iface, arg2, 2367 arg3, IPC_FLAG_BLOCKING, &phone); 2368 if (rc != EOK) { 2369 errno = rc; 2354 2370 free(sess); 2355 2371 return NULL; … … 2383 2399 } 2384 2400 2385 int phone = ipc_connect_kbox(id); 2386 if (phone < 0) { 2387 errno = phone; 2401 cap_handle_t phone; 2402 errno_t rc = ipc_connect_kbox(id, &phone); 2403 if (rc != EOK) { 2404 errno = rc; 2388 2405 free(sess); 2389 2406 return NULL; … … 2407 2424 } 2408 2425 2409 static int async_hangup_internal(int phone)2426 static errno_t async_hangup_internal(int phone) 2410 2427 { 2411 2428 return ipc_hangup(phone); … … 2416 2433 * @param sess Session to hung up. 2417 2434 * 2418 * @return Zero on success or a negativeerror code.2419 * 2420 */ 2421 int async_hangup(async_sess_t *sess)2435 * @return Zero on success or an error code. 2436 * 2437 */ 2438 errno_t async_hangup(async_sess_t *sess) 2422 2439 { 2423 2440 async_exch_t *exch; … … 2430 2447 fibril_mutex_lock(&async_sess_mutex); 2431 2448 2432 int rc = async_hangup_internal(sess->phone);2449 errno_t rc = async_hangup_internal(sess->phone); 2433 2450 2434 2451 while (!list_empty(&sess->exch_list)) { … … 2502 2519 } else if (mgmt == EXCHANGE_PARALLEL) { 2503 2520 int phone; 2521 errno_t rc; 2504 2522 2505 2523 retry: … … 2507 2525 * Make a one-time attempt to connect a new data phone. 2508 2526 */ 2509 phone= async_connect_me_to_internal(sess->phone, sess->arg1,2510 sess->arg2, sess->arg3, 0 );2511 if ( phone >= 0) {2527 rc = async_connect_me_to_internal(sess->phone, sess->arg1, 2528 sess->arg2, sess->arg3, 0, &phone); 2529 if (rc == EOK) { 2512 2530 exch = (async_exch_t *) malloc(sizeof(async_exch_t)); 2513 2531 if (exch != NULL) { … … 2595 2613 * base address. Cannot be NULL. 2596 2614 * 2597 * @return Zero on success or a negativeerror code from errno.h.2598 * 2599 */ 2600 int async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg,2615 * @return Zero on success or an error code from errno.h. 2616 * 2617 */ 2618 errno_t async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg, 2601 2619 unsigned int *flags, void **dst) 2602 2620 { … … 2606 2624 sysarg_t _flags = 0; 2607 2625 sysarg_t _dst = (sysarg_t) -1; 2608 int res = async_req_2_4(exch, IPC_M_SHARE_IN, (sysarg_t) size,2626 errno_t res = async_req_2_4(exch, IPC_M_SHARE_IN, (sysarg_t) size, 2609 2627 arg, NULL, &_flags, NULL, &_dst); 2610 2628 … … 2658 2676 * 2659 2677 */ 2660 int async_share_in_finalize(cap_handle_t chandle, void *src, unsigned int flags)2678 errno_t async_share_in_finalize(cap_handle_t chandle, void *src, unsigned int flags) 2661 2679 { 2662 2680 return ipc_answer_3(chandle, EOK, (sysarg_t) src, (sysarg_t) flags, … … 2670 2688 * @param flags Flags to be used for sharing. Bits can be only cleared. 2671 2689 * 2672 * @return Zero on success or a negativeerror code from errno.h.2673 * 2674 */ 2675 int async_share_out_start(async_exch_t *exch, void *src, unsigned int flags)2690 * @return Zero on success or an error code from errno.h. 2691 * 2692 */ 2693 errno_t async_share_out_start(async_exch_t *exch, void *src, unsigned int flags) 2676 2694 { 2677 2695 if (exch == NULL) … … 2728 2746 * 2729 2747 */ 2730 int async_share_out_finalize(cap_handle_t chandle, void **dst)2748 errno_t async_share_out_finalize(cap_handle_t chandle, void **dst) 2731 2749 { 2732 2750 return ipc_answer_2(chandle, EOK, (sysarg_t) __entry, (sysarg_t) dst); … … 2756 2774 * @param size Size of the destination buffer. 2757 2775 * 2758 * @return Zero on success or a negativeerror code from errno.h.2759 * 2760 */ 2761 int async_data_read_start(async_exch_t *exch, void *dst, size_t size)2776 * @return Zero on success or an error code from errno.h. 2777 * 2778 */ 2779 errno_t async_data_read_start(async_exch_t *exch, void *dst, size_t size) 2762 2780 { 2763 2781 if (exch == NULL) … … 2833 2851 * 2834 2852 */ 2835 int async_data_read_finalize(cap_handle_t chandle, const void *src, size_t size)2853 errno_t async_data_read_finalize(cap_handle_t chandle, const void *src, size_t size) 2836 2854 { 2837 2855 return ipc_answer_2(chandle, EOK, (sysarg_t) src, (sysarg_t) size); … … 2841 2859 * 2842 2860 */ 2843 int async_data_read_forward_fast(async_exch_t *exch, sysarg_t imethod,2861 errno_t async_data_read_forward_fast(async_exch_t *exch, sysarg_t imethod, 2844 2862 sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, 2845 2863 ipc_call_t *dataptr) … … 2861 2879 } 2862 2880 2863 int retval = ipc_forward_fast(chandle, exch->phone, 0, 0, 0,2881 errno_t retval = ipc_forward_fast(chandle, exch->phone, 0, 0, 0, 2864 2882 IPC_FF_ROUTE_FROM_ME); 2865 2883 if (retval != EOK) { … … 2869 2887 } 2870 2888 2871 sysarg_t rc;2889 errno_t rc; 2872 2890 async_wait_for(msg, &rc); 2873 2891 2874 return ( int) rc;2892 return (errno_t) rc; 2875 2893 } 2876 2894 … … 2881 2899 * @param size Size of the source buffer. 2882 2900 * 2883 * @return Zero on success or a negativeerror code from errno.h.2884 * 2885 */ 2886 int async_data_write_start(async_exch_t *exch, const void *src, size_t size)2901 * @return Zero on success or an error code from errno.h. 2902 * 2903 */ 2904 errno_t async_data_write_start(async_exch_t *exch, const void *src, size_t size) 2887 2905 { 2888 2906 if (exch == NULL) … … 2958 2976 * 2959 2977 */ 2960 int async_data_write_finalize(cap_handle_t chandle, void *dst, size_t size)2978 errno_t async_data_write_finalize(cap_handle_t chandle, void *dst, size_t size) 2961 2979 { 2962 2980 return ipc_answer_2(chandle, EOK, (sysarg_t) dst, (sysarg_t) size); … … 2984 3002 * 2985 3003 */ 2986 int async_data_write_accept(void **data, const bool nullterm,3004 errno_t async_data_write_accept(void **data, const bool nullterm, 2987 3005 const size_t min_size, const size_t max_size, const size_t granularity, 2988 3006 size_t *received) … … 3024 3042 } 3025 3043 3026 int rc = async_data_write_finalize(chandle, arg_data, size);3044 errno_t rc = async_data_write_finalize(chandle, arg_data, size); 3027 3045 if (rc != EOK) { 3028 3046 free(arg_data); … … 3047 3065 * 3048 3066 */ 3049 void async_data_write_void( sysarg_t retval)3067 void async_data_write_void(errno_t retval) 3050 3068 { 3051 3069 cap_handle_t chandle; … … 3057 3075 * 3058 3076 */ 3059 int async_data_write_forward_fast(async_exch_t *exch, sysarg_t imethod,3077 errno_t async_data_write_forward_fast(async_exch_t *exch, sysarg_t imethod, 3060 3078 sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, 3061 3079 ipc_call_t *dataptr) … … 3077 3095 } 3078 3096 3079 int retval = ipc_forward_fast(chandle, exch->phone, 0, 0, 0,3097 errno_t retval = ipc_forward_fast(chandle, exch->phone, 0, 0, 0, 3080 3098 IPC_FF_ROUTE_FROM_ME); 3081 3099 if (retval != EOK) { … … 3085 3103 } 3086 3104 3087 sysarg_t rc;3105 errno_t rc; 3088 3106 async_wait_for(msg, &rc); 3089 3107 3090 return ( int) rc;3108 return (errno_t) rc; 3091 3109 } 3092 3110 … … 3182 3200 } 3183 3201 3184 int async_state_change_start(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2,3202 errno_t async_state_change_start(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2, 3185 3203 sysarg_t arg3, async_exch_t *other_exch) 3186 3204 { … … 3210 3228 } 3211 3229 3212 int async_state_change_finalize(cap_handle_t chandle, async_exch_t *other_exch)3230 errno_t async_state_change_finalize(cap_handle_t chandle, async_exch_t *other_exch) 3213 3231 { 3214 3232 return ipc_answer_1(chandle, EOK, other_exch->phone);
Note:
See TracChangeset
for help on using the changeset viewer.