Changes in kernel/generic/src/ipc/sysipc.c [706b4de:503ffce] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/sysipc.c
r706b4de r503ffce 286 286 #endif 287 287 288 ipc_call_hold(call);288 kobject_add_ref(call->kobject); 289 289 rc = ipc_call_sync(kobj->phone, call); 290 290 spinlock_lock(&call->forget_lock); 291 291 bool forgotten = call->forget; 292 292 spinlock_unlock(&call->forget_lock); 293 ipc_call_release(call);293 kobject_put(call->kobject); 294 294 295 295 #ifdef CONFIG_UDEBUG … … 306 306 * deallocation. 307 307 */ 308 ipc_call_free(call);308 kobject_put(call->kobject); 309 309 } else { 310 310 /* … … 323 323 324 324 memcpy(data->args, call->data.args, sizeof(data->args)); 325 ipc_call_free(call);325 kobject_put(call->kobject); 326 326 kobject_put(kobj); 327 327 … … 347 347 /** Make a fast asynchronous call over IPC. 348 348 * 349 * This function can only handle fourarguments of payload, but is faster than349 * This function can only handle three arguments of payload, but is faster than 350 350 * the generic function sys_ipc_call_async_slow(). 351 351 * … … 355 355 * @param arg2 Service-defined payload argument. 356 356 * @param arg3 Service-defined payload argument. 357 * @param arg4 Service-defined payload argument.357 * @param label User-defined label. 358 358 * 359 359 * @return Call hash on success. … … 362 362 */ 363 363 sysarg_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) 365 365 { 366 366 kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE); … … 378 378 IPC_SET_ARG2(call->data, arg2); 379 379 IPC_SET_ARG3(call->data, arg3); 380 IPC_SET_ARG4(call->data, arg4);381 380 382 381 /* … … 385 384 */ 386 385 IPC_SET_ARG5(call->data, 0); 386 387 /* Set the user-defined label */ 388 call->data.label = label; 387 389 388 390 int res = request_preprocess(call, kobj->phone); … … 401 403 * @param handle Phone capability for the call. 402 404 * @param data Userspace address of call data with the request. 405 * @param label User-defined label. 403 406 * 404 407 * @return See sys_ipc_call_async_fast(). 405 408 * 406 409 */ 407 sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data) 410 sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data, 411 sysarg_t label) 408 412 { 409 413 kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE); … … 420 424 sizeof(call->data.args)); 421 425 if (rc != 0) { 422 ipc_call_free(call);426 kobject_put(call->kobject); 423 427 kobject_put(kobj); 424 428 return (sysarg_t) rc; 425 429 } 430 431 /* Set the user-defined label */ 432 call->data.label = label; 426 433 427 434 int res = request_preprocess(call, kobj->phone); … … 721 728 * 722 729 * @return Hash of the call. 723 * If IPC_CALLID_NOTIFICATION bit is set in the hash, the724 * call is a notification. IPC_CALLID_ANSWERED denotes an725 * answer.726 *727 730 */ 728 731 sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, … … 751 754 call->data.phone = (void *) call->priv; 752 755 756 call->data.flags = IPC_CALLID_NOTIFICATION; 757 753 758 STRUCT_TO_USPACE(calldata, &call->data); 759 kobject_put(call->kobject); 754 760 755 ipc_call_free(call); 756 757 return ((sysarg_t) call) | IPC_CALLID_NOTIFICATION; 761 return (sysarg_t) call; 758 762 } 759 763 … … 762 766 763 767 if (call->flags & IPC_CALL_DISCARD_ANSWER) { 764 ipc_call_free(call);768 kobject_put(call->kobject); 765 769 goto restart; 766 770 } 771 772 call->data.flags = IPC_CALLID_ANSWERED; 767 773 768 774 STRUCT_TO_USPACE(calldata, &call->data); 769 ipc_call_free(call);775 kobject_put(call->kobject); 770 776 771 return ( (sysarg_t) call) | IPC_CALLID_ANSWERED;777 return (sysarg_t) call; 772 778 } 773 779
Note:
See TracChangeset
for help on using the changeset viewer.