예제 #1
0
int
ipc_event_recv(int *pid_store, int *event_store, unsigned int timeout) {
    if (event_store == NULL) {
        return -E_INVAL;
    }

    struct mm_struct *mm = current->mm;
    if (pid_store != NULL) {
        if (!user_mem_check(mm, (uintptr_t)pid_store, sizeof(int), 1)) {
            return -E_INVAL;
        }
    }
    if (!user_mem_check(mm, (uintptr_t)event_store, sizeof(int), 1)) {
        return -E_INVAL;
    }

    unsigned long saved_ticks;
    timer_t __timer, *timer = ipc_timer_init(timeout, &saved_ticks, &__timer);

    int pid, event, ret;
    if ((ret = recv_event(&pid, &event, timer)) == 0) {
        lock_mm(mm);
        {
            ret = -E_INVAL;
            if (pid_store == NULL || copy_to_user(mm, pid_store, &pid, sizeof(int))) {
                if (copy_to_user(mm, event_store, &event, sizeof(int))) {
                    ret = 0;
                }
            }
        }
        unlock_mm(mm);
        return ret;
    }
    return ipc_check_timeout(timeout, saved_ticks);
}
예제 #2
0
파일: event.c 프로젝트: Aresthu/ucore_plus
int ipc_event_send(int pid, int event, unsigned int timeout)
{
	struct proc_struct *proc;
	if ((proc = find_proc(pid)) == NULL || proc->state == PROC_ZOMBIE) {
		return -E_INVAL;
	}
	if (proc == current || proc == idleproc || proc == initproc) {
		return -E_INVAL;
	}
#ifdef UCONFIG_SWAP
	if(proc == kswapd)
		return -E_INVAL;
#endif
	if (proc->wait_state == WT_EVENT_RECV) {
		wakeup_proc(proc);
	}
	current->event_box.event = event;

	unsigned long saved_ticks;
	timer_t __timer, *timer =
	    ipc_timer_init(timeout, &saved_ticks, &__timer);

	uint32_t flags;
	if ((flags = send_event(proc, timer)) == 0) {
		return 0;
	}
	assert(flags == WT_INTERRUPTED);
	return ipc_check_timeout(timeout, saved_ticks);
}
예제 #3
0
파일: sem.c 프로젝트: spinlock/ucore
static int
usem_down(semaphore_t *sem, unsigned int timeout) {
    unsigned long saved_ticks;
    timer_t __timer, *timer = ipc_timer_init(timeout, &saved_ticks, &__timer);

    uint32_t flags;
    if ((flags = __down(sem, WT_USEM, timer)) == 0) {
        return 0;
    }
    assert(flags == WT_INTERRUPTED);
    return ipc_check_timeout(timeout, saved_ticks);
}