Rev 1364 | Rev 1568 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1364 | Rev 1502 | ||
---|---|---|---|
Line 140... | Line 140... | ||
140 | 140 | ||
141 | /* We will receive data on special box */ |
141 | /* We will receive data on special box */ |
142 | request->callerbox = &sync_box; |
142 | request->callerbox = &sync_box; |
143 | 143 | ||
144 | ipc_call(phone, request); |
144 | ipc_call(phone, request); |
145 | ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, SYNCH_BLOCKING); |
145 | ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
146 | } |
146 | } |
147 | 147 | ||
148 | /** Answer message that was not dispatched and is not entered in |
148 | /** Answer message that was not dispatched and is not entered in |
149 | * any queue |
149 | * any queue |
150 | */ |
150 | */ |
Line 303... | Line 303... | ||
303 | /** Wait for phone call |
303 | /** Wait for phone call |
304 | * |
304 | * |
305 | * @param box Answerbox expecting the call. |
305 | * @param box Answerbox expecting the call. |
306 | * @param usec Timeout in microseconds. See documentation for waitq_sleep_timeout() for |
306 | * @param usec Timeout in microseconds. See documentation for waitq_sleep_timeout() for |
307 | * decription of its special meaning. |
307 | * decription of its special meaning. |
308 | * @param nonblocking Blocking vs. non-blocking operation mode switch. See documentation |
308 | * @param flags Select mode of sleep operation. See documentation for waitq_sleep_timeout()i |
309 | * for waitq_sleep_timeout() for description of its special meaning. |
309 | * for description of its special meaning. |
310 | * @return Recived message address |
310 | * @return Recived message address |
311 | * - to distinguish between call and answer, look at call->flags |
311 | * - to distinguish between call and answer, look at call->flags |
312 | */ |
312 | */ |
313 | call_t * ipc_wait_for_call(answerbox_t *box, __u32 usec, int nonblocking) |
313 | call_t * ipc_wait_for_call(answerbox_t *box, __u32 usec, int flags) |
314 | { |
314 | { |
315 | call_t *request; |
315 | call_t *request; |
316 | ipl_t ipl; |
316 | ipl_t ipl; |
317 | int rc; |
317 | int rc; |
318 | 318 | ||
319 | restart: |
319 | restart: |
320 | rc = waitq_sleep_timeout(&box->wq, usec, nonblocking); |
320 | rc = waitq_sleep_timeout(&box->wq, usec, flags); |
321 | if (SYNCH_FAILED(rc)) |
321 | if (SYNCH_FAILED(rc)) |
322 | return NULL; |
322 | return NULL; |
323 | 323 | ||
324 | spinlock_lock(&box->lock); |
324 | spinlock_lock(&box->lock); |
325 | if (!list_empty(&box->irq_notifs)) { |
325 | if (!list_empty(&box->irq_notifs)) { |
Line 410... | Line 410... | ||
410 | ipc_cleanup_call_list(&task->answerbox.calls); |
410 | ipc_cleanup_call_list(&task->answerbox.calls); |
411 | spinlock_unlock(&task->answerbox.lock); |
411 | spinlock_unlock(&task->answerbox.lock); |
412 | 412 | ||
413 | /* Wait for all async answers to arrive */ |
413 | /* Wait for all async answers to arrive */ |
414 | while (atomic_get(&task->active_calls)) { |
414 | while (atomic_get(&task->active_calls)) { |
415 | call = ipc_wait_for_call(&task->answerbox, SYNCH_NO_TIMEOUT, SYNCH_BLOCKING); |
415 | call = ipc_wait_for_call(&task->answerbox, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
416 | ASSERT((call->flags & IPC_CALL_ANSWERED) || (call->flags & IPC_CALL_NOTIF)); |
416 | ASSERT((call->flags & IPC_CALL_ANSWERED) || (call->flags & IPC_CALL_NOTIF)); |
417 | ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
417 | ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
418 | 418 | ||
419 | atomic_dec(&task->active_calls); |
419 | atomic_dec(&task->active_calls); |
420 | ipc_call_free(call); |
420 | ipc_call_free(call); |