Changeset 0cc4313 in mainline for uspace/lib/libc/include/async.h
- Timestamp:
- 2007-11-22T15:50:24Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d40a8ff
- Parents:
- 8498915
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/include/async.h
r8498915 r0cc4313 40 40 #include <sys/time.h> 41 41 #include <atomic.h> 42 #include <bool.h> 42 43 43 44 typedef ipc_callid_t aid_t; … … 55 56 } 56 57 57 aid_t async_send_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, 58 /* 59 * User-friendly wrappers for async_send_fast() and async_send_slow(). The 60 * macros are in the form async_send_m(), where m denotes the number of payload 61 * arguments. Each macros chooses between the fast and the slow version based 62 * on m. 63 */ 64 65 #define async_send_0(phoneid, method, dataptr) \ 66 async_send_fast((phoneid), (method), 0, 0, 0, 0, (dataptr)) 67 #define async_send_1(phoneid, method, arg1, dataptr) \ 68 async_send_fast((phoneid), (method), (arg1), 0, 0, 0, (dataptr)) 69 #define async_send_2(phoneid, method, arg1, arg2, dataptr) \ 70 async_send_fast((phoneid), (method), (arg1), (arg2), 0, 0, (dataptr)) 71 #define async_send_3(phoneid, method, arg1, arg2, arg3, dataptr) \ 72 async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (dataptr)) 73 #define async_send_4(phoneid, method, arg1, arg2, arg3, arg4, dataptr) \ 74 async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 75 (dataptr)) 76 #define async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, dataptr) \ 77 async_send_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 78 (arg5), (dataptr)) 79 80 extern aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, 81 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr); 82 extern aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, 83 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, 58 84 ipc_call_t *dataptr); 59 aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, 60 ipcarg_t arg3, ipc_call_t *dataptr); 61 void async_wait_for(aid_t amsgid, ipcarg_t *result); 62 int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout); 63 64 /** Pseudo-synchronous message sending 65 * 66 * Send message through IPC, wait in the event loop, until it is received 67 * 68 * @return Return code of message 69 */ 70 static inline ipcarg_t async_req_2(int phoneid, ipcarg_t method, ipcarg_t arg1, 71 ipcarg_t arg2, ipcarg_t *r1, ipcarg_t *r2) 72 { 73 ipc_call_t result; 74 ipcarg_t rc; 75 76 aid_t eid = async_send_2(phoneid, method, arg1, arg2, &result); 77 async_wait_for(eid, &rc); 78 if (r1) 79 *r1 = IPC_GET_ARG1(result); 80 if (r2) 81 *r2 = IPC_GET_ARG2(result); 82 return rc; 83 } 84 #define async_req(phoneid, method, arg1, r1) \ 85 async_req_2(phoneid, method, arg1, 0, r1, 0) 86 87 static inline ipcarg_t async_req_3(int phoneid, ipcarg_t method, ipcarg_t arg1, 88 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t *r1, ipcarg_t *r2, ipcarg_t *r3) 89 { 90 ipc_call_t result; 91 ipcarg_t rc; 92 93 aid_t eid = async_send_3(phoneid, method, arg1, arg2, arg3, &result); 94 async_wait_for(eid, &rc); 95 if (r1) 96 *r1 = IPC_GET_ARG1(result); 97 if (r2) 98 *r2 = IPC_GET_ARG2(result); 99 if (r3) 100 *r3 = IPC_GET_ARG3(result); 101 return rc; 102 } 103 85 extern void async_wait_for(aid_t amsgid, ipcarg_t *result); 86 extern int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, 87 suseconds_t timeout); 104 88 105 89 fid_t async_new_connection(ipcarg_t in_phone_hash,ipc_callid_t callid, … … 108 92 void async_create_manager(void); 109 93 void async_destroy_manager(void); 110 void async_set_client_connection(async_client_conn_t conn);111 void async_set_interrupt_received(async_client_conn_t conn);112 94 int _async_init(void); 113 95 114 115 /* Primitve functions for IPC communication */ 116 void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, 117 ipcarg_t arg3); 118 void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2); 119 #define async_msg(ph, m, a1) async_msg_2(ph, m, a1, 0) 96 extern void async_set_client_connection(async_client_conn_t conn); 97 extern void async_set_interrupt_received(async_client_conn_t conn); 98 99 /* Wrappers for simple communication */ 100 #define async_msg_0(phone, method) \ 101 ipc_call_async_0((phone), (method), NULL, NULL, !in_interrupt_handler()) 102 #define async_msg_1(phone, method, arg1) \ 103 ipc_call_async_1((phone), (method), (arg1), NULL, NULL, \ 104 !in_interrupt_handler()) 105 #define async_msg_2(phone, method, arg1, arg2) \ 106 ipc_call_async_2((phone), (method), (arg1), (arg2), NULL, NULL, \ 107 !in_interrupt_handler()) 108 #define async_msg_3(phone, method, arg1, arg2, arg3) \ 109 ipc_call_async_3((phone), (method), (arg1), (arg2), (arg3), NULL, NULL, \ 110 !in_interrupt_handler()) 111 #define async_msg_4(phone, method, arg1, arg2, arg3, arg4) \ 112 ipc_call_async_4((phone), (method), (arg1), (arg2), (arg3), (arg4), NULL, \ 113 NULL, !in_interrupt_handler()) 114 #define async_msg_5(phone, method, arg1, arg2, arg3, arg4, arg5) \ 115 ipc_call_async_5((phone), (method), (arg1), (arg2), (arg3), (arg4), \ 116 (arg5), NULL, NULL, !in_interrupt_handler()) 117 118 /* 119 * User-friendly wrappers for async_req_fast() and async_req_slow(). The macros 120 * are in the form async_req_m_n(), where m is the number of payload arguments 121 * and n is the number of return arguments. The macros decidce between the fast 122 * and slow verion based on m. 123 */ 124 #define async_req_0_0(phoneid, method) \ 125 async_req_fast((phoneid), (method), 0, 0, 0, 0, NULL, NULL, NULL, NULL, \ 126 NULL) 127 #define async_req_0_1(phoneid, method, r1) \ 128 async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), NULL, NULL, NULL, \ 129 NULL) 130 #define async_req_0_2(phoneid, method, r1, r2) \ 131 async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), NULL, NULL, \ 132 NULL) 133 #define async_req_0_3(phoneid, method, r1, r2, r3) \ 134 async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), NULL, \ 135 NULL) 136 #define async_req_0_4(phoneid, method, r1, r2, r3, r4) \ 137 async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \ 138 NULL) 139 #define async_req_0_5(phoneid, method, r1, r2, r3, r4, r5) \ 140 async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \ 141 (r5)) 142 #define async_req_1_0(phoneid, method, arg1) \ 143 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, NULL, NULL, NULL, \ 144 NULL, NULL) 145 #define async_req_1_1(phoneid, method, arg1, rc1) \ 146 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), NULL, NULL, \ 147 NULL, NULL) 148 #define async_req_1_2(phoneid, method, arg1, rc1, rc2) \ 149 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), NULL, \ 150 NULL, NULL) 151 #define async_req_1_3(phoneid, method, arg1, rc1, rc2, rc3) \ 152 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ 153 NULL, NULL) 154 #define async_req_1_4(phoneid, method, arg1, rc1, rc2, rc3, rc4) \ 155 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ 156 (rc4), NULL) 157 #define async_req_1_5(phoneid, method, arg1, rc1, rc2, rc3, rc4, rc5) \ 158 async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ 159 (rc4), (rc5)) 160 #define async_req_2_0(phoneid, method, arg1, arg2) \ 161 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, NULL, NULL, \ 162 NULL, NULL, NULL) 163 #define async_req_2_1(phoneid, method, arg1, arg2, rc1) \ 164 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), NULL, \ 165 NULL, NULL, NULL) 166 #define async_req_2_2(phoneid, method, arg1, arg2, rc1, rc2) \ 167 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ 168 NULL, NULL, NULL) 169 #define async_req_2_3(phoneid, method, arg1, arg2, rc1, rc2, rc3) \ 170 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ 171 (rc3), NULL, NULL) 172 #define async_req_2_4(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4) \ 173 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ 174 (rc3), (rc4), NULL) 175 #define async_req_2_5(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4, rc5) \ 176 async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ 177 (rc3), (rc4), (rc5)) 178 #define async_req_3_0(phoneid, method, arg1, arg2, arg3) \ 179 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, NULL, NULL, \ 180 NULL, NULL, NULL) 181 #define async_req_3_1(phoneid, method, arg1, arg2, arg3, rc1) \ 182 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ 183 NULL, NULL, NULL, NULL) 184 #define async_req_3_2(phoneid, method, arg1, arg2, arg3, rc1, rc2) \ 185 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ 186 (rc2), NULL, NULL, NULL) 187 #define async_req_3_3(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3) \ 188 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ 189 (rc2), (rc3), NULL, NULL) 190 #define async_req_3_4(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4) \ 191 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ 192 (rc2), (rc3), (rc4), NULL) 193 #define async_req_3_5(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4, \ 194 rc5) \ 195 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ 196 (rc2), (rc3), (rc4), (rc5)) 197 #define async_req_4_0(phoneid, method, arg1, arg2, arg3, arg4) \ 198 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), NULL, \ 199 NULL, NULL, NULL, NULL) 200 #define async_req_4_1(phoneid, method, arg1, arg2, arg3, arg4, rc1) \ 201 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ 202 NULL, NULL, NULL, NULL) 203 #define async_req_4_2(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2) \ 204 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ 205 (rc2), NULL, NULL, NULL) 206 #define async_req_4_3(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3) \ 207 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ 208 (rc2), (rc3), NULL, NULL) 209 #define async_req_4_4(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \ 210 rc4) \ 211 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 212 (rc1), (rc2), (rc3), (rc4), NULL) 213 #define async_req_4_5(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \ 214 rc4, rc5) \ 215 async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 216 (rc1), (rc2), (rc3), (rc4), (rc5)) 217 #define async_req_5_0(phoneid, method, arg1, arg2, arg3, arg4, arg5) \ 218 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 219 (arg5), NULL, NULL, NULL, NULL, NULL) 220 #define async_req_5_1(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1) \ 221 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 222 (arg5), (rc1), NULL, NULL, NULL, NULL) 223 #define async_req_5_2(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2) \ 224 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 225 (arg5), (rc1), (rc2), NULL, NULL, NULL) 226 #define async_req_5_3(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ 227 rc3) \ 228 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 229 (arg5), (rc1), (rc2), (rc3), NULL, NULL) 230 #define async_req_5_4(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ 231 rc3, rc4) \ 232 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 233 (arg5), (rc1), (rc2), (rc3), (rc4), NULL) 234 #define async_req_5_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ 235 rc3, rc4, rc5) \ 236 async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ 237 (arg5), (rc1), (rc2), (rc3), (rc4), (rc5)) 238 239 extern ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, 240 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2, 241 ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5); 242 extern ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, 243 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1, 244 ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5); 120 245 121 246 static inline void async_serialize_start(void) … … 129 254 } 130 255 256 extern bool in_interrupt_handler(void); 257 131 258 extern atomic_t async_futex; 259 132 260 #endif 133 261
Note:
See TracChangeset
for help on using the changeset viewer.