RFR(S) 8242504: Enhance the system clock to nanosecond precision

Daniel D. Daugherty daniel.daugherty at oracle.com
Wed May 27 15:09:39 UTC 2020


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

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.

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.

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