Files
xen/extras/mini-os/include/wait.h
T
kaf24@firebug.cl.cam.ac.uk 7fc4533b32 Merge in the newer Xenbus implementation from Linux to the Mini-OS. The new
version compiles and starts up, but I'm not really sure how to test the new
xenbus implementation.

* Added unbind_evtchn
* Copied parts of the Linux spinlock implementation to make the changes to
  xenbus compared to Linux smaller. Also added a dummy rwsem implementation.
* Updated the xenbus-files

Signed-off-by: Simon Kagstrom <simon.kagstrom@bth.se>
2005-12-08 15:24:02 +01:00

96 lines
2.7 KiB
C

#ifndef __WAIT_H__
#define __WAIT_H__
#include <sched.h>
#include <list.h>
#include <lib.h>
#include <os.h>
struct wait_queue
{
struct thread *thread;
struct list_head thread_list;
};
struct wait_queue_head
{
/* TODO - lock required? */
struct list_head thread_list;
};
#define DECLARE_WAIT_QUEUE_HEAD(name) \
struct wait_queue_head name = \
{ .thread_list = { &(name).thread_list, &(name).thread_list} }
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \
.thread_list = { &(name).thread_list, &(name).thread_list } }
#define DEFINE_WAIT(name) \
struct wait_queue name = { \
.thread = current, \
.thread_list = LIST_HEAD_INIT((name).thread_list), \
}
static inline void init_waitqueue_head(struct wait_queue_head *h)
{
INIT_LIST_HEAD(&h->thread_list);
}
static inline void init_waitqueue_entry(struct wait_queue *q, struct thread *thread)
{
q->thread = thread;
}
static inline void add_wait_queue(struct wait_queue_head *h, struct wait_queue *q)
{
if (list_empty(&q->thread_list))
list_add(&q->thread_list, &h->thread_list);
}
static inline void remove_wait_queue(struct wait_queue *q)
{
list_del(&q->thread_list);
}
static inline void wake_up(struct wait_queue_head *head)
{
struct list_head *tmp, *next;
list_for_each_safe(tmp, next, &head->thread_list)
{
struct wait_queue *curr;
curr = list_entry(tmp, struct wait_queue, thread_list);
wake(curr->thread);
}
}
#define wait_event(wq, condition) do{ \
unsigned long flags; \
if(condition) \
break; \
DEFINE_WAIT(__wait); \
for(;;) \
{ \
/* protect the list */ \
local_irq_save(flags); \
add_wait_queue(&wq, &__wait); \
block(current); \
local_irq_restore(flags); \
if(condition) \
break; \
schedule(); \
} \
local_irq_save(flags); \
/* need to wake up */ \
wake(current); \
remove_wait_queue(&__wait); \
local_irq_restore(flags); \
} while(0)
#endif /* __WAIT_H__ */