Changeset 48bcf49 in mainline for kernel/generic/src/ipc/ops
- Timestamp:
- 2017-09-28T22:08:15Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6636fb19
- Parents:
- dd20cbb
- Location:
- kernel/generic/src/ipc/ops
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/ops/conctmeto.c
rdd20cbb r48bcf49 1 1 /* 2 2 * Copyright (c) 2006 Ondrej Palkovsky 3 * Copyright (c) 2012 Jakub Jermar 3 * Copyright (c) 2012 Jakub Jermar 4 4 * All rights reserved. 5 5 * … … 42 42 static int request_preprocess(call_t *call, phone_t *phone) 43 43 { 44 int cap= phone_alloc(TASK);44 cap_handle_t phone_handle = phone_alloc(TASK); 45 45 46 46 /* Remember the phone capability or the error. */ 47 call->priv = cap;48 if ( cap< 0)49 return ELIMIT;50 47 call->priv = phone_handle; 48 if (phone_handle < 0) 49 return phone_handle; 50 51 51 /* Set arg5 for server */ 52 IPC_SET_ARG5(call->data, (sysarg_t) phone_get_current(cap)); 52 kobject_t *phone_obj = kobject_get(TASK, phone_handle, 53 KOBJECT_TYPE_PHONE); 54 /* Hand over phone_obj's reference to ARG5 */ 55 IPC_SET_ARG5(call->data, (sysarg_t) phone_obj->phone); 53 56 54 57 return EOK; … … 57 60 static int request_forget(call_t *call) 58 61 { 59 phone_dealloc(call->priv); 62 cap_handle_t phone_handle = (cap_handle_t) call->priv; 63 phone_dealloc(phone_handle); 64 /* Hand over reference from ARG5 to phone->kobject */ 65 phone_t *phone = (phone_t *) IPC_GET_ARG5(call->data); 66 /* Drop phone_obj's reference */ 67 kobject_put(phone->kobject); 60 68 return EOK; 61 69 } … … 63 71 static int answer_preprocess(call_t *answer, ipc_data_t *olddata) 64 72 { 73 /* Hand over reference from ARG5 to phone */ 65 74 phone_t *phone = (phone_t *) IPC_GET_ARG5(*olddata); 66 75 67 76 /* If the user accepted call, connect */ 68 if (IPC_GET_RETVAL(answer->data) == EOK) 77 if (IPC_GET_RETVAL(answer->data) == EOK) { 78 /* Hand over reference from phone to the answerbox */ 69 79 (void) ipc_phone_connect(phone, &TASK->answerbox); 80 } else { 81 kobject_put(phone->kobject); 82 } 70 83 71 84 return EOK; … … 74 87 static int answer_process(call_t *answer) 75 88 { 76 int cap = (int) answer->priv;89 cap_handle_t phone_handle = (cap_handle_t) answer->priv; 77 90 78 91 if (IPC_GET_RETVAL(answer->data)) { 79 if ( cap>= 0) {92 if (phone_handle >= 0) { 80 93 /* 81 94 * The phone was indeed allocated and now needs 82 95 * to be deallocated. 83 96 */ 84 phone_dealloc( cap);97 phone_dealloc(phone_handle); 85 98 } 86 99 } else { 87 IPC_SET_ARG5(answer->data, cap);100 IPC_SET_ARG5(answer->data, phone_handle); 88 101 } 89 102 -
kernel/generic/src/ipc/ops/concttome.c
rdd20cbb r48bcf49 1 1 /* 2 2 * Copyright (c) 2006 Ondrej Palkovsky 3 * Copyright (c) 2012 Jakub Jermar 3 * Copyright (c) 2012 Jakub Jermar 4 4 * All rights reserved. 5 5 * … … 42 42 static int request_process(call_t *call, answerbox_t *box) 43 43 { 44 int cap= phone_alloc(TASK);44 cap_handle_t phone_handle = phone_alloc(TASK); 45 45 46 IPC_SET_ARG5(call->data, cap);46 IPC_SET_ARG5(call->data, phone_handle); 47 47 48 48 return EOK; … … 51 51 static int answer_cleanup(call_t *answer, ipc_data_t *olddata) 52 52 { 53 int cap = (int) IPC_GET_ARG5(*olddata);53 cap_handle_t phone_handle = (cap_handle_t) IPC_GET_ARG5(*olddata); 54 54 55 if ( cap>= 0)56 phone_dealloc( cap);55 if (phone_handle >= 0) 56 phone_dealloc(phone_handle); 57 57 58 58 return EOK; … … 61 61 static int answer_preprocess(call_t *answer, ipc_data_t *olddata) 62 62 { 63 int cap = (int) IPC_GET_ARG5(*olddata);63 cap_handle_t phone_handle = (cap_handle_t) IPC_GET_ARG5(*olddata); 64 64 65 65 if (IPC_GET_RETVAL(answer->data) != EOK) { 66 66 /* The connection was not accepted */ 67 67 answer_cleanup(answer, olddata); 68 } else if ( cap>= 0) {68 } else if (phone_handle >= 0) { 69 69 /* The connection was accepted */ 70 if (phone_connect(cap, &answer->sender->answerbox)) { 71 /* Set 'phone hash' as arg5 of response */ 70 if (phone_connect(phone_handle, &answer->sender->answerbox)) { 71 /* Set 'phone hash' as ARG5 of response */ 72 kobject_t *phone_obj = kobject_get(TASK, phone_handle, 73 KOBJECT_TYPE_PHONE); 72 74 IPC_SET_ARG5(answer->data, 73 (sysarg_t) phone_get_current(cap)); 75 (sysarg_t) phone_obj->phone); 76 kobject_put(phone_obj); 74 77 } else { 75 78 /* The answerbox is shutting down. */ -
kernel/generic/src/ipc/ops/stchngath.c
rdd20cbb r48bcf49 45 45 task_t *other_task_s; 46 46 47 phone_t *sender_phone = phone_get_current(IPC_GET_ARG5(call->data)); 48 if (!sender_phone) 47 kobject_t *sender_obj = kobject_get(TASK, IPC_GET_ARG5(call->data), 48 KOBJECT_TYPE_PHONE); 49 if (!sender_obj) 49 50 return ENOENT; 50 51 51 mutex_lock(&sender_phone->lock); 52 if (sender_phone->state != IPC_PHONE_CONNECTED) { 53 mutex_unlock(&sender_phone->lock); 52 mutex_lock(&sender_obj->phone->lock); 53 if (sender_obj->phone->state != IPC_PHONE_CONNECTED) { 54 mutex_unlock(&sender_obj->phone->lock); 55 kobject_put(sender_obj); 54 56 return EINVAL; 55 57 } 56 58 57 other_task_s = sender_ phone->callee->task;59 other_task_s = sender_obj->phone->callee->task; 58 60 59 mutex_unlock(&sender_ phone->lock);61 mutex_unlock(&sender_obj->phone->lock); 60 62 61 63 /* Remember the third party task hash. */ 62 64 IPC_SET_ARG5(call->data, (sysarg_t) other_task_s); 63 65 66 kobject_put(sender_obj); 64 67 return EOK; 65 68 } … … 71 74 if (!IPC_GET_RETVAL(answer->data)) { 72 75 /* The recipient authorized the change of state. */ 73 phone_t *recipient_phone;74 76 task_t *other_task_s; 75 77 task_t *other_task_r; 76 78 77 recipient_phone = phone_get_current(IPC_GET_ARG1(answer->data)); 78 if (!recipient_phone) { 79 kobject_t *recipient_obj = kobject_get(TASK, 80 IPC_GET_ARG1(answer->data), KOBJECT_TYPE_PHONE); 81 if (!recipient_obj) { 79 82 IPC_SET_RETVAL(answer->data, ENOENT); 80 83 return ENOENT; 81 84 } 82 85 83 mutex_lock(&recipient_ phone->lock);84 if (recipient_ phone->state != IPC_PHONE_CONNECTED) {85 mutex_unlock(&recipient_ phone->lock);86 mutex_lock(&recipient_obj->phone->lock); 87 if (recipient_obj->phone->state != IPC_PHONE_CONNECTED) { 88 mutex_unlock(&recipient_obj->phone->lock); 86 89 IPC_SET_RETVAL(answer->data, EINVAL); 90 kobject_put(recipient_obj); 87 91 return EINVAL; 88 92 } 89 93 90 other_task_r = recipient_ phone->callee->task;94 other_task_r = recipient_obj->phone->callee->task; 91 95 other_task_s = (task_t *) IPC_GET_ARG5(*olddata); 92 96 … … 109 113 } 110 114 111 mutex_unlock(&recipient_phone->lock); 115 mutex_unlock(&recipient_obj->phone->lock); 116 kobject_put(recipient_obj); 112 117 } 113 118
Note:
See TracChangeset
for help on using the changeset viewer.