Rev 3343 | Rev 3492 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3343 | Rev 3397 | ||
|---|---|---|---|
| Line 169... | Line 169... | ||
| 169 | 169 | ||
| 170 | /** Helper function to facilitate synchronous calls. |
170 | /** Helper function to facilitate synchronous calls. |
| 171 | * |
171 | * |
| 172 | * @param phone Destination kernel phone structure. |
172 | * @param phone Destination kernel phone structure. |
| 173 | * @param request Call structure with request. |
173 | * @param request Call structure with request. |
| - | 174 | * |
|
| - | 175 | * @return EOK on success or EINTR if the sleep was interrupted. |
|
| 174 | */ |
176 | */ |
| 175 | void ipc_call_sync(phone_t *phone, call_t *request) |
177 | int ipc_call_sync(phone_t *phone, call_t *request) |
| 176 | { |
178 | { |
| 177 | answerbox_t sync_box; |
179 | answerbox_t sync_box; |
| 178 | 180 | ||
| 179 | ipc_answerbox_init(&sync_box, TASK); |
181 | ipc_answerbox_init(&sync_box, TASK); |
| 180 | 182 | ||
| 181 | /* We will receive data in a special box. */ |
183 | /* We will receive data in a special box. */ |
| 182 | request->callerbox = &sync_box; |
184 | request->callerbox = &sync_box; |
| 183 | 185 | ||
| 184 | ipc_call(phone, request); |
186 | ipc_call(phone, request); |
| 185 | ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
187 | if (!ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, |
| - | 188 | SYNCH_FLAGS_INTERRUPTIBLE)) |
|
| - | 189 | return EINTR; |
|
| - | 190 | return EOK; |
|
| 186 | } |
191 | } |
| 187 | 192 | ||
| 188 | /** Answer a message which was not dispatched and is not listed in any queue. |
193 | /** Answer a message which was not dispatched and is not listed in any queue. |
| 189 | * |
194 | * |
| 190 | * @param call Call structure to be answered. |
195 | * @param call Call structure to be answered. |
| Line 193... | Line 198... | ||
| 193 | { |
198 | { |
| 194 | answerbox_t *callerbox = call->callerbox; |
199 | answerbox_t *callerbox = call->callerbox; |
| 195 | 200 | ||
| 196 | call->flags |= IPC_CALL_ANSWERED; |
201 | call->flags |= IPC_CALL_ANSWERED; |
| 197 | 202 | ||
| - | 203 | if (call->flags & IPC_CALL_FORWARDED) { |
|
| - | 204 | if (call->caller_phone) { |
|
| - | 205 | /* Demasquerade the caller phone. */ |
|
| - | 206 | call->data.phone = call->caller_phone; |
|
| - | 207 | } |
|
| - | 208 | } |
|
| - | 209 | ||
| 198 | spinlock_lock(&callerbox->lock); |
210 | spinlock_lock(&callerbox->lock); |
| 199 | list_append(&call->link, &callerbox->answers); |
211 | list_append(&call->link, &callerbox->answers); |
| 200 | spinlock_unlock(&callerbox->lock); |
212 | spinlock_unlock(&callerbox->lock); |
| 201 | waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); |
213 | waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); |
| 202 | } |
214 | } |
| Line 345... | Line 357... | ||
| 345 | { |
357 | { |
| 346 | spinlock_lock(&oldbox->lock); |
358 | spinlock_lock(&oldbox->lock); |
| 347 | list_remove(&call->link); |
359 | list_remove(&call->link); |
| 348 | spinlock_unlock(&oldbox->lock); |
360 | spinlock_unlock(&oldbox->lock); |
| 349 | 361 | ||
| 350 | if (mode & IPC_FF_ROUTE_FROM_ME) |
362 | if (mode & IPC_FF_ROUTE_FROM_ME) { |
| - | 363 | if (!call->caller_phone) |
|
| - | 364 | call->caller_phone = call->data.phone; |
|
| 351 | call->data.phone = newphone; |
365 | call->data.phone = newphone; |
| - | 366 | } |
|
| 352 | 367 | ||
| 353 | return ipc_call(newphone, call); |
368 | return ipc_call(newphone, call); |
| 354 | } |
369 | } |
| 355 | 370 | ||
| 356 | 371 | ||
| Line 575... | Line 590... | ||
| 575 | printf("ABOX - CALLS:\n"); |
590 | printf("ABOX - CALLS:\n"); |
| 576 | for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls; |
591 | for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls; |
| 577 | tmp = tmp->next) { |
592 | tmp = tmp->next) { |
| 578 | call = list_get_instance(tmp, call_t, link); |
593 | call = list_get_instance(tmp, call_t, link); |
| 579 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
594 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
| 580 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
595 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
| 581 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid, |
596 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, |
| - | 597 | call->sender->taskid, |
|
| 582 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
598 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 583 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
599 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 584 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
600 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 585 | call->flags); |
601 | call->flags); |
| 586 | } |
602 | } |
| Line 589... | Line 605... | ||
| 589 | for (tmp = task->answerbox.dispatched_calls.next; |
605 | for (tmp = task->answerbox.dispatched_calls.next; |
| 590 | tmp != &task->answerbox.dispatched_calls; |
606 | tmp != &task->answerbox.dispatched_calls; |
| 591 | tmp = tmp->next) { |
607 | tmp = tmp->next) { |
| 592 | call = list_get_instance(tmp, call_t, link); |
608 | call = list_get_instance(tmp, call_t, link); |
| 593 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
609 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
| 594 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
610 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
| 595 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid, |
611 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, |
| - | 612 | call->sender->taskid, |
|
| 596 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
613 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 597 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
614 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 598 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
615 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 599 | call->flags); |
616 | call->flags); |
| 600 | } |
617 | } |
| 601 | /* Print answerbox - calls */ |
618 | /* Print answerbox - calls */ |
| 602 | printf("ABOX - ANSWERS:\n"); |
619 | printf("ABOX - ANSWERS:\n"); |
| 603 | for (tmp = task->answerbox.answers.next; tmp != &task->answerbox.answers; |
620 | for (tmp = task->answerbox.answers.next; |
| - | 621 | tmp != &task->answerbox.answers; |
|
| 604 | tmp = tmp->next) { |
622 | tmp = tmp->next) { |
| 605 | call = list_get_instance(tmp, call_t, link); |
623 | call = list_get_instance(tmp, call_t, link); |
| 606 | printf("Callid:%p M:%" PRIun " A1:%" PRIun " A2:%" PRIun |
624 | printf("Callid:%p M:%" PRIun " A1:%" PRIun " A2:%" PRIun |
| 607 | " A3:%" PRIun " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", |
625 | " A3:%" PRIun " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", |
| 608 | call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
626 | call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 609 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
627 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 610 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
628 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 611 | call->flags); |
629 | call->flags); |
| 612 | } |
630 | } |