forked from mirrors/linux
		
	 f86bf9b7bc
			
		
	
	
		f86bf9b7bc
		
	
	
	
	
		
			
			Clean up lockdep on-stack-completion initializer. (This also removes the dependency on waitqueue_lock_key.) Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 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 FASTCALL(wait_for_completion(struct completion *));
 | |
| extern int FASTCALL(wait_for_completion_interruptible(struct completion *x));
 | |
| extern unsigned long FASTCALL(wait_for_completion_timeout(struct completion *x,
 | |
| 						   unsigned long timeout));
 | |
| extern unsigned long FASTCALL(wait_for_completion_interruptible_timeout(
 | |
| 			struct completion *x, unsigned long timeout));
 | |
| 
 | |
| extern void FASTCALL(complete(struct completion *));
 | |
| extern void FASTCALL(complete_all(struct completion *));
 | |
| 
 | |
| #define INIT_COMPLETION(x)	((x).done = 0)
 | |
| 
 | |
| #endif
 |