cregit-Linux how code gets into the kernel

Release 4.14 include/linux/completion.h

Directory: include/linux
/* 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/wait.h>
#ifdef CONFIG_LOCKDEP_COMPLETIONS
#include <linux/lockdep.h>
#endif

/*
 * 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;
	
wait_queue_head_t wait;
#ifdef CONFIG_LOCKDEP_COMPLETIONS
	
struct lockdep_map_cross map;
#endif
};

#ifdef CONFIG_LOCKDEP_COMPLETIONS

static inline void complete_acquire(struct completion *x) { lock_acquire_exclusive((struct lockdep_map *)&x->map, 0, 0, NULL, _RET_IP_); }

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park33100.00%1100.00%
Total33100.00%1100.00%


static inline void complete_release(struct completion *x) { lock_release((struct lockdep_map *)&x->map, 0, _RET_IP_); }

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park29100.00%1100.00%
Total29100.00%1100.00%


static inline void complete_release_commit(struct completion *x) { lock_commit_crosslock((struct lockdep_map *)&x->map); }

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park25100.00%1100.00%
Total25100.00%1100.00%

#define init_completion(x) \ do { \ static struct lock_class_key __key; \ lockdep_init_map_crosslock((struct lockdep_map *)&(x)->map, \ "(complete)" #x, \ &__key, 0); \ __init_completion(x); \ } while (0) #else #define init_completion(x) __init_completion(x)
static inline void complete_acquire(struct completion *x) {}

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park11100.00%1100.00%
Total11100.00%1100.00%


static inline void complete_release(struct completion *x) {}

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park11100.00%1100.00%
Total11100.00%1100.00%


static inline void complete_release_commit(struct completion *x) {}

Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park11100.00%1100.00%
Total11100.00%1100.00%

#endif #ifdef CONFIG_LOCKDEP_COMPLETIONS #define COMPLETION_INITIALIZER(work) \ { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait), \ STATIC_CROSS_LOCKDEP_MAP_INIT("(complete)" #work, &(work)) } #else #define COMPLETION_INITIALIZER(work) \ { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) } #endif #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) #else # define DECLARE_COMPLETION_ONSTACK(work) 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_waitqueue_head(&x->wait); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds2492.31%133.33%
Wolfram Sang13.85%133.33%
Byungchul Park13.85%133.33%
Total26100.00%3100.00%

/** * 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; }

Contributors

PersonTokensPropCommitsCommitProp
Wolfram Sang1794.44%150.00%
Linus Torvalds15.56%150.00%
Total18100.00%2100.00%

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 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_all(struct completion *); #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Byungchul Park17540.79%211.76%
Ingo Molnar8820.51%529.41%
Linus Torvalds7216.78%15.88%
Vladimir Davydov245.59%15.88%
Wolfram Sang214.90%15.88%
David Chinner204.66%15.88%
Sage Weil143.26%15.88%
Matthew Wilcox102.33%15.88%
Randy Dunlap20.47%15.88%
Greg Kroah-Hartman10.23%15.88%
Peter Zijlstra10.23%15.88%
Boqun Feng10.23%15.88%
Total429100.00%17100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.