more debug output
[linux-2.4.git] / include / asm-cris / semaphore-helper.h
1 /*
2  * SMP- and interrupt-safe semaphores helper functions. Generic versions, no
3  * optimizations whatsoever...
4  *
5  */
6
7 #ifndef _ASM_SEMAPHORE_HELPER_H
8 #define _ASM_SEMAPHORE_HELPER_H
9
10 #include <asm/atomic.h>
11
12 #define read(a) ((a)->counter)
13 #define inc(a) (((a)->counter)++)
14 #define dec(a) (((a)->counter)--)
15
16 #define count_inc(a) ((*(a))++)
17
18 /*
19  * These two _must_ execute atomically wrt each other.
20  */
21 extern inline void wake_one_more(struct semaphore * sem)
22 {
23         atomic_inc(&sem->waking);
24 }
25
26 extern inline int waking_non_zero(struct semaphore *sem)
27 {
28         unsigned long flags;
29         int ret = 0;
30
31         save_and_cli(flags);
32         if (read(&sem->waking) > 0) {
33                 dec(&sem->waking);
34                 ret = 1;
35         }
36         restore_flags(flags);
37         return ret;
38 }
39
40 extern inline int waking_non_zero_interruptible(struct semaphore *sem,
41                                                 struct task_struct *tsk)
42 {
43         int ret = 0;
44         unsigned long flags;
45
46         save_and_cli(flags);
47         if (read(&sem->waking) > 0) {
48                 dec(&sem->waking);
49                 ret = 1;
50         } else if (signal_pending(tsk)) {
51                 count_inc(&sem->count);
52                 ret = -EINTR;
53         }
54         restore_flags(flags);
55         return ret;
56 }
57
58 extern inline int waking_non_zero_trylock(struct semaphore *sem)
59 {
60         int ret = 1;
61         unsigned long flags;
62
63         save_and_cli(flags);
64         if (read(&sem->waking) <= 0)
65                 count_inc(&sem->count);
66         else {
67                 dec(&sem->waking);
68                 ret = 0;
69         }
70         restore_flags(flags);
71         return ret;
72 }
73
74 #endif /* _ASM_SEMAPHORE_HELPER_H */