29 #ifndef RCF_DETAIL_WIN_EVENT_HPP
30 #define RCF_DETAIL_WIN_EVENT_HPP
32 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
34 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
36 #if defined(BOOST_WINDOWS)
38 #include <boost/assert.hpp>
40 #include <RCF/thread/push_options.hpp>
42 #include <RCF/thread/mutex.hpp>
47 class RCF_EXPORT win_event
57 ::CloseHandle(event_);
61 template <
typename Lock>
62 void signal_all(Lock& lock)
64 BOOST_ASSERT(lock.locked());
73 template <
typename Lock>
74 void clear(Lock& lock)
76 BOOST_ASSERT(lock.locked());
82 template <
typename Lock>
85 BOOST_ASSERT(lock.locked());
89 mutex::scoped_lock waitLock(mWaitCountMutex);
93 ::WaitForSingleObject(event_, INFINITE);
96 mutex::scoped_lock waitLock(mWaitCountMutex);
101 ::ResetEvent(event_);
110 template <
typename Lock>
111 bool timed_wait(Lock& lock, boost::uint32_t waitMs)
113 BOOST_ASSERT(lock.locked());
118 mutex::scoped_lock waitLock(mWaitCountMutex);
122 DWORD ret = ::WaitForSingleObject(event_, waitMs);
123 assert(ret != WAIT_ABANDONED && ret != WAIT_FAILED);
126 mutex::scoped_lock waitLock(mWaitCountMutex);
128 if (ret != WAIT_TIMEOUT && mWaitCount == 0)
131 ::ResetEvent(event_);
136 if (ret == WAIT_TIMEOUT)
145 template <
typename Lock>
146 void notify_all(Lock& lock)
162 mutex mWaitCountMutex;
169 #include <RCF/thread/pop_options.hpp>
171 #endif // defined(BOOST_WINDOWS)
173 #endif // RCF_DETAIL_WIN_EVENT_HPP