diff options
Diffstat (limited to 'include/linux/completion.h')
| -rw-r--r-- | include/linux/completion.h | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/include/linux/completion.h b/include/linux/completion.h index d2961b66d53d..57faa60de9bd 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h @@ -55,4 +55,49 @@ extern void complete_all(struct completion *);  #define INIT_COMPLETION(x)	((x).done = 0) + +/** + *	try_wait_for_completion - try to decrement a completion without blocking + *	@x:	completion structure + * + *	Returns: 0 if a decrement cannot be done without blocking + *		 1 if a decrement succeeded. + * + *	If a completion is being used as a counting completion, + *	attempt to decrement the counter without blocking. This + *	enables us to avoid waiting if the resource the completion + *	is protecting is not available. + */ +static inline bool try_wait_for_completion(struct completion *x) +{ +	int ret = 1; + +	spin_lock_irq(&x->wait.lock); +	if (!x->done) +		ret = 0; +	else +		x->done--; +	spin_unlock_irq(&x->wait.lock); +	return ret; +} + +/** + *	completion_done - Test to see if a completion has any waiters + *	@x:	completion structure + * + *	Returns: 0 if there are waiters (wait_for_completion() in progress) + *		 1 if there are no waiters. + * + */ +static inline bool completion_done(struct completion *x) +{ +	int ret = 1; + +	spin_lock_irq(&x->wait.lock); +	if (!x->done) +		ret = 0; +	spin_unlock_irq(&x->wait.lock); +	return ret; +} +  #endif | 
