8182743: Ineffective use of volatile hurts performance of Charset.atBugLevel()

Reviewed-by: clanger, redestad, plevart, coffeys
This commit is contained in:
Ogata Kazunori 2017-07-01 20:35:28 +02:00 committed by Christoph Langer
parent 7b258a7561
commit 43fc1b68a2
4 changed files with 10 additions and 56 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -195,12 +195,10 @@ public abstract class Charset$Coder$ {
if (max$ItypesPerOtype$ <= 0.0f)
throw new IllegalArgumentException("Non-positive "
+ "max$ItypesPerOtype$");
if (!Charset.atBugLevel("1.4")) {
if (average$ItypesPerOtype$ > max$ItypesPerOtype$)
throw new IllegalArgumentException("average$ItypesPerOtype$"
+ " exceeds "
+ "max$ItypesPerOtype$");
}
if (average$ItypesPerOtype$ > max$ItypesPerOtype$)
throw new IllegalArgumentException("average$ItypesPerOtype$"
+ " exceeds "
+ "max$ItypesPerOtype$");
this.replacement = replacement;
this.average$ItypesPerOtype$ = average$ItypesPerOtype$;
this.max$ItypesPerOtype$ = max$ItypesPerOtype$;

View File

@ -281,19 +281,6 @@ public abstract class Charset
/* -- Static methods -- */
private static volatile String bugLevel;
static boolean atBugLevel(String bl) { // package-private
String level = bugLevel;
if (level == null) {
if (!VM.isBooted())
return false;
bugLevel = level = GetPropertyAction
.privilegedGetProperty("sun.nio.cs.bugLevel", "");
}
return level.equals(bl);
}
/**
* Checks that the given string is a legal charset name. </p>
*
@ -305,7 +292,7 @@ public abstract class Charset
*/
private static void checkName(String s) {
int n = s.length();
if (n == 0 && !atBugLevel("1.4")) {
if (n == 0) {
throw new IllegalCharsetNameException(s);
}
for (int i = 0; i < n; i++) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,10 +25,6 @@
* @bug 4786884
* @summary Ensure that passing the empty string to Charset methods and
* constructors causes an IllegalArgumentException to be thrown
*
* @build EmptyCharsetName
* @run main EmptyCharsetName
* @run main/othervm -Dsun.nio.cs.bugLevel=1.4 EmptyCharsetName
*/
import java.io.*;
@ -38,8 +34,6 @@ import java.nio.charset.*;
public class EmptyCharsetName {
static boolean compat;
static abstract class Test {
public abstract void go() throws Exception;
@ -48,13 +42,6 @@ public class EmptyCharsetName {
try {
go();
} catch (Exception x) {
if (compat) {
if (x instanceof UnsupportedCharsetException) {
System.err.println("Thrown as expected: " + x);
return;
}
throw new Exception("Exception thrown", x);
}
if (x instanceof IllegalCharsetNameException) {
System.err.println("Thrown as expected: " + x);
return;
@ -63,18 +50,13 @@ public class EmptyCharsetName {
+ x.getClass().getName(),
x);
}
if (!compat)
throw new Exception("No exception thrown");
throw new Exception("No exception thrown");
}
}
public static void main(String[] args) throws Exception {
// If sun.nio.cs.bugLevel == 1.4 then we want the 1.4 behavior
String bl = System.getProperty("sun.nio.cs.bugLevel");
compat = (bl != null && bl.equals("1.4"));
new Test() {
public void go() throws Exception {
Charset.forName("");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -24,10 +24,6 @@
/* @test
* @bug 4853350
* @summary Ensure that averages do not exceed maxima
*
* @build AverageMax
* @run main AverageMax
* @run main/othervm -Dsun.nio.cs.bugLevel=1.4 AverageMax
*/
import java.nio.*;
@ -36,8 +32,6 @@ import java.nio.charset.*;
public class AverageMax {
static boolean compat;
static abstract class Test {
public abstract void go() throws Exception;
@ -46,9 +40,6 @@ public class AverageMax {
try {
go();
} catch (Exception x) {
if (compat) {
throw new Exception("Exception thrown", x);
}
if (x instanceof IllegalArgumentException) {
System.err.println("Thrown as expected: " + x);
return;
@ -57,17 +48,13 @@ public class AverageMax {
+ x.getClass().getName(),
x);
}
if (!compat)
throw new Exception("No exception thrown");
throw new Exception("No exception thrown");
}
}
public static void main(String[] args) throws Exception {
// If sun.nio.cs.bugLevel == 1.4 then we want the 1.4 behavior
String bl = System.getProperty("sun.nio.cs.bugLevel");
compat = (bl != null && bl.equals("1.4"));
final Charset ascii = Charset.forName("US-ASCII");
new Test() {