semaphore.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _SPARC_SEMAPHORE_H
  2. #define _SPARC_SEMAPHORE_H
  3. /* Dinky, good for nothing, just barely irq safe, Sparc semaphores. */
  4. #ifdef __KERNEL__
  5. #include <asm/atomic.h>
  6. #include <linux/wait.h>
  7. #include <linux/rwsem.h>
  8. struct semaphore {
  9. atomic_t count;
  10. int sleepers;
  11. wait_queue_head_t wait;
  12. #if WAITQUEUE_DEBUG
  13. long __magic;
  14. #endif
  15. };
  16. #if WAITQUEUE_DEBUG
  17. # define __SEM_DEBUG_INIT(name) 
  18. , (long)&(name).__magic
  19. #else
  20. # define __SEM_DEBUG_INIT(name)
  21. #endif
  22. #define __SEMAPHORE_INITIALIZER(name,count) 
  23. { ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) 
  24. __SEM_DEBUG_INIT(name) }
  25. #define __MUTEX_INITIALIZER(name) 
  26. __SEMAPHORE_INITIALIZER(name,1)
  27. #define __DECLARE_SEMAPHORE_GENERIC(name,count) 
  28. struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
  29. #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
  30. #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
  31. static inline void sema_init (struct semaphore *sem, int val)
  32. {
  33. atomic_set(&sem->count, val);
  34. sem->sleepers = 0;
  35. init_waitqueue_head(&sem->wait);
  36. #if WAITQUEUE_DEBUG
  37. sem->__magic = (long)&sem->__magic;
  38. #endif
  39. }
  40. static inline void init_MUTEX (struct semaphore *sem)
  41. {
  42. sema_init(sem, 1);
  43. }
  44. static inline void init_MUTEX_LOCKED (struct semaphore *sem)
  45. {
  46. sema_init(sem, 0);
  47. }
  48. extern void __down(struct semaphore * sem);
  49. extern int __down_interruptible(struct semaphore * sem);
  50. extern int __down_trylock(struct semaphore * sem);
  51. extern void __up(struct semaphore * sem);
  52. static inline void down(struct semaphore * sem)
  53. {
  54. register volatile int *ptr asm("g1");
  55. register int increment asm("g2");
  56. #if WAITQUEUE_DEBUG
  57. CHECK_MAGIC(sem->__magic);
  58. #endif
  59. ptr = &(sem->count.counter);
  60. increment = 1;
  61. __asm__ __volatile__(
  62. "mov %%o7, %%g4nt"
  63. "call ___atomic_subnt"
  64. " add %%o7, 8, %%o7nt"
  65. "tst %%g2nt"
  66. "bl 2fnt"
  67. " nopn"
  68. "1:nt"
  69. ".subsection 2n"
  70. "2:nt"
  71. "save %%sp, -64, %%spnt"
  72. "mov %%g1, %%l1nt"
  73. "mov %%g5, %%l5nt"
  74. "call %3nt"
  75. " mov %%g1, %%o0nt"
  76. "mov %%l1, %%g1nt"
  77. "ba 1bnt"
  78. " restore %%l5, %%g0, %%g5nt"
  79. ".previousn"
  80. : "=&r" (increment)
  81. : "0" (increment), "r" (ptr), "i" (__down)
  82. : "g3", "g4", "g7", "memory", "cc");
  83. }
  84. static inline int down_interruptible(struct semaphore * sem)
  85. {
  86. register volatile int *ptr asm("g1");
  87. register int increment asm("g2");
  88. #if WAITQUEUE_DEBUG
  89. CHECK_MAGIC(sem->__magic);
  90. #endif
  91. ptr = &(sem->count.counter);
  92. increment = 1;
  93. __asm__ __volatile__(
  94. "mov %%o7, %%g4nt"
  95. "call ___atomic_subnt"
  96. " add %%o7, 8, %%o7nt"
  97. "tst %%g2nt"
  98. "bl 2fnt"
  99. " clr %%g2n"
  100. "1:nt"
  101. ".subsection 2n"
  102. "2:nt"
  103. "save %%sp, -64, %%spnt"
  104. "mov %%g1, %%l1nt"
  105. "mov %%g5, %%l5nt"
  106. "call %3nt"
  107. " mov %%g1, %%o0nt"
  108. "mov %%l1, %%g1nt"
  109. "mov %%l5, %%g5nt"
  110. "ba 1bnt"
  111. " restore %%o0, %%g0, %%g2nt"
  112. ".previousn"
  113. : "=&r" (increment)
  114. : "0" (increment), "r" (ptr), "i" (__down_interruptible)
  115. : "g3", "g4", "g7", "memory", "cc");
  116. return increment;
  117. }
  118. static inline int down_trylock(struct semaphore * sem)
  119. {
  120. register volatile int *ptr asm("g1");
  121. register int increment asm("g2");
  122. #if WAITQUEUE_DEBUG
  123. CHECK_MAGIC(sem->__magic);
  124. #endif
  125. ptr = &(sem->count.counter);
  126. increment = 1;
  127. __asm__ __volatile__(
  128. "mov %%o7, %%g4nt"
  129. "call ___atomic_subnt"
  130. " add %%o7, 8, %%o7nt"
  131. "tst %%g2nt"
  132. "bl 2fnt"
  133. " clr %%g2n"
  134. "1:nt"
  135. ".subsection 2n"
  136. "2:nt"
  137. "save %%sp, -64, %%spnt"
  138. "mov %%g1, %%l1nt"
  139. "mov %%g5, %%l5nt"
  140. "call %3nt"
  141. " mov %%g1, %%o0nt"
  142. "mov %%l1, %%g1nt"
  143. "mov %%l5, %%g5nt"
  144. "ba 1bnt"
  145. " restore %%o0, %%g0, %%g2nt"
  146. ".previousn"
  147. : "=&r" (increment)
  148. : "0" (increment), "r" (ptr), "i" (__down_trylock)
  149. : "g3", "g4", "g7", "memory", "cc");
  150. return increment;
  151. }
  152. static inline void up(struct semaphore * sem)
  153. {
  154. register volatile int *ptr asm("g1");
  155. register int increment asm("g2");
  156. #if WAITQUEUE_DEBUG
  157. CHECK_MAGIC(sem->__magic);
  158. #endif
  159. ptr = &(sem->count.counter);
  160. increment = 1;
  161. __asm__ __volatile__(
  162. "mov %%o7, %%g4nt"
  163. "call ___atomic_addnt"
  164. " add %%o7, 8, %%o7nt"
  165. "tst %%g2nt"
  166. "ble 2fnt"
  167. " nopn"
  168. "1:nt"
  169. ".subsection 2n"
  170. "2:nt"
  171. "save %%sp, -64, %%spnt"
  172. "mov %%g1, %%l1nt"
  173. "mov %%g5, %%l5nt"
  174. "call %3nt"
  175. " mov %%g1, %%o0nt"
  176. "mov %%l1, %%g1nt"
  177. "ba 1bnt"
  178. " restore %%l5, %%g0, %%g5nt"
  179. ".previousn"
  180. : "=&r" (increment)
  181. : "0" (increment), "r" (ptr), "i" (__up)
  182. : "g3", "g4", "g7", "memory", "cc");
  183. }
  184. static inline int sem_getcount(struct semaphore *sem)
  185. {
  186. return atomic_read(&sem->count);
  187. }
  188. #endif /* __KERNEL__ */
  189. #endif /* !(_SPARC_SEMAPHORE_H) */