RFR: 6313903: Thread.sleep(3) might wake up immediately on windows

Roger Riggs Roger.Riggs at oracle.com
Tue Sep 3 14:30:28 UTC 2019


Hi David,

In os.cpp:1893, can the double read of javaTimeNanos be avoided on the 
first iteration?
Set newtime = prevtime before the loop and re-read it after the call to 
park(:1918)
Negible nanotime should have elapsed between 1881 and 1893.
Ditto the non-interruptable code in 1936-1947.
(Unless javaTimeNanos is free?).

$.02, Roger




On 9/2/19 2:06 AM, David Holmes wrote:
> Bug: https://bugs.openjdk.java.net/browse/JDK-6313903
> webrev: http://cr.openjdk.java.net/~dholmes/6313903/webrev/
>
> This is a fix to a very long term problem on Windows that really 
> should have been fixed many years ago: the Windows timed-wait routines 
> can return early by up to a clock tick** (which itself could be as 
> long as 16ms). The fix for Thread.sleep is to track the elapsed time 
> (via nanoTime) and simply adjust and repeat the sleep if we were going 
> to return earlier than requested. This is the same as what we have 
> been doing on non-Windows for many years.
>
> ** whether or not you observe this seems highly dependent on hardware 
> - see bug report for observed behaviours.
>
> The additional motivation for fixing this now is to reduce the amount 
> of platform specific sleep/interrupt code and to allow changes to the 
> shared interrupt code. There are some additional RFE's in the pipeline 
> for that.
>
> This fix does the following:
> - moves the os_posix.cpp os::sleep implementation to os.cpp to be 
> shared by all platforms and deletes the os_windows.cpp os::sleep 
> implementation
>   - there are some additional comments added and the JavaThread 
> assertion is moved to the head of the "interruptible" code path
> - updates os_windows.cpp in these additional ways:
>   - updates the commentary about creating the interrupt_event (which 
> is now only used by JDK library code for use by Process.waitFor)
>   - updates os::interrupt to also unpark the _SleepEvent
>   - moves the use of the HighResolutionInterval utility class from the 
> os::sleep code to the PlatformEvent::park code, so that sleep on 
> Windows will still make adjustments to the clock tick if needed (it 
> also means that Object.wait() calls will now make the same 
> adjustments**).
>
> ** This is a change behaviour but I'm not concerned about there being 
> any adverse effects from this. On many systems the code will have no 
> affect as the system will be using the 1ms clock tick all the time 
> anyway (e.g. my laptops do this). On systems with e.g. 15ms tick, what 
> you will now see is Object.wait returning on time rather than much 
> later than requested e.g. before this fix a timed-wait of 1ms returned 
> in 15.14ms, but after the fix it was 2.3ms. (Note that this 
> observation seems contrary to the general statement that windows 
> timed-wait event operations can return early by up to a clock tick - 
> as I said it seems highly hardware dependent.)
>
> Testing: tiers 1-3
>          custom testing to look at sleep and wait times, as per bug 
> report.
>
> Thanks,
> David
> -----



More information about the hotspot-runtime-dev mailing list