Ignore:
File:
1 edited

Legend:

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

    r706b4de r503ffce  
    286286#endif
    287287
    288                 ipc_call_hold(call);
     288                kobject_add_ref(call->kobject);
    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                 ipc_call_release(call);
     293                kobject_put(call->kobject);
    294294
    295295#ifdef CONFIG_UDEBUG
     
    306306                                 * deallocation.
    307307                                 */
    308                                 ipc_call_free(call);
     308                                kobject_put(call->kobject);
    309309                        } else {
    310310                                /*
     
    323323       
    324324        memcpy(data->args, call->data.args, sizeof(data->args));
    325         ipc_call_free(call);
     325        kobject_put(call->kobject);
    326326        kobject_put(kobj);
    327327       
     
    347347/** Make a fast asynchronous call over IPC.
    348348 *
    349  * This function can only handle four arguments of payload, but is faster than
     349 * This function can only handle three 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 arg4     Service-defined payload argument.
     357 * @param label    User-defined label.
    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 arg4)
     364    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t label)
    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);
    381380       
    382381        /*
     
    385384         */
    386385        IPC_SET_ARG5(call->data, 0);
     386
     387        /* Set the user-defined label */
     388        call->data.label = label;
    387389       
    388390        int res = request_preprocess(call, kobj->phone);
     
    401403 * @param handle  Phone capability for the call.
    402404 * @param data    Userspace address of call data with the request.
     405 * @param label   User-defined label.
    403406 *
    404407 * @return See sys_ipc_call_async_fast().
    405408 *
    406409 */
    407 sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data)
     410sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data,
     411    sysarg_t label)
    408412{
    409413        kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
     
    420424            sizeof(call->data.args));
    421425        if (rc != 0) {
    422                 ipc_call_free(call);
     426                kobject_put(call->kobject);
    423427                kobject_put(kobj);
    424428                return (sysarg_t) rc;
    425429        }
     430
     431        /* Set the user-defined label */
     432        call->data.label = label;
    426433       
    427434        int res = request_preprocess(call, kobj->phone);
     
    721728 *
    722729 * @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  *
    727730 */
    728731sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec,
     
    751754                call->data.phone = (void *) call->priv;
    752755               
     756                call->data.flags = IPC_CALLID_NOTIFICATION;
     757
    753758                STRUCT_TO_USPACE(calldata, &call->data);
     759                kobject_put(call->kobject);
    754760               
    755                 ipc_call_free(call);
    756                
    757                 return ((sysarg_t) call) | IPC_CALLID_NOTIFICATION;
     761                return (sysarg_t) call;
    758762        }
    759763       
     
    762766               
    763767                if (call->flags & IPC_CALL_DISCARD_ANSWER) {
    764                         ipc_call_free(call);
     768                        kobject_put(call->kobject);
    765769                        goto restart;
    766770                }
     771
     772                call->data.flags = IPC_CALLID_ANSWERED;
    767773               
    768774                STRUCT_TO_USPACE(calldata, &call->data);
    769                 ipc_call_free(call);
     775                kobject_put(call->kobject);
    770776               
    771                 return ((sysarg_t) call) | IPC_CALLID_ANSWERED;
     777                return (sysarg_t) call;
    772778        }
    773779       
Note: See TracChangeset for help on using the changeset viewer.