lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
critical_section.h
00001 /*****************************************************/
00002 /* lean Concurrent              (c) Tobias Zirr 2011 */
00003 /*****************************************************/
00004 
00005 #ifndef LEAN_CONCURRENT_CRITICAL_SECTION
00006 #define LEAN_CONCURRENT_CRITICAL_SECTION
00007 
00008 #include "../lean.h"
00009 #include "../tags/noncopyable.h"
00010 #include <windows.h>
00011 
00012 // Include automatically to encourage use of scoped_lock
00013 #include "../smart/scoped_lock.h"
00014 
00015 namespace lean
00016 {
00017 namespace concurrent
00018 {
00019 
00021 class critical_section : public noncopyable
00022 {
00023 private:
00024     CRITICAL_SECTION m_criticalSection;
00025 
00026 public:
00028     critical_section(unsigned long spinCount = 4096)
00029     {
00030         if (!::InitializeCriticalSectionAndSpinCount(&m_criticalSection, spinCount))
00031             LEAN_ASSERT(false);
00032     }
00034     ~critical_section()
00035     {
00036         ::DeleteCriticalSection(&m_criticalSection);
00037     }
00038 
00040     LEAN_INLINE bool try_lock()
00041     {
00042         return (::TryEnterCriticalSection(&m_criticalSection) != FALSE);
00043     }
00044 
00046     LEAN_INLINE void lock()
00047     {
00048         ::EnterCriticalSection(&m_criticalSection);
00049     }
00050 
00052     LEAN_INLINE void unlock()
00053     {
00054         ::LeaveCriticalSection(&m_criticalSection);
00055     }
00056 };
00057 
00059 typedef smart::scoped_lock<critical_section> scoped_cs_lock;
00060 
00061 } // namespace
00062 
00063 using concurrent::critical_section;
00064 
00065 using concurrent::scoped_cs_lock;
00066 
00067 } // namespace
00068 
00069 #endif