pthread_mutex_scoped_lock.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #ifndef BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP
  2. #define BOOST_PTHREAD_MUTEX_SCOPED_LOCK_HPP
  3. // (C) Copyright 2007-8 Anthony Williams
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #include <pthread.h>
  9. #include <boost/assert.hpp>
  10. #include <boost/config/abi_prefix.hpp>
  11. namespace boost
  12. {
  13. namespace posix {
  14. #ifdef BOOST_THREAD_HAS_EINTR_BUG
  15. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  16. int pthread_mutex_destroy(pthread_mutex_t* m)
  17. {
  18. int ret;
  19. do
  20. {
  21. ret = ::pthread_mutex_destroy(m);
  22. } while (ret == EINTR);
  23. return ret;
  24. }
  25. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  26. int pthread_mutex_lock(pthread_mutex_t* m)
  27. {
  28. int ret;
  29. do
  30. {
  31. ret = ::pthread_mutex_lock(m);
  32. } while (ret == EINTR);
  33. return ret;
  34. }
  35. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  36. int pthread_mutex_unlock(pthread_mutex_t* m)
  37. {
  38. int ret;
  39. do
  40. {
  41. ret = ::pthread_mutex_unlock(m);
  42. } while (ret == EINTR);
  43. return ret;
  44. }
  45. #else
  46. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  47. int pthread_mutex_destroy(pthread_mutex_t* m)
  48. {
  49. return ::pthread_mutex_destroy(m);
  50. }
  51. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  52. int pthread_mutex_lock(pthread_mutex_t* m)
  53. {
  54. return ::pthread_mutex_lock(m);
  55. }
  56. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  57. int pthread_mutex_unlock(pthread_mutex_t* m)
  58. {
  59. return ::pthread_mutex_unlock(m);
  60. }
  61. #endif
  62. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  63. int pthread_mutex_trylock(pthread_mutex_t* m)
  64. {
  65. return ::pthread_mutex_trylock(m);
  66. }
  67. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  68. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
  69. {
  70. return ::pthread_cond_wait(cond, mutex);
  71. }
  72. BOOST_FORCEINLINE BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS
  73. int pthread_cond_signal(pthread_cond_t *cond)
  74. {
  75. return ::pthread_cond_signal(cond);
  76. }
  77. }
  78. namespace pthread
  79. {
  80. class pthread_mutex_scoped_lock
  81. {
  82. pthread_mutex_t* m;
  83. bool locked;
  84. public:
  85. explicit pthread_mutex_scoped_lock(pthread_mutex_t* m_) BOOST_NOEXCEPT:
  86. m(m_),locked(true)
  87. {
  88. BOOST_VERIFY(!posix::pthread_mutex_lock(m));
  89. }
  90. void unlock() BOOST_NOEXCEPT
  91. {
  92. BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
  93. locked=false;
  94. }
  95. void unlock_if_locked() BOOST_NOEXCEPT
  96. {
  97. if(locked)
  98. {
  99. unlock();
  100. }
  101. }
  102. ~pthread_mutex_scoped_lock() BOOST_NOEXCEPT
  103. {
  104. if(locked)
  105. {
  106. unlock();
  107. }
  108. }
  109. };
  110. class pthread_mutex_scoped_unlock
  111. {
  112. pthread_mutex_t* m;
  113. public:
  114. explicit pthread_mutex_scoped_unlock(pthread_mutex_t* m_) BOOST_NOEXCEPT:
  115. m(m_)
  116. {
  117. BOOST_VERIFY(!posix::pthread_mutex_unlock(m));
  118. }
  119. ~pthread_mutex_scoped_unlock() BOOST_NOEXCEPT
  120. {
  121. BOOST_VERIFY(!posix::pthread_mutex_lock(m));
  122. }
  123. };
  124. }
  125. }
  126. #include <boost/config/abi_suffix.hpp>
  127. #endif