1 #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED 2 #define BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED 3 4 // MS compatible compilers support #pragma once 5 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020) 7 # pragma once 8 #endif 9 10 // 11 // boost/detail/lwm_win32_cs.hpp 12 // 13 // Copyright (c) 2002, 2003 Peter Dimov 14 // Copyright (c) Microsoft Corporation 2014 15 // 16 // Distributed under the Boost Software License, Version 1.0. (See 17 // accompanying file LICENSE_1_0.txt or copy at 18 // http://www.boost.org/LICENSE_1_0.txt) 19 // 20 21 #include <boost/predef.h> 22 23 #ifdef BOOST_USE_WINDOWS_H 24 25 #include <windows.h> 26 27 #else 28 29 struct _RTL_CRITICAL_SECTION; 30 31 #endif 32 33 namespace boost 34 { 35 36 namespace detail 37 { 38 39 #ifndef BOOST_USE_WINDOWS_H 40 41 struct critical_section 42 { 43 struct critical_section_debug * DebugInfo; 44 long LockCount; 45 long RecursionCount; 46 void * OwningThread; 47 void * LockSemaphore; 48 #if defined(_WIN64) 49 unsigned __int64 SpinCount; 50 #else 51 unsigned long SpinCount; 52 #endif 53 }; 54 55 #if BOOST_PLAT_WINDOWS_RUNTIME 56 extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSectionEx(::_RTL_CRITICAL_SECTION *, unsigned long, unsigned long); 57 #else 58 extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(::_RTL_CRITICAL_SECTION *); 59 #endif 60 extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(::_RTL_CRITICAL_SECTION *); 61 extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(::_RTL_CRITICAL_SECTION *); 62 extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(::_RTL_CRITICAL_SECTION *); 63 64 typedef ::_RTL_CRITICAL_SECTION rtl_critical_section; 65 66 #else // #ifndef BOOST_USE_WINDOWS_H 67 68 typedef ::CRITICAL_SECTION critical_section; 69 70 #if BOOST_PLAT_WINDOWS_RUNTIME 71 using ::InitializeCriticalSectionEx; 72 #else 73 using ::InitializeCriticalSection; 74 #endif 75 using ::EnterCriticalSection; 76 using ::LeaveCriticalSection; 77 using ::DeleteCriticalSection; 78 79 typedef ::CRITICAL_SECTION rtl_critical_section; 80 81 #endif // #ifndef BOOST_USE_WINDOWS_H 82 83 class lightweight_mutex 84 { 85 private: 86 87 critical_section cs_; 88 89 lightweight_mutex(lightweight_mutex const &); 90 lightweight_mutex & operator=(lightweight_mutex const &); 91 92 public: 93 lightweight_mutex()94 lightweight_mutex() 95 { 96 #if BOOST_PLAT_WINDOWS_RUNTIME 97 boost::detail::InitializeCriticalSectionEx(reinterpret_cast< rtl_critical_section* >(&cs_), 4000, 0); 98 #else 99 boost::detail::InitializeCriticalSection(reinterpret_cast< rtl_critical_section* >(&cs_)); 100 #endif 101 } 102 ~lightweight_mutex()103 ~lightweight_mutex() 104 { 105 boost::detail::DeleteCriticalSection(reinterpret_cast< rtl_critical_section* >(&cs_)); 106 } 107 108 class scoped_lock; 109 friend class scoped_lock; 110 111 class scoped_lock 112 { 113 private: 114 115 lightweight_mutex & m_; 116 117 scoped_lock(scoped_lock const &); 118 scoped_lock & operator=(scoped_lock const &); 119 120 public: 121 scoped_lock(lightweight_mutex & m)122 explicit scoped_lock(lightweight_mutex & m): m_(m) 123 { 124 boost::detail::EnterCriticalSection(reinterpret_cast< rtl_critical_section* >(&m_.cs_)); 125 } 126 ~scoped_lock()127 ~scoped_lock() 128 { 129 boost::detail::LeaveCriticalSection(reinterpret_cast< rtl_critical_section* >(&m_.cs_)); 130 } 131 }; 132 }; 133 134 } // namespace detail 135 136 } // namespace boost 137 138 #endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED 139