Ignore:
File:
1 edited

Legend:

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

    rc1f68b0 rd51a0d6  
    8787}
    8888
    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 }
     89static 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
     100static kobject_ops_t call_kobject_ops = {
     101        .destroy = call_destroy
     102};
    104103
    105104/** Allocate and initialize a call structure.
     
    117116{
    118117        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;
    123129       
    124130        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);
    135131}
    136132
     
    290286                /* This is a forgotten call and call->sender is not valid. */
    291287                spinlock_unlock(&call->forget_lock);
    292                 ipc_call_free(call);
     288                kobject_put(call->kobject);
    293289                return;
    294290        } else {
     
    705701         * must hold a reference to it.
    706702         */
    707         ipc_call_hold(call);
     703        kobject_add_ref(call->kobject);
    708704
    709705        spinlock_unlock(&call->forget_lock);
     
    714710        SYSIPC_OP(request_forget, call);
    715711
    716         ipc_call_release(call);
     712        kobject_put(call->kobject);
    717713}
    718714
     
    822818        SYSIPC_OP(answer_process, call);
    823819
    824         ipc_call_free(call);
     820        kobject_put(call->kobject);
    825821        goto restart;
    826822}
Note: See TracChangeset for help on using the changeset viewer.