semaphore.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _ASM_PARISC_SEMAPHORE_H
  2. #define _ASM_PARISC_SEMAPHORE_H
  3. #include <linux/linkage.h>
  4. /*
  5.  * SMP- and interrupt-safe semaphores.
  6.  *
  7.  * (C) Copyright 1996 Linus Torvalds
  8.  *
  9.  * SuperH verison by Niibe Yutaka
  10.  *
  11.  */
  12. #include <linux/spinlock.h>
  13. #include <linux/rwsem.h>
  14. #include <asm/system.h>
  15. #include <asm/atomic.h>
  16. struct semaphore {
  17. atomic_t count;
  18. int waking;
  19. wait_queue_head_t wait;
  20. #if WAITQUEUE_DEBUG
  21. long __magic;
  22. #endif
  23. };
  24. #if WAITQUEUE_DEBUG
  25. # define __SEM_DEBUG_INIT(name) 
  26. , (long)&(name).__magic
  27. #else
  28. # define __SEM_DEBUG_INIT(name)
  29. #endif
  30. #define __SEMAPHORE_INITIALIZER(name,count) 
  31. { ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) 
  32. __SEM_DEBUG_INIT(name) }
  33. #define __MUTEX_INITIALIZER(name) 
  34. __SEMAPHORE_INITIALIZER(name,1)
  35. #define __DECLARE_SEMAPHORE_GENERIC(name,count) 
  36. struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
  37. #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
  38. #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
  39. extern inline void sema_init (struct semaphore *sem, int val)
  40. {
  41. /*
  42.  * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
  43.  *
  44.  * i'd rather use the more flexible initialization above, but sadly
  45.  * GCC 2.7.2.3 emits a bogus warning. EGCS doesnt. Oh well.
  46.  */
  47. atomic_set(&sem->count, val);
  48. sem->waking = 0;
  49. init_waitqueue_head(&sem->wait);
  50. #if WAITQUEUE_DEBUG
  51. sem->__magic = (long)&sem->__magic;
  52. #endif
  53. }
  54. static inline void init_MUTEX (struct semaphore *sem)
  55. {
  56. sema_init(sem, 1);
  57. }
  58. static inline void init_MUTEX_LOCKED (struct semaphore *sem)
  59. {
  60. sema_init(sem, 0);
  61. }
  62. asmlinkage void __down_failed(void /* special register calling convention */);
  63. asmlinkage int  __down_failed_interruptible(void  /* params in registers */);
  64. asmlinkage int  __down_failed_trylock(void  /* params in registers */);
  65. asmlinkage void __up_wakeup(void /* special register calling convention */);
  66. asmlinkage void __down(struct semaphore * sem);
  67. asmlinkage int  __down_interruptible(struct semaphore * sem);
  68. asmlinkage int  __down_trylock(struct semaphore * sem);
  69. asmlinkage void __up(struct semaphore * sem);
  70. extern spinlock_t semaphore_wake_lock;
  71. extern __inline__ void down(struct semaphore * sem)
  72. {
  73. #if WAITQUEUE_DEBUG
  74. CHECK_MAGIC(sem->__magic);
  75. #endif
  76. if (atomic_dec_return(&sem->count) < 0)
  77. __down(sem);
  78. }
  79. extern __inline__ int down_interruptible(struct semaphore * sem)
  80. {
  81. int ret = 0;
  82. #if WAITQUEUE_DEBUG
  83. CHECK_MAGIC(sem->__magic);
  84. #endif
  85. if (atomic_dec_return(&sem->count) < 0)
  86. ret = __down_interruptible(sem);
  87. return ret;
  88. }
  89. extern __inline__ int down_trylock(struct semaphore * sem)
  90. {
  91. int ret = 0;
  92. #if WAITQUEUE_DEBUG
  93. CHECK_MAGIC(sem->__magic);
  94. #endif
  95. if (atomic_dec_return(&sem->count) < 0)
  96. ret = __down_trylock(sem);
  97. return ret;
  98. }
  99. /*
  100.  * Note! This is subtle. We jump to wake people up only if
  101.  * the semaphore was negative (== somebody was waiting on it).
  102.  */
  103. extern __inline__ void up(struct semaphore * sem)
  104. {
  105. #if WAITQUEUE_DEBUG
  106. CHECK_MAGIC(sem->__magic);
  107. #endif
  108. if (atomic_inc_return(&sem->count) <= 0)
  109. __up(sem);
  110. }
  111. #endif /* _ASM_PARISC_SEMAPHORE_H */