--- 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);