RFR (4th): 8023524: Mechanism to dump generated lambda classes / log lambda code generation
Remi Forax
forax at univ-mlv.fr
Tue Oct 1 23:54:31 UTC 2013
On 10/02/2013 01:04 AM, Henry Jen wrote:
> Hi,
>
> Please review the updated webrev at
> http://cr.openjdk.java.net/~henryjen/ccc/8023524/3/webrev/
>
> This update addressed comments from Mandy with following,
>
> - call doPrivileged with specific file permission, "<<ALL FILES>>", "write".
> - Use nio package to write deal with FS, also create directory hierarchy
> with package name instead of flat files.
> - If not specify a value or empty string, the directory is default to
> current working directory as "." is specified.
>
> We continue to use local encoding rule as other suggestions doesn't fit.
> The reason we cannot use something like URLEncoder is that ":" won't get
> encoded and it's not valid character for filename on Windows. All the
> suggestions so far seems to have that same issue.
>
> Cheers,
> Henry
>
Hi Henry,
most of the code that use atomic values is not needed if you do all
these checks
in the static block (because the static block is protected by a lock) and
also instead of injecting the dump_dir, I think it's better to ask for it
in ProxyClassesDumper.
so first, nitpicking!, DUMP_PATH_PROPERTY doesn't need to be a static field,
the code below is equivalent to yours but avoid to create yet another
static field.
// For dumping generated classes to disk, for debugging purposes
/* package */ static final String LAMBDA_PROXY_DUMP_DIR;
static {
String DUMP_PATH_PROPERTY = "jdk.internal.lambda.dumpProxyClasses";
LAMBDA_PROXY_DUMP_DIR= AccessController.doPrivileged(new GetPropertyAction(DUMP_PATH_PROPERTY));
}
// If requested, dump out to a file for debugging purposes
if (LAMBDA_PROXY_DUMP_DIR != null) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
ProxyClassesDumper dumper = ProxyClassesDumper.getInstance(); // dont send DUMP_DIR here
...
then as I said the code in ProxyClassesDumper can be simplified if instead
of sending the dump directory, the ProxyClassesDumper ask for it.
final class ProxyClassesDumper {
...
private final static ProxyClassesDumper INSTANCE;
static {
// ProxyClassesDumper.getInstance() should never be called
// in the static block of InnerClassLambdaMetafactory
// because it will create a circular dependency (a NPE)
String pathname = InnerClassLambdaMetafactory.LAMBDA_PROXY_DUMP_DIR.trim();
Path dumpDir = Paths.get(pathname.isEmpty() ? "." : pathname);
dumpDir = validateDumpDir(dumpDir)? dumpDir: null;
INSTANCE = new ProxyClassesDumper(dumpDir);
}
private final Path dumpDir; // null if invalid
// implement dump singleton instance, that's all we need right now
public static ProxyClassesDumper getInstance() {
return INSTANCE;
}
private ProxyClassesDumper(String path) {
this.path = path;
}
private static boolean validateDumpDir(Path path) {
String errMsg; // no need to initialize errMsg here
if (!Files.exists(path)) {
...
public void dumpClass(String className, final byte[] classBytes) {
if (dumpDir == null) {
// invalid dump directory, silently ignore it
return;
}
...
cheers,
Rémi
More information about the core-libs-dev
mailing list