Rev 1365 | Rev 1443 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1365 | Rev 1392 | ||
---|---|---|---|
Line 55... | Line 55... | ||
55 | } async_call_t; |
55 | } async_call_t; |
56 | 56 | ||
57 | LIST_INITIALIZE(dispatched_calls); |
57 | LIST_INITIALIZE(dispatched_calls); |
58 | LIST_INITIALIZE(queued_calls); |
58 | LIST_INITIALIZE(queued_calls); |
59 | 59 | ||
60 | static atomic_t ipc_futex; |
60 | static atomic_t ipc_futex = FUTEX_INITIALIZER; |
61 | - | ||
62 | void _ipc_init(void) |
- | |
63 | { |
- | |
64 | futex_initialize(&ipc_futex, 1); |
- | |
65 | } |
- | |
66 | 61 | ||
67 | int ipc_call_sync(int phoneid, ipcarg_t method, ipcarg_t arg1, |
62 | int ipc_call_sync(int phoneid, ipcarg_t method, ipcarg_t arg1, |
68 | ipcarg_t *result) |
63 | ipcarg_t *result) |
69 | { |
64 | { |
70 | ipc_call_t resdata; |
65 | ipc_call_t resdata; |
Line 250... | Line 245... | ||
250 | futex_up(&ipc_futex); |
245 | futex_up(&ipc_futex); |
251 | printf("Received unidentified answer: %P!!!\n", callid); |
246 | printf("Received unidentified answer: %P!!!\n", callid); |
252 | } |
247 | } |
253 | 248 | ||
254 | 249 | ||
255 | /** Unconditionally wait for an IPC call. |
250 | /** One cycle of ipc wait for call call |
256 | * |
251 | * |
257 | * - dispatch ASYNC reoutines in the background |
252 | * - dispatch ASYNC reoutines in the background |
258 | * @param call Space where the message is stored |
253 | * @param call Space where the message is stored |
- | 254 | * @param usec Timeout in microseconds |
|
- | 255 | * @param flags Flags passed to SYS_IPC_WAIT (blocking, nonblocking) |
|
259 | * @return Callid of the answer. |
256 | * @return Callid of the answer. |
260 | */ |
257 | */ |
261 | ipc_callid_t ipc_wait_for_call(ipc_call_t *call) |
258 | ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags) |
262 | { |
259 | { |
263 | ipc_callid_t callid; |
260 | ipc_callid_t callid; |
264 | 261 | ||
265 | do { |
- | |
266 | try_dispatch_queued_calls(); |
262 | try_dispatch_queued_calls(); |
267 | 263 | ||
268 | callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, SYNCH_NO_TIMEOUT, SYNCH_BLOCKING); |
264 | callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, flags); |
269 | /* Handle received answers */ |
265 | /* Handle received answers */ |
270 | if (callid & IPC_CALLID_ANSWERED) |
266 | if (callid & IPC_CALLID_ANSWERED) |
271 | handle_answer(callid, call); |
267 | handle_answer(callid, call); |
272 | } while (callid & IPC_CALLID_ANSWERED); |
- | |
273 | 268 | ||
274 | return callid; |
269 | return callid; |
275 | } |
270 | } |
276 | 271 | ||
277 | /** Wait some time for an IPC call. |
272 | /** Wait some time for an IPC call. |
Line 284... | Line 279... | ||
284 | ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *call, uint32_t usec) |
279 | ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *call, uint32_t usec) |
285 | { |
280 | { |
286 | ipc_callid_t callid; |
281 | ipc_callid_t callid; |
287 | 282 | ||
288 | do { |
283 | do { |
289 | try_dispatch_queued_calls(); |
- | |
290 | - | ||
291 | callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, SYNCH_BLOCKING); |
284 | callid = ipc_wait_cycle(call, usec, SYNCH_BLOCKING); |
292 | /* Handle received answers */ |
- | |
293 | if (callid & IPC_CALLID_ANSWERED) |
- | |
294 | handle_answer(callid, call); |
- | |
295 | } while (callid & IPC_CALLID_ANSWERED); |
285 | } while (callid & IPC_CALLID_ANSWERED); |
296 | 286 | ||
297 | return callid; |
287 | return callid; |
298 | } |
288 | } |
299 | 289 | ||
Line 306... | Line 296... | ||
306 | ipc_callid_t ipc_trywait_for_call(ipc_call_t *call) |
296 | ipc_callid_t ipc_trywait_for_call(ipc_call_t *call) |
307 | { |
297 | { |
308 | ipc_callid_t callid; |
298 | ipc_callid_t callid; |
309 | 299 | ||
310 | do { |
300 | do { |
311 | try_dispatch_queued_calls(); |
- | |
312 | - | ||
313 | callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t)call, SYNCH_NO_TIMEOUT, SYNCH_NON_BLOCKING); |
301 | callid = ipc_wait_cycle(call, SYNCH_NO_TIMEOUT, SYNCH_NON_BLOCKING); |
314 | /* Handle received answers */ |
- | |
315 | if (callid & IPC_CALLID_ANSWERED) |
- | |
316 | handle_answer(callid, call); |
- | |
317 | } while (callid & IPC_CALLID_ANSWERED); |
302 | } while (callid & IPC_CALLID_ANSWERED); |
318 | 303 | ||
319 | return callid; |
304 | return callid; |
320 | } |
305 | } |
321 | 306 |