Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/ipc.c

    r706b4de rc170438  
    148148        }
    149149       
     150        if (callid == (ipc_callid_t) IPC_CALLRET_TEMPORARY) {
     151                futex_unlock(&ipc_futex);
     152               
     153                call->u.msg.phoneid = phoneid;
     154               
     155                futex_down(&async_futex);
     156                list_append(&call->list, &queued_calls);
     157               
     158                call->fid = fibril_get_id();
     159                fibril_switch(FIBRIL_TO_MANAGER);
     160                /* Async futex unlocked by previous call */
     161               
     162                return;
     163        }
     164       
    150165        call->u.callid = callid;
    151166       
     
    195210        ipc_callid_t callid = __SYSCALL6(SYS_IPC_CALL_ASYNC_FAST, phoneid,
    196211            imethod, arg1, arg2, arg3, arg4);
     212       
     213        if (callid == (ipc_callid_t) IPC_CALLRET_TEMPORARY) {
     214                if (!call) {
     215                        call = ipc_prepare_async(private, callback);
     216                        if (!call) {
     217                                futex_unlock(&ipc_futex);
     218                                return;
     219                        }
     220                }
     221               
     222                IPC_SET_IMETHOD(call->u.msg.data, imethod);
     223                IPC_SET_ARG1(call->u.msg.data, arg1);
     224                IPC_SET_ARG2(call->u.msg.data, arg2);
     225                IPC_SET_ARG3(call->u.msg.data, arg3);
     226                IPC_SET_ARG4(call->u.msg.data, arg4);
     227               
     228                /*
     229                 * To achieve deterministic behavior, we always zero out the
     230                 * arguments that are beyond the limits of the fast version.
     231                 */
     232               
     233                IPC_SET_ARG5(call->u.msg.data, 0);
     234        }
    197235       
    198236        ipc_finish_async(callid, phoneid, call);
     
    313351                ipc_callid_t callid =
    314352                    ipc_call_async_internal(call->u.msg.phoneid, &call->u.msg.data);
     353               
     354                if (callid == (ipc_callid_t) IPC_CALLRET_TEMPORARY)
     355                        break;
    315356               
    316357                list_remove(&call->list);
Note: See TracChangeset for help on using the changeset viewer.