mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 12:39:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __LINUX_COMPLETION_H
 | |
| #define __LINUX_COMPLETION_H
 | |
| 
 | |
| /*
 | |
|  * (C) Copyright 2001 Linus Torvalds
 | |
|  *
 | |
|  * Atomic wait-for-completion handler data structures.
 | |
|  * See kernel/sched.c for details.
 | |
|  */
 | |
| 
 | |
| #include <linux/wait.h>
 | |
| 
 | |
| struct completion {
 | |
| 	unsigned int done;
 | |
| 	wait_queue_head_t wait;
 | |
| };
 | |
| 
 | |
| #define COMPLETION_INITIALIZER(work) \
 | |
| 	{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
 | |
| 
 | |
| #define COMPLETION_INITIALIZER_ONSTACK(work) \
 | |
| 	({ init_completion(&work); work; })
 | |
| 
 | |
| #define DECLARE_COMPLETION(work) \
 | |
| 	struct completion work = COMPLETION_INITIALIZER(work)
 | |
| 
 | |
| /*
 | |
|  * Lockdep needs to run a non-constant initializer for on-stack
 | |
|  * completions - so we use the _ONSTACK() variant for those that
 | |
|  * are on the kernel stack:
 | |
|  */
 | |
| #ifdef CONFIG_LOCKDEP
 | |
| # define DECLARE_COMPLETION_ONSTACK(work) \
 | |
| 	struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
 | |
| #else
 | |
| # define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
 | |
| #endif
 | |
| 
 | |
| static inline void init_completion(struct completion *x)
 | |
| {
 | |
| 	x->done = 0;
 | |
| 	init_waitqueue_head(&x->wait);
 | |
| }
 | |
| 
 | |
| extern void wait_for_completion(struct completion *);
 | |
| extern int wait_for_completion_interruptible(struct completion *x);
 | |
| extern int wait_for_completion_killable(struct completion *x);
 | |
| extern unsigned long wait_for_completion_timeout(struct completion *x,
 | |
| 						   unsigned long timeout);
 | |
| extern unsigned long wait_for_completion_interruptible_timeout(
 | |
| 			struct completion *x, unsigned long timeout);
 | |
| 
 | |
| extern void complete(struct completion *);
 | |
| extern void complete_all(struct completion *);
 | |
| 
 | |
| #define INIT_COMPLETION(x)	((x).done = 0)
 | |
| 
 | |
| #endif
 | 
