Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/asio/detail/posix_event.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
1 // | 1 // |
2 // detail/posix_event.hpp | 2 // detail/posix_event.hpp |
3 // ~~~~~~~~~~~~~~~~~~~~~~ | 3 // ~~~~~~~~~~~~~~~~~~~~~~ |
4 // | 4 // |
5 // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) | 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
6 // | 6 // |
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying | 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying |
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
9 // | 9 // |
10 | 10 |
40 ~posix_event() | 40 ~posix_event() |
41 { | 41 { |
42 ::pthread_cond_destroy(&cond_); | 42 ::pthread_cond_destroy(&cond_); |
43 } | 43 } |
44 | 44 |
45 // Signal the event. | 45 // Signal the event. (Retained for backward compatibility.) |
46 template <typename Lock> | 46 template <typename Lock> |
47 void signal(Lock& lock) | 47 void signal(Lock& lock) |
48 { | 48 { |
49 this->signal_all(lock); | |
50 } | |
51 | |
52 // Signal all waiters. | |
53 template <typename Lock> | |
54 void signal_all(Lock& lock) | |
55 { | |
49 BOOST_ASIO_ASSERT(lock.locked()); | 56 BOOST_ASIO_ASSERT(lock.locked()); |
50 (void)lock; | 57 (void)lock; |
51 signalled_ = true; | 58 state_ |= 1; |
52 ::pthread_cond_signal(&cond_); // Ignore EINVAL. | 59 ::pthread_cond_broadcast(&cond_); // Ignore EINVAL. |
53 } | 60 } |
54 | 61 |
55 // Signal the event and unlock the mutex. | 62 // Unlock the mutex and signal one waiter. |
56 template <typename Lock> | 63 template <typename Lock> |
57 void signal_and_unlock(Lock& lock) | 64 void unlock_and_signal_one(Lock& lock) |
58 { | 65 { |
59 BOOST_ASIO_ASSERT(lock.locked()); | 66 BOOST_ASIO_ASSERT(lock.locked()); |
60 signalled_ = true; | 67 state_ |= 1; |
68 bool have_waiters = (state_ > 1); | |
61 lock.unlock(); | 69 lock.unlock(); |
62 ::pthread_cond_signal(&cond_); // Ignore EINVAL. | 70 if (have_waiters) |
71 ::pthread_cond_signal(&cond_); // Ignore EINVAL. | |
72 } | |
73 | |
74 // If there's a waiter, unlock the mutex and signal it. | |
75 template <typename Lock> | |
76 bool maybe_unlock_and_signal_one(Lock& lock) | |
77 { | |
78 BOOST_ASIO_ASSERT(lock.locked()); | |
79 state_ |= 1; | |
80 if (state_ > 1) | |
81 { | |
82 lock.unlock(); | |
83 ::pthread_cond_signal(&cond_); // Ignore EINVAL. | |
84 return true; | |
85 } | |
86 return false; | |
63 } | 87 } |
64 | 88 |
65 // Reset the event. | 89 // Reset the event. |
66 template <typename Lock> | 90 template <typename Lock> |
67 void clear(Lock& lock) | 91 void clear(Lock& lock) |
68 { | 92 { |
69 BOOST_ASIO_ASSERT(lock.locked()); | 93 BOOST_ASIO_ASSERT(lock.locked()); |
70 (void)lock; | 94 (void)lock; |
71 signalled_ = false; | 95 state_ &= ~std::size_t(1); |
72 } | 96 } |
73 | 97 |
74 // Wait for the event to become signalled. | 98 // Wait for the event to become signalled. |
75 template <typename Lock> | 99 template <typename Lock> |
76 void wait(Lock& lock) | 100 void wait(Lock& lock) |
77 { | 101 { |
78 BOOST_ASIO_ASSERT(lock.locked()); | 102 BOOST_ASIO_ASSERT(lock.locked()); |
79 while (!signalled_) | 103 while ((state_ & 1) == 0) |
104 { | |
105 state_ += 2; | |
80 ::pthread_cond_wait(&cond_, &lock.mutex().mutex_); // Ignore EINVAL. | 106 ::pthread_cond_wait(&cond_, &lock.mutex().mutex_); // Ignore EINVAL. |
107 state_ -= 2; | |
108 } | |
81 } | 109 } |
82 | 110 |
83 private: | 111 private: |
84 ::pthread_cond_t cond_; | 112 ::pthread_cond_t cond_; |
85 bool signalled_; | 113 std::size_t state_; |
86 }; | 114 }; |
87 | 115 |
88 } // namespace detail | 116 } // namespace detail |
89 } // namespace asio | 117 } // namespace asio |
90 } // namespace boost | 118 } // namespace boost |