Blame view

include/linux/completion.h 3.23 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  #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>
ee2f154a5   Randy Dunlap   docbook: add more...
12
  /*
65eb3dc60   Kevin Diggs   sched: add kernel...
13
14
15
16
17
18
19
20
21
22
23
   * 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(),
   * and macros DECLARE_COMPLETION(), DECLARE_COMPLETION_ONSTACK(), and
   * INIT_COMPLETION().
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
  struct completion {
  	unsigned int done;
  	wait_queue_head_t wait;
  };
  
  #define COMPLETION_INITIALIZER(work) \
  	{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
f86bf9b7b   Ingo Molnar   [PATCH] lockdep: ...
31
32
  #define COMPLETION_INITIALIZER_ONSTACK(work) \
  	({ init_completion(&work); work; })
65eb3dc60   Kevin Diggs   sched: add kernel...
33
  /**
ee2f154a5   Randy Dunlap   docbook: add more...
34
   * DECLARE_COMPLETION - declare and initialize a completion structure
65eb3dc60   Kevin Diggs   sched: add kernel...
35
36
37
38
39
40
   * @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.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
  #define DECLARE_COMPLETION(work) \
  	struct completion work = COMPLETION_INITIALIZER(work)
8b3db9c54   Ingo Molnar   [PATCH] lockdep: ...
43
44
45
46
47
  /*
   * 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:
   */
65eb3dc60   Kevin Diggs   sched: add kernel...
48
  /**
ee2f154a5   Randy Dunlap   docbook: add more...
49
   * DECLARE_COMPLETION_ONSTACK - declare and initialize a completion structure
65eb3dc60   Kevin Diggs   sched: add kernel...
50
51
52
53
54
   * @work:  identifier for the completion structure
   *
   * This macro declares and initializes a completion structure on the kernel
   * stack.
   */
8b3db9c54   Ingo Molnar   [PATCH] lockdep: ...
55
56
  #ifdef CONFIG_LOCKDEP
  # define DECLARE_COMPLETION_ONSTACK(work) \
f86bf9b7b   Ingo Molnar   [PATCH] lockdep: ...
57
  	struct completion work = COMPLETION_INITIALIZER_ONSTACK(work)
8b3db9c54   Ingo Molnar   [PATCH] lockdep: ...
58
59
60
  #else
  # define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work)
  #endif
65eb3dc60   Kevin Diggs   sched: add kernel...
61
  /**
ee2f154a5   Randy Dunlap   docbook: add more...
62
   * init_completion - Initialize a dynamically allocated completion
65eb3dc60   Kevin Diggs   sched: add kernel...
63
64
65
66
67
   * @x:  completion structure that is to be initialized
   *
   * This inline function will initialize a dynamically created completion
   * structure.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
70
71
72
  static inline void init_completion(struct completion *x)
  {
  	x->done = 0;
  	init_waitqueue_head(&x->wait);
  }
b15136e94   Ingo Molnar   sched: fix fastca...
73
74
  extern void wait_for_completion(struct completion *);
  extern int wait_for_completion_interruptible(struct completion *x);
009e577e0   Matthew Wilcox   Add wait_for_comp...
75
  extern int wait_for_completion_killable(struct completion *x);
b15136e94   Ingo Molnar   sched: fix fastca...
76
77
  extern unsigned long wait_for_completion_timeout(struct completion *x,
  						   unsigned long timeout);
6bf412376   NeilBrown   sched: Change wai...
78
79
80
81
  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);
be4de3526   Dave Chinner   completions: unin...
82
83
  extern bool try_wait_for_completion(struct completion *x);
  extern bool completion_done(struct completion *x);
b15136e94   Ingo Molnar   sched: fix fastca...
84
85
86
  
  extern void complete(struct completion *);
  extern void complete_all(struct completion *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87

65eb3dc60   Kevin Diggs   sched: add kernel...
88
  /**
ee2f154a5   Randy Dunlap   docbook: add more...
89
   * INIT_COMPLETION - reinitialize a completion structure
65eb3dc60   Kevin Diggs   sched: add kernel...
90
91
92
93
94
   * @x:  completion structure to be reinitialized
   *
   * This macro should be used to reinitialize a completion structure so it can
   * be reused. This is especially important after complete_all() is used.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
  #define INIT_COMPLETION(x)	((x).done = 0)
39d2f1ab2   David Chinner   [XFS] extend comp...
96

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  #endif