home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-v850 / semaphore.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.0 KB  |  86 lines

  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.  
  11. struct 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 __DECLARE_SEMAPHORE_GENERIC(name,count)    \
  22.     struct semaphore name = __SEMAPHORE_INITIALIZER (name,count)
  23.  
  24. #define DECLARE_MUTEX(name)        __DECLARE_SEMAPHORE_GENERIC (name,1)
  25. #define DECLARE_MUTEX_LOCKED(name)    __DECLARE_SEMAPHORE_GENERIC (name,0)
  26.  
  27. static inline void sema_init (struct semaphore *sem, int val)
  28. {
  29.     *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
  30. }
  31.  
  32. static inline void init_MUTEX (struct semaphore *sem)
  33. {
  34.     sema_init (sem, 1);
  35. }
  36.  
  37. static inline void init_MUTEX_LOCKED (struct semaphore *sem)
  38. {
  39.     sema_init (sem, 0);
  40. }
  41.  
  42. /*
  43.  * special register calling convention
  44.  */
  45. asmlinkage void __down_failed (void);
  46. asmlinkage int  __down_interruptible_failed (void);
  47. asmlinkage int  __down_trylock_failed (void);
  48. asmlinkage void __up_wakeup (void);
  49.  
  50. extern void __down (struct semaphore * sem);
  51. extern int  __down_interruptible (struct semaphore * sem);
  52. extern int  __down_trylock (struct semaphore * sem);
  53. extern void __up (struct semaphore * sem);
  54.  
  55. static inline void down (struct semaphore * sem)
  56. {
  57.     might_sleep();
  58.     if (atomic_dec_return (&sem->count) < 0)
  59.         __down (sem);
  60. }
  61.  
  62. static inline int down_interruptible (struct semaphore * sem)
  63. {
  64.     int ret = 0;
  65.     might_sleep();
  66.     if (atomic_dec_return (&sem->count) < 0)
  67.         ret = __down_interruptible (sem);
  68.     return ret;
  69. }
  70.  
  71. static inline int down_trylock (struct semaphore *sem)
  72. {
  73.     int ret = 0;
  74.     if (atomic_dec_return (&sem->count) < 0)
  75.         ret = __down_trylock (sem);
  76.     return ret;
  77. }
  78.  
  79. static inline void up (struct semaphore * sem)
  80. {
  81.     if (atomic_inc_return (&sem->count) <= 0)
  82.         __up (sem);
  83. }
  84.  
  85. #endif /* __V850_SEMAPHORE_H__ */
  86.