OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [include/] [l4/] [lib/] [wait.h] - Rev 2

Compare with Previous | Blame | View Log

#ifndef __LIB_WAIT_H__
#define __LIB_WAIT_H__
 
#include <l4/lib/list.h>
#include <l4/lib/spinlock.h>
 
struct ktcb;
struct waitqueue {
	struct link task_list;
	struct ktcb *task;
};
 
#define WAKEUP_ASYNC			0
 
enum wakeup_flags {
	WAKEUP_INTERRUPT = (1 << 0),	/* Set interrupt flag for task */
	WAKEUP_SYNC	 = (1 << 1),	/* Wake it up synchronously */
};
 
#define CREATE_WAITQUEUE_ON_STACK(wq, tsk)		\
struct waitqueue wq = {					\
	.task_list = { &wq.task_list, &wq.task_list },	\
	.task = tsk,					\
};
 
struct waitqueue_head {
	int sleepers;
	struct spinlock slock;
	struct link task_list;
};
 
static inline void waitqueue_head_init(struct waitqueue_head *head)
{
	memset(head, 0, sizeof(struct waitqueue_head));
	link_init(&head->task_list);
}
 
void task_set_wqh(struct ktcb *task, struct waitqueue_head *wqh,
		  struct waitqueue *wq);
 
void task_unset_wqh(struct ktcb *task);
 
 
/*
 * Sleep if the given condition isn't true.
 * ret will tell whether condition was met
 * or we got interrupted.
 */
#define WAIT_EVENT(wqh, condition, ret)				\
do {								\
	ret = 0;						\
	for (;;) {						\
		unsigned long irqsave;				\
		spin_lock_irq(&(wqh)->slock, &irqsave);		\
		if (condition) {				\
			spin_unlock_irq(&(wqh)->slock, irqsave);\
			break;					\
		}						\
		CREATE_WAITQUEUE_ON_STACK(wq, current);		\
		task_set_wqh(current, wqh, &wq);		\
		(wqh)->sleepers++;				\
		list_insert_tail(&wq.task_list, 		\
				 &(wqh)->task_list);		\
		/* printk("(%d) waiting...\n", current->tid); */\
		sched_prepare_sleep();				\
		spin_unlock_irq(&(wqh)->slock, irqsave);	\
		schedule();					\
		/* Did we wake up normally or get interrupted */\
		if (current->flags & TASK_INTERRUPTED) {	\
			current->flags &= ~TASK_INTERRUPTED;	\
			ret = -EINTR;				\
			break;					\
		}						\
	}							\
} while(0);
 
 
void wake_up(struct waitqueue_head *wqh, unsigned int flags);
int wake_up_task(struct ktcb *task, unsigned int flags);
void wake_up_all(struct waitqueue_head *wqh, unsigned int flags);
 
int wait_on(struct waitqueue_head *wqh);
int wait_on_prepare(struct waitqueue_head *wqh, struct waitqueue *wq);
int wait_on_prepared_wait(void);
#endif /* __LIB_WAIT_H__ */
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.