ntdll: make NtDelayExecution a bit more efficient
Graham Knap
graham.knap at gmail.com
Mon Mar 11 08:15:56 CDT 2013
Francois Gouget wrote:
> I think it's really a three patch series and the first one has the
> clearer commit message:
>
> Made NtDelayExecution with a 0 timeout yield the CPU, as it is
> supposed to.
I agree that this is the correct behaviour for the "zero timeout"
case. The comments that I submitted with my patch were incorrect,
because I misread the existing code. The patch that I submitted would
not have changed this behaviour, though it did reorganize a few lines
of code.
I had proposed to change the "nonzero timeout" case. If the caller
specifies a non-zero timeout value, the existing code calls:
1 if the timeout is negative: NtQuerySystemTime
2 NtYieldExecution
3 begin loop:
3.1 NtQuerySystemTime
3.2 select
We break out of the loop when "select" has waited the specified time,
and was not interrupted by a signal. (Right? Please tell me if I've
misinterpreted the code again.)
I suggested changing it to:
1 NtQuerySystemTime
2 begin loop:
2.1 select
2.2 NtQuerySystemTime
To explain:
* I think there is no need to call sched_yield before blocking on
select. (But I haven't yet come up with a way to prove it.)
* We no longer need to measure how long sched_yield made us wait, so
we can reorder the NtQuerySystemTime calls. The break condition is
unchanged, so the second NtQuerySystemTime call is often skipped.
> http://www.winehq.org/pipermail/wine-devel/2004-November/030796.html
Thanks, I will look at this.
-- graham
More information about the wine-devel
mailing list