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