semaphore.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/semaphore.h
  3.  */
  4. #ifndef __ASM_ARM_SEMAPHORE_H
  5. #define __ASM_ARM_SEMAPHORE_H
  6. #include <linux/linkage.h>
  7. #include <linux/spinlock.h>
  8. #include <linux/wait.h>
  9. #include <linux/rwsem.h>
  10. #include <asm/atomic.h>
  11. #include <asm/locks.h>
  12. struct semaphore {
  13. atomic_t count;
  14. int sleepers;
  15. wait_queue_head_t wait;
  16. };
  17. #define __SEMAPHORE_INIT(name, cnt)
  18. {
  19. .count = ATOMIC_INIT(cnt),
  20. .wait = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait),
  21. }
  22. #define __MUTEX_INITIALIZER(name) __SEMAPHORE_INIT(name,1)
  23. #define __DECLARE_SEMAPHORE_GENERIC(name,count)
  24. struct semaphore name = __SEMAPHORE_INIT(name,count)
  25. #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
  26. #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
  27. static inline void sema_init(struct semaphore *sem, int val)
  28. {
  29. atomic_set(&sem->count, val);
  30. sem->sleepers = 0;
  31. init_waitqueue_head(&sem->wait);
  32. }
  33. static inline void init_MUTEX(struct semaphore *sem)
  34. {
  35. sema_init(sem, 1);
  36. }
  37. static inline void init_MUTEX_LOCKED(struct semaphore *sem)
  38. {
  39. sema_init(sem, 0);
  40. }
  41. static inline int sema_count(struct semaphore *sem)
  42. {
  43. return atomic_read(&sem->count);
  44. }
  45. /*
  46.  * special register calling convention
  47.  */
  48. asmlinkage void __down_failed(void);
  49. asmlinkage int  __down_interruptible_failed(void);
  50. asmlinkage int  __down_trylock_failed(void);
  51. asmlinkage void __up_wakeup(void);
  52. extern void __down(struct semaphore * sem);
  53. extern int  __down_interruptible(struct semaphore * sem);
  54. extern int  __down_trylock(struct semaphore * sem);
  55. extern void __up(struct semaphore * sem);
  56. /*
  57.  * This is ugly, but we want the default case to fall through.
  58.  * "__down" is the actual routine that waits...
  59.  */
  60. static inline void down(struct semaphore * sem)
  61. {
  62. might_sleep();
  63. __down_op(sem, __down_failed);
  64. }
  65. /*
  66.  * This is ugly, but we want the default case to fall through.
  67.  * "__down_interruptible" is the actual routine that waits...
  68.  */
  69. static inline int down_interruptible (struct semaphore * sem)
  70. {
  71. might_sleep();
  72. return __down_op_ret(sem, __down_interruptible_failed);
  73. }
  74. static inline int down_trylock(struct semaphore *sem)
  75. {
  76. return __down_op_ret(sem, __down_trylock_failed);
  77. }
  78. /*
  79.  * Note! This is subtle. We jump to wake people up only if
  80.  * the semaphore was negative (== somebody was waiting on it).
  81.  * The default case (no contention) will result in NO
  82.  * jumps for both down() and up().
  83.  */
  84. static inline void up(struct semaphore * sem)
  85. {
  86. __up_op(sem, __up_wakeup);
  87. }
  88. #endif