Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/ipc.c

    rd51a0d6 rc1f68b0  
    8787}
    8888
    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 };
     89void ipc_call_hold(call_t *call)
     90{
     91        atomic_inc(&call->refcnt);
     92}
     93
     94void 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}
    103104
    104105/** Allocate and initialize a call structure.
     
    116117{
    117118        call_t *call = slab_alloc(call_slab, flags);
    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;
     119        if (call) {
     120                _ipc_call_init(call);
     121                ipc_call_hold(call);
     122        }
    129123       
    130124        return call;
     125}
     126
     127/** Deallocate a call structure.
     128 *
     129 * @param call Call structure to be freed.
     130 *
     131 */
     132void ipc_call_free(call_t *call)
     133{
     134        ipc_call_release(call);
    131135}
    132136
     
    286290                /* This is a forgotten call and call->sender is not valid. */
    287291                spinlock_unlock(&call->forget_lock);
    288                 kobject_put(call->kobject);
     292                ipc_call_free(call);
    289293                return;
    290294        } else {
     
    701705         * must hold a reference to it.
    702706         */
    703         kobject_add_ref(call->kobject);
     707        ipc_call_hold(call);
    704708
    705709        spinlock_unlock(&call->forget_lock);
     
    710714        SYSIPC_OP(request_forget, call);
    711715
    712         kobject_put(call->kobject);
     716        ipc_call_release(call);
    713717}
    714718
     
    818822        SYSIPC_OP(answer_process, call);
    819823
    820         kobject_put(call->kobject);
     824        ipc_call_free(call);
    821825        goto restart;
    822826}
Note: See TracChangeset for help on using the changeset viewer.