/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __LINUX_COMPLETION_H
#define __LINUX_COMPLETION_H
/*
* ( C ) Copyright 2001 Linus Torvalds
*
* Atomic wait - for - completion handler data structures .
* See kernel / sched / completion . c for details .
*/
#include <linux/swait.h>
/*
* struct completion - structure used to maintain state for a " completion "
*
* This is the opaque structure used to maintain the state for a " completion " .
* Completions currently use a FIFO to queue threads that have to wait for
* the " completion " event .
*
* See also : complete ( ) , wait_for_completion ( ) ( and friends _ timeout ,
* _ interruptible , _ interruptible_timeout , and _ killable ) , init_completion ( ) ,
* reinit_completion ( ) , and macros DECLARE_COMPLETION ( ) ,
* DECLARE_COMPLETION_ONSTACK ( ) .
*/
struct completion {
unsigned int done;
struct swait_queue_head wait;
};
#define init_completion_map(x, m) init_completion(x)
static inline void complete_acquire(struct completion *x) {}
static inline void complete_release(struct completion *x) {}
#define COMPLETION_INITIALIZER(work) \
{ 0 , __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
#define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \
(*({ init_completion_map(&(work), &(map)); &(work); }))
#define COMPLETION_INITIALIZER_ONSTACK(work) \
(*({ init_completion(&work); &work; }))
/**
* DECLARE_COMPLETION - declare and initialize a completion structure
* @ work : identifier for the completion structure
*
* This macro declares and initializes a completion structure . Generally used
* for static declarations . You should use the _ ONSTACK variant for automatic
* variables .
*/
#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 :
*/
/**
* DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure
* @ work : identifier for the completion structure
*
* This macro declares and initializes a completion structure on the kernel
* stack .
*/
#ifdef CONFIG_LOCKDEP
# define DECLARE_COMPLETION_ONSTACK(work) \
struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
# define DECLARE_COMPLETION_ONSTACK_MAP(work, map) \
struct completion work = COMPLETION_INITIALIZER_ONSTACK_MAP(work, map)
#else
# define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
# define DECLARE_COMPLETION_ONSTACK_MAP(work, map) DECLARE_COMPLETION(work)
#endif
/**
* init_completion - Initialize a dynamically allocated completion
* @ x : pointer to completion structure that is to be initialized
*
* This inline function will initialize a dynamically created completion
* structure .
*/
static inline void init_completion(struct completion *x)
{
x->done = 0 ;
init_swait_queue_head(&x->wait);
}
/**
* reinit_completion - reinitialize a completion structure
* @ x : pointer to completion structure that is to be reinitialized
*
* This inline function should be used to reinitialize a completion structure so it can
* be reused . This is especially important after complete_all ( ) is used .
*/
static inline void reinit_completion(struct completion *x)
{
x->done = 0 ;
}
extern void wait_for_completion(struct completion *);
extern void wait_for_completion_io(struct completion *);
extern int wait_for_completion_interruptible(struct completion *x);
extern int wait_for_completion_killable(struct completion *x);
extern int wait_for_completion_state(struct completion *x, unsigned int state);
extern unsigned long wait_for_completion_timeout(struct completion *x,
unsigned long timeout);
extern unsigned long wait_for_completion_io_timeout(struct completion *x,
unsigned long timeout);
extern long wait_for_completion_interruptible_timeout(
struct completion *x, unsigned long timeout);
extern long wait_for_completion_killable_timeout(
struct completion *x, unsigned long timeout);
extern bool try_wait_for_completion(struct completion *x);
extern bool completion_done(struct completion *x);
extern void complete(struct completion *);
extern void complete_on_current_cpu(struct completion *x);
extern void complete_all(struct completion *);
#endif
Messung V0.5 in Prozent C=98 H=100 G=98
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland