Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/asio/detail/win_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/win_event.hpp | 2 // detail/win_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 |
35 public: | 35 public: |
36 // Constructor. | 36 // Constructor. |
37 BOOST_ASIO_DECL win_event(); | 37 BOOST_ASIO_DECL win_event(); |
38 | 38 |
39 // Destructor. | 39 // Destructor. |
40 ~win_event() | 40 BOOST_ASIO_DECL ~win_event(); |
41 { | |
42 ::CloseHandle(event_); | |
43 } | |
44 | 41 |
45 // Signal the event. | 42 // Signal the event. (Retained for backward compatibility.) |
46 template <typename Lock> | 43 template <typename Lock> |
47 void signal(Lock& lock) | 44 void signal(Lock& lock) |
48 { | 45 { |
46 this->signal_all(lock); | |
47 } | |
48 | |
49 // Signal all waiters. | |
50 template <typename Lock> | |
51 void signal_all(Lock& lock) | |
52 { | |
49 BOOST_ASIO_ASSERT(lock.locked()); | 53 BOOST_ASIO_ASSERT(lock.locked()); |
50 (void)lock; | 54 (void)lock; |
51 ::SetEvent(event_); | 55 state_ |= 1; |
56 ::SetEvent(events_[0]); | |
52 } | 57 } |
53 | 58 |
54 // Signal the event and unlock the mutex. | 59 // Unlock the mutex and signal one waiter. |
55 template <typename Lock> | 60 template <typename Lock> |
56 void signal_and_unlock(Lock& lock) | 61 void unlock_and_signal_one(Lock& lock) |
57 { | 62 { |
58 BOOST_ASIO_ASSERT(lock.locked()); | 63 BOOST_ASIO_ASSERT(lock.locked()); |
64 state_ |= 1; | |
65 bool have_waiters = (state_ > 1); | |
59 lock.unlock(); | 66 lock.unlock(); |
60 ::SetEvent(event_); | 67 if (have_waiters) |
68 ::SetEvent(events_[1]); | |
69 } | |
70 | |
71 // If there's a waiter, unlock the mutex and signal it. | |
72 template <typename Lock> | |
73 bool maybe_unlock_and_signal_one(Lock& lock) | |
74 { | |
75 BOOST_ASIO_ASSERT(lock.locked()); | |
76 state_ |= 1; | |
77 if (state_ > 1) | |
78 { | |
79 lock.unlock(); | |
80 ::SetEvent(events_[1]); | |
81 return true; | |
82 } | |
83 return false; | |
61 } | 84 } |
62 | 85 |
63 // Reset the event. | 86 // Reset the event. |
64 template <typename Lock> | 87 template <typename Lock> |
65 void clear(Lock& lock) | 88 void clear(Lock& lock) |
66 { | 89 { |
67 BOOST_ASIO_ASSERT(lock.locked()); | 90 BOOST_ASIO_ASSERT(lock.locked()); |
68 (void)lock; | 91 (void)lock; |
69 ::ResetEvent(event_); | 92 ::ResetEvent(events_[0]); |
93 state_ &= ~std::size_t(1); | |
70 } | 94 } |
71 | 95 |
72 // Wait for the event to become signalled. | 96 // Wait for the event to become signalled. |
73 template <typename Lock> | 97 template <typename Lock> |
74 void wait(Lock& lock) | 98 void wait(Lock& lock) |
75 { | 99 { |
76 BOOST_ASIO_ASSERT(lock.locked()); | 100 BOOST_ASIO_ASSERT(lock.locked()); |
77 lock.unlock(); | 101 while ((state_ & 1) == 0) |
78 ::WaitForSingleObject(event_, INFINITE); | 102 { |
79 lock.lock(); | 103 state_ += 2; |
104 lock.unlock(); | |
105 ::WaitForMultipleObjects(2, events_, false, INFINITE); | |
106 lock.lock(); | |
107 state_ -= 2; | |
108 } | |
80 } | 109 } |
81 | 110 |
82 private: | 111 private: |
83 HANDLE event_; | 112 HANDLE events_[2]; |
113 std::size_t state_; | |
84 }; | 114 }; |
85 | 115 |
86 } // namespace detail | 116 } // namespace detail |
87 } // namespace asio | 117 } // namespace asio |
88 } // namespace boost | 118 } // namespace boost |