Changeset e8039a86 in mainline for kernel/generic/src/ipc/ops/stchngath.c
- Timestamp:
- 2012-08-20T23:21:41Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0343a1b
- Parents:
- 642dc72
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/ops/stchngath.c
r642dc72 re8039a86 34 34 35 35 #include <ipc/sysipc_ops.h> 36 #include <ipc/ipc.h> 37 #include <ipc/ipcrsc.h> 38 #include <synch/mutex.h> 39 #include <proc/task.h> 40 #include <abi/errno.h> 41 #include <macros.h> 42 43 static int request_preprocess(call_t *call, phone_t *phone) 44 { 45 phone_t *sender_phone; 46 task_t *other_task_s; 47 48 if (phone_get(IPC_GET_ARG5(call->data), &sender_phone) != EOK) 49 return ENOENT; 50 51 mutex_lock(&sender_phone->lock); 52 if (sender_phone->state != IPC_PHONE_CONNECTED) { 53 mutex_unlock(&sender_phone->lock); 54 return EINVAL; 55 } 56 57 other_task_s = sender_phone->callee->task; 58 59 mutex_unlock(&sender_phone->lock); 60 61 /* Remember the third party task hash. */ 62 IPC_SET_ARG5(call->data, (sysarg_t) other_task_s); 63 64 return EOK; 65 } 66 67 static int answer_preprocess(call_t *answer, ipc_data_t *olddata) 68 { 69 int rc = EOK; 70 71 if (!IPC_GET_RETVAL(answer->data)) { 72 /* The recipient authorized the change of state. */ 73 phone_t *recipient_phone; 74 task_t *other_task_s; 75 task_t *other_task_r; 76 77 rc = phone_get(IPC_GET_ARG1(answer->data), 78 &recipient_phone); 79 if (rc != EOK) { 80 IPC_SET_RETVAL(answer->data, ENOENT); 81 return ENOENT; 82 } 83 84 mutex_lock(&recipient_phone->lock); 85 if (recipient_phone->state != IPC_PHONE_CONNECTED) { 86 mutex_unlock(&recipient_phone->lock); 87 IPC_SET_RETVAL(answer->data, EINVAL); 88 return EINVAL; 89 } 90 91 other_task_r = recipient_phone->callee->task; 92 other_task_s = (task_t *) IPC_GET_ARG5(*olddata); 93 94 /* 95 * See if both the sender and the recipient meant the 96 * same third party task. 97 */ 98 if (other_task_r != other_task_s) { 99 IPC_SET_RETVAL(answer->data, EINVAL); 100 rc = EINVAL; 101 } else { 102 rc = event_task_notify_5(other_task_r, 103 EVENT_TASK_STATE_CHANGE, false, 104 IPC_GET_ARG1(*olddata), 105 IPC_GET_ARG2(*olddata), 106 IPC_GET_ARG3(*olddata), 107 LOWER32(olddata->task_id), 108 UPPER32(olddata->task_id)); 109 IPC_SET_RETVAL(answer->data, rc); 110 } 111 112 mutex_unlock(&recipient_phone->lock); 113 } 114 115 return rc; 116 } 36 117 37 118 sysipc_ops_t ipc_m_state_change_authorize_ops = { 38 .request_preprocess = null_request_preprocess,119 .request_preprocess = request_preprocess, 39 120 .request_process = null_request_process, 40 .answer_preprocess = null_answer_preprocess,121 .answer_preprocess = answer_preprocess, 41 122 .answer_process = null_answer_process, 42 123 };
Note:
See TracChangeset
for help on using the changeset viewer.