Exemplo n.º 1
0
int shim_do_msgsnd (int msqid, const void * msgp, size_t msgsz, int msgflg)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    int ret;

    if ((msgsz < 0) || (msgsz > MSGMAX))
        return -EINVAL;

    if (!msgp)
        return -EFAULT;

    struct __kernel_msgbuf * msgbuf = (struct __kernel_msgbuf *) msgp;

    if (msgbuf->mtype < 0)
        return -EINVAL;

    struct shim_msg_handle * msgq;
    __try_create_lock();

    if ((ret = connect_msg_handle(msqid, &msgq)) < 0)
        return ret;

    ret = add_sysv_msg(msgq, msgbuf->mtype, msgsz, msgbuf->mtext, NULL);
    put_msg_handle(msgq);
    return ret;
}
Exemplo n.º 2
0
int shim_do_msgctl (int msqid, int cmd, struct msqid_ds * buf)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    struct shim_msg_handle * msgq;
    int ret;
    __try_create_lock();

    if ((ret = connect_msg_handle(msqid, &msgq)) < 0)
       return ret;

    switch (cmd) {
        case IPC_RMID:
            if (!msgq->owned) {
                ret = ipc_sysv_delres_send(NULL, 0, msgq->msqid, SYSV_MSGQ);
                if (ret < 0)
                    break;
            }

            __del_msg_handle(msgq);
            break;

        default:
            ret = -ENOSYS;
            break;
    }

    put_msg_handle(msgq);
    return ret;
}
Exemplo n.º 3
0
noreturn int shim_do_exit_group (int error_code)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    struct shim_thread * cur_thread = get_cur_thread();
    assert(!is_internal(cur_thread));

    if (debug_handle)
        sysparser_printf("---- shim_exit_group (returning %d)\n", error_code);

    if (cur_thread->dummy) {
        cur_thread->term_signal = 0;
        thread_exit(cur_thread, true);
        switch_dummy_thread(cur_thread);
    }

    debug("now kill other threads in the process\n");
    do_kill_proc(cur_thread->tgid, cur_thread->tgid, SIGKILL, false);

    debug("now exit the process\n");
    try_process_exit(error_code, 0);

#ifdef PROFILE
    if (ENTER_TIME)
        SAVE_PROFILE_INTERVAL_SINCE(syscall_exit_group, ENTER_TIME);
#endif

    DkThreadExit();
}
Exemplo n.º 4
0
int shim_do_msgget (key_t key, int msgflg)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    IDTYPE msgid = 0;
    int ret;
    __try_create_lock();

    if (key != IPC_PRIVATE) {
        struct shim_msg_handle * msgq = get_msg_handle_by_key(key);
        if (msgq) {
            msgid = msgq->msqid;
            put_msg_handle(msgq);
            return (msgflg & IPC_EXCL) ? -EEXIST : msgid;
        }
    }

    struct sysv_key k;
    k.key  = key;
    k.type = SYSV_MSGQ;

    if (msgflg & IPC_CREAT) {
        do {
            msgid = allocate_sysv(0, 0);
            if (!msgid)
                ipc_sysv_lease_send(NULL);
        } while (!msgid);

        if (key != IPC_PRIVATE) {
            if ((ret = ipc_sysv_tellkey_send(NULL, 0, &k, msgid, 0)) < 0) {
                release_sysv(msgid);
                return ret;
            }
        }

        add_msg_handle(key, msgid, true);
    } else {
        /* query the manager with the key to find the
           corresponding sysvkey */
        if ((ret = ipc_sysv_findkey_send(&k)) < 0)
            return ret;

        msgid = ret;

        if ((ret = ipc_sysv_query_send(msgid)) < 0)
            return ret;

        add_msg_handle(key, msgid, false);
    }

    return msgid;
}
Exemplo n.º 5
0
int shim_do_msgrcv (int msqid, void * msgp, size_t msgsz, long msgtype,
                    int msgflg)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    int ret;

    if (msgsz < 0)
        return -EINVAL;
    if (!msgp)
        return -EFAULT;

    struct __kernel_msgbuf * msgbuf = (struct __kernel_msgbuf *) msgp;
    struct shim_msg_handle * msgq;
    __try_create_lock();

    if ((ret = connect_msg_handle(msqid, &msgq)) < 0)
        return ret;

    ret = get_sysv_msg(msgq, msgtype, msgsz, msgbuf->mtext, msgflg, NULL);
    put_msg_handle(msgq);
    return ret;
}
Exemplo n.º 6
0
noreturn int shim_do_exit (int error_code)
{
    INC_PROFILE_OCCURENCE(syscall_use_ipc);
    struct shim_thread * cur_thread = get_cur_thread();
    assert(!is_internal(cur_thread));

    if (debug_handle)
        sysparser_printf("---- shim_exit (returning %d)\n", error_code);

    if (cur_thread->dummy) {
        cur_thread->term_signal = 0;
        thread_exit(cur_thread, true);
        switch_dummy_thread(cur_thread);
    }

    try_process_exit(error_code, 0);

#ifdef PROFILE
    if (ENTER_TIME)
        SAVE_PROFILE_INTERVAL_SINCE(syscall_exit, ENTER_TIME);
#endif

    DkThreadExit();
}
Exemplo n.º 7
0
pid_t shim_do_wait4 (pid_t pid, int * status, int option,
                     struct __kernel_rusage * ru)
{
    struct shim_thread * cur = get_cur_thread();
    struct shim_thread * thread = NULL;
    int ret = 0;

    INC_PROFILE_OCCURENCE(syscall_use_ipc);

    if (pid > 0) {
        if (!(thread = lookup_thread(pid)))
            return -ECHILD;

        if (!(option & WNOHANG)) {
block_pid:
            DkObjectsWaitAny(1, &thread->exit_event,
                             NO_TIMEOUT);
        }

        lock(thread->lock);

        if (thread->is_alive) {
            unlock(thread->lock);
            if (!(option & WNOHANG))
                goto block_pid;
            put_thread(thread);
            return 0;
        }

        if (!list_empty(&thread->siblings)) {
            struct shim_thread * parent = thread->parent;
            assert(parent);

            lock(parent->lock);
            list_del_init(&thread->siblings);
            unlock(parent->lock);

            put_thread(parent);
            put_thread(thread);
            thread->parent = NULL;
        }

        unlock(thread->lock);
        goto found;
    }

    lock(cur->lock);

    if (list_empty(&cur->children) &&
        list_empty(&cur->exited_children)) {
        unlock(cur->lock);
        return -ECHILD;
    }

    if (!(option & WNOHANG)) {
block:
        if (cur->child_exit_event)
            while (list_empty(&cur->exited_children)) {
                unlock(cur->lock);
                DkObjectsWaitAny(1, &cur->child_exit_event, NO_TIMEOUT);
                lock(cur->lock);
            }
    }

    if (pid == 0 || pid < -1) {
        if (pid == 0)
            pid = -cur->pgid;

        list_for_each_entry(thread, &cur->exited_children, siblings)
            if (thread->pgid == -pid)
                goto found_child;

        if (!(option & WNOHANG))
            goto block;
    } else {
        if (!list_empty(&cur->exited_children)) {