Review request for 7034570 - java.lang.Runtime.exec(String[] cmd, String[] env) can not work properly if SystemRoot not inherited

David Schlosnagle schlosna at gmail.com
Mon Apr 18 18:16:43 UTC 2011


On Mon, Apr 18, 2011 at 1:40 PM, Ulf Zibis <Ulf.Zibis at gmx.de> wrote:
> Am 15.04.2011 15:43, schrieb Michael McMahon:
>>
>> I have incorporated much of Ulf's approach into this version.
>>
>> I agree with Alan about the spec. We could find other variables in the
>> future that need
>> to be set, but can have alternative values other than the default. I think
>> this approach
>> is the most flexible.
>>
>> http://cr.openjdk.java.net/~michaelm/7034570/webrev.4/
>>
>
> Additionally I see another problem:
>
> Because the ProcessEnvironment.nameComparator is static, creating a new
> Process will not be thread-safe!

Ulf,

I don't see a problem here. The ProcessEnvironment.nameComparator is a
static final field that is initialized to `new NameComparator()` in a
static initialization block for the ProcessEnvironment class. The
NameComparator has no instance state, and can be safely shared by
multiple threads.

>From http://cr.openjdk.java.net/~michaelm/7034570/webrev.4/src/windows/classes/java/lang/ProcessEnvironment.java.html:
 191     private static final class NameComparator
 192         implements Comparator<String> {
 193         public int compare(String s1, String s2) {
 194             // We can't use String.compareToIgnoreCase since it
 195             // canonicalizes to lower case, while Windows
 196             // canonicalizes to upper case!  For example, "_" should
 197             // sort *after* "Z", not before.
 198             int n1 = s1.length();
 199             int n2 = s2.length();
 200             int min = Math.min(n1, n2);
 201             for (int i = 0; i < min; i++) {
 202                 char c1 = s1.charAt(i);
 203                 char c2 = s2.charAt(i);
 204                 if (c1 != c2) {
 205                     c1 = Character.toUpperCase(c1);
 206                     c2 = Character.toUpperCase(c2);
 207                     if (c1 != c2)
 208                         // No overflow because of numeric promotion
 209                         return c1 - c2;
 210                 }
 211             }
 212             return n1 - n2;
 213         }
 214     }
...
 227     private static final NameComparator nameComparator;
...
 233     static {
 234         nameComparator  = new NameComparator();
...

- Dave



More information about the core-libs-dev mailing list