Ignore:
File:
1 edited

Legend:

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

    r09024119 rae66564  
    106106{
    107107        switch (imethod) {
     108        case IPC_M_PAGE_IN:
    108109        case IPC_M_SHARE_OUT:
    109110        case IPC_M_SHARE_IN:
     
    137138        case IPC_M_CONNECT_TO_ME:
    138139        case IPC_M_CONNECT_ME_TO:
     140        case IPC_M_PAGE_IN:
    139141        case IPC_M_SHARE_OUT:
    140142        case IPC_M_SHARE_IN:
     
    257259{
    258260        return SYSIPC_OP(request_process, call, box);
     261}
     262
     263/** Make a call over IPC and wait for reply.
     264 *
     265 * @param phoneid     Phone handle for the call.
     266 * @param data[inout] Structure with request/reply data.
     267 * @param priv        Value to be stored in call->priv.
     268 *
     269 * @return EOK on success.
     270 * @return ENOENT if there is no such phone handle.
     271 *
     272 */
     273int ipc_req_internal(int phoneid, ipc_data_t *data, sysarg_t priv)
     274{
     275        phone_t *phone;
     276        if (phone_get(phoneid, &phone) != EOK)
     277                return ENOENT;
     278       
     279        call_t *call = ipc_call_alloc(0);
     280        call->priv = priv;
     281        memcpy(call->data.args, data->args, sizeof(data->args));
     282       
     283        int rc = request_preprocess(call, phone);
     284        if (!rc) {
     285#ifdef CONFIG_UDEBUG
     286                udebug_stoppable_begin();
     287#endif
     288
     289                ipc_call_hold(call);
     290                rc = ipc_call_sync(phone, call);
     291                spinlock_lock(&call->forget_lock);
     292                bool forgotten = call->forget;
     293                spinlock_unlock(&call->forget_lock);
     294                ipc_call_release(call);
     295
     296#ifdef CONFIG_UDEBUG
     297                udebug_stoppable_end();
     298#endif
     299
     300                if (rc != EOK) {
     301                        if (!forgotten) {
     302                                /*
     303                                 * There was an error, but it did not result
     304                                 * in the call being forgotten. In fact, the
     305                                 * call was not even sent. We are still
     306                                 * its owners and are responsible for its
     307                                 * deallocation.
     308                                 */
     309                                ipc_call_free(call);
     310                        } else {
     311                                /*
     312                                 * The call was forgotten and it changed hands.
     313                                 * We are no longer expected to free it.
     314                                 */
     315                                ASSERT(rc == EINTR);
     316                        }
     317                        return rc;     
     318                }
     319
     320                process_answer(call);
     321        } else
     322                IPC_SET_RETVAL(call->data, rc);
     323       
     324        memcpy(data->args, call->data.args, sizeof(data->args));
     325        ipc_call_free(call);
     326       
     327        return EOK;
    259328}
    260329
Note: See TracChangeset for help on using the changeset viewer.