--- old/src/share/vm/classfile/javaClasses.cpp 2013-01-08 05:02:02.976067188 -0500 +++ new/src/share/vm/classfile/javaClasses.cpp 2013-01-08 05:02:01.880006951 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -2786,6 +2786,7 @@ bool java_lang_ClassLoader::offsets_computed = false; int java_lang_ClassLoader::_loader_data_offset = -1; int java_lang_ClassLoader::parallelCapable_offset = -1; +int java_lang_ClassLoader::fullyConcurrent_offset = -1; ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) { assert(loader != NULL && loader->is_oop(), "loader must be oop"); @@ -2805,6 +2806,10 @@ compute_optional_offset(parallelCapable_offset, k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); + // The field indicating fullyConcurrent is only present starting in 8 + compute_optional_offset(fullyConcurrent_offset, + k1, vmSymbols::fullyConcurrent_name(), vmSymbols::bool_signature()); + CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); } @@ -2842,6 +2847,17 @@ return (class_loader->obj_field(parallelCapable_offset) != NULL); } +// For class loader classes, fullyConcurrent defined as boolean field +// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it +bool java_lang_ClassLoader::fullyConcurrent(oop class_loader) { + if (!JDK_Version::is_gte_jdk18x_version() + || fullyConcurrent_offset == -1) { + // Default for backward compatibility is false + return false; + } + return (class_loader->bool_field(fullyConcurrent_offset) == 1); +} + bool java_lang_ClassLoader::is_trusted_loader(oop loader) { // Fix for 4474172; see evaluation for more details loader = non_reflection_class_loader(loader); --- old/src/share/vm/classfile/javaClasses.hpp 2013-01-08 05:02:06.416256254 -0500 +++ new/src/share/vm/classfile/javaClasses.hpp 2013-01-08 05:02:05.320196017 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -1152,6 +1152,7 @@ static bool offsets_computed; static int parent_offset; static int parallelCapable_offset; + static int fullyConcurrent_offset; public: static void compute_offsets(); @@ -1165,6 +1166,9 @@ // Support for parallelCapable field static bool parallelCapable(oop the_class_mirror); + // Support for fullyConcurrent field + static bool fullyConcurrent(oop the_class_mirror); + static bool is_trusted_loader(oop loader); // Fix for 4474172 --- old/src/share/vm/classfile/systemDictionary.cpp 2013-01-08 05:02:13.292634168 -0500 +++ new/src/share/vm/classfile/systemDictionary.cpp 2013-01-08 05:02:11.308525124 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -135,13 +135,18 @@ bool SystemDictionary::is_parallelCapable(Handle class_loader) { if (UnsyncloadClass || class_loader.is_null()) return true; if (AlwaysLockClassLoader) return false; - return java_lang_ClassLoader::parallelCapable(class_loader()); + // fullyConcurrent subsumes the parallelCapable test + return java_lang_ClassLoader::fullyConcurrent(class_loader()) || + java_lang_ClassLoader::parallelCapable(class_loader()); } // ---------------------------------------------------------------------------- // ParallelDefineClass flag does not apply to bootclass loader bool SystemDictionary::is_parallelDefine(Handle class_loader) { if (class_loader.is_null()) return false; - if (AllowParallelDefineClass && java_lang_ClassLoader::parallelCapable(class_loader())) { + if (java_lang_ClassLoader::fullyConcurrent(class_loader()) || + AllowParallelDefineClass && java_lang_ClassLoader::parallelCapable(class_loader())) { + if (TraceClassLoading) + tty->print_cr("Parallel define permitted for loader: " PTR_FORMAT, class_loader()); return true; } return false; --- old/src/share/vm/classfile/vmSymbols.hpp 2013-01-08 05:02:16.264797514 -0500 +++ new/src/share/vm/classfile/vmSymbols.hpp 2013-01-08 05:02:15.440752225 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -497,6 +497,7 @@ \ /* used to identify class loaders handling parallel class loading */ \ template(parallelCapable_name, "parallelLockMap") \ + template(fullyConcurrent_name, "isFullyConcurrent") \ \ /* JVM monitoring and management support */ \ template(java_lang_StackTraceElement_array, "[Ljava/lang/StackTraceElement;") \