rwsem.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* rwsem.h: R/W semaphores, public interface
  2. *
  3. * Written by David Howells (dhowells@redhat.com).
  4. * Derived from asm-i386/semaphore.h
  5. */
  6. #ifndef _LINUX_RWSEM_H
  7. #define _LINUX_RWSEM_H
  8. #include <linux/linkage.h>
  9. #define RWSEM_DEBUG 0
  10. #ifdef __KERNEL__
  11. #include <linux/config.h>
  12. #include <linux/types.h>
  13. #include <linux/kernel.h>
  14. #include <asm/system.h>
  15. #include <asm/atomic.h>
  16. struct rw_semaphore;
  17. #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
  18. #include <linux/rwsem-spinlock.h> /* use a generic implementation */
  19. #else
  20. #include <asm/rwsem.h> /* use an arch-specific implementation */
  21. #endif
  22. #ifndef rwsemtrace
  23. #if RWSEM_DEBUG
  24. extern void FASTCALL(rwsemtrace(struct rw_semaphore *sem, const char *str));
  25. #else
  26. #define rwsemtrace(SEM,FMT)
  27. #endif
  28. #endif
  29. /*
  30. * lock for reading
  31. */
  32. static inline void down_read(struct rw_semaphore *sem)
  33. {
  34. might_sleep();
  35. rwsemtrace(sem,"Entering down_read");
  36. __down_read(sem);
  37. rwsemtrace(sem,"Leaving down_read");
  38. }
  39. /*
  40. * trylock for reading -- returns 1 if successful, 0 if contention
  41. */
  42. static inline int down_read_trylock(struct rw_semaphore *sem)
  43. {
  44. int ret;
  45. rwsemtrace(sem,"Entering down_read_trylock");
  46. ret = __down_read_trylock(sem);
  47. rwsemtrace(sem,"Leaving down_read_trylock");
  48. return ret;
  49. }
  50. /*
  51. * lock for writing
  52. */
  53. static inline void down_write(struct rw_semaphore *sem)
  54. {
  55. might_sleep();
  56. rwsemtrace(sem,"Entering down_write");
  57. __down_write(sem);
  58. rwsemtrace(sem,"Leaving down_write");
  59. }
  60. /*
  61. * trylock for writing -- returns 1 if successful, 0 if contention
  62. */
  63. static inline int down_write_trylock(struct rw_semaphore *sem)
  64. {
  65. int ret;
  66. rwsemtrace(sem,"Entering down_write_trylock");
  67. ret = __down_write_trylock(sem);
  68. rwsemtrace(sem,"Leaving down_write_trylock");
  69. return ret;
  70. }
  71. /*
  72. * release a read lock
  73. */
  74. static inline void up_read(struct rw_semaphore *sem)
  75. {
  76. rwsemtrace(sem,"Entering up_read");
  77. __up_read(sem);
  78. rwsemtrace(sem,"Leaving up_read");
  79. }
  80. /*
  81. * release a write lock
  82. */
  83. static inline void up_write(struct rw_semaphore *sem)
  84. {
  85. rwsemtrace(sem,"Entering up_write");
  86. __up_write(sem);
  87. rwsemtrace(sem,"Leaving up_write");
  88. }
  89. /*
  90. * downgrade write lock to read lock
  91. */
  92. static inline void downgrade_write(struct rw_semaphore *sem)
  93. {
  94. rwsemtrace(sem,"Entering downgrade_write");
  95. __downgrade_write(sem);
  96. rwsemtrace(sem,"Leaving downgrade_write");
  97. }
  98. #endif /* __KERNEL__ */
  99. #endif /* _LINUX_RWSEM_H */