Subversion Repositories HelenOS

Rev

Rev 2619 | Rev 2622 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2619 Rev 2620
Line 318... Line 318...
318
        IPC_SET_METHOD(call->u.msg.data, method);
318
        IPC_SET_METHOD(call->u.msg.data, method);
319
        IPC_SET_ARG1(call->u.msg.data, arg1);
319
        IPC_SET_ARG1(call->u.msg.data, arg1);
320
        IPC_SET_ARG2(call->u.msg.data, arg2);
320
        IPC_SET_ARG2(call->u.msg.data, arg2);
321
        IPC_SET_ARG3(call->u.msg.data, arg3);
321
        IPC_SET_ARG3(call->u.msg.data, arg3);
322
        IPC_SET_ARG4(call->u.msg.data, arg4);
322
        IPC_SET_ARG4(call->u.msg.data, arg4);
-
 
323
        /*
-
 
324
         * To achieve deterministic behavior, we always zero out the
-
 
325
         * arguments that are beyond the limits of the fast version.
-
 
326
         */
-
 
327
        IPC_SET_ARG5(call->u.msg.data, 0);
323
    }
328
    }
324
    ipc_finish_async(callid, phoneid, call, can_preempt);
329
    ipc_finish_async(callid, phoneid, call, can_preempt);
325
}
330
}
326
 
331
 
327
/** Make an asynchronous call transmitting the entire payload.
332
/** Make an asynchronous call transmitting the entire payload.
Line 433... Line 438...
433
     * ipc_call_async_*(), until it is added to dispatched_calls.
438
     * ipc_call_async_*(), until it is added to dispatched_calls.
434
     */
439
     */
435
    futex_down(&async_futex);
440
    futex_down(&async_futex);
436
    while (!list_empty(&queued_calls)) {
441
    while (!list_empty(&queued_calls)) {
437
        call = list_get_instance(queued_calls.next, async_call_t, list);
442
        call = list_get_instance(queued_calls.next, async_call_t, list);
438
        callid = _ipc_call_async(call->u.msg.phoneid, &call->u.msg.data);
443
        callid = _ipc_call_async(call->u.msg.phoneid,
-
 
444
            &call->u.msg.data);
439
        if (callid == IPC_CALLRET_TEMPORARY) {
445
        if (callid == IPC_CALLRET_TEMPORARY) {
440
            break;
446
            break;
441
        }
447
        }
442
        list_remove(&call->list);
448
        list_remove(&call->list);
443
 
449
 
Line 643... Line 649...
643
 *
649
 *
644
 * @return      Zero on success or an error code.
650
 * @return      Zero on success or an error code.
645
 *
651
 *
646
 * For non-system methods, the old method and arg1 are rewritten by the new
652
 * For non-system methods, the old method and arg1 are rewritten by the new
647
 * values. For system methods, the new method and arg1 are written to the old
653
 * values. For system methods, the new method and arg1 are written to the old
648
 * arg1 and arg2, respectivelly.
654
 * arg1 and arg2, respectivelly. Calls with immutable methods are forwarded
-
 
655
 * verbatim.
649
 */
656
 */
650
int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method, ipcarg_t arg1)
657
int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method,
-
 
658
    ipcarg_t arg1)
651
{
659
{
652
    return __SYSCALL4(SYS_IPC_FORWARD_FAST, callid, phoneid, method, arg1);
660
    return __SYSCALL4(SYS_IPC_FORWARD_FAST, callid, phoneid, method, arg1);
653
}
661
}
654
 
662
 
655
/** Wrapper for making IPC_M_DATA_SEND calls.
663
/** Wrapper for making IPC_M_DATA_SEND calls.