Thanks, Laurent. I can sponsor this fix, get a RFR thread going for JDK-8226297, keep webrevs updated as the review progresses, etc.

However I've uncovered an issue with the fix that should be resolved before proceeding.

Specifically, the new Arrays.COMMON_PARALLELISM static constant causes exceptions at startup under some circumstances:
    * running with LANG=C on Linux[1]
    * setting a property value with non-Ascii characters on Mac[2]

java.util.Arrays is used a fair bit for String handling (java.lang.StringCoding, java.langStringLatin1, etc). The problem is that early in startup, depending on the locale/language setup and/or property settings, java.util.Arrays can be called during initialization of system properties.

During Arrays.<clinit>, COMMON_PARALLELISM is setup with a call to ForkJoinPool.getCommonPoolParallelism(). ForkJoinPool<clinit> sets up some VarHandles, VarHandles<clinit> leads to MethodHandleStatics.<clinit>, which reads some system properties. But we're still initializing the system properties - 'props' is null, so NPE.

I think Arrays.java needs to remove the COMMON_PARALLELISM constant, and go back to making calls to ForkJoinPool.getCommonPoolParallelism().

I can do the update and post an updated webrev (unless further discussion is needed).

Thanks,
-Brent

1. FWIW, additional JNU_CHECK_EXCEPTION_RETURN calls were needed to produce this stack trace:
Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
        at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2052)
at java.lang.invoke.VarHandles.makeFieldHandle(java.base/VarHandles.java:71) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandleCommon(java.base/MethodHandles.java:3147) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandle(java.base/MethodHandles.java:3107) at java.lang.invoke.MethodHandles$Lookup.findVarHandle(java.base/MethodHandles.java:2229) at java.util.concurrent.ForkJoinPool.<clinit>(java.base/ForkJoinPool.java:3184)
        at java.util.Arrays.<clinit>(java.base/Arrays.java:436)
        at java.lang.StringLatin1.newString(java.base/StringLatin1.java:767)
        at java.lang.StringBuilder.toString(java.base/StringBuilder.java:446)
at sun.nio.cs.StandardCharsets.toLower(java.base/StandardCharsets.java:1284)
        at 
sun.nio.cs.StandardCharsets.lookup(java.base/StandardCharsets.java:1304)
at sun.nio.cs.StandardCharsets.charsetForName(java.base/StandardCharsets.java:1338)
        at java.nio.charset.Charset.lookup2(java.base/Charset.java:471)
        at java.nio.charset.Charset.lookup(java.base/Charset.java:460)
        at java.nio.charset.Charset.isSupported(java.base/Charset.java:501)
at jdk.internal.util.SystemProps$Raw.platformProperties(java.base/Native Method)
        at 
jdk.internal.util.SystemProps$Raw.<init>(java.base/SystemProps.java:233)
at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:54)
        at java.lang.System.initPhase1(java.base/System.java:2001)
Caused by: java.lang.NullPointerException
at java.lang.invoke.MethodHandleStatics.<clinit>(java.base/MethodHandleStatics.java:62)
        at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2052)
at java.lang.invoke.VarHandles.makeFieldHandle(java.base/VarHandles.java:71) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandleCommon(java.base/MethodHandles.java:3147) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandle(java.base/MethodHandles.java:3107) at java.lang.invoke.MethodHandles$Lookup.findVarHandle(java.base/MethodHandles.java:2229) at java.util.concurrent.ForkJoinPool.<clinit>(java.base/ForkJoinPool.java:3184)
        at java.util.Arrays.<clinit>(java.base/Arrays.java:436)
        at java.lang.StringLatin1.newString(java.base/StringLatin1.java:767)
        at java.lang.StringBuilder.toString(java.base/StringBuilder.java:446)
at sun.nio.cs.StandardCharsets.toLower(java.base/StandardCharsets.java:1284)
        at 
sun.nio.cs.StandardCharsets.lookup(java.base/StandardCharsets.java:1304)
at sun.nio.cs.StandardCharsets.charsetForName(java.base/StandardCharsets.java:1338)
        at java.nio.charset.Charset.lookup2(java.base/Charset.java:471)
        at java.nio.charset.Charset.lookup(java.base/Charset.java:460)
        at java.nio.charset.Charset.isSupported(java.base/Charset.java:501)
at jdk.internal.util.SystemProps$Raw.platformProperties(java.base/Native Method)
        at 
jdk.internal.util.SystemProps$Raw.<init>(java.base/SystemProps.java:233)
at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:54)
        at java.lang.System.initPhase1(java.base/System.java:2001)


2. I tried setting java.io.tmpdir to include a non-ascii character (e.g. ï ):

Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
        at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2052)
at java.lang.invoke.VarHandles.makeFieldHandle(java.base/VarHandles.java:71) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandleCommon(java.base/MethodHandles.java:3140) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandle(java.base/MethodHandles.java:3100) at java.lang.invoke.MethodHandles$Lookup.findVarHandle(java.base/MethodHandles.java:2222) at java.util.concurrent.ForkJoinPool.<clinit>(java.base/ForkJoinPool.java:3184)
        at java.util.Arrays.<clinit>(java.base/Arrays.java:389)
        at java.lang.StringCoding.decodeUTF8_0(java.base/StringCoding.java:747)
        at java.lang.StringCoding.decodeUTF8(java.base/StringCoding.java:712)
        at java.lang.StringCoding.decode(java.base/StringCoding.java:231)
        at java.lang.String.<init>(java.base/String.java:483)
        at java.lang.String.<init>(java.base/String.java:553)
        at jdk.internal.util.SystemProps$Raw.vmProperties(java.base/Native 
Method)
at jdk.internal.util.SystemProps$Raw.cmdProperties(java.base/SystemProps.java:253) at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:55)
        at java.lang.System.initPhase1(java.base/System.java:2001)
Caused by: java.lang.NullPointerException
at java.lang.invoke.MethodHandleStatics.<clinit>(java.base/MethodHandleStatics.java:62)
        at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2052)
at java.lang.invoke.VarHandles.makeFieldHandle(java.base/VarHandles.java:71) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandleCommon(java.base/MethodHandles.java:3140) at java.lang.invoke.MethodHandles$Lookup.getFieldVarHandle(java.base/MethodHandles.java:3100) at java.lang.invoke.MethodHandles$Lookup.findVarHandle(java.base/MethodHandles.java:2222) at java.util.concurrent.ForkJoinPool.<clinit>(java.base/ForkJoinPool.java:3184)
        at java.util.Arrays.<clinit>(java.base/Arrays.java:389)
        at java.lang.StringCoding.decodeUTF8_0(java.base/StringCoding.java:747)
        at java.lang.StringCoding.decodeUTF8(java.base/StringCoding.java:712)
        at java.lang.StringCoding.decode(java.base/StringCoding.java:231)
        at java.lang.String.<init>(java.base/String.java:483)
        at java.lang.String.<init>(java.base/String.java:553)
        at jdk.internal.util.SystemProps$Raw.vmProperties(java.base/Native 
Method)
at jdk.internal.util.SystemProps$Raw.cmdProperties(java.base/SystemProps.java:253) at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:55)
        at java.lang.System.initPhase1(java.base/System.java:2001)


On 7/26/19 1:14 AM, Laurent Bourgès wrote:
Hi all,

I updated the DPQS patch thanks to latest release from Vladimir (Pièces jointes2019.07.25):
http://cr.openjdk.java.net/~lbourges/dpqs/dpqs-8226297/dpqs-8226297.1/

"
Updated version of Arrays and DualPivotQuicksort files, the summary of changes:

1. Corrected minimal threshold for parallelism argument (0 -> 1)
2. Added constant for common parallelism
3. Updated byte / char / short counting sort.
"

Incremental patch change:
http://cr.openjdk.java.net/~lbourges/dpqs/dpqs-8226297/diff_dpqs_1_vs_0.log

Cheers,
Laurent


Le mer. 17 juil. 2019 à 17:12, Laurent Bourgès <bourges.laur...@gmail.com <mailto:bourges.laur...@gmail.com>> a écrit :

    Hi,

    I integrated locally the complete DPQS 19.2 patch from Vladimir
    Yaroslavskiy with up-to-date jdk14 (client) repository:
    build OK and jtreg passed OK (java/util/Arrays).

    Here is the corresponding webrev for review:
    http://cr.openjdk.java.net/~lbourges/dpqs/dpqs-8226297/webrev/

    Cheers,
    Laurent

Reply via email to