Changeset 5d3ed34 in mainline
- Timestamp:
- 2012-09-03T21:39:37Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9c9bbaf
- Parents:
- 9ef1b79b
- Location:
- kernel/generic
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/ipc.h
r9ef1b79b r5d3ed34 179 179 extern void ipc_backsend_err(phone_t *, call_t *, sysarg_t); 180 180 extern void ipc_answerbox_slam_phones(answerbox_t *, bool); 181 extern void ipc_cleanup_call_list( list_t *);181 extern void ipc_cleanup_call_list(answerbox_t *, list_t *); 182 182 183 183 extern void ipc_print_task(task_id_t); -
kernel/generic/src/ipc/ipc.c
r9ef1b79b r5d3ed34 46 46 #include <ipc/event.h> 47 47 #include <ipc/sysipc_ops.h> 48 #include <ipc/sysipc_priv.h> 48 49 #include <errno.h> 49 50 #include <mm/slab.h> … … 475 476 /** Answer all calls from list with EHANGUP answer. 476 477 * 478 * @param box Answerbox with the list. 477 479 * @param lst Head of the list to be cleaned up. 478 * 479 */ 480 void ipc_cleanup_call_list(list_t *lst) 481 { 480 */ 481 void ipc_cleanup_call_list(answerbox_t *box, list_t *lst) 482 { 483 irq_spinlock_lock(&box->lock, true); 482 484 while (!list_empty(lst)) { 483 485 call_t *call = list_get_instance(list_first(lst), call_t, … … 485 487 486 488 list_remove(&call->ab_link); 487 489 490 irq_spinlock_unlock(&box->lock, true); 491 492 ipc_data_t old = call->data; 488 493 IPC_SET_RETVAL(call->data, EHANGUP); 494 answer_preprocess(call, &old); 489 495 _ipc_answer_free_call(call, true); 490 } 496 497 irq_spinlock_lock(&box->lock, true); 498 } 499 irq_spinlock_unlock(&box->lock, true); 491 500 } 492 501 … … 694 703 695 704 /* Answer all messages in 'calls' and 'dispatched_calls' queues */ 696 irq_spinlock_lock(&TASK->answerbox.lock, true); 697 ipc_cleanup_call_list(&TASK->answerbox.dispatched_calls); 698 ipc_cleanup_call_list(&TASK->answerbox.calls); 699 irq_spinlock_unlock(&TASK->answerbox.lock, true); 705 ipc_cleanup_call_list(&TASK->answerbox, 706 &TASK->answerbox.dispatched_calls); 707 ipc_cleanup_call_list(&TASK->answerbox, &TASK->answerbox.calls); 700 708 701 709 ipc_forget_all_active_calls(); -
kernel/generic/src/ipc/kbox.c
r9ef1b79b r5d3ed34 88 88 89 89 /* Answer all messages in 'calls' and 'dispatched_calls' queues. */ 90 irq_spinlock_lock(&TASK->kb.box.lock, true); 91 ipc_cleanup_call_list(&TASK->kb.box.dispatched_calls); 92 ipc_cleanup_call_list(&TASK->kb.box.calls); 93 irq_spinlock_unlock(&TASK->kb.box.lock, true); 90 ipc_cleanup_call_list(&TASK->kb.box, &TASK->kb.box.dispatched_calls); 91 ipc_cleanup_call_list(&TASK->kb.box, &TASK->kb.box.calls); 94 92 } 95 93 -
kernel/generic/src/ipc/ops/concttome.c
r9ef1b79b r5d3ed34 40 40 #include <arch.h> 41 41 42 static int request_preprocess(call_t *call, phone_t *phone) 43 { 44 /* Start with the assumption that there is no allocated phoneid. */ 45 IPC_SET_ARG5(call->data, -1); 46 return EOK; 47 } 48 42 49 static int request_process(call_t *call, answerbox_t *box) 43 50 { 44 51 int phoneid = phone_alloc(TASK); 45 52 46 if (phoneid < 0) {47 IPC_SET_RETVAL(call->data, ELIMIT);48 /*49 * This is a shortcut which bypasses the standard call50 * processing hooks. We are still playing it save here as51 * there is no state to be cleaned up at this stage.52 */53 ipc_answer(box, call);54 return -1;55 }56 57 53 IPC_SET_ARG5(call->data, phoneid); 58 54 … … 64 60 int phoneid = (int) IPC_GET_ARG5(*olddata); 65 61 66 phone_dealloc(phoneid); 62 if (phoneid >= 0) 63 phone_dealloc(phoneid); 67 64 } 68 65 … … 74 71 /* The connection was not accepted */ 75 72 answer_cleanup(answer, olddata); 76 } else {73 } else if (phoneid >= 0) { 77 74 /* The connection was accepted */ 78 75 phone_connect(phoneid, &answer->sender->answerbox); 79 76 /* Set 'phone hash' as arg5 of response */ 80 77 IPC_SET_ARG5(answer->data, (sysarg_t) &TASK->phones[phoneid]); 78 } else { 79 IPC_SET_RETVAL(answer->data, ELIMIT); 81 80 } 82 81 … … 86 85 87 86 sysipc_ops_t ipc_m_connect_to_me_ops = { 88 .request_preprocess = null_request_preprocess,87 .request_preprocess = request_preprocess, 89 88 .request_forget = null_request_forget, 90 89 .request_process = request_process, -
kernel/generic/src/ipc/sysipc.c
r9ef1b79b r5d3ed34 40 40 #include <ipc/sysipc.h> 41 41 #include <ipc/sysipc_ops.h> 42 #include <ipc/sysipc_priv.h> 42 43 #include <ipc/irq.h> 43 44 #include <ipc/ipcrsc.h> … … 157 158 * 158 159 */ 159 staticint answer_preprocess(call_t *answer, ipc_data_t *olddata)160 int answer_preprocess(call_t *answer, ipc_data_t *olddata) 160 161 { 161 162 int rc = EOK;
Note:
See TracChangeset
for help on using the changeset viewer.