@@ -56,7 +56,7 @@ DEFINE_VTBL_WRAPPER(56);
56
56
57
57
void * (__cdecl * MSVCRT_set_new_handler )(void * );
58
58
59
- #if _MSVCP_VER >= 110
59
+ #if _MSVCP_VER >= 110 && _MSVCP_VER <= 120
60
60
#ifdef __ASM_USE_THISCALL_WRAPPER
61
61
62
62
extern void * call_thiscall_func ;
@@ -93,59 +93,112 @@ bool (__thiscall *_Condition_variable_wait_for)(_Condition_variable*,
93
93
void (__thiscall * _Condition_variable_notify_one )(_Condition_variable * );
94
94
void (__thiscall * _Condition_variable_notify_all )(_Condition_variable * );
95
95
96
- void cs_init (critical_section * cs )
96
+ void cs_init (cs * cs )
97
97
{
98
- call_func1 (critical_section_ctor , cs );
98
+ call_func1 (critical_section_ctor , & cs -> conc );
99
99
}
100
100
101
- void cs_destroy (critical_section * cs )
101
+ void cs_destroy (cs * cs )
102
102
{
103
- call_func1 (critical_section_dtor , cs );
103
+ call_func1 (critical_section_dtor , & cs -> conc );
104
104
}
105
105
106
- void cs_lock (critical_section * cs )
106
+ void cs_lock (cs * cs )
107
107
{
108
- call_func1 (critical_section_lock , cs );
108
+ call_func1 (critical_section_lock , & cs -> conc );
109
109
}
110
110
111
- void cs_unlock (critical_section * cs )
111
+ void cs_unlock (cs * cs )
112
112
{
113
- call_func1 (critical_section_unlock , cs );
113
+ call_func1 (critical_section_unlock , & cs -> conc );
114
114
}
115
115
116
- bool cs_trylock (critical_section * cs )
116
+ bool cs_trylock (cs * cs )
117
117
{
118
- return call_func1 (critical_section_trylock , cs );
118
+ return call_func1 (critical_section_trylock , & cs -> conc );
119
119
}
120
120
121
- void cv_init (_Condition_variable * cv )
121
+ void cv_init (cv * cv )
122
122
{
123
- call_func1 (_Condition_variable_ctor , cv );
123
+ call_func1 (_Condition_variable_ctor , & cv -> conc );
124
124
}
125
125
126
- void cv_destroy (_Condition_variable * cv )
126
+ void cv_destroy (cv * cv )
127
127
{
128
- call_func1 (_Condition_variable_dtor , cv );
128
+ call_func1 (_Condition_variable_dtor , & cv -> conc );
129
129
}
130
130
131
- void cv_wait (_Condition_variable * cv , critical_section * cs )
131
+ void cv_wait (cv * cv , cs * cs )
132
132
{
133
- call_func2 (_Condition_variable_wait , cv , cs );
133
+ call_func2 (_Condition_variable_wait , & cv -> conc , & cs -> conc );
134
134
}
135
135
136
- bool cv_wait_for (_Condition_variable * cv , critical_section * cs , unsigned int timeout )
136
+ bool cv_wait_for (cv * cv , cs * cs , unsigned int timeout )
137
137
{
138
- return call_func3 (_Condition_variable_wait_for , cv , cs , timeout );
138
+ return call_func3 (_Condition_variable_wait_for , & cv -> conc , & cs -> conc , timeout );
139
139
}
140
140
141
- void cv_notify_one (_Condition_variable * cv )
141
+ void cv_notify_one (cv * cv )
142
142
{
143
- call_func1 (_Condition_variable_notify_one , cv );
143
+ call_func1 (_Condition_variable_notify_one , & cv -> conc );
144
144
}
145
145
146
- void cv_notify_all (_Condition_variable * cv )
146
+ void cv_notify_all (cv * cv )
147
147
{
148
- call_func1 (_Condition_variable_notify_all , cv );
148
+ call_func1 (_Condition_variable_notify_all , & cv -> conc );
149
+ }
150
+ #elif _MSVCP_VER >= 140
151
+ void cs_init (cs * cs )
152
+ {
153
+ InitializeSRWLock (& cs -> win );
154
+ }
155
+
156
+ void cs_destroy (cs * cs )
157
+ {
158
+ }
159
+
160
+ void cs_lock (cs * cs )
161
+ {
162
+ AcquireSRWLockExclusive (& cs -> win );
163
+ }
164
+
165
+ void cs_unlock (cs * cs )
166
+ {
167
+ ReleaseSRWLockExclusive (& cs -> win );
168
+ }
169
+
170
+ bool cs_trylock (cs * cs )
171
+ {
172
+ return TryAcquireSRWLockExclusive (& cs -> win );
173
+ }
174
+
175
+ void cv_init (cv * cv )
176
+ {
177
+ InitializeConditionVariable (& cv -> win );
178
+ }
179
+
180
+ void cv_destroy (cv * cv )
181
+ {
182
+ }
183
+
184
+ void cv_wait (cv * cv , cs * cs )
185
+ {
186
+ SleepConditionVariableSRW (& cv -> win , & cs -> win , INFINITE , 0 );
187
+ }
188
+
189
+ bool cv_wait_for (cv * cv , cs * cs , unsigned int timeout )
190
+ {
191
+ return SleepConditionVariableSRW (& cv -> win , & cs -> win , timeout , 0 );
192
+ }
193
+
194
+ void cv_notify_one (cv * cv )
195
+ {
196
+ WakeConditionVariable (& cv -> win );
197
+ }
198
+
199
+ void cv_notify_all (cv * cv )
200
+ {
201
+ WakeAllConditionVariable (& cv -> win );
149
202
}
150
203
#endif
151
204
@@ -240,7 +293,7 @@ static void init_cxx_funcs(void)
240
293
}
241
294
#endif
242
295
243
- #if _MSVCP_VER >= 110
296
+ #if _MSVCP_VER >= 110 && _MSVCP_VER <= 120
244
297
if (sizeof (void * ) > sizeof (int )) /* 64-bit has different names */
245
298
{
246
299
critical_section_ctor = (void * )GetProcAddress (hcon , "??0critical_section@Concurrency@@QEAA@XZ" );
0 commit comments