RFR(S) 8242504: Enhance the system clock to nanosecond precision
David Holmes
david.holmes at oracle.com
Thu May 28 07:47:11 UTC 2020
Thanks Dan!
David
On 28/05/2020 12:52 pm, Daniel D. Daugherty wrote:
>> I'll wait for your thumbs up on the explanation.
>
> I'm good with the explanation. Thanks!
>
> Dan
>
>
> On 5/27/20 10:08 PM, David Holmes wrote:
>> Hi Dan,
>>
>> Thanks for taking a look.
>>
>> On 28/05/2020 1:09 am, Daniel D. Daugherty wrote:
>>> On 5/26/20 12:59 AM, David Holmes wrote:
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8242504
>>>> webrev: http://cr.openjdk.java.net/~dholmes/8242504/webrev/
>>>
>>> src/hotspot/os/posix/os_posix.hpp
>>> No comments.
>>>
>>> src/hotspot/os/posix/os_posix.inline.hpp
>>> No comments.
>>>
>>> src/hotspot/os/posix/os_posix.cpp
>>> old L1686: #ifdef NEEDS_LIBRT
>>> old L1687 // Close librt if there is no monotonic clock.
>>> old L1688 if (handle != RTLD_DEFAULT) {
>>> old L1689 dlclose(handle);
>>> old L1690 }
>>> old L1691 #endif
>>> I don't see any explanation in the bug or in the CR invite
>>> about why this code is deleted when this preceding code
>>> remains:
>>>
>>> L1658: // For older linux we need librt, for other OS we
>>> can find
>>> L1659: // this function in regular libc.
>>> L1660: #ifdef NEEDS_LIBRT
>>> L1661: // We do dlopen's in this particular order due to
>>> bug in linux
>>> L1662: // dynamic loader (see 6348968) leading to crash on
>>> exit.
>>> L1663: handle = dlopen("librt.so.1", RTLD_LAZY);
>>> L1664: if (handle == NULL) {
>>> L1665: handle = dlopen("librt.so", RTLD_LAZY);
>>> L1666: }
>>> L1667: #endif
>>
>> Sorry I should have mentioned this. In the existing code if we don't
>> have CLOCK_MONOTONIC support we will never use the dynamic handles to
>> clock_gettime and so we can close librt again (if we loaded it for
>> clock_gettime).
>>
>> With the new code we will always use clock_gettime so we can't unload
>> librt (if we needed it for clock_gettime) just because there is no
>> CLOCK_MONOTONIC.
>>
>> The existing code (and thus the new code) is technically missing
>> something here:
>>
>> 1675 if (clock_getres_func != NULL && clock_gettime_func != NULL) {
>> ...
>> 1693 }
>>
>> There could be an else clause that closes librt if it was loaded. But
>> the reality is that these functions are present in librt so we should
>> never reach such an else clause. Closing the handle to librt is a
>> minor "good citizen" act. This will all be moot in the not too distant
>> future when we rely on these functions being in libc on all platforms.
>>
>>> src/hotspot/os/linux/os_linux.cpp
>>> old L1382: return jlong(time.tv_sec) * 1000 +
>>> jlong(time.tv_usec / 1000);
>>> new L1390: return jlong(time.tv_sec) * MILLIUNITS +
>>> new L1391: jlong(time.tv_usec) / (MICROUNITS /
>>> MILLIUNITS);
>>>
>>> old L1390: nanos = jlong(time.tv_usec) * 1000;
>>> new L1407: nanos = jlong(time.tv_usec) * (NANOUNITS /
>>> MICROUNITS);
>>> Thanks for replacing the literal 1000s in the old code.
>>>
>>> test/jdk/java/time/test/java/time/TestClock_System.java
>>> L207: + " millisecond precision:
>>> "+countBetterThanMillisPrecision+"/"+1000);
>>> L209: + " microsecond precision:
>>> "+countBetterThanMicrosPrecision+"/"+1000);
>>> nit - need spaces around some of the '+' operators.
>>
>> Fixed.
>>
>>> test/micro/org/openjdk/bench/java/lang/SystemTime.java
>>> test/micro/org/openjdk/bench/java/lang/Systems.java
>>> No comments.
>>>
>>> My only "concern" is the deletion of closing the librt handle.
>>> If you have a good explanation for that, then I'm good with this patch.
>>
>> Thanks again. I'll wait for your thumbs up on the explanation.
>>
>> David
>> -----
>>
>>> Dan
>>>
>>>
>>>
>>>>
>>>> This work was contributed by Mark Kralj-Taylor:
>>>>
>>>> https://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2020-April/038975.html
>>>>
>>>>
>>>> On the hotspot side we change the Linux implementations of
>>>> javaTimeMillis() and javaTimeSystemUTC() so that they use
>>>> clock_gettime(CLOCK_REALTIME) instead of gettimeofday(). In keeping
>>>> with our conditional use of this API I added a new guard
>>>>
>>>> os::Posix::supports_clock_gettime()
>>>>
>>>> and refined the existing supports_monotonic_clock() so that we can
>>>> still use CLOCK_REALTIME if CLOCK_MONOTONIC does not exist. In the
>>>> future (hopefully very near future) we will simply assume these APIs
>>>> always exist.
>>>>
>>>> On the core-libs side the existing test:
>>>>
>>>> test/jdk/java/time/test/java/time/TestClock_System.java
>>>>
>>>> is adjusted to track the precision in more detail.
>>>>
>>>> Finally Mark has added instantNowAsEpochNanos() to the benchmark
>>>> previously known as
>>>>
>>>> test/micro/org/openjdk/bench/java/lang/Systems.java
>>>>
>>>> which I've renamed to SystemTime.java as Mark suggested. I agree
>>>> having these three functions measured together makes sense.
>>>>
>>>> Testing:
>>>> - test/jdk/java/time/test/java/time/TestClock_System.java
>>>> - test/micro/org/openjdk/bench/java/lang/SystemTime.java
>>>> - Tiers 1-3
>>>>
>>>> Thanks,
>>>> David
>>>
>
More information about the core-libs-dev
mailing list