lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
event.h
00001 /*****************************************************/
00002 /* lean Concurrent              (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_CONCURRENT_EVENT
00006 #define LEAN_CONCURRENT_EVENT
00007 
00008 #include "../lean.h"
00009 #include "../tags/noncopyable.h"
00010 #include <windows.h>
00011 
00012 namespace lean
00013 {
00014 namespace concurrent
00015 {
00016 
00018 class event : public noncopyable
00019 {
00020 private:
00021     HANDLE m_event;
00022 
00023 public:
00025     event(bool signaled = false)
00026         : m_event( ::CreateEventW(NULL, true, signaled, NULL) )
00027     {
00028         LEAN_ASSERT(m_event != NULL);
00029     }
00031     ~event()
00032     {
00033         ::CloseHandle(m_event);
00034     }
00035 
00037     LEAN_INLINE void wait()
00038     {
00039         DWORD result = ::WaitForSingleObject(m_event, INFINITE);
00040         LEAN_ASSERT(result == WAIT_OBJECT_0);
00041     }
00042 
00044     LEAN_INLINE void set()
00045     {
00046         BOOL result = ::SetEvent(m_event);
00047         LEAN_ASSERT(result != FALSE);
00048     }
00050     LEAN_INLINE void reset()
00051     {
00052         BOOL result = ::ResetEvent(m_event);
00053         LEAN_ASSERT(result != FALSE);
00054     }
00055 
00057     LEAN_INLINE void signaled(bool signaled)
00058     {
00059         if (signaled)
00060             set();
00061         else
00062             reset();
00063     }
00064 
00066     LEAN_INLINE HANDLE native_handle() const
00067     {
00068         return m_event;
00069     }
00070 };
00071 
00072 } // namespace
00073 
00074 using concurrent::event;
00075 
00076 } // namespace
00077 
00078 #endif