Beispiel #1
0
void wakeup_queue(wait_queue_t * queue, uint32_t wakeup_flags, bool del)
{
	wait_t *wait;
	if ((wait = wait_queue_first(queue)) != NULL) {
		if (del) {
			do {
				wakeup_wait(queue, wait, wakeup_flags, 1);
			} while ((wait = wait_queue_first(queue)) != NULL);
		} else {
			do {
				wakeup_wait(queue, wait, wakeup_flags, 0);
			} while ((wait = wait_queue_next(queue, wait)) != NULL);
		}
	}
}
Beispiel #2
0
void
wakeup_first(wait_queue_t *queue, uint32_t wakeup_flags, bool del) {
    wait_t *wait;
    if ((wait = wait_queue_first(queue)) != NULL) {
        wakeup_wait(queue, wait, wakeup_flags, del);
    }
}
Beispiel #3
0
static int
recv_event(int *pid_store, int *event_store, timer_t *timer) {
    bool intr_flag;
    local_intr_save(intr_flag);
    wait_queue_t *wait_queue = &(current->event_box.wait_queue);
    if (wait_queue_empty(wait_queue)) {
        current->state = PROC_SLEEPING;
        current->wait_state = WT_EVENT_RECV;
        ipc_add_timer(timer);
        local_intr_restore(intr_flag);

        schedule();

        local_intr_save(intr_flag);
        ipc_del_timer(timer);
    }

    int ret = -1;

    wait_t *wait;
    if ((wait = wait_queue_first(wait_queue)) != NULL) {
        struct proc_struct *proc = wait->proc;
        *pid_store = proc->pid, *event_store = proc->event_box.event, ret = 0;
        wakeup_wait(wait_queue, wait, WT_EVENT_SEND, 1);
    }
    local_intr_restore(intr_flag);
    return ret;
}
Beispiel #4
0
static __noinline void __up(semaphore_t *sem, uint32_t wait_state) {
    bool intr_flag;
    local_intr_save(intr_flag);
    {
        wait_t *wait;
        if ((wait = wait_queue_first(&(sem->wait_queue))) == NULL) {
            sem->value ++;
        }
        else {
            assert(wait->proc->wait_state == wait_state);
            wakeup_wait(&(sem->wait_queue), wait, wait_state, 1);
        }
    }
    local_intr_restore(intr_flag);
}
Beispiel #5
0
    __attribute__ ((noinline)) __up(semaphore_t * sem, uint32_t wait_state)
{
	assert(sem->valid);
	bool intr_flag;
	spin_lock_irqsave(&sem->lock, intr_flag);
	{
		wait_t *wait;
		if ((wait = wait_queue_first(&(sem->wait_queue))) == NULL) {
			sem->value++;
		} else {
			assert(wait->proc->wait_state == wait_state);
			wakeup_wait(&(sem->wait_queue), wait, wait_state, 1);
		}
	}
	spin_unlock_irqrestore(&sem->lock, intr_flag);
}