1 #include <lwk/kernel.h>
6 waitq_init(waitq_t *waitq)
8 spin_lock_init(&waitq->lock);
9 list_head_init(&waitq->waitq);
13 waitq_init_entry(waitq_entry_t *entry, struct task_struct *task)
16 list_head_init(&entry->link);
20 waitq_active(waitq_t *waitq)
23 unsigned long irqstate;
25 spin_lock_irqsave(&waitq->lock, irqstate);
26 active = !list_empty(&waitq->waitq);
27 spin_unlock_irqrestore(&waitq->lock, irqstate);
33 waitq_add_entry(waitq_t *waitq, waitq_entry_t *entry)
35 unsigned long irqstate;
37 spin_lock_irqsave(&waitq->lock, irqstate);
38 BUG_ON(!list_empty(&entry->link));
39 list_add(&entry->link, &waitq->waitq);
40 spin_unlock_irqrestore(&waitq->lock, irqstate);
44 waitq_remove_entry(waitq_t *waitq, waitq_entry_t *entry)
46 unsigned long irqstate;
48 spin_lock_irqsave(&waitq->lock, irqstate);
49 BUG_ON(list_empty(&entry->link));
50 list_del_init(&entry->link);
51 spin_unlock_irqrestore(&waitq->lock, irqstate);
55 waitq_prepare_to_wait(waitq_t *waitq, waitq_entry_t *entry, taskstate_t state)
57 unsigned long irqstate;
59 spin_lock_irqsave(&waitq->lock, irqstate);
60 if (list_empty(&entry->link))
61 list_add(&entry->link, &waitq->waitq);
62 set_mb(entry->task->state, state);
63 spin_unlock_irqrestore(&waitq->lock, irqstate);
67 waitq_finish_wait(waitq_t *waitq, waitq_entry_t *entry)
69 set_mb(entry->task->state, TASKSTATE_READY);
70 waitq_remove_entry(waitq, entry);
74 waitq_wakeup(waitq_t *waitq)
76 unsigned long irqstate;
77 struct list_head *tmp;
80 spin_lock_irqsave(&waitq->lock, irqstate);
81 list_for_each(tmp, &waitq->waitq) {
82 entry = list_entry(tmp, waitq_entry_t, link);
85 (TASKSTATE_UNINTERRUPTIBLE | TASKSTATE_INTERRUPTIBLE)
88 spin_unlock_irqrestore(&waitq->lock, irqstate);