Ignore:
File:
1 edited

Legend:

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

    r503ffce r706b4de  
    286286#endif
    287287
    288                 kobject_add_ref(call->kobject);
     288                ipc_call_hold(call);
    289289                rc = ipc_call_sync(kobj->phone, call);
    290290                spinlock_lock(&call->forget_lock);
    291291                bool forgotten = call->forget;
    292292                spinlock_unlock(&call->forget_lock);
    293                 kobject_put(call->kobject);
     293                ipc_call_release(call);
    294294
    295295#ifdef CONFIG_UDEBUG
     
    306306                                 * deallocation.
    307307                                 */
    308                                 kobject_put(call->kobject);
     308                                ipc_call_free(call);
    309309                        } else {
    310310                                /*
     
    323323       
    324324        memcpy(data->args, call->data.args, sizeof(data->args));
    325         kobject_put(call->kobject);
     325        ipc_call_free(call);
    326326        kobject_put(kobj);
    327327       
     
    347347/** Make a fast asynchronous call over IPC.
    348348 *
    349  * This function can only handle three arguments of payload, but is faster than
     349 * This function can only handle four arguments of payload, but is faster than
    350350 * the generic function sys_ipc_call_async_slow().
    351351 *
     
    355355 * @param arg2     Service-defined payload argument.
    356356 * @param arg3     Service-defined payload argument.
    357  * @param label    User-defined label.
     357 * @param arg4     Service-defined payload argument.
    358358 *
    359359 * @return Call hash on success.
     
    362362 */
    363363sysarg_t sys_ipc_call_async_fast(sysarg_t handle, sysarg_t imethod,
    364     sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t label)
     364    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4)
    365365{
    366366        kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
     
    378378        IPC_SET_ARG2(call->data, arg2);
    379379        IPC_SET_ARG3(call->data, arg3);
     380        IPC_SET_ARG4(call->data, arg4);
    380381       
    381382        /*
     
    384385         */
    385386        IPC_SET_ARG5(call->data, 0);
    386 
    387         /* Set the user-defined label */
    388         call->data.label = label;
    389387       
    390388        int res = request_preprocess(call, kobj->phone);
     
    403401 * @param handle  Phone capability for the call.
    404402 * @param data    Userspace address of call data with the request.
    405  * @param label   User-defined label.
    406403 *
    407404 * @return See sys_ipc_call_async_fast().
    408405 *
    409406 */
    410 sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data,
    411     sysarg_t label)
     407sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data)
    412408{
    413409        kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
     
    424420            sizeof(call->data.args));
    425421        if (rc != 0) {
    426                 kobject_put(call->kobject);
     422                ipc_call_free(call);
    427423                kobject_put(kobj);
    428424                return (sysarg_t) rc;
    429425        }
    430 
    431         /* Set the user-defined label */
    432         call->data.label = label;
    433426       
    434427        int res = request_preprocess(call, kobj->phone);
     
    728721 *
    729722 * @return Hash of the call.
     723 *         If IPC_CALLID_NOTIFICATION bit is set in the hash, the
     724 *         call is a notification. IPC_CALLID_ANSWERED denotes an
     725 *         answer.
     726 *
    730727 */
    731728sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec,
     
    754751                call->data.phone = (void *) call->priv;
    755752               
    756                 call->data.flags = IPC_CALLID_NOTIFICATION;
    757 
    758753                STRUCT_TO_USPACE(calldata, &call->data);
    759                 kobject_put(call->kobject);
    760754               
    761                 return (sysarg_t) call;
     755                ipc_call_free(call);
     756               
     757                return ((sysarg_t) call) | IPC_CALLID_NOTIFICATION;
    762758        }
    763759       
     
    766762               
    767763                if (call->flags & IPC_CALL_DISCARD_ANSWER) {
    768                         kobject_put(call->kobject);
     764                        ipc_call_free(call);
    769765                        goto restart;
    770766                }
    771 
    772                 call->data.flags = IPC_CALLID_ANSWERED;
    773767               
    774768                STRUCT_TO_USPACE(calldata, &call->data);
    775                 kobject_put(call->kobject);
     769                ipc_call_free(call);
    776770               
    777                 return (sysarg_t) call;
     771                return ((sysarg_t) call) | IPC_CALLID_ANSWERED;
    778772        }
    779773       
Note: See TracChangeset for help on using the changeset viewer.