Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb3f0b69

Browse files
authored
gh-104530: Enable native Win32 condition variables by default (GH-104531)
1 parentd29f57f commitb3f0b69

File tree

6 files changed

+41
-35
lines changed

6 files changed

+41
-35
lines changed

‎Include/internal/pycore_condvar.h‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@
3535
#include<windows.h>// CRITICAL_SECTION
3636

3737
/* options */
38-
/*non-emulated condition variables are provided for those that want
39-
* to target WindowsVista. Modify this macro to enable them.
38+
/* emulated condition variables are provided for those that want
39+
* to target WindowsXP or earlier. Modify this macro to enable them.
4040
*/
4141
#ifndef_PY_EMULATED_WIN_CV
42-
#define_PY_EMULATED_WIN_CV1/* use emulated condition variables */
42+
#define_PY_EMULATED_WIN_CV0/* usenon-emulated condition variables */
4343
#endif
4444

45-
/* fall back to emulation ifnottargeting Vista */
45+
/* fall back to emulation if targeting earlier than Vista */
4646
#if !definedNTDDI_VISTA||NTDDI_VERSION<NTDDI_VISTA
4747
#undef _PY_EMULATED_WIN_CV
4848
#define_PY_EMULATED_WIN_CV 1
@@ -77,7 +77,7 @@ typedef struct _PyCOND_T
7777

7878
#else/* !_PY_EMULATED_WIN_CV */
7979

80-
/* Use nativeWin7 primitives if build target isWin7 or higher */
80+
/* Use nativeWindows primitives if build target isVista or higher */
8181

8282
/* SRWLOCK is faster and better than CriticalSection */
8383
typedefSRWLOCKPyMUTEX_T;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Use native Win32 condition variables.

‎Python/ceval_gil.c‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,16 @@ PyEval_SaveThread(void)
610610
void
611611
PyEval_RestoreThread(PyThreadState*tstate)
612612
{
613+
#ifdefMS_WINDOWS
614+
interr=GetLastError();
615+
#endif
616+
613617
_Py_EnsureTstateNotNULL(tstate);
614618
_PyThreadState_Attach(tstate);
619+
620+
#ifdefMS_WINDOWS
621+
SetLastError(err);
622+
#endif
615623
}
616624

617625

‎Python/condvar.h‎

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,13 @@ PyMUTEX_UNLOCK(PyMUTEX_T *cs)
260260
return0;
261261
}
262262

263-
264263
Py_LOCAL_INLINE(int)
265264
PyCOND_INIT(PyCOND_T*cv)
266265
{
267266
InitializeConditionVariable(cv);
268267
return0;
269268
}
269+
270270
Py_LOCAL_INLINE(int)
271271
PyCOND_FINI(PyCOND_T*cv)
272272
{
@@ -279,27 +279,32 @@ PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs)
279279
returnSleepConditionVariableSRW(cv,cs,INFINITE,0) ?0 :-1;
280280
}
281281

282-
/* This implementation makes no distinction about timeouts. Signal
283-
* 2 to indicate that we don't know.
284-
*/
282+
/* return 0 for success, 1 on timeout, -1 on error */
285283
Py_LOCAL_INLINE(int)
286284
PyCOND_TIMEDWAIT(PyCOND_T*cv,PyMUTEX_T*cs,long longus)
287285
{
288-
returnSleepConditionVariableSRW(cv,cs, (DWORD)(us/1000),0) ?2 :-1;
286+
BOOLsuccess=SleepConditionVariableSRW(cv,cs, (DWORD)(us/1000),0);
287+
if (!success) {
288+
if (GetLastError()==ERROR_TIMEOUT) {
289+
return1;
290+
}
291+
return-1;
292+
}
293+
return0;
289294
}
290295

291296
Py_LOCAL_INLINE(int)
292297
PyCOND_SIGNAL(PyCOND_T*cv)
293298
{
294-
WakeConditionVariable(cv);
295-
return0;
299+
WakeConditionVariable(cv);
300+
return0;
296301
}
297302

298303
Py_LOCAL_INLINE(int)
299304
PyCOND_BROADCAST(PyCOND_T*cv)
300305
{
301-
WakeAllConditionVariable(cv);
302-
return0;
306+
WakeAllConditionVariable(cv);
307+
return0;
303308
}
304309

305310

‎Python/pystate.c‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2488,7 +2488,17 @@ PyGILState_Check(void)
24882488
return0;
24892489
}
24902490

2491-
return (tstate==gilstate_tss_get(runtime));
2491+
#ifdefMS_WINDOWS
2492+
interr=GetLastError();
2493+
#endif
2494+
2495+
PyThreadState*tcur=gilstate_tss_get(runtime);
2496+
2497+
#ifdefMS_WINDOWS
2498+
SetLastError(err);
2499+
#endif
2500+
2501+
return (tstate==tcur);
24922502
}
24932503

24942504
PyGILState_STATE

‎Python/thread_nt.h‎

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -444,16 +444,7 @@ PyThread_set_key_value(int key, void *value)
444444
void*
445445
PyThread_get_key_value(intkey)
446446
{
447-
/* because TLS is used in the Py_END_ALLOW_THREAD macro,
448-
* it is necessary to preserve the windows error state, because
449-
* it is assumed to be preserved across the call to the macro.
450-
* Ideally, the macro should be fixed, but it is simpler to
451-
* do it here.
452-
*/
453-
DWORDerror=GetLastError();
454-
void*result=TlsGetValue(key);
455-
SetLastError(error);
456-
returnresult;
447+
returnTlsGetValue(key);
457448
}
458449

459450
void
@@ -525,14 +516,5 @@ void *
525516
PyThread_tss_get(Py_tss_t*key)
526517
{
527518
assert(key!=NULL);
528-
/* because TSS is used in the Py_END_ALLOW_THREAD macro,
529-
* it is necessary to preserve the windows error state, because
530-
* it is assumed to be preserved across the call to the macro.
531-
* Ideally, the macro should be fixed, but it is simpler to
532-
* do it here.
533-
*/
534-
DWORDerror=GetLastError();
535-
void*result=TlsGetValue(key->_key);
536-
SetLastError(error);
537-
returnresult;
519+
returnTlsGetValue(key->_key);
538520
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp