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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/semaphore.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *
  7.  *  Derived from "include/asm-i386/semaphore.h"
  8.  *    (C) Copyright 1996 Linus Torvalds
  9.  */
  10. #ifndef _S390_SEMAPHORE_H
  11. #define _S390_SEMAPHORE_H
  12. #include <asm/system.h>
  13. #include <asm/atomic.h>
  14. #include <linux/wait.h>
  15. #include <linux/rwsem.h>
  16. struct semaphore {
  17. atomic_t count;
  18. int sleepers;
  19. wait_queue_head_t wait;
  20. };
  21. #define __SEM_DEBUG_INIT(name)
  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. *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
  34. }
  35. static inline void init_MUTEX (struct semaphore *sem)
  36. {
  37. sema_init(sem, 1);
  38. }
  39. static inline void init_MUTEX_LOCKED (struct semaphore *sem)
  40. {
  41. sema_init(sem, 0);
  42. }
  43. asmlinkage void __down_failed(void /* special register calling convention */);
  44. asmlinkage int  __down_failed_interruptible(void  /* params in registers */);
  45. asmlinkage int  __down_failed_trylock(void  /* params in registers */);
  46. asmlinkage void __up_wakeup(void /* special register calling convention */);
  47. asmlinkage void __down(struct semaphore * sem);
  48. asmlinkage int  __down_interruptible(struct semaphore * sem);
  49. asmlinkage int  __down_trylock(struct semaphore * sem);
  50. asmlinkage void __up(struct semaphore * sem);
  51. static inline void down(struct semaphore * sem)
  52. {
  53. if (atomic_dec_return(&sem->count) < 0)
  54. __down(sem);
  55. }
  56. static inline int down_interruptible(struct semaphore * sem)
  57. {
  58. int ret = 0;
  59. if (atomic_dec_return(&sem->count) < 0)
  60. ret = __down_interruptible(sem);
  61. return ret;
  62. }
  63. static inline int down_trylock(struct semaphore * sem)
  64. {
  65. int ret = 0;
  66. if (atomic_dec_return(&sem->count) < 0)
  67. ret = __down_trylock(sem);
  68. return ret;
  69. }
  70. static inline void up(struct semaphore * sem)
  71. {
  72. if (atomic_inc_return(&sem->count) <= 0)
  73. __up(sem);
  74. }
  75. static inline int sem_getcount(struct semaphore *sem)
  76. {
  77. return atomic_read(&sem->count);
  78. }
  79. #endif