Eryk Sun <eryk...@gmail.com> added the comment:

> Python 2.7 had totally different code, IIRC.

In 2.7 the wait() method of threading._Condition implements the timeout with a 
loop the calls time.sleep() with an increasing delay from 500 microseconds up 
to 50 ms, and no more than the remaining time.

> But the good news is that we should be able to use code similar to 
> what's in Modules/timemodule.c#L1878 (the pysleep() function) to also 
> wait on the event we use to emulate signals on Windows. 

If Python continues to use emulated condition variables, then the kernel wait 
in _PyCOND_WAIT_MS can easily be adapted to include the SIGINT event. However, 
isn't it planned at some point to remove the emulated condition-variable 
implementation in favor of native condition variables? If so and PyCOND_WAIT 
and PyCOND_TIMEDWAIT end up calling SleepConditionVariableSRW, there's no 
obvious way to interrupt this to support Ctrl+C and Ctrl+Break (given a custom 
SIGBREAK handler) in the main thread. 

In particular, in Windows 8+, SleepConditionVariableSRW begins by spinning in 
user mode for a fixed number of cycles. Then it calls NtWaitForAlertByThreadId 
to block until alerted by NtAlertThreadByThreadId, which gets called internally 
by Wake[All]ConditionVariable. It wouldn't be kosher to call 
NtAlertThreadByThreadId directly in order to alert the main thread because it's 
an undocumented system call, plus it's poking into the internal implementation 
details of SleepConditionVariableSRW and WakeConditionVariable, which could 
leave the variable in a bad state.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38428>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to