Ignore:
Timestamp:
2012-08-20T23:21:41Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0343a1b
Parents:
642dc72
Message:

Separate system IPC logic into dedicated ops structure hooks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/ops/stchngath.c

    r642dc72 re8039a86  
    3434
    3535#include <ipc/sysipc_ops.h>
     36#include <ipc/ipc.h>
     37#include <ipc/ipcrsc.h>
     38#include <synch/mutex.h>
     39#include <proc/task.h>
     40#include <abi/errno.h>
     41#include <macros.h>
     42
     43static int request_preprocess(call_t *call, phone_t *phone)
     44{
     45        phone_t *sender_phone;
     46        task_t *other_task_s;
     47
     48        if (phone_get(IPC_GET_ARG5(call->data), &sender_phone) != EOK)
     49                return ENOENT;
     50
     51        mutex_lock(&sender_phone->lock);
     52        if (sender_phone->state != IPC_PHONE_CONNECTED) {
     53                mutex_unlock(&sender_phone->lock);
     54                return EINVAL;
     55        }
     56
     57        other_task_s = sender_phone->callee->task;
     58
     59        mutex_unlock(&sender_phone->lock);
     60
     61        /* Remember the third party task hash. */
     62        IPC_SET_ARG5(call->data, (sysarg_t) other_task_s);
     63
     64        return EOK;
     65}
     66
     67static int answer_preprocess(call_t *answer, ipc_data_t *olddata)
     68{
     69        int rc = EOK;
     70
     71        if (!IPC_GET_RETVAL(answer->data)) {
     72                /* The recipient authorized the change of state. */
     73                phone_t *recipient_phone;
     74                task_t *other_task_s;
     75                task_t *other_task_r;
     76
     77                rc = phone_get(IPC_GET_ARG1(answer->data),
     78                    &recipient_phone);
     79                if (rc != EOK) {
     80                        IPC_SET_RETVAL(answer->data, ENOENT);
     81                        return ENOENT;
     82                }
     83
     84                mutex_lock(&recipient_phone->lock);
     85                if (recipient_phone->state != IPC_PHONE_CONNECTED) {
     86                        mutex_unlock(&recipient_phone->lock);
     87                        IPC_SET_RETVAL(answer->data, EINVAL);
     88                        return EINVAL;
     89                }
     90
     91                other_task_r = recipient_phone->callee->task;
     92                other_task_s = (task_t *) IPC_GET_ARG5(*olddata);
     93
     94                /*
     95                 * See if both the sender and the recipient meant the
     96                 * same third party task.
     97                 */
     98                if (other_task_r != other_task_s) {
     99                        IPC_SET_RETVAL(answer->data, EINVAL);
     100                        rc = EINVAL;
     101                } else {
     102                        rc = event_task_notify_5(other_task_r,
     103                            EVENT_TASK_STATE_CHANGE, false,
     104                            IPC_GET_ARG1(*olddata),
     105                            IPC_GET_ARG2(*olddata),
     106                            IPC_GET_ARG3(*olddata),
     107                            LOWER32(olddata->task_id),
     108                            UPPER32(olddata->task_id));
     109                        IPC_SET_RETVAL(answer->data, rc);
     110                }
     111
     112                mutex_unlock(&recipient_phone->lock);
     113        }
     114
     115        return rc;
     116}
    36117
    37118sysipc_ops_t ipc_m_state_change_authorize_ops = {
    38         .request_preprocess = null_request_preprocess,
     119        .request_preprocess = request_preprocess,
    39120        .request_process = null_request_process,
    40         .answer_preprocess = null_answer_preprocess,
     121        .answer_preprocess = answer_preprocess,
    41122        .answer_process = null_answer_process,
    42123};
Note: See TracChangeset for help on using the changeset viewer.