Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /* rwsem.h: R/W semaphores, public interface |
2 | * |
||
3 | * Written by David Howells (dhowells@redhat.com). |
||
4 | * Derived from asm-i386/semaphore.h |
||
5 | */ |
||
6 | |||
7 | #ifndef _LINUX_RWSEM_H |
||
8 | #define _LINUX_RWSEM_H |
||
9 | |||
10 | #include <linux/linkage.h> |
||
11 | |||
12 | #define RWSEM_DEBUG 0 |
||
13 | |||
14 | #ifdef __KERNEL__ |
||
15 | |||
16 | #include <linux/config.h> |
||
17 | #include <linux/types.h> |
||
18 | #include <linux/kernel.h> |
||
19 | #include <asm/system.h> |
||
20 | #include <asm/atomic.h> |
||
21 | |||
22 | struct rw_semaphore; |
||
23 | |||
24 | #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK |
||
25 | #include <linux/rwsem-spinlock.h> /* use a generic implementation */ |
||
26 | #else |
||
27 | #include <asm/rwsem.h> /* use an arch-specific implementation */ |
||
28 | #endif |
||
29 | |||
30 | #ifndef rwsemtrace |
||
31 | #if RWSEM_DEBUG |
||
32 | extern void FASTCALL(rwsemtrace(struct rw_semaphore *sem, const char *str)); |
||
33 | #else |
||
34 | #define rwsemtrace(SEM,FMT) |
||
35 | #endif |
||
36 | #endif |
||
37 | |||
38 | /* |
||
39 | * lock for reading |
||
40 | */ |
||
41 | static inline void down_read(struct rw_semaphore *sem) |
||
42 | { |
||
43 | might_sleep(); |
||
44 | rwsemtrace(sem,"Entering down_read"); |
||
45 | __down_read(sem); |
||
46 | rwsemtrace(sem,"Leaving down_read"); |
||
47 | } |
||
48 | |||
49 | /* |
||
50 | * trylock for reading -- returns 1 if successful, 0 if contention |
||
51 | */ |
||
52 | static inline int down_read_trylock(struct rw_semaphore *sem) |
||
53 | { |
||
54 | int ret; |
||
55 | rwsemtrace(sem,"Entering down_read_trylock"); |
||
56 | ret = __down_read_trylock(sem); |
||
57 | rwsemtrace(sem,"Leaving down_read_trylock"); |
||
58 | return ret; |
||
59 | } |
||
60 | |||
61 | /* |
||
62 | * lock for writing |
||
63 | */ |
||
64 | static inline void down_write(struct rw_semaphore *sem) |
||
65 | { |
||
66 | might_sleep(); |
||
67 | rwsemtrace(sem,"Entering down_write"); |
||
68 | __down_write(sem); |
||
69 | rwsemtrace(sem,"Leaving down_write"); |
||
70 | } |
||
71 | |||
72 | /* |
||
73 | * trylock for writing -- returns 1 if successful, 0 if contention |
||
74 | */ |
||
75 | static inline int down_write_trylock(struct rw_semaphore *sem) |
||
76 | { |
||
77 | int ret; |
||
78 | rwsemtrace(sem,"Entering down_write_trylock"); |
||
79 | ret = __down_write_trylock(sem); |
||
80 | rwsemtrace(sem,"Leaving down_write_trylock"); |
||
81 | return ret; |
||
82 | } |
||
83 | |||
84 | /* |
||
85 | * release a read lock |
||
86 | */ |
||
87 | static inline void up_read(struct rw_semaphore *sem) |
||
88 | { |
||
89 | rwsemtrace(sem,"Entering up_read"); |
||
90 | __up_read(sem); |
||
91 | rwsemtrace(sem,"Leaving up_read"); |
||
92 | } |
||
93 | |||
94 | /* |
||
95 | * release a write lock |
||
96 | */ |
||
97 | static inline void up_write(struct rw_semaphore *sem) |
||
98 | { |
||
99 | rwsemtrace(sem,"Entering up_write"); |
||
100 | __up_write(sem); |
||
101 | rwsemtrace(sem,"Leaving up_write"); |
||
102 | } |
||
103 | |||
104 | /* |
||
105 | * downgrade write lock to read lock |
||
106 | */ |
||
107 | static inline void downgrade_write(struct rw_semaphore *sem) |
||
108 | { |
||
109 | rwsemtrace(sem,"Entering downgrade_write"); |
||
110 | __downgrade_write(sem); |
||
111 | rwsemtrace(sem,"Leaving downgrade_write"); |
||
112 | } |
||
113 | |||
114 | #endif /* __KERNEL__ */ |
||
115 | #endif /* _LINUX_RWSEM_H */ |