Rev 3424 | Rev 3431 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3424 | Rev 3425 | ||
|---|---|---|---|
| Line 86... | Line 86... | ||
| 86 | call_t *ipc_call_alloc(int flags) |
86 | call_t *ipc_call_alloc(int flags) |
| 87 | { |
87 | { |
| 88 | call_t *call; |
88 | call_t *call; |
| 89 | 89 | ||
| 90 | call = slab_alloc(ipc_call_slab, flags); |
90 | call = slab_alloc(ipc_call_slab, flags); |
| - | 91 | if (call) |
|
| 91 | _ipc_call_init(call); |
92 | _ipc_call_init(call); |
| 92 | 93 | ||
| 93 | return call; |
94 | return call; |
| 94 | } |
95 | } |
| 95 | 96 | ||
| 96 | /** Initialize a statically allocated call structure. |
97 | /** Initialize a statically allocated call structure. |
| Line 159... | Line 160... | ||
| 159 | * |
160 | * |
| 160 | * @param phone Phone structure to be initialized. |
161 | * @param phone Phone structure to be initialized. |
| 161 | */ |
162 | */ |
| 162 | void ipc_phone_init(phone_t *phone) |
163 | void ipc_phone_init(phone_t *phone) |
| 163 | { |
164 | { |
| 164 | mutex_initialize(&phone->lock); |
165 | mutex_initialize(&phone->lock, MUTEX_PASSIVE); |
| 165 | phone->callee = NULL; |
166 | phone->callee = NULL; |
| 166 | phone->state = IPC_PHONE_FREE; |
167 | phone->state = IPC_PHONE_FREE; |
| 167 | atomic_set(&phone->active_calls, 0); |
168 | atomic_set(&phone->active_calls, 0); |
| 168 | } |
169 | } |
| 169 | 170 | ||
| 170 | /** Helper function to facilitate synchronous calls. |
171 | /** Helper function to facilitate synchronous calls. |
| 171 | * |
172 | * |
| 172 | * @param phone Destination kernel phone structure. |
173 | * @param phone Destination kernel phone structure. |
| 173 | * @param request Call structure with request. |
174 | * @param request Call structure with request. |
| - | 175 | * |
|
| - | 176 | * @return EOK on success or EINTR if the sleep was interrupted. |
|
| 174 | */ |
177 | */ |
| 175 | void ipc_call_sync(phone_t *phone, call_t *request) |
178 | int ipc_call_sync(phone_t *phone, call_t *request) |
| 176 | { |
179 | { |
| 177 | answerbox_t sync_box; |
180 | answerbox_t sync_box; |
| 178 | 181 | ||
| 179 | ipc_answerbox_init(&sync_box, TASK); |
182 | ipc_answerbox_init(&sync_box, TASK); |
| 180 | 183 | ||
| 181 | /* We will receive data in a special box. */ |
184 | /* We will receive data in a special box. */ |
| 182 | request->callerbox = &sync_box; |
185 | request->callerbox = &sync_box; |
| 183 | 186 | ||
| 184 | ipc_call(phone, request); |
187 | ipc_call(phone, request); |
| 185 | ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
188 | if (!ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, |
| - | 189 | SYNCH_FLAGS_INTERRUPTIBLE)) |
|
| - | 190 | return EINTR; |
|
| - | 191 | return EOK; |
|
| 186 | } |
192 | } |
| 187 | 193 | ||
| 188 | /** Answer a message which was not dispatched and is not listed in any queue. |
194 | /** Answer a message which was not dispatched and is not listed in any queue. |
| 189 | * |
195 | * |
| 190 | * @param call Call structure to be answered. |
196 | * @param call Call structure to be answered. |
| Line 193... | Line 199... | ||
| 193 | { |
199 | { |
| 194 | answerbox_t *callerbox = call->callerbox; |
200 | answerbox_t *callerbox = call->callerbox; |
| 195 | 201 | ||
| 196 | call->flags |= IPC_CALL_ANSWERED; |
202 | call->flags |= IPC_CALL_ANSWERED; |
| 197 | 203 | ||
| - | 204 | if (call->flags & IPC_CALL_FORWARDED) { |
|
| - | 205 | if (call->caller_phone) { |
|
| - | 206 | /* Demasquerade the caller phone. */ |
|
| - | 207 | call->data.phone = call->caller_phone; |
|
| - | 208 | } |
|
| - | 209 | } |
|
| - | 210 | ||
| 198 | spinlock_lock(&callerbox->lock); |
211 | spinlock_lock(&callerbox->lock); |
| 199 | list_append(&call->link, &callerbox->answers); |
212 | list_append(&call->link, &callerbox->answers); |
| 200 | spinlock_unlock(&callerbox->lock); |
213 | spinlock_unlock(&callerbox->lock); |
| 201 | waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); |
214 | waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); |
| 202 | } |
215 | } |
| Line 345... | Line 358... | ||
| 345 | { |
358 | { |
| 346 | spinlock_lock(&oldbox->lock); |
359 | spinlock_lock(&oldbox->lock); |
| 347 | list_remove(&call->link); |
360 | list_remove(&call->link); |
| 348 | spinlock_unlock(&oldbox->lock); |
361 | spinlock_unlock(&oldbox->lock); |
| 349 | 362 | ||
| 350 | if (mode & IPC_FF_ROUTE_FROM_ME) |
363 | if (mode & IPC_FF_ROUTE_FROM_ME) { |
| - | 364 | if (!call->caller_phone) |
|
| - | 365 | call->caller_phone = call->data.phone; |
|
| 351 | call->data.phone = newphone; |
366 | call->data.phone = newphone; |
| - | 367 | } |
|
| 352 | 368 | ||
| 353 | return ipc_call(newphone, call); |
369 | return ipc_call(newphone, call); |
| 354 | } |
370 | } |
| 355 | 371 | ||
| 356 | 372 | ||
| Line 664... | Line 680... | ||
| 664 | printf("ABOX - CALLS:\n"); |
680 | printf("ABOX - CALLS:\n"); |
| 665 | for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls; |
681 | for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls; |
| 666 | tmp = tmp->next) { |
682 | tmp = tmp->next) { |
| 667 | call = list_get_instance(tmp, call_t, link); |
683 | call = list_get_instance(tmp, call_t, link); |
| 668 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
684 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
| 669 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
685 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
| 670 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid, |
686 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, |
| - | 687 | call->sender->taskid, |
|
| 671 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
688 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 672 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
689 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 673 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
690 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 674 | call->flags); |
691 | call->flags); |
| 675 | } |
692 | } |
| Line 678... | Line 695... | ||
| 678 | for (tmp = task->answerbox.dispatched_calls.next; |
695 | for (tmp = task->answerbox.dispatched_calls.next; |
| 679 | tmp != &task->answerbox.dispatched_calls; |
696 | tmp != &task->answerbox.dispatched_calls; |
| 680 | tmp = tmp->next) { |
697 | tmp = tmp->next) { |
| 681 | call = list_get_instance(tmp, call_t, link); |
698 | call = list_get_instance(tmp, call_t, link); |
| 682 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
699 | printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun |
| 683 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
700 | " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun |
| 684 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid, |
701 | " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, |
| - | 702 | call->sender->taskid, |
|
| 685 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
703 | IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 686 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
704 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 687 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
705 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 688 | call->flags); |
706 | call->flags); |
| 689 | } |
707 | } |
| 690 | /* Print answerbox - calls */ |
708 | /* Print answerbox - calls */ |
| 691 | printf("ABOX - ANSWERS:\n"); |
709 | printf("ABOX - ANSWERS:\n"); |
| 692 | for (tmp = task->answerbox.answers.next; tmp != &task->answerbox.answers; |
710 | for (tmp = task->answerbox.answers.next; |
| - | 711 | tmp != &task->answerbox.answers; |
|
| 693 | tmp = tmp->next) { |
712 | tmp = tmp->next) { |
| 694 | call = list_get_instance(tmp, call_t, link); |
713 | call = list_get_instance(tmp, call_t, link); |
| 695 | printf("Callid:%p M:%" PRIun " A1:%" PRIun " A2:%" PRIun |
714 | printf("Callid:%p M:%" PRIun " A1:%" PRIun " A2:%" PRIun |
| 696 | " A3:%" PRIun " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", |
715 | " A3:%" PRIun " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", |
| 697 | call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
716 | call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
| 698 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
717 | IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
| 699 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
718 | IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
| 700 | call->flags); |
719 | call->flags); |
| 701 | } |
720 | } |