Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /* rwsem-spinlock.h: fallback C implementation |
2 | * |
||
3 | * Copyright (c) 2001 David Howells (dhowells@redhat.com). |
||
4 | * - Derived partially from ideas by Andrea Arcangeli <andrea@suse.de> |
||
5 | * - Derived also from comments by Linus |
||
6 | */ |
||
7 | |||
8 | #ifndef _LINUX_RWSEM_SPINLOCK_H |
||
9 | #define _LINUX_RWSEM_SPINLOCK_H |
||
10 | |||
11 | #ifndef _LINUX_RWSEM_H |
||
12 | #error "please don't include linux/rwsem-spinlock.h directly, use linux/rwsem.h instead" |
||
13 | #endif |
||
14 | |||
15 | #include <linux/spinlock.h> |
||
16 | #include <linux/list.h> |
||
17 | |||
18 | #ifdef __KERNEL__ |
||
19 | |||
20 | #include <linux/types.h> |
||
21 | |||
22 | struct rwsem_waiter; |
||
23 | |||
24 | /* |
||
25 | * the rw-semaphore definition |
||
26 | * - if activity is 0 then there are no active readers or writers |
||
27 | * - if activity is +ve then that is the number of active readers |
||
28 | * - if activity is -1 then there is one active writer |
||
29 | * - if wait_list is not empty, then there are processes waiting for the semaphore |
||
30 | */ |
||
31 | struct rw_semaphore { |
||
32 | __s32 activity; |
||
33 | spinlock_t wait_lock; |
||
34 | struct list_head wait_list; |
||
35 | #if RWSEM_DEBUG |
||
36 | int debug; |
||
37 | #endif |
||
38 | }; |
||
39 | |||
40 | /* |
||
41 | * initialisation |
||
42 | */ |
||
43 | #if RWSEM_DEBUG |
||
44 | #define __RWSEM_DEBUG_INIT , 0 |
||
45 | #else |
||
46 | #define __RWSEM_DEBUG_INIT /* */ |
||
47 | #endif |
||
48 | |||
49 | #define __RWSEM_INITIALIZER(name) \ |
||
50 | { 0, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __RWSEM_DEBUG_INIT } |
||
51 | |||
52 | #define DECLARE_RWSEM(name) \ |
||
53 | struct rw_semaphore name = __RWSEM_INITIALIZER(name) |
||
54 | |||
55 | extern void FASTCALL(init_rwsem(struct rw_semaphore *sem)); |
||
56 | extern void FASTCALL(__down_read(struct rw_semaphore *sem)); |
||
57 | extern int FASTCALL(__down_read_trylock(struct rw_semaphore *sem)); |
||
58 | extern void FASTCALL(__down_write(struct rw_semaphore *sem)); |
||
59 | extern int FASTCALL(__down_write_trylock(struct rw_semaphore *sem)); |
||
60 | extern void FASTCALL(__up_read(struct rw_semaphore *sem)); |
||
61 | extern void FASTCALL(__up_write(struct rw_semaphore *sem)); |
||
62 | extern void FASTCALL(__downgrade_write(struct rw_semaphore *sem)); |
||
63 | |||
64 | #endif /* __KERNEL__ */ |
||
65 | #endif /* _LINUX_RWSEM_SPINLOCK_H */ |