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