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