Line data Source code
1 : /*
2 : * Copyright (c) 2008 Intel Corporation
3 : * Author: Matthew Wilcox <willy@linux.intel.com>
4 : *
5 : * Distributed under the terms of the GNU GPL, version 2
6 : *
7 : * Please see kernel/semaphore.c for documentation of these functions
8 : */
9 : #ifndef __LINUX_SEMAPHORE_H
10 : #define __LINUX_SEMAPHORE_H
11 :
12 : #include <linux/list.h>
13 : #include <linux/spinlock.h>
14 :
15 : /* Please don't access any members of this structure directly */
16 : struct semaphore {
17 : raw_spinlock_t lock;
18 : unsigned int count;
19 : struct list_head wait_list;
20 : };
21 :
22 : #define __SEMAPHORE_INITIALIZER(name, n) \
23 : { \
24 : .lock = __RAW_SPIN_LOCK_UNLOCKED((name).lock), \
25 : .count = n, \
26 : .wait_list = LIST_HEAD_INIT((name).wait_list), \
27 : }
28 :
29 : #define DEFINE_SEMAPHORE(name) \
30 : struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
31 :
32 : static inline void sema_init(struct semaphore *sem, int val)
33 : {
34 : static struct lock_class_key __key;
35 221 : *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
36 : lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
37 : }
38 :
39 : extern void down(struct semaphore *sem);
40 : extern int __must_check down_interruptible(struct semaphore *sem);
41 : extern int __must_check down_killable(struct semaphore *sem);
42 : extern int __must_check down_trylock(struct semaphore *sem);
43 : extern int __must_check down_timeout(struct semaphore *sem, long jiffies);
44 : extern void up(struct semaphore *sem);
45 :
46 : #endif /* __LINUX_SEMAPHORE_H */
|