Changeset d51a0d6 in mainline for kernel/generic/src/ipc/ipc.c
- Timestamp:
- 2017-11-21T22:23:00Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 35f2bb1
- Parents:
- c4c6025
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/ipc.c
rc4c6025 rd51a0d6 87 87 } 88 88 89 void ipc_call_hold(call_t *call) 90 { 91 atomic_inc(&call->refcnt); 92 } 93 94 void ipc_call_release(call_t *call) 95 { 96 if (atomic_predec(&call->refcnt) == 0) { 97 if (call->buffer) 98 free(call->buffer); 99 if (call->caller_phone) 100 kobject_put(call->caller_phone->kobject); 101 slab_free(call_slab, call); 102 } 103 } 89 static void call_destroy(void *arg) 90 { 91 call_t *call = (call_t *) arg; 92 93 if (call->buffer) 94 free(call->buffer); 95 if (call->caller_phone) 96 kobject_put(call->caller_phone->kobject); 97 slab_free(call_slab, call); 98 } 99 100 static kobject_ops_t call_kobject_ops = { 101 .destroy = call_destroy 102 }; 104 103 105 104 /** Allocate and initialize a call structure. … … 117 116 { 118 117 call_t *call = slab_alloc(call_slab, flags); 119 if (call) { 120 _ipc_call_init(call); 121 ipc_call_hold(call); 122 } 118 if (!call) 119 return NULL; 120 kobject_t *kobj = (kobject_t *) malloc(sizeof(kobject_t), flags); 121 if (!kobj) { 122 slab_free(call_slab, call); 123 return NULL; 124 } 125 126 _ipc_call_init(call); 127 kobject_initialize(kobj, KOBJECT_TYPE_CALL, call, &call_kobject_ops); 128 call->kobject = kobj; 123 129 124 130 return call; 125 }126 127 /** Deallocate a call structure.128 *129 * @param call Call structure to be freed.130 *131 */132 void ipc_call_free(call_t *call)133 {134 ipc_call_release(call);135 131 } 136 132 … … 290 286 /* This is a forgotten call and call->sender is not valid. */ 291 287 spinlock_unlock(&call->forget_lock); 292 ipc_call_free(call);288 kobject_put(call->kobject); 293 289 return; 294 290 } else { … … 705 701 * must hold a reference to it. 706 702 */ 707 ipc_call_hold(call);703 kobject_add_ref(call->kobject); 708 704 709 705 spinlock_unlock(&call->forget_lock); … … 714 710 SYSIPC_OP(request_forget, call); 715 711 716 ipc_call_release(call);712 kobject_put(call->kobject); 717 713 } 718 714 … … 822 818 SYSIPC_OP(answer_process, call); 823 819 824 ipc_call_free(call);820 kobject_put(call->kobject); 825 821 goto restart; 826 822 }
Note:
See TracChangeset
for help on using the changeset viewer.