Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.14-rc5 88 lines 2.1 kB view raw
1#ifndef __V850_SEMAPHORE_H__ 2#define __V850_SEMAPHORE_H__ 3 4#include <linux/linkage.h> 5#include <linux/spinlock.h> 6#include <linux/wait.h> 7#include <linux/rwsem.h> 8 9#include <asm/atomic.h> 10 11struct semaphore { 12 atomic_t count; 13 int sleepers; 14 wait_queue_head_t wait; 15}; 16 17#define __SEMAPHORE_INITIALIZER(name,count) \ 18 { ATOMIC_INIT (count), 0, \ 19 __WAIT_QUEUE_HEAD_INITIALIZER ((name).wait) } 20 21#define __MUTEX_INITIALIZER(name) \ 22 __SEMAPHORE_INITIALIZER (name,1) 23 24#define __DECLARE_SEMAPHORE_GENERIC(name,count) \ 25 struct semaphore name = __SEMAPHORE_INITIALIZER (name,count) 26 27#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC (name,1) 28#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC (name,0) 29 30extern inline void sema_init (struct semaphore *sem, int val) 31{ 32 *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); 33} 34 35static inline void init_MUTEX (struct semaphore *sem) 36{ 37 sema_init (sem, 1); 38} 39 40static inline void init_MUTEX_LOCKED (struct semaphore *sem) 41{ 42 sema_init (sem, 0); 43} 44 45/* 46 * special register calling convention 47 */ 48asmlinkage void __down_failed (void); 49asmlinkage int __down_interruptible_failed (void); 50asmlinkage int __down_trylock_failed (void); 51asmlinkage void __up_wakeup (void); 52 53extern void __down (struct semaphore * sem); 54extern int __down_interruptible (struct semaphore * sem); 55extern int __down_trylock (struct semaphore * sem); 56extern void __up (struct semaphore * sem); 57 58extern inline void down (struct semaphore * sem) 59{ 60 might_sleep(); 61 if (atomic_dec_return (&sem->count) < 0) 62 __down (sem); 63} 64 65extern inline int down_interruptible (struct semaphore * sem) 66{ 67 int ret = 0; 68 might_sleep(); 69 if (atomic_dec_return (&sem->count) < 0) 70 ret = __down_interruptible (sem); 71 return ret; 72} 73 74extern inline int down_trylock (struct semaphore *sem) 75{ 76 int ret = 0; 77 if (atomic_dec_return (&sem->count) < 0) 78 ret = __down_trylock (sem); 79 return ret; 80} 81 82extern inline void up (struct semaphore * sem) 83{ 84 if (atomic_inc_return (&sem->count) <= 0) 85 __up (sem); 86} 87 88#endif /* __V850_SEMAPHORE_H__ */