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); } } }
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); } }
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; }
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); }
__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); }