diff --git a/.hgtags b/.hgtags
index a7ad329d42d..fdaa267c3a3 100644
--- a/.hgtags
+++ b/.hgtags
@@ -263,3 +263,5 @@ efe7dbc6088691757404e0c8745f894e3ca9c022 jdk9-b09
c5495e25c7258ab5f96a1ae14610887d76d2be63 jdk9-b18
2dcf544eb7ed5ac6a3f7813a32e33acea7442405 jdk9-b19
89731ae72a761afdf4262e8b9513f302f6563f89 jdk9-b20
+28dd0c7beb3cad9cf95f17b4b5ad87eb447a4084 jdk9-b21
+9678e0db8ff6ed845d4c2ee4a3baf7f386a777e5 jdk9-b22
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index a6aef895743..f99201f034e 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -263,3 +263,5 @@ cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16
65abab59f783fcf02ff8e133431c252f9e5f07d5 jdk9-b18
75a08df650eb3126bab0c4d15241f5886162393c jdk9-b19
ee4fd72b2ec3d92497f37163352f294aa695c6fb jdk9-b20
+9052803f4d01feda28b3d65f2b64dd457d21c7b6 jdk9-b21
+8e4bdab4c362aadde2d321f968cd503a2f779e2f jdk9-b22
diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4
index 649f8ddfc29..00ee498ed82 100644
--- a/common/autoconf/basics.m4
+++ b/common/autoconf/basics.m4
@@ -512,7 +512,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT],
)
AC_ARG_WITH(sysroot, [AS_HELP_STRING([--with-sysroot],
- [use this directory as sysroot)])],
+ [use this directory as sysroot])],
[SYSROOT=$with_sysroot]
)
@@ -531,6 +531,75 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT],
[BASIC_PREPEND_TO_PATH([EXTRA_PATH],$with_extra_path)]
)
+ if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
+ # detect if Xcode is installed by running xcodebuild -version
+ # if no Xcode installed, xcodebuild exits with 1
+ # if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
+ if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
+ # We need to use xcodebuild in the toolchain dir provided by the user, this will
+ # fall back on the stub binary in /usr/bin/xcodebuild
+ AC_PATH_PROG([XCODEBUILD], [xcodebuild], [/usr/bin/xcodebuild], [$TOOLCHAIN_PATH])
+ else
+ # this should result in SYSROOT being empty, unless --with-sysroot is provided
+ # when only the command line tools are installed there are no SDKs, so headers
+ # are copied into the system frameworks
+ XCODEBUILD=
+ AC_SUBST(XCODEBUILD)
+ fi
+
+ AC_MSG_CHECKING([for sdk name])
+ AC_ARG_WITH([sdk-name], [AS_HELP_STRING([--with-sdk-name],
+ [use the platform SDK of the given name. @<:@macosx@:>@])],
+ [SDKNAME=$with_sdk_name]
+ )
+ AC_MSG_RESULT([$SDKNAME])
+
+ # if toolchain path is specified then don't rely on system headers, they may not compile
+ HAVE_SYSTEM_FRAMEWORK_HEADERS=0
+ test -z "$TOOLCHAIN_PATH" && \
+ HAVE_SYSTEM_FRAMEWORK_HEADERS=`test ! -f /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h; echo $?`
+
+ if test -z "$SYSROOT"; then
+ if test -n "$XCODEBUILD"; then
+ # if we don't have system headers, use default SDK name (last resort)
+ if test -z "$SDKNAME" -a $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0; then
+ SDKNAME=${SDKNAME:-macosx}
+ fi
+
+ if test -n "$SDKNAME"; then
+ # Call xcodebuild to determine SYSROOT
+ SYSROOT=`"$XCODEBUILD" -sdk $SDKNAME -version | grep '^Path: ' | sed 's/Path: //'`
+ fi
+ else
+ if test $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0; then
+ AC_MSG_ERROR([No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK])
+ fi
+ fi
+ else
+ # warn user if --with-sdk-name was also set
+ if test -n "$with_sdk_name"; then
+ AC_MSG_WARN([Both SYSROOT and --with-sdk-name are set, only SYSROOT will be used])
+ fi
+ fi
+
+ if test $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0 -a -z "$SYSROOT"; then
+ # If no system framework headers, then SYSROOT must be set, or we won't build
+ AC_MSG_ERROR([Unable to determine SYSROOT and no headers found in /System/Library/Frameworks. Check Xcode configuration, --with-sysroot or --with-sdk-name arguments.])
+ fi
+
+ # Perform a basic sanity test
+ if test ! -f "$SYSROOT/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h"; then
+ if test -z "$SYSROOT"; then
+ AC_MSG_ERROR([Unable to find required framework headers, provide a path to an SDK via --with-sysroot or --with-sdk-name and be sure Xcode is installed properly])
+ else
+ AC_MSG_ERROR([Invalid SDK or SYSROOT path, dependent framework headers not found])
+ fi
+ fi
+
+ # set SDKROOT too, Xcode tools will pick it up
+ AC_SUBST(SDKROOT,$SYSROOT)
+ fi
+
# Prepend the extra path to the global path
BASIC_PREPEND_TO_PATH([PATH],$EXTRA_PATH)
diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4
index 95fa6521575..40f60a9c85d 100644
--- a/common/autoconf/flags.m4
+++ b/common/autoconf/flags.m4
@@ -131,6 +131,10 @@ AC_DEFUN_ONCE([FLAGS_SETUP_INIT_FLAGS],
-L$SYSROOT/lib$OPENJDK_TARGET_CPU_ISADIR \
-L$SYSROOT/usr/ccs/lib$OPENJDK_TARGET_CPU_ISADIR"
fi
+ elif test "x$OPENJDK_TARGET_OS" = xmacosx; then
+ # Apple only wants -isysroot , but we also need -iframework/System/Library/Frameworks
+ SYSROOT_CFLAGS="-isysroot \"$SYSROOT\" -iframework\"$SYSROOT/System/Library/Frameworks\""
+ SYSROOT_LDFLAGS=$SYSROOT_CFLAGS
elif test "x$TOOLCHAIN_TYPE" = xgcc; then
SYSROOT_CFLAGS="--sysroot=\"$SYSROOT\""
SYSROOT_LDFLAGS="--sysroot=\"$SYSROOT\""
@@ -143,6 +147,14 @@ AC_DEFUN_ONCE([FLAGS_SETUP_INIT_FLAGS],
LEGACY_EXTRA_CXXFLAGS="$LEGACY_EXTRA_CXXFLAGS $SYSROOT_CFLAGS"
LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $SYSROOT_LDFLAGS"
fi
+
+ # These always need to be set, or we can't find the frameworks embedded in JavaVM.framework
+ # set this here so it doesn't have to be peppered throughout the forest
+ if test "x$OPENJDK_TARGET_OS" = xmacosx; then
+ SYSROOT_CFLAGS="$SYSROOT_CFLAGS -F\"$SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks\""
+ SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS -F\"$SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks\""
+ fi
+
AC_SUBST(SYSROOT_CFLAGS)
AC_SUBST(SYSROOT_LDFLAGS)
])
@@ -644,23 +656,18 @@ AC_DEFUN_ONCE([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK],
# Additional macosx handling
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # FIXME: This needs to be exported in spec.gmk due to closed legacy code.
- # FIXME: clean this up, and/or move it elsewhere.
+ # Setting these parameters makes it an error to link to macosx APIs that are
+ # newer than the given OS version and makes the linked binaries compatible
+ # even if built on a newer version of the OS.
+ # The expected format is X.Y.Z
+ MACOSX_VERSION_MIN=10.7.0
+ AC_SUBST(MACOSX_VERSION_MIN)
- # Setting these parameters makes it an error to link to macosx APIs that are
- # newer than the given OS version and makes the linked binaries compatible
- # even if built on a newer version of the OS.
- # The expected format is X.Y.Z
- MACOSX_VERSION_MIN=10.7.0
- AC_SUBST(MACOSX_VERSION_MIN)
-
- # The macro takes the version with no dots, ex: 1070
- # Let the flags variables get resolved in make for easier override on make
- # command line.
- COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
- LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
- fi
+ # The macro takes the version with no dots, ex: 1070
+ # Let the flags variables get resolved in make for easier override on make
+ # command line.
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
# Setup some hard coded includes
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index 4d95f64e34d..2ec5ac45fb8 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -874,6 +874,8 @@ PKGHANDLER
OUTPUT_ROOT
CONF_NAME
SPEC
+SDKROOT
+XCODEBUILD
BUILD_VARIANT_RELEASE
DEBUG_CLASSFILES
FASTDEBUG
@@ -1040,6 +1042,7 @@ with_sysroot
with_tools_dir
with_toolchain_path
with_extra_path
+with_sdk_name
with_conf_name
with_builddeps_conf
with_builddeps_server
@@ -1074,7 +1077,6 @@ with_extra_cxxflags
with_extra_ldflags
enable_debug_symbols
enable_zip_debug_info
-enable_macosx_runtime_support
with_x
with_cups
with_cups_include
@@ -1085,6 +1087,7 @@ enable_freetype_bundling
with_alsa
with_alsa_include
with_alsa_lib
+with_libjpeg
with_giflib
with_lcms
with_libpng
@@ -1841,9 +1844,6 @@ Optional Features:
--disable-debug-symbols disable generation of debug symbols [enabled]
--disable-zip-debug-info
disable zipping of debug-info files [enabled]
- --enable-macosx-runtime-support
- Deprecated. Option is kept for backwards
- compatibility and is ignored
--disable-freetype-bundling
disable bundling of the freetype library with the
build result [enabled on Windows or when using
@@ -1872,12 +1872,13 @@ Optional Packages:
optimized (HotSpot build only)) [release]
--with-devkit use this devkit for compilers, tools and resources
--with-sys-root alias for --with-sysroot for backwards compatability
- --with-sysroot use this directory as sysroot)
+ --with-sysroot use this directory as sysroot
--with-tools-dir alias for --with-toolchain-path for backwards
compatibility
--with-toolchain-path prepend these directories when searching for
toolchain binaries (compilers etc)
--with-extra-path prepend these directories to the default path
+ --with-sdk-name use the platform SDK of the given name. [macosx]
--with-conf-name use this as the name of the configuration [generated
from important configuration options]
--with-builddeps-conf use this configuration file for the builddeps
@@ -1942,6 +1943,8 @@ Optional Packages:
headers under PATH/include)
--with-alsa-include specify directory for the alsa include files
--with-alsa-lib specify directory for the alsa library
+ --with-libjpeg use libjpeg from build system or OpenJDK source
+ (system, bundled) [bundled]
--with-giflib use giflib from build system or OpenJDK source
(system, bundled) [bundled]
--with-lcms use lcms2 from build system or OpenJDK source
@@ -4308,7 +4311,7 @@ TOOLCHAIN_DESCRIPTION_xlc="IBM XL C/C++"
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1402614845
+DATE_WHEN_GENERATED=1403557683
###############################################################################
#
@@ -13607,7 +13610,7 @@ test -n "$target_alias" &&
VAR_CPU_BITS=32
VAR_CPU_ENDIAN=big
;;
- sparcv9)
+ sparcv9|sparc64)
VAR_CPU=sparcv9
VAR_CPU_ARCH=sparc
VAR_CPU_BITS=64
@@ -13738,7 +13741,7 @@ $as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; }
VAR_CPU_BITS=32
VAR_CPU_ENDIAN=big
;;
- sparcv9)
+ sparcv9|sparc64)
VAR_CPU=sparcv9
VAR_CPU_ARCH=sparc
VAR_CPU_BITS=64
@@ -14968,6 +14971,122 @@ if test "${with_extra_path+set}" = set; then :
fi
+ if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
+ # detect if Xcode is installed by running xcodebuild -version
+ # if no Xcode installed, xcodebuild exits with 1
+ # if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
+ if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
+ # We need to use xcodebuild in the toolchain dir provided by the user, this will
+ # fall back on the stub binary in /usr/bin/xcodebuild
+ # Extract the first word of "xcodebuild", so it can be a program name with args.
+set dummy xcodebuild; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XCODEBUILD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $XCODEBUILD in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XCODEBUILD="$XCODEBUILD" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $TOOLCHAIN_PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_XCODEBUILD="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_XCODEBUILD" && ac_cv_path_XCODEBUILD="/usr/bin/xcodebuild"
+ ;;
+esac
+fi
+XCODEBUILD=$ac_cv_path_XCODEBUILD
+if test -n "$XCODEBUILD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XCODEBUILD" >&5
+$as_echo "$XCODEBUILD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ else
+ # this should result in SYSROOT being empty, unless --with-sysroot is provided
+ # when only the command line tools are installed there are no SDKs, so headers
+ # are copied into the system frameworks
+ XCODEBUILD=
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sdk name" >&5
+$as_echo_n "checking for sdk name... " >&6; }
+
+# Check whether --with-sdk-name was given.
+if test "${with_sdk_name+set}" = set; then :
+ withval=$with_sdk_name; SDKNAME=$with_sdk_name
+
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDKNAME" >&5
+$as_echo "$SDKNAME" >&6; }
+
+ # if toolchain path is specified then don't rely on system headers, they may not compile
+ HAVE_SYSTEM_FRAMEWORK_HEADERS=0
+ test -z "$TOOLCHAIN_PATH" && \
+ HAVE_SYSTEM_FRAMEWORK_HEADERS=`test ! -f /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h; echo $?`
+
+ if test -z "$SYSROOT"; then
+ if test -n "$XCODEBUILD"; then
+ # if we don't have system headers, use default SDK name (last resort)
+ if test -z "$SDKNAME" -a $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0; then
+ SDKNAME=${SDKNAME:-macosx}
+ fi
+
+ if test -n "$SDKNAME"; then
+ # Call xcodebuild to determine SYSROOT
+ SYSROOT=`"$XCODEBUILD" -sdk $SDKNAME -version | grep '^Path: ' | sed 's/Path: //'`
+ fi
+ else
+ if test $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0; then
+ as_fn_error $? "No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK" "$LINENO" 5
+ fi
+ fi
+ else
+ # warn user if --with-sdk-name was also set
+ if test -n "$with_sdk_name"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Both SYSROOT and --with-sdk-name are set, only SYSROOT will be used" >&5
+$as_echo "$as_me: WARNING: Both SYSROOT and --with-sdk-name are set, only SYSROOT will be used" >&2;}
+ fi
+ fi
+
+ if test $HAVE_SYSTEM_FRAMEWORK_HEADERS -eq 0 -a -z "$SYSROOT"; then
+ # If no system framework headers, then SYSROOT must be set, or we won't build
+ as_fn_error $? "Unable to determine SYSROOT and no headers found in /System/Library/Frameworks. Check Xcode configuration, --with-sysroot or --with-sdk-name arguments." "$LINENO" 5
+ fi
+
+ # Perform a basic sanity test
+ if test ! -f "$SYSROOT/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h"; then
+ if test -z "$SYSROOT"; then
+ as_fn_error $? "Unable to find required framework headers, provide a path to an SDK via --with-sysroot or --with-sdk-name and be sure Xcode is installed properly" "$LINENO" 5
+ else
+ as_fn_error $? "Invalid SDK or SYSROOT path, dependent framework headers not found" "$LINENO" 5
+ fi
+ fi
+
+ # set SDKROOT too, Xcode tools will pick it up
+ SDKROOT=$SYSROOT
+
+ fi
+
# Prepend the extra path to the global path
if test "x$EXTRA_PATH" != x; then
@@ -26596,21 +26715,28 @@ fi
VALID_TOOLCHAINS=${!toolchain_var_name}
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- # On Mac OS X, default toolchain to clang after Xcode 5
- XCODE_VERSION_OUTPUT=`xcodebuild -version 2>&1 | $HEAD -n 1`
- $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
- if test $? -ne 0; then
- as_fn_error $? "Failed to determine Xcode version." "$LINENO" 5
- fi
- XCODE_MAJOR_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | \
- $SED -e 's/^Xcode \([1-9][0-9.]*\)/\1/' | \
- $CUT -f 1 -d .`
- { $as_echo "$as_me:${as_lineno-$LINENO}: Xcode major version: $XCODE_MAJOR_VERSION" >&5
+ if test -n "$XCODEBUILD"; then
+ # On Mac OS X, default toolchain to clang after Xcode 5
+ XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version 2>&1 | $HEAD -n 1`
+ $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
+ if test $? -ne 0; then
+ as_fn_error $? "Failed to determine Xcode version." "$LINENO" 5
+ fi
+ XCODE_MAJOR_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | \
+ $SED -e 's/^Xcode \([1-9][0-9.]*\)/\1/' | \
+ $CUT -f 1 -d .`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Xcode major version: $XCODE_MAJOR_VERSION" >&5
$as_echo "$as_me: Xcode major version: $XCODE_MAJOR_VERSION" >&6;}
- if test $XCODE_MAJOR_VERSION -ge 5; then
- DEFAULT_TOOLCHAIN="clang"
+ if test $XCODE_MAJOR_VERSION -ge 5; then
+ DEFAULT_TOOLCHAIN="clang"
+ else
+ DEFAULT_TOOLCHAIN="gcc"
+ fi
else
- DEFAULT_TOOLCHAIN="gcc"
+ # If Xcode is not installed, but the command line tools are
+ # then we can't run xcodebuild. On these systems we should
+ # default to clang
+ DEFAULT_TOOLCHAIN="clang"
fi
else
# First toolchain type in the list is the default
@@ -41076,6 +41202,10 @@ $as_echo "$tool_specified" >&6; }
-L$SYSROOT/lib$OPENJDK_TARGET_CPU_ISADIR \
-L$SYSROOT/usr/ccs/lib$OPENJDK_TARGET_CPU_ISADIR"
fi
+ elif test "x$OPENJDK_TARGET_OS" = xmacosx; then
+ # Apple only wants -isysroot , but we also need -iframework/System/Library/Frameworks
+ SYSROOT_CFLAGS="-isysroot \"$SYSROOT\" -iframework\"$SYSROOT/System/Library/Frameworks\""
+ SYSROOT_LDFLAGS=$SYSROOT_CFLAGS
elif test "x$TOOLCHAIN_TYPE" = xgcc; then
SYSROOT_CFLAGS="--sysroot=\"$SYSROOT\""
SYSROOT_LDFLAGS="--sysroot=\"$SYSROOT\""
@@ -41089,6 +41219,14 @@ $as_echo "$tool_specified" >&6; }
LEGACY_EXTRA_LDFLAGS="$LEGACY_EXTRA_LDFLAGS $SYSROOT_LDFLAGS"
fi
+ # These always need to be set, or we can't find the frameworks embedded in JavaVM.framework
+ # set this here so it doesn't have to be peppered throughout the forest
+ if test "x$OPENJDK_TARGET_OS" = xmacosx; then
+ SYSROOT_CFLAGS="$SYSROOT_CFLAGS -F\"$SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks\""
+ SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS -F\"$SYSROOT/System/Library/Frameworks/JavaVM.framework/Frameworks\""
+ fi
+
+
@@ -42135,23 +42273,18 @@ fi
# Additional macosx handling
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- if test "x$TOOLCHAIN_TYPE" = xgcc; then
- # FIXME: This needs to be exported in spec.gmk due to closed legacy code.
- # FIXME: clean this up, and/or move it elsewhere.
-
- # Setting these parameters makes it an error to link to macosx APIs that are
- # newer than the given OS version and makes the linked binaries compatible
- # even if built on a newer version of the OS.
- # The expected format is X.Y.Z
- MACOSX_VERSION_MIN=10.7.0
+ # Setting these parameters makes it an error to link to macosx APIs that are
+ # newer than the given OS version and makes the linked binaries compatible
+ # even if built on a newer version of the OS.
+ # The expected format is X.Y.Z
+ MACOSX_VERSION_MIN=10.7.0
- # The macro takes the version with no dots, ex: 1070
- # Let the flags variables get resolved in make for easier override on make
- # command line.
- COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
- LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
- fi
+ # The macro takes the version with no dots, ex: 1070
+ # Let the flags variables get resolved in make for easier override on make
+ # command line.
+ COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(subst .,,\$(MACOSX_VERSION_MIN)) -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
+ LDFLAGS_JDK="$LDFLAGS_JDK -mmacosx-version-min=\$(MACOSX_VERSION_MIN)"
fi
# Setup some hard coded includes
@@ -42654,8 +42787,6 @@ $as_echo_n "checking what is not needed on MacOSX?... " >&6; }
ALSA_NOT_NEEDED=yes
PULSE_NOT_NEEDED=yes
X11_NOT_NEEDED=yes
- # If the java runtime framework is disabled, then we need X11.
- # This will be adjusted below.
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa pulse x11" >&5
$as_echo "alsa pulse x11" >&6; }
fi
@@ -42676,33 +42807,6 @@ $as_echo "alsa" >&6; }
X11_NOT_NEEDED=yes
fi
- ###############################################################################
- #
- # Check for MacOSX support for OpenJDK.
- #
-
-
- # Check whether --enable-macosx-runtime-support was given.
-if test "${enable_macosx_runtime_support+set}" = set; then :
- enableval=$enable_macosx_runtime_support;
-fi
-
- if test "x$enable_macosx_runtime_support" != x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Option --enable-macosx-runtime-support is deprecated and will be ignored." >&5
-$as_echo "$as_me: WARNING: Option --enable-macosx-runtime-support is deprecated and will be ignored." >&2;}
- fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS X Java Framework" >&5
-$as_echo_n "checking for Mac OS X Java Framework... " >&6; }
- if test -f /System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Headers/JavaRuntimeSupport.h; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: /System/Library/Frameworks/JavaVM.framework" >&5
-$as_echo "/System/Library/Frameworks/JavaVM.framework" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
-
###############################################################################
@@ -47573,10 +47677,43 @@ done
# Check for the jpeg library
#
- USE_EXTERNAL_LIBJPEG=true
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ljpeg" >&5
-$as_echo_n "checking for main in -ljpeg... " >&6; }
-if ${ac_cv_lib_jpeg_main+:} false; then :
+
+# Check whether --with-libjpeg was given.
+if test "${with_libjpeg+set}" = set; then :
+ withval=$with_libjpeg;
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for which libjpeg to use" >&5
+$as_echo_n "checking for which libjpeg to use... " >&6; }
+
+ # default is bundled
+ DEFAULT_LIBJPEG=bundled
+
+ #
+ # if user didn't specify, use DEFAULT_LIBJPEG
+ #
+ if test "x${with_libjpeg}" = "x"; then
+ with_libjpeg=${DEFAULT_LIBJPEG}
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_libjpeg}" >&5
+$as_echo "${with_libjpeg}" >&6; }
+
+ if test "x${with_libjpeg}" = "xbundled"; then
+ USE_EXTERNAL_LIBJPEG=false
+ elif test "x${with_libjpeg}" = "xsystem"; then
+ ac_fn_cxx_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
+if test "x$ac_cv_header_jpeglib_h" = xyes; then :
+
+else
+ as_fn_error $? "--with-libjpeg=system specified, but jpeglib.h not found!" "$LINENO" 5
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_CreateDecompress in -ljpeg" >&5
+$as_echo_n "checking for jpeg_CreateDecompress in -ljpeg... " >&6; }
+if ${ac_cv_lib_jpeg_jpeg_CreateDecompress+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -47584,27 +47721,33 @@ LIBS="-ljpeg $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char jpeg_CreateDecompress ();
int
main ()
{
-return main ();
+return jpeg_CreateDecompress ();
;
return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
- ac_cv_lib_jpeg_main=yes
+ ac_cv_lib_jpeg_jpeg_CreateDecompress=yes
else
- ac_cv_lib_jpeg_main=no
+ ac_cv_lib_jpeg_jpeg_CreateDecompress=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_main" >&5
-$as_echo "$ac_cv_lib_jpeg_main" >&6; }
-if test "x$ac_cv_lib_jpeg_main" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_CreateDecompress" >&5
+$as_echo "$ac_cv_lib_jpeg_jpeg_CreateDecompress" >&6; }
+if test "x$ac_cv_lib_jpeg_jpeg_CreateDecompress" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBJPEG 1
_ACEOF
@@ -47612,13 +47755,16 @@ _ACEOF
LIBS="-ljpeg $LIBS"
else
- USE_EXTERNAL_LIBJPEG=false
- { $as_echo "$as_me:${as_lineno-$LINENO}: Will use jpeg decoder bundled with the OpenJDK source" >&5
-$as_echo "$as_me: Will use jpeg decoder bundled with the OpenJDK source" >&6;}
-
+ as_fn_error $? "--with-libjpeg=system specified, but no libjpeg found" "$LINENO" 5
fi
+ USE_EXTERNAL_LIBJPEG=true
+ else
+ as_fn_error $? "Invalid use of --with-libjpeg: ${with_libjpeg}, use 'system' or 'bundled'" "$LINENO" 5
+ fi
+
+
###############################################################################
#
diff --git a/common/autoconf/hotspot-spec.gmk.in b/common/autoconf/hotspot-spec.gmk.in
index f7abdd40e0a..057d882c28e 100644
--- a/common/autoconf/hotspot-spec.gmk.in
+++ b/common/autoconf/hotspot-spec.gmk.in
@@ -69,8 +69,8 @@ ISA_DIR=$(OPENJDK_TARGET_CPU_ISADIR)
# Yet another name for arch used for an extra subdir below the jvm lib.
# Uses i386 and amd64, instead of x86 and x86_64.
LIBARCH=$(OPENJDK_TARGET_CPU_LEGACY_LIB)
-# Old name for OPENJDK_TARGET_CPU, uses i586 and amd64, instead of x86 and x86_64.
-ARCH=$(OPENJDK_TARGET_CPU_LEGACY)
+# Set the cpu architecture
+ARCH=$(OPENJDK_TARGET_CPU_ARCH)
# Legacy setting for building for a 64 bit machine.
# If yes then this expands to _LP64:=1
@LP64@
diff --git a/common/autoconf/libraries.m4 b/common/autoconf/libraries.m4
index 6ee3221ad96..3a689ef62ee 100644
--- a/common/autoconf/libraries.m4
+++ b/common/autoconf/libraries.m4
@@ -65,8 +65,6 @@ AC_DEFUN_ONCE([LIB_SETUP_INIT],
ALSA_NOT_NEEDED=yes
PULSE_NOT_NEEDED=yes
X11_NOT_NEEDED=yes
- # If the java runtime framework is disabled, then we need X11.
- # This will be adjusted below.
AC_MSG_RESULT([alsa pulse x11])
fi
@@ -83,20 +81,6 @@ AC_DEFUN_ONCE([LIB_SETUP_INIT],
if test "x$SUPPORT_HEADFUL" = xno; then
X11_NOT_NEEDED=yes
fi
-
- ###############################################################################
- #
- # Check for MacOSX support for OpenJDK.
- #
-
- BASIC_DEPRECATED_ARG_ENABLE(macosx-runtime-support, macosx_runtime_support)
-
- AC_MSG_CHECKING([for Mac OS X Java Framework])
- if test -f /System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Headers/JavaRuntimeSupport.h; then
- AC_MSG_RESULT([/System/Library/Frameworks/JavaVM.framework])
- else
- AC_MSG_RESULT([no])
- fi
])
AC_DEFUN_ONCE([LIB_SETUP_X11],
@@ -620,11 +604,36 @@ AC_DEFUN_ONCE([LIB_SETUP_MISC_LIBS],
# Check for the jpeg library
#
- USE_EXTERNAL_LIBJPEG=true
- AC_CHECK_LIB(jpeg, main, [],
- [ USE_EXTERNAL_LIBJPEG=false
- AC_MSG_NOTICE([Will use jpeg decoder bundled with the OpenJDK source])
- ])
+ AC_ARG_WITH(libjpeg, [AS_HELP_STRING([--with-libjpeg],
+ [use libjpeg from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
+
+ AC_MSG_CHECKING([for which libjpeg to use])
+
+ # default is bundled
+ DEFAULT_LIBJPEG=bundled
+
+ #
+ # if user didn't specify, use DEFAULT_LIBJPEG
+ #
+ if test "x${with_libjpeg}" = "x"; then
+ with_libjpeg=${DEFAULT_LIBJPEG}
+ fi
+
+ AC_MSG_RESULT(${with_libjpeg})
+
+ if test "x${with_libjpeg}" = "xbundled"; then
+ USE_EXTERNAL_LIBJPEG=false
+ elif test "x${with_libjpeg}" = "xsystem"; then
+ AC_CHECK_HEADER(jpeglib.h, [],
+ [ AC_MSG_ERROR([--with-libjpeg=system specified, but jpeglib.h not found!])])
+ AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, [],
+ [ AC_MSG_ERROR([--with-libjpeg=system specified, but no libjpeg found])])
+
+ USE_EXTERNAL_LIBJPEG=true
+ else
+ AC_MSG_ERROR([Invalid use of --with-libjpeg: ${with_libjpeg}, use 'system' or 'bundled'])
+ fi
+
AC_SUBST(USE_EXTERNAL_LIBJPEG)
###############################################################################
diff --git a/common/autoconf/platform.m4 b/common/autoconf/platform.m4
index 1f06f0ce7d5..54838a3e72c 100644
--- a/common/autoconf/platform.m4
+++ b/common/autoconf/platform.m4
@@ -84,7 +84,7 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_CPU],
VAR_CPU_BITS=32
VAR_CPU_ENDIAN=big
;;
- sparcv9)
+ sparcv9|sparc64)
VAR_CPU=sparcv9
VAR_CPU_ARCH=sparc
VAR_CPU_BITS=64
diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index 2f6d7bd3746..bc916f636c3 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -347,6 +347,9 @@ CPP:=@FIXPATH@ @CPP@
# The linker can be gcc or ld on posix systems, or link.exe on windows systems.
LD:=@FIXPATH@ @LD@
+# Xcode SDK path
+SDKROOT:=@SDKROOT@
+
# The linker on older SuSE distros (e.g. on SLES 10) complains with:
# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
# if feeded with a version script which contains named tags.
@@ -544,7 +547,7 @@ SETFILE:=@SETFILE@
XATTR:=@XATTR@
JT_HOME:=@JT_HOME@
JTREGEXE:=@JTREGEXE@
-
+XCODEBUILD=@XCODEBUILD@
FIXPATH:=@FIXPATH@
# Where the build output is stored for your convenience.
diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4
index 4686517151b..f380bf446ad 100644
--- a/common/autoconf/toolchain.m4
+++ b/common/autoconf/toolchain.m4
@@ -98,20 +98,27 @@ AC_DEFUN_ONCE([TOOLCHAIN_DETERMINE_TOOLCHAIN_TYPE],
VALID_TOOLCHAINS=${!toolchain_var_name}
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
- # On Mac OS X, default toolchain to clang after Xcode 5
- XCODE_VERSION_OUTPUT=`xcodebuild -version 2>&1 | $HEAD -n 1`
- $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
- if test $? -ne 0; then
- AC_MSG_ERROR([Failed to determine Xcode version.])
- fi
- XCODE_MAJOR_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | \
- $SED -e 's/^Xcode \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/' | \
- $CUT -f 1 -d .`
- AC_MSG_NOTICE([Xcode major version: $XCODE_MAJOR_VERSION])
- if test $XCODE_MAJOR_VERSION -ge 5; then
- DEFAULT_TOOLCHAIN="clang"
+ if test -n "$XCODEBUILD"; then
+ # On Mac OS X, default toolchain to clang after Xcode 5
+ XCODE_VERSION_OUTPUT=`"$XCODEBUILD" -version 2>&1 | $HEAD -n 1`
+ $ECHO "$XCODE_VERSION_OUTPUT" | $GREP "Xcode " > /dev/null
+ if test $? -ne 0; then
+ AC_MSG_ERROR([Failed to determine Xcode version.])
+ fi
+ XCODE_MAJOR_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | \
+ $SED -e 's/^Xcode \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/' | \
+ $CUT -f 1 -d .`
+ AC_MSG_NOTICE([Xcode major version: $XCODE_MAJOR_VERSION])
+ if test $XCODE_MAJOR_VERSION -ge 5; then
+ DEFAULT_TOOLCHAIN="clang"
+ else
+ DEFAULT_TOOLCHAIN="gcc"
+ fi
else
- DEFAULT_TOOLCHAIN="gcc"
+ # If Xcode is not installed, but the command line tools are
+ # then we can't run xcodebuild. On these systems we should
+ # default to clang
+ DEFAULT_TOOLCHAIN="clang"
fi
else
# First toolchain type in the list is the default
diff --git a/corba/.hgtags b/corba/.hgtags
index f9ed22e0c47..e76e0325e2d 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -263,3 +263,5 @@ e54022d0dd92106fff7f7fe670010cd7e6517ee3 jdk9-b15
77565aaaa2bb814e94817e92d680168052a25395 jdk9-b18
eecc1b6adc7e193d00a0641eb0963add5a4c06e8 jdk9-b19
87f36eecb1665012d01c5cf102494e591c943ea6 jdk9-b20
+3615a4e7f0542ca7552ad6454b742c73ee211d8e jdk9-b21
+ddc07abf4307855c0dc904cc5c96cc764023a930 jdk9-b22
diff --git a/corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java b/corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java
index 1748397d065..6908cad9a83 100644
--- a/corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java
+++ b/corba/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, 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
@@ -35,7 +35,8 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectOutput;
-import java.util.Hashtable;
+import java.util.Map;
+import java.util.HashMap;
import org.omg.CORBA.INTERNAL;
@@ -49,7 +50,7 @@ public abstract class OutputStreamHook extends ObjectOutputStream
*/
private class HookPutFields extends ObjectOutputStream.PutField
{
- private Hashtable fields = new Hashtable();
+ private Map fields = new HashMap<>();
/**
* Put the value of the named boolean field into the persistent field.
@@ -140,7 +141,6 @@ public abstract class OutputStreamHook extends ObjectOutputStream
public OutputStreamHook()
throws java.io.IOException {
super();
-
}
public void defaultWriteObject() throws IOException {
diff --git a/get_source.sh b/get_source.sh
index f83a3766c12..5e874d1cb51 100644
--- a/get_source.sh
+++ b/get_source.sh
@@ -1,7 +1,7 @@
#!/bin/sh
#
-# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2014, 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,9 +25,76 @@
# questions.
#
-# Get clones of all nested repositories
-sh ./common/bin/hgforest.sh clone "$@" || exit 1
+to_stderr() {
+ echo "$@" >&2
+}
+
+error() {
+ to_stderr "ERROR: $1"
+ exit ${2:-126}
+}
+
+warning() {
+ to_stderr "WARNING: $1"
+}
+
+version_field() {
+ # rev is typically omitted for minor and major releases
+ field=`echo ${1}.0 | cut -f ${2} -d .`
+ if expr 1 + $field >/dev/null 2> /dev/null; then
+ echo $field
+ else
+ echo -1
+ fi
+}
+
+# Version check
+
+# required
+reqdmajor=1
+reqdminor=4
+reqdrev=0
+
+# requested
+rqstmajor=2
+rqstminor=6
+rqstrev=3
+
+
+# installed
+hgwhere="`command -v hg`"
+if [ "x$hgwhere" = "x" ]; then
+ error "Could not locate Mercurial command"
+fi
+
+hgversion="`hg --version 2> /dev/null | sed -n -e 's@^Mercurial Distributed SCM (version \([^+]*\).*)\$@\1@p'`"
+if [ "x${hgversion}" = "x" ] ; then
+ error "Could not determine Mercurial version of $hgwhere"
+fi
+
+hgmajor="`version_field $hgversion 1`"
+hgminor="`version_field $hgversion 2`"
+hgrev="`version_field $hgversion 3`"
+
+if [ $hgmajor -eq -1 -o $hgminor -eq -1 -o $hgrev -eq -1 ] ; then
+ error "Could not determine Mercurial version of $hgwhere from \"$hgversion\""
+fi
+
+
+# Require
+if [ $hgmajor -lt $reqdmajor -o \( $hgmajor -eq $reqdmajor -a $hgminor -lt $reqdminor \) -o \( $hgmajor -eq $reqdmajor -a $hgminor -eq $reqdminor -a $hgrev -lt $reqdrev \) ] ; then
+ error "Mercurial version $reqdmajor.$reqdminor.$reqdrev or later is required. $hgwhere is version $hgversion"
+fi
+
+
+# Request
+if [ $hgmajor -lt $rqstmajor -o \( $hgmajor -eq $rqstmajor -a $hgminor -lt $rqstminor \) -o \( $hgmajor -eq $rqstmajor -a $hgminor -eq $rqstminor -a $hgrev -lt $rqstrev \) ] ; then
+ warning "Mercurial version $rqstmajor.$rqstminor.$rqstrev or later is recommended. $hgwhere is version $hgversion"
+fi
+
+
+# Get clones of all absent nested repositories (harmless if already exist)
+sh ./common/bin/hgforest.sh clone "$@" || exit $?
# Update all existing repositories to the latest sources
sh ./common/bin/hgforest.sh pull -u
-
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index b4c3b90e4c2..882932d140a 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -423,3 +423,5 @@ b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16
871fd128548480095e0dc3fc34c422666baeec75 jdk9-b18
d4cffb3ae6213c66c7522ebffe0349360a45f0ef jdk9-b19
c1af79d122ec9f715fa29312b5e91763f3a4dfc4 jdk9-b20
+17b4a5e831b398738feedb0afe75245744510153 jdk9-b21
+518d1fcc0799494f013e00e0a94a91b6f212d54f jdk9-b22
diff --git a/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m b/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m
index 0f0ff4e5da4..044340aa511 100644
--- a/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m
+++ b/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, 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
@@ -26,7 +26,7 @@
#import
#import
-#include
+#include
#import
#import
diff --git a/hotspot/agent/src/os/bsd/Makefile b/hotspot/agent/src/os/bsd/Makefile
index ce3e2c4c32c..eabe1f7730d 100644
--- a/hotspot/agent/src/os/bsd/Makefile
+++ b/hotspot/agent/src/os/bsd/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2002, 2014, 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
@@ -50,9 +50,9 @@ SOURCES = symtab.c \
ps_core.c
OBJS = $(SOURCES:.c=.o)
OBJSPLUS = MacosxDebuggerLocal.o sadis.o $(OBJS)
-EXTINCLUDE = -I/System/Library/Frameworks/JavaVM.framework/Headers -I.
+EXTINCLUDE = -I.
EXTCFLAGS = -m64 -D__APPLE__ -framework JavaNativeFoundation
-FOUNDATIONFLAGS = -framework Foundation -F/System/Library/Frameworks/JavaVM.framework/Frameworks -framework JavaNativeFoundation -framework Security -framework CoreFoundation
+FOUNDATIONFLAGS = -framework Foundation -framework JavaNativeFoundation -framework Security -framework CoreFoundation
LIBSA = $(ARCH)/libsaproc.dylib
endif # Darwin
diff --git a/hotspot/agent/src/os/linux/libproc.h b/hotspot/agent/src/os/linux/libproc.h
index c917a938c5a..b07c090bfec 100644
--- a/hotspot/agent/src/os/linux/libproc.h
+++ b/hotspot/agent/src/os/linux/libproc.h
@@ -34,7 +34,7 @@
#include "libproc_md.h"
#endif
-#include
+#include
/************************************************************************************
diff --git a/hotspot/agent/src/os/linux/ps_proc.c b/hotspot/agent/src/os/linux/ps_proc.c
index 61923a25529..a3c18c9e0de 100644
--- a/hotspot/agent/src/os/linux/ps_proc.c
+++ b/hotspot/agent/src/os/linux/ps_proc.c
@@ -263,7 +263,7 @@ static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid
static bool read_lib_info(struct ps_prochandle* ph) {
char fname[32];
- char buf[256];
+ char buf[PATH_MAX];
FILE *fp = NULL;
sprintf(fname, "/proc/%d/maps", ph->pid);
@@ -273,10 +273,41 @@ static bool read_lib_info(struct ps_prochandle* ph) {
return false;
}
- while(fgets_no_cr(buf, 256, fp)){
- char * word[6];
- int nwords = split_n_str(buf, 6, word, ' ', '\0');
- if (nwords > 5 && find_lib(ph, word[5]) == false) {
+ while(fgets_no_cr(buf, PATH_MAX, fp)){
+ char * word[7];
+ int nwords = split_n_str(buf, 7, word, ' ', '\0');
+
+ if (nwords < 6) {
+ // not a shared library entry. ignore.
+ continue;
+ }
+
+ // SA does not handle the lines with patterns:
+ // "[stack]", "[heap]", "[vdso]", "[vsyscall]", etc.
+ if (word[5][0] == '[') {
+ // not a shared library entry. ignore.
+ continue;
+ }
+
+ if (nwords > 6) {
+ // prelink altered mapfile when the program is running.
+ // Entries like one below have to be skipped
+ // /lib64/libc-2.15.so (deleted)
+ // SO name in entries like one below have to be stripped.
+ // /lib64/libpthread-2.15.so.#prelink#.EECVts
+ char *s = strstr(word[5],".#prelink#");
+ if (s == NULL) {
+ // No prelink keyword. skip deleted library
+ print_debug("skip shared object %s deleted by prelink\n", word[5]);
+ continue;
+ }
+
+ // Fall through
+ print_debug("rectifying shared object name %s changed by prelink\n", word[5]);
+ *s = 0;
+ }
+
+ if (find_lib(ph, word[5]) == false) {
intptr_t base;
lib_info* lib;
#ifdef _LP64
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/G1YCType.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/G1YCType.java
new file mode 100644
index 00000000000..d3d15512b04
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/G1YCType.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.gc_interface;
+
+//These definitions should be kept in sync with the definitions in the HotSpot
+//code.
+
+public enum G1YCType {
+ Normal ("Normal"),
+ InitialMark ("Initial Mark"),
+ DuringMark ("During Mark"),
+ Mixed ("Mixed"),
+ G1YCTypeEndSentinel ("Unknown");
+
+ private final String value;
+
+ G1YCType(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCCause.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCCause.java
new file mode 100644
index 00000000000..fc8f251f919
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCCause.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.gc_interface;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum GCCause {
+ _java_lang_system_gc ("System.gc()"),
+ _full_gc_alot ("FullGCAlot"),
+ _scavenge_alot ("ScavengeAlot"),
+ _allocation_profiler ("Allocation Profiler"),
+ _jvmti_force_gc ("JvmtiEnv ForceGarbageCollection"),
+ _gc_locker ("GCLocker Initiated GC"),
+ _heap_inspection ("Heap Inspection Initiated GC"),
+ _heap_dump ("Heap Dump Initiated GC"),
+
+ _no_gc ("No GC"),
+ _no_cause_specified ("Unknown GCCause"),
+ _allocation_failure ("Allocation Failure"),
+
+ _tenured_generation_full ("Tenured Generation Full"),
+ _metadata_GC_threshold ("Metadata GC Threshold"),
+
+ _cms_generation_full ("CMS Generation Full"),
+ _cms_initial_mark ("CMS Initial Mark"),
+ _cms_final_remark ("CMS Final Remark"),
+ _cms_concurrent_mark ("CMS Concurrent Mark"),
+
+ _old_generation_expanded_on_last_scavenge ("Old Generation Expanded On Last Scavenge"),
+ _old_generation_too_full_to_scavenge ("Old Generation Too Full To Scavenge"),
+ _adaptive_size_policy ("Ergonomics"),
+
+ _g1_inc_collection_pause ("G1 Evacuation Pause"),
+ _g1_humongous_allocation ("G1 Humongous Allocation"),
+
+ _last_ditch_collection ("Last ditch collection"),
+ _last_gc_cause ("ILLEGAL VALUE - last gc cause - ILLEGAL VALUE");
+
+ private final String value;
+
+ GCCause(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCName.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCName.java
new file mode 100644
index 00000000000..f8985778d35
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCName.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.gc_interface;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum GCName {
+ ParallelOld ("ParallelOld"),
+ SerialOld ("SerialOld"),
+ PSMarkSweep ("PSMarkSweep"),
+ ParallelScavenge ("ParallelScavenge"),
+ DefNew ("DefNew"),
+ ParNew ("ParNew"),
+ G1New ("G1New"),
+ ConcurrentMarkSweep ("ConcurrentMarkSweep"),
+ G1Old ("G1Old"),
+ GCNameEndSentinel ("GCNameEndSentinel");
+
+ private final String value;
+
+ GCName(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
+
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCWhen.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCWhen.java
new file mode 100644
index 00000000000..74d4a83f744
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/GCWhen.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.gc_interface;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum GCWhen {
+ BeforeGC ("Before GC"),
+ AfterGC ("After GC"),
+ GCWhenEndSentinel ("GCWhenEndSentinel");
+
+ private final String value;
+
+ GCWhen(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
+
+
+
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/ReferenceType.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/ReferenceType.java
new file mode 100644
index 00000000000..e8bb8bc2119
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_interface/ReferenceType.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.gc_interface;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum ReferenceType {
+ REF_NONE ("None reference"), // Regular class
+ REF_OTHER ("Other reference"), // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
+ REF_SOFT ("Soft reference"), // Subclass of java/lang/ref/SoftReference
+ REF_WEAK ("Weak reference"), // Subclass of java/lang/ref/WeakReference
+ REF_FINAL ("Final reference"), // Subclass of java/lang/ref/FinalReference
+ REF_PHANTOM ("Phantom reference"); // Subclass of java/lang/ref/PhantomReference
+
+ private final String value;
+
+ ReferenceType(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java
index c23ce3a4093..a6654340276 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java
@@ -56,6 +56,12 @@ public class Universe {
private static AddressField narrowKlassBaseField;
private static CIntegerField narrowKlassShiftField;
+ public enum NARROW_OOP_MODE {
+ UnscaledNarrowOop,
+ ZeroBasedNarrowOop,
+ HeapBasedNarrowOop
+ }
+
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
@@ -94,7 +100,17 @@ public class Universe {
public Universe() {
}
-
+ public static String narrowOopModeToString(NARROW_OOP_MODE mode) {
+ switch (mode) {
+ case UnscaledNarrowOop:
+ return "32-bits Oops";
+ case ZeroBasedNarrowOop:
+ return "zero based Compressed Oops";
+ case HeapBasedNarrowOop:
+ return "Compressed Oops with base";
+ }
+ return "";
+ }
public CollectedHeap heap() {
try {
return (CollectedHeap) heapConstructor.instantiateWrapperFor(collectedHeapField.getValue());
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
index 9e1561bd390..c3f7b8cb88b 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java
@@ -55,6 +55,7 @@ public class Klass extends Metadata implements ClassConstants {
layoutHelper = new IntField(type.getJIntField("_layout_helper"), 0);
name = type.getAddressField("_name");
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
+ traceIDField = type.getField("_trace_id");
subklass = new MetadataField(type.getAddressField("_subklass"), 0);
nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0);
@@ -86,6 +87,7 @@ public class Klass extends Metadata implements ClassConstants {
private static CIntField accessFlags;
private static MetadataField subklass;
private static MetadataField nextSibling;
+ private static sun.jvm.hotspot.types.Field traceIDField;
private Address getValue(AddressField field) {
return addr.getAddressAt(field.getOffset());
@@ -106,6 +108,7 @@ public class Klass extends Metadata implements ClassConstants {
public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); }
public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); }
public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); }
+ public long traceID() { return traceIDField.getJLong(addr); }
// computed access flags - takes care of inner classes etc.
// This is closer to actual source level than getAccessFlags() etc.
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
index a42d8be68b5..fe93d6238a8 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java
@@ -54,6 +54,8 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
private static OopField threadNameField;
private static OopField threadGroupField;
private static LongField threadEETopField;
+ //tid field is new since 1.5
+ private static LongField threadTIDField;
// threadStatus field is new since 1.5
private static IntField threadStatusField;
// parkBlocker field is new since 1.6
@@ -220,6 +222,7 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
threadNameField = (OopField) k.findField("name", "[C");
threadGroupField = (OopField) k.findField("group", "Ljava/lang/ThreadGroup;");
threadEETopField = (LongField) k.findField("eetop", "J");
+ threadTIDField = (LongField) k.findField("tid", "J");
threadStatusField = (IntField) k.findField("threadStatus", "I");
threadParkBlockerField = (OopField) k.findField("parkBlocker",
"Ljava/lang/Object;");
@@ -268,6 +271,15 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
return VM.getVM().getThreads().createJavaThreadWrapper(addr);
}
+ public static long threadOopGetTID(Oop threadOop) {
+ initThreadFields();
+ if (threadTIDField != null) {
+ return threadTIDField.getValue(threadOop);
+ } else {
+ return 0;
+ }
+ }
+
/** returns value of java.lang.Thread.threadStatus field */
public static int threadOopGetThreadStatus(Oop threadOop) {
initThreadFields();
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/CompilerPhaseType.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/CompilerPhaseType.java
new file mode 100644
index 00000000000..e0eb10942df
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/CompilerPhaseType.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.opto;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum CompilerPhaseType {
+ PHASE_BEFORE_STRINGOPTS ("Before StringOpts"),
+ PHASE_AFTER_STRINGOPTS ("After StringOpts"),
+ PHASE_BEFORE_REMOVEUSELESS ("Before RemoveUseless"),
+ PHASE_AFTER_PARSING ("After Parsing"),
+ PHASE_ITER_GVN1 ("Iter GVN 1"),
+ PHASE_PHASEIDEAL_BEFORE_EA ("PhaseIdealLoop before EA"),
+ PHASE_ITER_GVN_AFTER_EA ("Iter GVN after EA"),
+ PHASE_ITER_GVN_AFTER_ELIMINATION ("Iter GVN after eliminating allocations and locks"),
+ PHASE_PHASEIDEALLOOP1 ("PhaseIdealLoop 1"),
+ PHASE_PHASEIDEALLOOP2 ("PhaseIdealLoop 2"),
+ PHASE_PHASEIDEALLOOP3 ("PhaseIdealLoop 3"),
+ PHASE_CPP1 ("PhaseCPP 1"),
+ PHASE_ITER_GVN2 ("Iter GVN 2"),
+ PHASE_PHASEIDEALLOOP_ITERATIONS ("PhaseIdealLoop iterations"),
+ PHASE_OPTIMIZE_FINISHED ("Optimize finished"),
+ PHASE_GLOBAL_CODE_MOTION ("Global code motion"),
+ PHASE_FINAL_CODE ("Final Code"),
+ PHASE_AFTER_EA ("After Escape Analysis"),
+ PHASE_BEFORE_CLOOPS ("Before CountedLoop"),
+ PHASE_AFTER_CLOOPS ("After CountedLoop"),
+ PHASE_BEFORE_BEAUTIFY_LOOPS ("Before beautify loops"),
+ PHASE_AFTER_BEAUTIFY_LOOPS ("After beautify loops"),
+ PHASE_BEFORE_MATCHING ("Before Matching"),
+ PHASE_INCREMENTAL_INLINE ("Incremental Inline"),
+ PHASE_INCREMENTAL_BOXING_INLINE ("Incremental Boxing Inline"),
+ PHASE_END ("End"),
+ PHASE_FAILURE ("Failure"),
+ PHASE_NUM_TYPES ("Number of Phase Types");
+
+ private final String value;
+
+ CompilerPhaseType(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Flags.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Flags.java
new file mode 100644
index 00000000000..320dda27ee4
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Flags.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.runtime;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum Flags {
+ // value origin
+ DEFAULT ("Default"),
+ COMMAND_LINE ("Command line"),
+ ENVIRON_VAR ("Environment variable"),
+ CONFIG_FILE ("Config file"),
+ MANAGEMENT ("Management"),
+ ERGONOMIC ("Ergonomic"),
+ ATTACH_ON_DEMAND ("Attach on demand"),
+ INTERNAL ("Internal");
+
+ private final String value;
+
+ Flags(String val) {
+ this.value = val;
+ }
+ public String value() {
+ return value;
+ }
+}
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
index 2948f7b95ca..03c426ba84a 100644
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
@@ -41,6 +41,8 @@ public class Thread extends VMObject {
private static AddressField currentPendingMonitorField;
private static AddressField currentWaitingMonitorField;
+ private static JLongField allocatedBytesField;
+
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
@@ -61,6 +63,7 @@ public class Thread extends VMObject {
activeHandlesField = type.getAddressField("_active_handles");
currentPendingMonitorField = type.getAddressField("_current_pending_monitor");
currentWaitingMonitorField = type.getAddressField("_current_waiting_monitor");
+ allocatedBytesField = type.getJLongField("_allocated_bytes");
}
public Thread(Address addr) {
@@ -104,6 +107,10 @@ public class Thread extends VMObject {
return new JNIHandleBlock(a);
}
+ public long allocatedBytes() {
+ return allocatedBytesField.getValue(addr);
+ }
+
public boolean isVMThread() { return false; }
public boolean isJavaThread() { return false; }
public boolean isCompilerThread() { return false; }
diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VMOps.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VMOps.java
new file mode 100644
index 00000000000..c2ab69f4b2f
--- /dev/null
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VMOps.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.runtime;
+
+//These definitions should be kept in sync with the definitions in the HotSpot code.
+
+public enum VMOps {
+ Dummy,
+ ThreadStop,
+ ThreadDump,
+ PrintThreads,
+ FindDeadlocks,
+ ForceSafepoint,
+ ForceAsyncSafepoint,
+ Deoptimize,
+ DeoptimizeFrame,
+ DeoptimizeAll,
+ ZombieAll,
+ UnlinkSymbols,
+ Verify,
+ PrintJNI,
+ HeapDumper,
+ DeoptimizeTheWorld,
+ CollectForMetadataAllocation,
+ GC_HeapInspection,
+ GenCollectFull,
+ GenCollectFullConcurrent,
+ GenCollectForAllocation,
+ ParallelGCFailedAllocation,
+ ParallelGCSystemGC,
+ CGC_Operation,
+ CMS_Initial_Mark,
+ CMS_Final_Remark,
+ G1CollectFull,
+ G1CollectForAllocation,
+ G1IncCollectionPause,
+ EnableBiasedLocking,
+ RevokeBias,
+ BulkRevokeBias,
+ PopulateDumpSharedSpace,
+ JNIFunctionTableCopier,
+ RedefineClasses,
+ GetOwnedMonitorInfo,
+ GetObjectMonitorUsage,
+ GetCurrentContendedMonitor,
+ GetStackTrace,
+ GetMultipleStackTraces,
+ GetAllStackTraces,
+ GetThreadListStackTraces,
+ GetFrameCount,
+ GetFrameLocation,
+ ChangeBreakpoints,
+ GetOrSetLocal,
+ GetCurrentLocation,
+ EnterInterpOnlyMode,
+ ChangeSingleStep,
+ HeapWalkOperation,
+ HeapIterateOperation,
+ ReportJavaOutOfMemory,
+ JFRCheckpoint,
+ Exit,
+ LinuxDllLoad,
+ Terminating
+}
diff --git a/hotspot/make/aix/makefiles/vm.make b/hotspot/make/aix/makefiles/vm.make
index b579babfffa..1170b0477d6 100644
--- a/hotspot/make/aix/makefiles/vm.make
+++ b/hotspot/make/aix/makefiles/vm.make
@@ -82,14 +82,12 @@ VM_VER_DEFS = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\"" \
-DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\"" \
$(JDK_VER_DEFS)
HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
-BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
CXXFLAGS = \
${SYSDEFS} \
${INCLUDES} \
- ${BUILD_TARGET} \
${BUILD_USER} \
${HS_LIB_ARCH} \
${VM_DISTRO}
diff --git a/hotspot/make/bsd/makefiles/gcc.make b/hotspot/make/bsd/makefiles/gcc.make
index c96ff2a78b6..b2b925b2e1c 100644
--- a/hotspot/make/bsd/makefiles/gcc.make
+++ b/hotspot/make/bsd/makefiles/gcc.make
@@ -280,7 +280,10 @@ endif
# optimization control flags (Used by fastdebug and release variants)
OPT_CFLAGS/NOOPT=-O0
-ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ifeq ($(USE_CLANG), true)
+ # Clang does not support -Og
+ OPT_CFLAGS/DEBUG=-O0
+else ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
OPT_CFLAGS/DEBUG=-Og
else
@@ -319,9 +322,20 @@ endif
# Work around some compiler bugs.
ifeq ($(USE_CLANG), true)
+ # Clang 4.2
ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)
OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
OPT_CFLAGS/unsafe.o += -O1
+ # Clang 5.0
+ else ifeq ($(shell expr $(CC_VER_MAJOR) = 5 \& $(CC_VER_MINOR) = 0), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ OPT_CFLAGS/unsafe.o += -O1
+ # Clang 5.1
+ else ifeq ($(shell expr $(CC_VER_MAJOR) = 5 \& $(CC_VER_MINOR) = 1), 1)
+ OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)
+ OPT_CFLAGS/unsafe.o += -O1
+ else
+ $(error "Update compiler workarounds for Clang $(CC_VER_MAJOR).$(CC_VER_MINOR)")
endif
else
# 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
@@ -443,7 +457,10 @@ ifeq ($(USE_CLANG), true)
CFLAGS += -flimit-debug-info
endif
-ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
+ifeq ($(USE_CLANG), true)
+ # Clang does not support -Og
+ DEBUG_CFLAGS=-O0
+else ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
DEBUG_CFLAGS=-Og
else
diff --git a/hotspot/make/bsd/makefiles/saproc.make b/hotspot/make/bsd/makefiles/saproc.make
index a147325979f..1b0d5d603e8 100644
--- a/hotspot/make/bsd/makefiles/saproc.make
+++ b/hotspot/make/bsd/makefiles/saproc.make
@@ -64,9 +64,23 @@ ifeq ($(OS_VENDOR), FreeBSD)
else
ifeq ($(OS_VENDOR), Darwin)
SASRCFILES = $(DARWIN_NON_STUB_SASRCFILES)
- SALIBS = -g -framework Foundation -F/System/Library/Frameworks/JavaVM.framework/Frameworks -framework JavaNativeFoundation -framework Security -framework CoreFoundation
+ SALIBS = -g \
+ -framework Foundation \
+ -framework JavaNativeFoundation \
+ -framework Security \
+ -framework CoreFoundation
#objc compiler blows up on -march=i586, perhaps it should not be included in the macosx intel 32-bit C++ compiles?
SAARCH = $(subst -march=i586,,$(ARCHFLAG))
+
+ # This is needed to locate JavaNativeFoundation.framework
+ ifeq ($(SYSROOT_CFLAGS),)
+ # this will happen when building without spec.gmk, set SDKROOT to a valid SDK
+ # path if your system does not have headers installed in the system frameworks
+ SA_SYSROOT_FLAGS = -F"$(SDKROOT)/System/Library/Frameworks/JavaVM.framework/Frameworks"
+ else
+ # Just use SYSROOT_CFLAGS
+ SA_SYSROOT_FLAGS=$(SYSROOT_CFLAGS)
+ endif
else
SASRCFILES = $(SASRCDIR)/StubDebuggerLocal.c
SALIBS =
@@ -100,14 +114,8 @@ SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE))
endif
SA_LFLAGS += $(LDFLAGS_HASH_STYLE)
-ifeq ($(OS_VENDOR), Darwin)
- BOOT_JAVA_INCLUDES = -I$(BOOT_JAVA_HOME)/include \
- -I$(BOOT_JAVA_HOME)/include/$(shell uname -s | tr "[:upper:]" "[:lower:]") \
- -I/System/Library/Frameworks/JavaVM.framework/Headers
-else
- BOOT_JAVA_INCLUDES = -I$(BOOT_JAVA_HOME)/include \
- -I$(BOOT_JAVA_HOME)/include/$(shell uname -s | tr "[:upper:]" "[:lower:]")
-endif
+BOOT_JAVA_INCLUDES = -I$(BOOT_JAVA_HOME)/include \
+ -I$(BOOT_JAVA_HOME)/include/$(shell uname -s | tr "[:upper:]" "[:lower:]")
$(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
@@ -116,6 +124,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
fi
@echo Making SA debugger back-end...
$(QUIETLY) $(CC) -D$(BUILDARCH) -D_GNU_SOURCE \
+ $(SA_SYSROOT_FLAGS) \
$(SYMFLAG) $(SAARCH) $(SHARED_FLAG) $(PICFLAG) \
-I$(SASRCDIR) \
-I$(GENERATED) \
diff --git a/hotspot/make/bsd/makefiles/vm.make b/hotspot/make/bsd/makefiles/vm.make
index 77dde8bc930..3a658ab1373 100644
--- a/hotspot/make/bsd/makefiles/vm.make
+++ b/hotspot/make/bsd/makefiles/vm.make
@@ -81,14 +81,12 @@ VM_VER_DEFS = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\"" \
-DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\"" \
$(JDK_VER_DEFS)
HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
-BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
CXXFLAGS = \
${SYSDEFS} \
${INCLUDES} \
- ${BUILD_TARGET} \
${BUILD_USER} \
${HS_LIB_ARCH} \
${VM_DISTRO}
@@ -295,6 +293,7 @@ endif
$(PRECOMPILED_HEADER):
$(QUIETLY) echo Generating precompiled header $@
$(QUIETLY) mkdir -p $(PRECOMPILED_HEADER_DIR)
+ $(QUIETLY) rm -f $@
$(QUIETLY) $(COMPILE.CXX) $(DEPFLAGS) -x c++-header $(PRECOMPILED_HEADER_SRC) -o $@ $(COMPILE_DONE)
# making the library:
diff --git a/hotspot/make/defs.make b/hotspot/make/defs.make
index 65942d2b53f..70e050eb2e1 100644
--- a/hotspot/make/defs.make
+++ b/hotspot/make/defs.make
@@ -135,8 +135,12 @@ endif
ifeq ($(JDK_MKTG_VERSION),)
JDK_MKTG_VERSION=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION)
endif
-ifeq ($(JDK_VERSION),)
- JDK_VERSION=$(JDK_MAJOR_VERSION).$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION)
+ifeq ($(JDK_VERSION),)
+ ifeq ($(BUILD_FLAVOR), product)
+ JDK_VERSION=$(JDK_MAJOR_VERSION).$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION)
+ else
+ JDK_VERSION=$(JDK_MAJOR_VERSION).$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION)-$(BUILD_FLAVOR)
+ endif
endif
ifeq ($(FULL_VERSION),)
FULL_VERSION="$(JDK_VERSION)"
diff --git a/hotspot/make/linux/makefiles/defs.make b/hotspot/make/linux/makefiles/defs.make
index 8922fdd8728..dc0bb08728d 100644
--- a/hotspot/make/linux/makefiles/defs.make
+++ b/hotspot/make/linux/makefiles/defs.make
@@ -69,7 +69,7 @@ ifeq ($(ARCH), ia64)
endif
# sparc
-ifeq ($(ARCH), sparc64)
+ifneq (,$(findstring $(ARCH), sparc))
ifeq ($(ARCH_DATA_MODEL), 64)
ARCH_DATA_MODEL = 64
MAKE_ARGS += LP64=1
@@ -83,30 +83,20 @@ ifeq ($(ARCH), sparc64)
HS_ARCH = sparc
endif
-# amd64/x86_64
-ifneq (,$(findstring $(ARCH), amd64 x86_64))
+# i686/i586 and amd64/x86_64
+ifneq (,$(findstring $(ARCH), amd64 x86_64 i686 i586))
ifeq ($(ARCH_DATA_MODEL), 64)
ARCH_DATA_MODEL = 64
MAKE_ARGS += LP64=1
PLATFORM = linux-amd64
VM_PLATFORM = linux_amd64
- HS_ARCH = x86
else
ARCH_DATA_MODEL = 32
PLATFORM = linux-i586
VM_PLATFORM = linux_i486
- HS_ARCH = x86
- # We have to reset ARCH to i686 since SRCARCH relies on it
- ARCH = i686
endif
-endif
-# i686/i586 ie 32-bit x86
-ifneq (,$(findstring $(ARCH), i686 i586))
- ARCH_DATA_MODEL = 32
- PLATFORM = linux-i586
- VM_PLATFORM = linux_i486
- HS_ARCH = x86
+ HS_ARCH = x86
endif
# ARM
@@ -118,20 +108,18 @@ ifeq ($(ARCH), arm)
endif
# PPC
-ifeq ($(ARCH), ppc)
- ARCH_DATA_MODEL = 32
- PLATFORM = linux-ppc
- VM_PLATFORM = linux_ppc
- HS_ARCH = ppc
-endif
+ifneq (,$(findstring $(ARCH), ppc))
+ ifeq ($(ARCH_DATA_MODEL), 64)
+ MAKE_ARGS += LP64=1
+ PLATFORM = linux-ppc64
+ VM_PLATFORM = linux_ppc64
+ else
+ ARCH_DATA_MODEL = 32
+ PLATFORM = linux-ppc
+ VM_PLATFORM = linux_ppc
+ endif
-# PPC64
-ifeq ($(ARCH), ppc64)
- ARCH_DATA_MODEL = 64
- MAKE_ARGS += LP64=1
- PLATFORM = linux-ppc64
- VM_PLATFORM = linux_ppc64
- HS_ARCH = ppc
+ HS_ARCH = ppc
endif
# On 32 bit linux we build server and client, on 64 bit just server.
diff --git a/hotspot/make/linux/makefiles/vm.make b/hotspot/make/linux/makefiles/vm.make
index bcf87c043ec..7e3e5f0f65c 100644
--- a/hotspot/make/linux/makefiles/vm.make
+++ b/hotspot/make/linux/makefiles/vm.make
@@ -82,14 +82,12 @@ VM_VER_DEFS = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\"" \
-DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\"" \
$(JDK_VER_DEFS)
HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
-BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
CXXFLAGS = \
${SYSDEFS} \
${INCLUDES} \
- ${BUILD_TARGET} \
${BUILD_USER} \
${HS_LIB_ARCH} \
${VM_DISTRO}
@@ -290,6 +288,7 @@ LINK_VM = $(LINK_LIB.CC)
$(PRECOMPILED_HEADER):
$(QUIETLY) echo Generating precompiled header $@
$(QUIETLY) mkdir -p $(PRECOMPILED_HEADER_DIR)
+ $(QUIETLY) rm -f $@
$(QUIETLY) $(COMPILE.CXX) $(DEPFLAGS) -x c++-header $(PRECOMPILED_HEADER_SRC) -o $@ $(COMPILE_DONE)
# making the library:
diff --git a/hotspot/make/solaris/makefiles/sa.make b/hotspot/make/solaris/makefiles/sa.make
index 2c08b1c5170..546e2630ce4 100644
--- a/hotspot/make/solaris/makefiles/sa.make
+++ b/hotspot/make/solaris/makefiles/sa.make
@@ -29,8 +29,12 @@
# and generate JNI header file for native methods.
include $(GAMMADIR)/make/solaris/makefiles/rules.make
+include $(GAMMADIR)/make/defs.make
AGENT_DIR = $(GAMMADIR)/agent
include $(GAMMADIR)/make/sa.files
+
+-include $(HS_ALT_MAKE)/solaris/makefiles/sa.make
+
GENERATED = ../generated
# tools.jar is needed by the JDI - SA binding
diff --git a/hotspot/make/solaris/makefiles/vm.make b/hotspot/make/solaris/makefiles/vm.make
index 3e32a57cd92..e0176bf66c2 100644
--- a/hotspot/make/solaris/makefiles/vm.make
+++ b/hotspot/make/solaris/makefiles/vm.make
@@ -77,14 +77,12 @@ VM_VER_DEFS = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\"" \
-DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\"" \
$(JDK_VER_DEFS)
HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
-BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
CXXFLAGS = \
${SYSDEFS} \
${INCLUDES} \
- ${BUILD_TARGET} \
${BUILD_USER} \
${HS_LIB_ARCH} \
${VM_DISTRO}
diff --git a/hotspot/make/windows/create.bat b/hotspot/make/windows/create.bat
index a9a8acea6d2..fb0d450187a 100644
--- a/hotspot/make/windows/create.bat
+++ b/hotspot/make/windows/create.bat
@@ -1,6 +1,6 @@
@echo off
REM
-REM Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+REM Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
REM
REM This code is free software; you can redistribute it and/or modify it
@@ -81,33 +81,8 @@ REM figure out MSC version
for /F %%i in ('sh %HotSpotWorkSpace%/make/windows/get_msc_ver.sh') do set %%i
echo **************************************************************
-set ProjectFile=%HotSpotBuildSpace%\jvm.vcproj
echo MSC_VER = "%MSC_VER%"
-if "%MSC_VER%" == "1200" (
-set ProjectFile=%HotSpotBuildSpace%\jvm.dsp
-echo Will generate VC6 project {unsupported}
-) else (
-if "%MSC_VER%" == "1400" (
-echo Will generate VC8 {Visual Studio 2005}
-) else (
-if "%MSC_VER%" == "1500" (
-echo Will generate VC9 {Visual Studio 2008}
-) else (
-if "%MSC_VER%" == "1600" (
-echo Will generate VC10 {Visual Studio 2010}
set ProjectFile=%HotSpotBuildSpace%\jvm.vcxproj
-) else (
-if "%MSC_VER%" == "1700" (
-echo Will generate VC10 {compatible with Visual Studio 2012}
-echo After opening in VS 2012, click "Update" when prompted.
-set ProjectFile=%HotSpotBuildSpace%\jvm.vcxproj
-) else (
-echo Will generate VC7 project {Visual Studio 2003 .NET}
-)
-)
-)
-)
-)
echo %ProjectFile%
echo **************************************************************
diff --git a/hotspot/make/windows/makefiles/compile.make b/hotspot/make/windows/makefiles/compile.make
index 9da2742335e..a4d1c0d4c3e 100644
--- a/hotspot/make/windows/makefiles/compile.make
+++ b/hotspot/make/windows/makefiles/compile.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2014, 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
@@ -63,28 +63,20 @@ CXX_FLAGS=$(CXX_FLAGS) /Zi
# Based on BUILDARCH we add some flags and select the default compiler name
!if "$(BUILDARCH)" == "ia64"
MACHINE=IA64
-DEFAULT_COMPILER_NAME=VS2003
CXX_FLAGS=$(CXX_FLAGS) /D "CC_INTERP" /D "_LP64" /D "IA64"
!endif
!if "$(BUILDARCH)" == "amd64"
MACHINE=AMD64
-DEFAULT_COMPILER_NAME=VS2005
CXX_FLAGS=$(CXX_FLAGS) /D "_LP64" /D "AMD64"
LP64=1
!endif
!if "$(BUILDARCH)" == "i486"
MACHINE=I386
-DEFAULT_COMPILER_NAME=VS2003
CXX_FLAGS=$(CXX_FLAGS) /D "IA32"
!endif
-# Sanity check, this is the default if not amd64, ia64, or i486
-!ifndef DEFAULT_COMPILER_NAME
-CXX=ARCH_ERROR
-!endif
-
CXX_FLAGS=$(CXX_FLAGS) /D "WIN32" /D "_WINDOWS"
# Must specify this for sharedRuntimeTrig.cpp
CXX_FLAGS=$(CXX_FLAGS) /D "VM_LITTLE_ENDIAN"
@@ -112,6 +104,7 @@ CXX_FLAGS=$(CXX_FLAGS) /D TARGET_COMPILER_visCPP
# 1500 is for VS2008
# 1600 is for VS2010
# 1700 is for VS2012
+# 1800 is for VS2013
# Do not confuse this MSC_VER with the predefined macro _MSC_VER that the
# compiler provides, when MSC_VER==1399, _MSC_VER will be 1400.
# Normally they are the same, but a pre-release of the VS2005 compilers
@@ -119,35 +112,6 @@ CXX_FLAGS=$(CXX_FLAGS) /D TARGET_COMPILER_visCPP
# closer to VS2003 in terms of option spellings, so we use 1399 for that
# 1400 version that really isn't 1400.
# See the file get_msc_ver.sh for more info.
-!if "x$(MSC_VER)" == "x"
-COMPILER_NAME=$(DEFAULT_COMPILER_NAME)
-!else
-!if "$(MSC_VER)" == "1200"
-COMPILER_NAME=VC6
-!endif
-!if "$(MSC_VER)" == "1300"
-COMPILER_NAME=VS2003
-!endif
-!if "$(MSC_VER)" == "1310"
-COMPILER_NAME=VS2003
-!endif
-!if "$(MSC_VER)" == "1399"
-# Compiler might say 1400, but if it's 14.00.30701, it isn't really VS2005
-COMPILER_NAME=VS2003
-!endif
-!if "$(MSC_VER)" == "1400"
-COMPILER_NAME=VS2005
-!endif
-!if "$(MSC_VER)" == "1500"
-COMPILER_NAME=VS2008
-!endif
-!if "$(MSC_VER)" == "1600"
-COMPILER_NAME=VS2010
-!endif
-!if "$(MSC_VER)" == "1700"
-COMPILER_NAME=VS2012
-!endif
-!endif
# By default, we do not want to use the debug version of the msvcrt.dll file
# but if MFC_DEBUG is defined in the environment it will be used.
@@ -165,60 +129,6 @@ MS_RUNTIME_OPTION = $(MS_RUNTIME_OPTION) $(STATIC_CPPLIB_OPTION)
!endif
CXX_FLAGS=$(CXX_FLAGS) $(MS_RUNTIME_OPTION)
-# How /GX option is spelled
-GX_OPTION = /GX
-
-# Optimization settings for various versions of the compilers and types of
-# builds. Three basic sets of settings: product, fastdebug, and debug.
-# These get added into CXX_FLAGS as needed by other makefiles.
-!if "$(COMPILER_NAME)" == "VC6"
-PRODUCT_OPT_OPTION = /Ox /Os /Gy /GF
-FASTDEBUG_OPT_OPTION = /Ox /Os /Gy /GF
-DEBUG_OPT_OPTION = /Od
-!endif
-
-!if "$(COMPILER_NAME)" == "VS2003"
-PRODUCT_OPT_OPTION = /O2 /Oy-
-FASTDEBUG_OPT_OPTION = /O2 /Oy-
-DEBUG_OPT_OPTION = /Od
-SAFESEH_FLAG = /SAFESEH
-!endif
-
-!if "$(COMPILER_NAME)" == "VS2005"
-PRODUCT_OPT_OPTION = /O2 /Oy-
-FASTDEBUG_OPT_OPTION = /O2 /Oy-
-DEBUG_OPT_OPTION = /Od
-GX_OPTION = /EHsc
-# This VS2005 compiler has /GS as a default and requires bufferoverflowU.lib
-# on the link command line, otherwise we get missing __security_check_cookie
-# externals at link time. Even with /GS-, you need bufferoverflowU.lib.
-# NOTE: Currently we decided to not use /GS-
-BUFFEROVERFLOWLIB = bufferoverflowU.lib
-LD_FLAGS = /manifest $(LD_FLAGS) $(BUFFEROVERFLOWLIB)
-# Manifest Tool - used in VS2005 and later to adjust manifests stored
-# as resources inside build artifacts.
-!if "x$(MT)" == "x"
-MT=mt.exe
-!endif
-SAFESEH_FLAG = /SAFESEH
-!endif
-
-!if "$(COMPILER_NAME)" == "VS2008"
-PRODUCT_OPT_OPTION = /O2 /Oy-
-FASTDEBUG_OPT_OPTION = /O2 /Oy-
-DEBUG_OPT_OPTION = /Od
-GX_OPTION = /EHsc
-LD_FLAGS = /manifest $(LD_FLAGS)
-MP_FLAG = /MP
-# Manifest Tool - used in VS2005 and later to adjust manifests stored
-# as resources inside build artifacts.
-!if "x$(MT)" == "x"
-MT=mt.exe
-!endif
-SAFESEH_FLAG = /SAFESEH
-!endif
-
-!if "$(COMPILER_NAME)" == "VS2010"
PRODUCT_OPT_OPTION = /O2 /Oy-
FASTDEBUG_OPT_OPTION = /O2 /Oy-
DEBUG_OPT_OPTION = /Od
@@ -233,26 +143,6 @@ MT=mt.exe
!if "$(BUILDARCH)" == "i486"
LD_FLAGS = /SAFESEH $(LD_FLAGS)
!endif
-!endif
-
-!if "$(COMPILER_NAME)" == "VS2012"
-PRODUCT_OPT_OPTION = /O2 /Oy-
-FASTDEBUG_OPT_OPTION = /O2 /Oy-
-DEBUG_OPT_OPTION = /Od
-GX_OPTION = /EHsc
-LD_FLAGS = /manifest $(LD_FLAGS)
-MP_FLAG = /MP
-# Manifest Tool - used in VS2005 and later to adjust manifests stored
-# as resources inside build artifacts.
-!if "x$(MT)" == "x"
-MT=mt.exe
-!endif
-SAFESEH_FLAG = /SAFESEH
-!endif
-
-!if "$(BUILDARCH)" == "i486"
-LD_FLAGS = $(SAFESEH_FLAG) $(LD_FLAGS)
-!endif
CXX_FLAGS = $(CXX_FLAGS) $(MP_FLAG)
diff --git a/hotspot/make/windows/makefiles/rules.make b/hotspot/make/windows/makefiles/rules.make
index c5d565a2880..08a6a85e101 100644
--- a/hotspot/make/windows/makefiles/rules.make
+++ b/hotspot/make/windows/makefiles/rules.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2014, 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
@@ -49,35 +49,8 @@ BOOT_TARGET_CLASS_VERSION=6
JAVAC_FLAGS=-g -encoding ascii
BOOTSTRAP_JAVAC_FLAGS=$(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
-ProjectFile=jvm.vcproj
-
-!if "$(MSC_VER)" == "1200"
-
-VcVersion=VC6
-ProjectFile=jvm.dsp
-
-!elseif "$(MSC_VER)" == "1400"
-
-VcVersion=VC8
-
-!elseif "$(MSC_VER)" == "1500"
-
-VcVersion=VC9
-
-!elseif "$(MSC_VER)" == "1600"
-
-VcVersion=VC10
-ProjectFile=jvm.vcxproj
-
-!elseif "$(MSC_VER)" == "1700"
-# This is VS2012, but it loads VS10 projects just fine (and will
+# VS2012 and VS2013 loads VS10 projects just fine (and will
# upgrade them automatically to VS2012 format).
-
VcVersion=VC10
ProjectFile=jvm.vcxproj
-!else
-
-VcVersion=VC7
-
-!endif
diff --git a/hotspot/make/windows/makefiles/sa.make b/hotspot/make/windows/makefiles/sa.make
index 2208da9e3d8..4ac5d89f5fa 100644
--- a/hotspot/make/windows/makefiles/sa.make
+++ b/hotspot/make/windows/makefiles/sa.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2014, 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
@@ -38,6 +38,22 @@ checkAndBuildSA::
GENERATED = ../generated
+HS_COMMON_SRC_REL = src
+
+!if "$(OPENJDK)" != "true"
+HS_ALT_SRC_REL=src/closed
+HS_ALT_SRC = $(WorkSpace)/$(HS_ALT_SRC_REL)
+!ifndef HS_ALT_MAKE
+HS_ALT_MAKE=$(WorkSpace)/make/closed
+!endif
+!endif
+
+HS_COMMON_SRC = $(WorkSpace)/$(HS_COMMON_SRC_REL)
+
+!ifdef HS_ALT_MAKE
+!include $(HS_ALT_MAKE)/windows/makefiles/sa.make
+!endif
+
# tools.jar is needed by the JDI - SA binding
SA_CLASSPATH = $(BOOT_JAVA_HOME)/lib/tools.jar
@@ -85,14 +101,9 @@ checkAndBuildSA:: $(SAWINDBG)
# will be useful to have the assertion checks in place
!if "$(BUILDARCH)" == "ia64"
-SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "WIN64" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -YX -FD -c
+SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "WIN64" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -c
!elseif "$(BUILDARCH)" == "amd64"
-SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "WIN64" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -YX -FD -c
-!if "$(COMPILER_NAME)" == "VS2005"
-# On amd64, VS2005 compiler requires bufferoverflowU.lib on the link command line,
-# otherwise we get missing __security_check_cookie externals at link time.
-SA_LD_FLAGS = bufferoverflowU.lib
-!endif
+SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "WIN64" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -c
!else
SA_CFLAGS = -nologo $(MS_RUNTIME_OPTION) -W3 $(GX_OPTION) -Od -D "WIN32" -D "_WINDOWS" -D "_DEBUG" -D "_CONSOLE" -D "_MBCS" -FD -RTC1 -c
!if "$(ENABLE_FULL_DEBUG_SYMBOLS)" == "1"
diff --git a/hotspot/make/windows/makefiles/sanity.make b/hotspot/make/windows/makefiles/sanity.make
index b502cfaa65f..515b0bb1b50 100644
--- a/hotspot/make/windows/makefiles/sanity.make
+++ b/hotspot/make/windows/makefiles/sanity.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2014, 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
@@ -27,9 +27,9 @@
all: checkCL checkLink
checkCL:
- @ if "$(MSC_VER)" NEQ "1310" if "$(MSC_VER)" NEQ "1399" if "$(MSC_VER)" NEQ "1400" if "$(MSC_VER)" NEQ "1500" if "$(MSC_VER)" NEQ "1600" if "$(MSC_VER)" NEQ "1700" \
- echo *** WARNING *** unrecognized cl.exe version $(MSC_VER) ($(RAW_MSC_VER)). Use FORCE_MSC_VER to override automatic detection.
+ @ if "$(MSC_VER)" NEQ "1600" if "$(MSC_VER)" NEQ "1700" if "$(MSC_VER)" NEQ "1800" \
+ echo *** WARNING *** Unsupported cl.exe version detected: $(MSC_VER) ($(RAW_MSC_VER)), only 1600/1700/1800 (Visual Studio 2010/2012/2013) are supported.
checkLink:
- @ if "$(LD_VER)" NEQ "710" if "$(LD_VER)" NEQ "800" if "$(LD_VER)" NEQ "900" if "$(LD_VER)" NEQ "1000" if "$(LD_VER)" NEQ "1100" \
- echo *** WARNING *** unrecognized link.exe version $(LD_VER) ($(RAW_LD_VER)). Use FORCE_LD_VER to override automatic detection.
+ @ if "$(LD_VER)" NEQ "1000" if "$(LD_VER)" NEQ "1100" if "$(LD_VER)" NEQ "1200" \
+ echo *** WARNING *** Unsupported link.exe version detected: $(LD_VER) ($(RAW_LD_VER)), only 1000/1100/1200 (Visual Studio 2010/2012/2013) are supported.
diff --git a/hotspot/make/windows/makefiles/vm.make b/hotspot/make/windows/makefiles/vm.make
index e4caa13dea2..d8040f89ed8 100644
--- a/hotspot/make/windows/makefiles/vm.make
+++ b/hotspot/make/windows/makefiles/vm.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2014, 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
@@ -132,7 +132,7 @@ CXX_DONT_USE_PCH=/D DONT_USE_PRECOMPILED_HEADER
!if "$(USE_PRECOMPILED_HEADER)" != "0"
CXX_USE_PCH=/Fp"vm.pch" /Yu"precompiled.hpp"
-!if "$(COMPILER_NAME)" == "VS2012"
+!if "$(MSC_VER)" > "1600"
# VS2012 requires this object file to be listed:
LD_FLAGS=$(LD_FLAGS) _build_pch_file.obj
!endif
diff --git a/hotspot/make/windows/projectfiles/common/Makefile b/hotspot/make/windows/projectfiles/common/Makefile
index 51d4e6f1f11..696b39257aa 100644
--- a/hotspot/make/windows/projectfiles/common/Makefile
+++ b/hotspot/make/windows/projectfiles/common/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2014, 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
@@ -116,11 +116,10 @@ JDK_MAJOR_VERSION="\\\"$(JDK_MAJOR_VER)\\\""
JDK_MINOR_VERSION="\\\"$(JDK_MINOR_VER)\\\""
JDK_MICRO_VERSION="\\\"$(JDK_MICRO_VER)\\\""
-ReleaseOptions = -define HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) -define JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) -define HOTSPOT_VM_DISTRO=$(HOTSPOT_VM_DISTRO) -define JDK_MAJOR_VERSION=$(JDK_MAJOR_VERSION) -define JDK_MINOR_VERSION=$(JDK_MINOR_VERSION) -define JDK_MICRO_VERSION=$(JDK_MICRO_VERSION) -define JDK_BUILD_NUMBER=$(JDK_BUILD_NUMBER)
+ReleaseOptions = -define HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) -define JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) -define HOTSPOT_VM_DISTRO=$(HOTSPOT_VM_DISTRO) -define JDK_MAJOR_VERSION=$(JDK_MAJOR_VERSION) -define JDK_MINOR_VERSION=$(JDK_MINOR_VERSION) -define JDK_MICRO_VERSION=$(JDK_MICRO_VERSION) -define JDK_BUILD_NUMBER=$(JDK_BUILD_NUMBER) -define VISUAL_STUDIO_BUILD=true
ProjectCreatorIDEOptions = $(ProjectCreatorIDEOptions) $(ReleaseOptions)
$(HOTSPOTBUILDSPACE)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
- @if "$(MSC_VER)"=="1500" echo Make sure you have VS2008 SP1 or later, or you may see 'expanded command line too long'
@$(RUN_JAVA) -Djava.class.path="$(HOTSPOTBUILDSPACE)/classes" ProjectCreator WinGammaPlatform$(VcVersion) $(ProjectCreatorIDEOptions)
clean:
diff --git a/hotspot/src/cpu/ppc/vm/assembler_ppc.cpp b/hotspot/src/cpu/ppc/vm/assembler_ppc.cpp
index f9e49e1f4a8..6ab0f8a61bd 100644
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012, 2014 SAP AG. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -693,7 +693,7 @@ void Assembler::test_asm() {
// PPC 1, section 4.6.7 Floating-Point Compare Instructions
fcmpu( CCR7, F24, F25);
- tty->print_cr("\ntest_asm disassembly (0x%lx 0x%lx):", code()->insts_begin(), code()->insts_end());
+ tty->print_cr("\ntest_asm disassembly (0x%lx 0x%lx):", p2i(code()->insts_begin()), p2i(code()->insts_end()));
code()->decode();
}
diff --git a/hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp b/hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp
index b24b3c4c895..1b54594d09c 100644
--- a/hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -50,34 +50,6 @@ bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
return is_icholder_entry(call->destination());
}
-//-----------------------------------------------------------------------------
-// High-level access to an inline cache. Guaranteed to be MT-safe.
-
-CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
- : _ic_call(call)
-{
- address ic_call = call->instruction_address();
-
- assert(ic_call != NULL, "ic_call address must be set");
- assert(nm != NULL, "must pass nmethod");
- assert(nm->contains(ic_call), "must be in nmethod");
-
- // Search for the ic_call at the given address.
- RelocIterator iter(nm, ic_call, ic_call+1);
- bool ret = iter.next();
- assert(ret == true, "relocInfo must exist at this address");
- assert(iter.addr() == ic_call, "must find ic_call");
- if (iter.type() == relocInfo::virtual_call_type) {
- virtual_call_Relocation* r = iter.virtual_call_reloc();
- _is_optimized = false;
- _value = nativeMovConstReg_at(r->cached_value());
- } else {
- assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
- _is_optimized = true;
- _value = NULL;
- }
-}
-
// ----------------------------------------------------------------------------
// A PPC CompiledStaticCall looks like this:
@@ -203,7 +175,7 @@ void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry)
if (TraceICs) {
ResourceMark rm;
tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
- instruction_address(),
+ p2i(instruction_address()),
callee->name_and_sig_as_C_string());
}
diff --git a/hotspot/src/cpu/ppc/vm/frame_ppc.cpp b/hotspot/src/cpu/ppc/vm/frame_ppc.cpp
index 6df316d1b87..ff177e6231a 100644
--- a/hotspot/src/cpu/ppc/vm/frame_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/frame_ppc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012, 2014 SAP AG. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -140,7 +140,7 @@ frame frame::sender(RegisterMap* map) const {
void frame::patch_pc(Thread* thread, address pc) {
if (TracePcPatching) {
tty->print_cr("patch_pc at address " PTR_FORMAT " [" PTR_FORMAT " -> " PTR_FORMAT "]",
- &((address*) _sp)[-1], ((address*) _sp)[-1], pc);
+ p2i(&((address*) _sp)[-1]), p2i(((address*) _sp)[-1]), p2i(pc));
}
own_abi()->lr = (uint64_t)pc;
_cb = CodeCache::find_blob(pc);
diff --git a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp
index 8f026ac0d0c..ce10145ed90 100644
--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012, 2014 SAP AG. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -3099,7 +3099,7 @@ const char* stop_types[] = {
};
static void stop_on_request(int tp, const char* msg) {
- tty->print("PPC assembly code requires stop: (%s) %s\n", (void *)stop_types[tp%/*stop_end*/4], msg);
+ tty->print("PPC assembly code requires stop: (%s) %s\n", stop_types[tp%/*stop_end*/4], msg);
guarantee(false, err_msg("PPC assembly code requires stop: %s", msg));
}
diff --git a/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp b/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp
index 4383d61f7fd..89c0344a5fe 100644
--- a/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012, 2014 SAP AG. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -464,7 +464,7 @@ void trace_method_handle_stub(const char* adaptername,
strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH
const char* mh_reg_name = has_mh ? "R23_method_handle" : "G23";
tty->print_cr("MH %s %s="INTPTR_FORMAT " sp=" INTPTR_FORMAT,
- adaptername, mh_reg_name, (intptr_t) mh, entry_sp);
+ adaptername, mh_reg_name, (intptr_t) mh, (intptr_t) entry_sp);
if (Verbose) {
tty->print_cr("Registers:");
diff --git a/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp b/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp
index f6249450de1..6f40af06f40 100644
--- a/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2012, 2013 SAP AG. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2012, 2014 SAP AG. 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
@@ -147,9 +147,9 @@ void NativeCall::verify() {
address addr = addr_at(0);
if (!NativeCall::is_call_at(addr)) {
- tty->print_cr("not a NativeCall at " PTR_FORMAT, addr);
+ tty->print_cr("not a NativeCall at " PTR_FORMAT, p2i(addr));
// TODO: PPC port: Disassembler::decode(addr - 20, addr + 20, tty);
- fatal(err_msg("not a NativeCall at " PTR_FORMAT, addr));
+ fatal(err_msg("not a NativeCall at " PTR_FORMAT, p2i(addr)));
}
}
#endif // ASSERT
@@ -160,9 +160,9 @@ void NativeFarCall::verify() {
NativeInstruction::verify();
if (!NativeFarCall::is_far_call_at(addr)) {
- tty->print_cr("not a NativeFarCall at " PTR_FORMAT, addr);
+ tty->print_cr("not a NativeFarCall at " PTR_FORMAT, p2i(addr));
// TODO: PPC port: Disassembler::decode(addr, 20, 20, tty);
- fatal(err_msg("not a NativeFarCall at " PTR_FORMAT, addr));
+ fatal(err_msg("not a NativeFarCall at " PTR_FORMAT, p2i(addr)));
}
}
#endif // ASSERT
@@ -306,9 +306,9 @@ void NativeMovConstReg::verify() {
if (! (cb != NULL && MacroAssembler::is_calculate_address_from_global_toc_at(addr, cb->content_begin())) &&
! (cb != NULL && MacroAssembler::is_set_narrow_oop(addr, cb->content_begin())) &&
! MacroAssembler::is_bl(*((int*) addr))) {
- tty->print_cr("not a NativeMovConstReg at " PTR_FORMAT, addr);
+ tty->print_cr("not a NativeMovConstReg at " PTR_FORMAT, p2i(addr));
// TODO: PPC port: Disassembler::decode(addr, 20, 20, tty);
- fatal(err_msg("not a NativeMovConstReg at " PTR_FORMAT, addr));
+ fatal(err_msg("not a NativeMovConstReg at " PTR_FORMAT, p2i(addr)));
}
}
}
@@ -344,9 +344,9 @@ void NativeJump::verify() {
NativeInstruction::verify();
if (!NativeJump::is_jump_at(addr)) {
- tty->print_cr("not a NativeJump at " PTR_FORMAT, addr);
+ tty->print_cr("not a NativeJump at " PTR_FORMAT, p2i(addr));
// TODO: PPC port: Disassembler::decode(addr, 20, 20, tty);
- fatal(err_msg("not a NativeJump at " PTR_FORMAT, addr));
+ fatal(err_msg("not a NativeJump at " PTR_FORMAT, p2i(addr)));
}
}
#endif // ASSERT
diff --git a/hotspot/src/cpu/ppc/vm/ppc.ad b/hotspot/src/cpu/ppc/vm/ppc.ad
index d2d51379a22..9087959fe1e 100644
--- a/hotspot/src/cpu/ppc/vm/ppc.ad
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad
@@ -1329,7 +1329,7 @@ void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
if (!false /* TODO: PPC port C->is_frameless_method()*/) {
st->print("save return pc\n\t");
- st->print("push frame %d\n\t", -framesize);
+ st->print("push frame %ld\n\t", -framesize);
}
}
#endif
diff --git a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
index 32fb22ce229..28f992f41b8 100644
--- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
+++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
@@ -352,7 +352,7 @@ void VM_Version::determine_section_size() {
if (PrintAssembly) {
ttyLocker ttyl;
- tty->print_cr("Decoding section size detection stub at " INTPTR_FORMAT " before execution:", code);
+ tty->print_cr("Decoding section size detection stub at " INTPTR_FORMAT " before execution:", p2i(code));
Disassembler::decode((u_char*)code, (u_char*)code_end, tty);
tty->print_cr("Time loop1 :%f", loop1_seconds);
tty->print_cr("Time loop2 :%f", loop2_seconds);
@@ -435,7 +435,7 @@ void VM_Version::determine_features() {
// Print the detection code.
if (PrintAssembly) {
ttyLocker ttyl;
- tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " before execution:", code);
+ tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " before execution:", p2i(code));
Disassembler::decode((u_char*)code, (u_char*)code_end, tty);
}
@@ -468,7 +468,7 @@ void VM_Version::determine_features() {
// Print the detection code.
if (PrintAssembly) {
ttyLocker ttyl;
- tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " after execution:", code);
+ tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " after execution:", p2i(code));
Disassembler::decode((u_char*)code, (u_char*)code_end, tty);
}
diff --git a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
index 92d494fc0ca..a4b2a094a5b 100644
--- a/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/compiledIC_sparc.cpp
@@ -50,34 +50,6 @@ bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
return is_icholder_entry(call->destination());
}
-//-----------------------------------------------------------------------------
-// High-level access to an inline cache. Guaranteed to be MT-safe.
-
-CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
- : _ic_call(call)
-{
- address ic_call = call->instruction_address();
-
- assert(ic_call != NULL, "ic_call address must be set");
- assert(nm != NULL, "must pass nmethod");
- assert(nm->contains(ic_call), "must be in nmethod");
-
- // Search for the ic_call at the given address.
- RelocIterator iter(nm, ic_call, ic_call+1);
- bool ret = iter.next();
- assert(ret == true, "relocInfo must exist at this address");
- assert(iter.addr() == ic_call, "must find ic_call");
- if (iter.type() == relocInfo::virtual_call_type) {
- virtual_call_Relocation* r = iter.virtual_call_reloc();
- _is_optimized = false;
- _value = nativeMovConstReg_at(r->cached_value());
- } else {
- assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
- _is_optimized = true;
- _value = NULL;
- }
-}
-
// ----------------------------------------------------------------------------
#define __ _masm.
diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
index 2feb5eb0925..17b4d9e05ac 100644
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
@@ -436,32 +436,6 @@ void frame::set_interpreter_frame_sender_sp(intptr_t* sender_sp) {
}
#endif // CC_INTERP
-
-#ifdef ASSERT
-// Debugging aid
-static frame nth_sender(int n) {
- frame f = JavaThread::current()->last_frame();
-
- for(int i = 0; i < n; ++i)
- f = f.sender((RegisterMap*)NULL);
-
- printf("first frame %d\n", f.is_first_frame() ? 1 : 0);
- printf("interpreted frame %d\n", f.is_interpreted_frame() ? 1 : 0);
- printf("java frame %d\n", f.is_java_frame() ? 1 : 0);
- printf("entry frame %d\n", f.is_entry_frame() ? 1 : 0);
- printf("native frame %d\n", f.is_native_frame() ? 1 : 0);
- if (f.is_compiled_frame()) {
- if (f.is_deoptimized_frame())
- printf("deoptimized frame 1\n");
- else
- printf("compiled frame 1\n");
- }
-
- return f;
-}
-#endif
-
-
frame frame::sender_for_entry_frame(RegisterMap *map) const {
assert(map != NULL, "map must be set");
// Java frame called from C; skip all C frames and return top C
diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
index b9702a35e41..62bb56fe97f 100644
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
@@ -625,6 +625,7 @@ int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) {
__ lea(rscratch1, polling_page);
offset = __ offset();
add_debug_info_for_branch(info);
+ __ relocate(relocInfo::poll_type);
__ testl(rax, Address(rscratch1, 0));
} else {
add_debug_info_for_branch(info);
diff --git a/hotspot/src/cpu/x86/vm/compiledIC_x86.cpp b/hotspot/src/cpu/x86/vm/compiledIC_x86.cpp
index 26d56b86ab3..9537ef971f7 100644
--- a/hotspot/src/cpu/x86/vm/compiledIC_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/compiledIC_x86.cpp
@@ -47,34 +47,6 @@ bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
return is_icholder_entry(call->destination());
}
-//-----------------------------------------------------------------------------
-// High-level access to an inline cache. Guaranteed to be MT-safe.
-
-CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
- : _ic_call(call)
-{
- address ic_call = call->instruction_address();
-
- assert(ic_call != NULL, "ic_call address must be set");
- assert(nm != NULL, "must pass nmethod");
- assert(nm->contains(ic_call), "must be in nmethod");
-
- // Search for the ic_call at the given address.
- RelocIterator iter(nm, ic_call, ic_call+1);
- bool ret = iter.next();
- assert(ret == true, "relocInfo must exist at this address");
- assert(iter.addr() == ic_call, "must find ic_call");
- if (iter.type() == relocInfo::virtual_call_type) {
- virtual_call_Relocation* r = iter.virtual_call_reloc();
- _is_optimized = false;
- _value = nativeMovConstReg_at(r->cached_value());
- } else {
- assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
- _is_optimized = true;
- _value = NULL;
- }
-}
-
// ----------------------------------------------------------------------------
#define __ _masm.
diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
index 265455bf285..1e49ce1c6a4 100644
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
@@ -280,6 +280,8 @@ address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type
case T_BYTE : __ sign_extend_byte (rax); break;
case T_SHORT : __ sign_extend_short(rax); break;
case T_INT : /* nothing to do */ break;
+ case T_LONG : /* nothing to do */ break;
+ case T_VOID : /* nothing to do */ break;
case T_DOUBLE :
case T_FLOAT :
{ const Register t = InterpreterRuntime::SignatureHandlerGenerator::temp();
diff --git a/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp b/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp
deleted file mode 100644
index f214bb74512..00000000000
--- a/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2009 Red Hat, Inc.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#ifndef CPU_ZERO_VM_BYTECODES_ZERO_HPP
-#define CPU_ZERO_VM_BYTECODES_ZERO_HPP
-
-// This file is intentionally empty
-
-#endif // CPU_ZERO_VM_BYTECODES_ZERO_HPP
diff --git a/hotspot/src/cpu/zero/vm/compiledIC_zero.cpp b/hotspot/src/cpu/zero/vm/compiledIC_zero.cpp
index 6fa39ea078b..143dc317380 100644
--- a/hotspot/src/cpu/zero/vm/compiledIC_zero.cpp
+++ b/hotspot/src/cpu/zero/vm/compiledIC_zero.cpp
@@ -58,34 +58,6 @@ bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
return is_icholder_entry(call->destination());
}
-//-----------------------------------------------------------------------------
-// High-level access to an inline cache. Guaranteed to be MT-safe.
-
-CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
- : _ic_call(call)
-{
- address ic_call = call->instruction_address();
-
- assert(ic_call != NULL, "ic_call address must be set");
- assert(nm != NULL, "must pass nmethod");
- assert(nm->contains(ic_call), "must be in nmethod");
-
- // Search for the ic_call at the given address.
- RelocIterator iter(nm, ic_call, ic_call+1);
- bool ret = iter.next();
- assert(ret == true, "relocInfo must exist at this address");
- assert(iter.addr() == ic_call, "must find ic_call");
- if (iter.type() == relocInfo::virtual_call_type) {
- virtual_call_Relocation* r = iter.virtual_call_reloc();
- _is_optimized = false;
- _value = nativeMovConstReg_at(r->cached_value());
- } else {
- assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
- _is_optimized = true;
- _value = NULL;
- }
-}
-
// ----------------------------------------------------------------------------
void CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf) {
diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
index 9272724addc..fe9115be9ec 100644
--- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
+++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
@@ -37,6 +37,7 @@
#include "prims/jvmtiExport.hpp"
#include "prims/jvmtiThreadState.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/frame.inline.hpp"
#include "runtime/interfaceSupport.hpp"
diff --git a/hotspot/src/os/aix/vm/osThread_aix.cpp b/hotspot/src/os/aix/vm/osThread_aix.cpp
index 11f9c39168e..5c56387163c 100644
--- a/hotspot/src/os/aix/vm/osThread_aix.cpp
+++ b/hotspot/src/os/aix/vm/osThread_aix.cpp
@@ -24,17 +24,13 @@
*/
// no precompiled headers
-#include "runtime/atomic.hpp"
+
#include "runtime/handles.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
#include "runtime/osThread.hpp"
#include "runtime/safepoint.hpp"
#include "runtime/vmThread.hpp"
-#ifdef TARGET_ARCH_ppc
-# include "assembler_ppc.inline.hpp"
-#endif
-
void OSThread::pd_initialize() {
assert(this != NULL, "check");
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index e9d57c580ce..febc7260c48 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -48,6 +48,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -2812,13 +2813,6 @@ void os::yield() {
os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; }
-void os::yield_all() {
- // Yields to all threads, including threads with lower priorities
- // Threads on Linux are all with same priority. The Solaris style
- // os::yield_all() with nanosleep(1ms) is not necessary.
- sched_yield();
-}
-
////////////////////////////////////////////////////////////////////////////////
// thread priority support
@@ -3075,7 +3069,7 @@ static bool do_suspend(OSThread* osthread) {
for (int n = 0; !osthread->sr.is_suspended(); n++) {
for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) {
- os::yield_all();
+ os::yield();
}
// timeout, try to cancel the request
@@ -3109,7 +3103,7 @@ static void do_resume(OSThread* osthread) {
if (sr_notify(osthread) == 0) {
for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) {
for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) {
- os::yield_all();
+ os::yield();
}
}
} else {
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index 9d817380e3e..0c3a047f460 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -41,6 +41,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -786,7 +787,7 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
case os::java_thread:
// Java threads use ThreadStackSize which default value can be
// changed with the flag -Xss
- assert (JavaThread::stack_size_at_create() > 0, "this should be set");
+ assert(JavaThread::stack_size_at_create() > 0, "this should be set");
stack_size = JavaThread::stack_size_at_create();
break;
case os::compiler_thread:
@@ -1303,7 +1304,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
if (pelements == NULL) {
return false;
}
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
// Really shouldn't be NULL, but check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
continue; // skip the empty path values
@@ -1316,7 +1317,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
}
}
// release the storage
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
if (pelements[i] != NULL) {
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
}
@@ -1467,7 +1468,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
bool failed_to_read_elf_head=
(sizeof(elf_head)!=
- (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
+ (::read(file_descriptor, &elf_head,sizeof(elf_head))));
::close(file_descriptor);
if (failed_to_read_elf_head) {
@@ -1565,7 +1566,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
int running_arch_index=-1;
- for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
+ for (unsigned int i=0; i < ARRAY_SIZE(arch_array); i++) {
if (running_arch_code == arch_array[i].code) {
running_arch_index = i;
}
@@ -1596,7 +1597,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
#endif // !S390
if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
- if ( lib_arch.name!=NULL ) {
+ if (lib_arch.name!=NULL) {
::snprintf(diag_msg_buf, diag_msg_max_length-1,
" (Possible cause: can't load %s-bit .so on a %s-bit platform)",
lib_arch.name, arch_array[running_arch_index].name);
@@ -2598,14 +2599,7 @@ void os::yield() {
sched_yield();
}
-os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
-
-void os::yield_all() {
- // Yields to all threads, including threads with lower priorities
- // Threads on Bsd are all with same priority. The Solaris style
- // os::yield_all() with nanosleep(1ms) is not necessary.
- sched_yield();
-}
+os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; }
////////////////////////////////////////////////////////////////////////////////
// thread priority support
@@ -2686,7 +2680,7 @@ static int prio_init() {
}
OSReturn os::set_native_priority(Thread* thread, int newpri) {
- if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
+ if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK;
#ifdef __OpenBSD__
// OpenBSD pthread_setprio starves low priority threads
@@ -2713,7 +2707,7 @@ OSReturn os::set_native_priority(Thread* thread, int newpri) {
}
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
- if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
+ if (!UseThreadPriorities || ThreadPriorityPolicy == 0) {
*priority_ptr = java_to_os_priority[NormPriority];
return OS_OK;
}
@@ -3079,7 +3073,7 @@ bool os::Bsd::chained_handler(int sig, siginfo_t* siginfo, void* context) {
}
struct sigaction* os::Bsd::get_preinstalled_handler(int sig) {
- if ((( (unsigned int)1 << sig ) & sigs) != 0) {
+ if ((((unsigned int)1 << sig) & sigs) != 0) {
return &sigact[sig];
}
return NULL;
@@ -3300,7 +3294,7 @@ static void print_signal_handler(outputStream* st, int sig,
address rh = VMError::get_resetted_sighandler(sig);
// May be, handler was resetted by VMError?
- if(rh != NULL) {
+ if (rh != NULL) {
handler = rh;
sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
}
@@ -3309,11 +3303,11 @@ static void print_signal_handler(outputStream* st, int sig,
os::Posix::print_sa_flags(st, sa.sa_flags);
// Check: is it our handler?
- if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
+ if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
// It is our signal handler
// check for flags, reset system-used one!
- if((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
+ if ((int)sa.sa_flags != os::Bsd::get_our_sigflags(sig)) {
st->print(
", flags was changed from " PTR32_FORMAT ", consider using jsig library",
os::Bsd::get_our_sigflags(sig));
@@ -3382,10 +3376,10 @@ void os::Bsd::check_signal_handler(int sig) {
address thisHandler = (act.sa_flags & SA_SIGINFO)
? CAST_FROM_FN_PTR(address, act.sa_sigaction)
- : CAST_FROM_FN_PTR(address, act.sa_handler) ;
+ : CAST_FROM_FN_PTR(address, act.sa_handler);
- switch(sig) {
+ switch (sig) {
case SIGSEGV:
case SIGBUS:
case SIGFPE:
@@ -3515,22 +3509,22 @@ jint os::init_2(void)
{
// Allocate a single page and mark it as readable for safepoint polling
address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
+ guarantee(polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page");
- os::set_polling_page( polling_page );
+ os::set_polling_page(polling_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
#endif
if (!UseMembar) {
address mem_serialize_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
- os::set_memory_serialize_page( mem_serialize_page );
+ guarantee(mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
+ os::set_memory_serialize_page(mem_serialize_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
#endif
}
@@ -3631,13 +3625,13 @@ void os::init_3(void) { }
// Mark the polling page as unreadable
void os::make_polling_page_unreadable(void) {
- if( !guard_memory((char*)_polling_page, Bsd::page_size()) )
+ if (!guard_memory((char*)_polling_page, Bsd::page_size()))
fatal("Could not disable polling page");
};
// Mark the polling page as readable
void os::make_polling_page_readable(void) {
- if( !bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
+ if (!bsd_mprotect((char *)_polling_page, Bsd::page_size(), PROT_READ)) {
fatal("Could not enable polling page");
}
};
@@ -4229,9 +4223,9 @@ static struct timespec* compute_abstime(struct timespec* abstime, jlong millis)
int os::PlatformEvent::TryPark() {
for (;;) {
- const int v = _Event ;
- guarantee ((v == 0) || (v == 1), "invariant") ;
- if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
+ const int v = _Event;
+ guarantee((v == 0) || (v == 1), "invariant");
+ if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
}
}
@@ -4239,18 +4233,18 @@ void os::PlatformEvent::park() { // AKA "down()"
// Invariant: Only the thread associated with the Event/PlatformEvent
// may call park().
// TODO: assert that _Assoc != NULL or _Assoc == Self
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
+ guarantee(v >= 0, "invariant");
if (v == 0) {
// Do this the hard way by blocking ...
int status = pthread_mutex_lock(_mutex);
assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++ _nParked ;
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
while (_Event < 0) {
status = pthread_cond_wait(_cond, _mutex);
// for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
@@ -4258,28 +4252,28 @@ void os::PlatformEvent::park() { // AKA "down()"
if (status == ETIMEDOUT) { status = EINTR; }
assert_status(status == 0 || status == EINTR, status, "cond_wait");
}
- -- _nParked ;
+ --_nParked;
- _Event = 0 ;
+ _Event = 0;
status = pthread_mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other.
OrderAccess::fence();
}
- guarantee (_Event >= 0, "invariant") ;
+ guarantee(_Event >= 0, "invariant");
}
int os::PlatformEvent::park(jlong millis) {
- guarantee (_nParked == 0, "invariant") ;
+ guarantee(_nParked == 0, "invariant");
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
- if (v != 0) return OS_OK ;
+ guarantee(v >= 0, "invariant");
+ if (v != 0) return OS_OK;
// We do this the hard way, by blocking the thread.
// Consider enforcing a minimum timeout value.
@@ -4289,8 +4283,8 @@ int os::PlatformEvent::park(jlong millis) {
int ret = OS_TIMEOUT;
int status = pthread_mutex_lock(_mutex);
assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++_nParked ;
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
// Object.wait(timo) will return because of
// (a) notification
@@ -4308,24 +4302,24 @@ int os::PlatformEvent::park(jlong millis) {
while (_Event < 0) {
status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &abst);
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
- pthread_cond_destroy (_cond);
- pthread_cond_init (_cond, NULL) ;
+ pthread_cond_destroy(_cond);
+ pthread_cond_init(_cond, NULL);
}
assert_status(status == 0 || status == EINTR ||
status == ETIMEDOUT,
status, "cond_timedwait");
- if (!FilterSpuriousWakeups) break ; // previous semantics
- if (status == ETIMEDOUT) break ;
+ if (!FilterSpuriousWakeups) break; // previous semantics
+ if (status == ETIMEDOUT) break;
// We consume and ignore EINTR and spurious wakeups.
}
- --_nParked ;
+ --_nParked;
if (_Event >= 0) {
ret = OS_OK;
}
- _Event = 0 ;
+ _Event = 0;
status = pthread_mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
- assert (_nParked == 0, "invariant") ;
+ assert(_nParked == 0, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other.
OrderAccess::fence();
@@ -4409,7 +4403,7 @@ void os::PlatformEvent::unpark() {
*/
static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
- assert (time > 0, "convertTime");
+ assert(time > 0, "convertTime");
struct timeval now;
int status = gettimeofday(&now, NULL);
@@ -4470,7 +4464,7 @@ void Parker::park(bool isAbsolute, jlong time) {
// Next, demultiplex/decode time arguments
struct timespec absTime;
- if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
+ if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
return;
}
if (time > 0) {
@@ -4492,11 +4486,11 @@ void Parker::park(bool isAbsolute, jlong time) {
return;
}
- int status ;
+ int status;
if (_counter > 0) { // no wait needed
_counter = 0;
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -4516,12 +4510,12 @@ void Parker::park(bool isAbsolute, jlong time) {
// cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
if (time == 0) {
- status = pthread_cond_wait (_cond, _mutex) ;
+ status = pthread_cond_wait(_cond, _mutex);
} else {
- status = os::Bsd::safe_cond_timedwait (_cond, _mutex, &absTime) ;
+ status = os::Bsd::safe_cond_timedwait(_cond, _mutex, &absTime);
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
- pthread_cond_destroy (_cond) ;
- pthread_cond_init (_cond, NULL);
+ pthread_cond_destroy(_cond);
+ pthread_cond_init(_cond, NULL);
}
}
assert_status(status == 0 || status == EINTR ||
@@ -4532,9 +4526,9 @@ void Parker::park(bool isAbsolute, jlong time) {
pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
#endif
- _counter = 0 ;
- status = pthread_mutex_unlock(_mutex) ;
- assert_status(status == 0, status, "invariant") ;
+ _counter = 0;
+ status = pthread_mutex_unlock(_mutex);
+ assert_status(status == 0, status, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -4546,26 +4540,26 @@ void Parker::park(bool isAbsolute, jlong time) {
}
void Parker::unpark() {
- int s, status ;
+ int s, status;
status = pthread_mutex_lock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
s = _counter;
_counter = 1;
if (s < 1) {
if (WorkAroundNPTLTimedWaitHang) {
- status = pthread_cond_signal (_cond) ;
- assert (status == 0, "invariant") ;
+ status = pthread_cond_signal(_cond);
+ assert(status == 0, "invariant");
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
} else {
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
- status = pthread_cond_signal (_cond) ;
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
+ status = pthread_cond_signal(_cond);
+ assert(status == 0, "invariant");
}
} else {
pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
}
}
diff --git a/hotspot/src/os/bsd/vm/os_bsd.hpp b/hotspot/src/os/bsd/vm/os_bsd.hpp
index 25a16562dee..36fb913f38a 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.hpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.hpp
@@ -191,16 +191,16 @@ public:
class PlatformEvent : public CHeapObj {
private:
- double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line
- volatile int _Event ;
- volatile int _nParked ;
- pthread_mutex_t _mutex [1] ;
- pthread_cond_t _cond [1] ;
- double PostPad [2] ;
- Thread * _Assoc ;
+ double CachePad[4]; // increase odds that _mutex is sole occupant of cache line
+ volatile int _Event;
+ volatile int _nParked;
+ pthread_mutex_t _mutex[1];
+ pthread_cond_t _cond[1];
+ double PostPad[2];
+ Thread * _Assoc;
public: // TODO-FIXME: make dtor private
- ~PlatformEvent() { guarantee (0, "invariant") ; }
+ ~PlatformEvent() { guarantee(0, "invariant"); }
public:
PlatformEvent() {
@@ -209,28 +209,28 @@ class PlatformEvent : public CHeapObj {
assert_status(status == 0, status, "cond_init");
status = pthread_mutex_init (_mutex, NULL);
assert_status(status == 0, status, "mutex_init");
- _Event = 0 ;
- _nParked = 0 ;
- _Assoc = NULL ;
+ _Event = 0;
+ _nParked = 0;
+ _Assoc = NULL;
}
// Use caution with reset() and fired() -- they may require MEMBARs
- void reset() { _Event = 0 ; }
+ void reset() { _Event = 0; }
int fired() { return _Event; }
- void park () ;
- void unpark () ;
- int TryPark () ;
- int park (jlong millis) ;
- void SetAssociation (Thread * a) { _Assoc = a ; }
+ void park();
+ void unpark();
+ int TryPark();
+ int park(jlong millis);
+ void SetAssociation(Thread * a) { _Assoc = a; }
};
class PlatformParker : public CHeapObj {
protected:
- pthread_mutex_t _mutex [1] ;
- pthread_cond_t _cond [1] ;
+ pthread_mutex_t _mutex[1];
+ pthread_cond_t _cond[1];
public: // TODO-FIXME: make dtor private
- ~PlatformParker() { guarantee (0, "invariant") ; }
+ ~PlatformParker() { guarantee(0, "invariant"); }
public:
PlatformParker() {
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 89ffc72d972..847095fc772 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -41,6 +41,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -862,7 +863,7 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
case os::java_thread:
// Java threads use ThreadStackSize which default value can be
// changed with the flag -Xss
- assert (JavaThread::stack_size_at_create() > 0, "this should be set");
+ assert(JavaThread::stack_size_at_create() > 0, "this should be set");
stack_size = JavaThread::stack_size_at_create();
break;
case os::compiler_thread:
@@ -1097,7 +1098,7 @@ static bool find_vma(address addr, address* vma_low, address* vma_high) {
if (low <= addr && addr < high) {
if (vma_low) *vma_low = low;
if (vma_high) *vma_high = high;
- fclose (fp);
+ fclose(fp);
return true;
}
}
@@ -1420,7 +1421,7 @@ void os::Linux::fast_thread_clock_init() {
// must return at least tp.tv_sec == 0 which means a resolution
// better than 1 sec. This is extra check for reliability.
- if(pthread_getcpuclockid_func &&
+ if (pthread_getcpuclockid_func &&
pthread_getcpuclockid_func(_main_thread, &clockid) == 0 &&
sys_clock_getres(clockid, &tp) == 0 && tp.tv_sec == 0) {
@@ -1630,7 +1631,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
if (pelements == NULL) {
return false;
}
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
// Really shouldn't be NULL, but check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
continue; // skip the empty path values
@@ -1642,7 +1643,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
}
}
// release the storage
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
if (pelements[i] != NULL) {
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
}
@@ -1906,7 +1907,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
bool failed_to_read_elf_head=
(sizeof(elf_head)!=
- (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
+ (::read(file_descriptor, &elf_head,sizeof(elf_head))));
::close(file_descriptor);
if (failed_to_read_elf_head) {
@@ -1988,7 +1989,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
int running_arch_index=-1;
- for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
+ for (unsigned int i=0; i < ARRAY_SIZE(arch_array); i++) {
if (running_arch_code == arch_array[i].code) {
running_arch_index = i;
}
@@ -2019,7 +2020,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
#endif // !S390
if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
- if ( lib_arch.name!=NULL ) {
+ if (lib_arch.name!=NULL) {
::snprintf(diag_msg_buf, diag_msg_max_length-1,
" (Possible cause: can't load %s-bit .so on a %s-bit platform)",
lib_arch.name, arch_array[running_arch_index].name);
@@ -3793,14 +3794,7 @@ void os::yield() {
sched_yield();
}
-os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN ;}
-
-void os::yield_all() {
- // Yields to all threads, including threads with lower priorities
- // Threads on Linux are all with same priority. The Solaris style
- // os::yield_all() with nanosleep(1ms) is not necessary.
- sched_yield();
-}
+os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; }
////////////////////////////////////////////////////////////////////////////////
// thread priority support
@@ -3858,14 +3852,14 @@ static int prio_init() {
}
OSReturn os::set_native_priority(Thread* thread, int newpri) {
- if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
+ if (!UseThreadPriorities || ThreadPriorityPolicy == 0) return OS_OK;
int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
return (ret == 0) ? OS_OK : OS_ERR;
}
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
- if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) {
+ if (!UseThreadPriorities || ThreadPriorityPolicy == 0) {
*priority_ptr = java_to_os_priority[NormPriority];
return OS_OK;
}
@@ -4219,7 +4213,7 @@ bool os::Linux::chained_handler(int sig, siginfo_t* siginfo, void* context) {
}
struct sigaction* os::Linux::get_preinstalled_handler(int sig) {
- if ((( (unsigned int)1 << sig ) & sigs) != 0) {
+ if ((((unsigned int)1 << sig) & sigs) != 0) {
return &sigact[sig];
}
return NULL;
@@ -4423,7 +4417,7 @@ static void print_signal_handler(outputStream* st, int sig,
address rh = VMError::get_resetted_sighandler(sig);
// May be, handler was resetted by VMError?
- if(rh != NULL) {
+ if (rh != NULL) {
handler = rh;
sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK;
}
@@ -4432,11 +4426,11 @@ static void print_signal_handler(outputStream* st, int sig,
os::Posix::print_sa_flags(st, sa.sa_flags);
// Check: is it our handler?
- if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
+ if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) ||
handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) {
// It is our signal handler
// check for flags, reset system-used one!
- if((int)sa.sa_flags != os::Linux::get_our_sigflags(sig)) {
+ if ((int)sa.sa_flags != os::Linux::get_our_sigflags(sig)) {
st->print(
", flags was changed from " PTR32_FORMAT ", consider using jsig library",
os::Linux::get_our_sigflags(sig));
@@ -4507,10 +4501,10 @@ void os::Linux::check_signal_handler(int sig) {
address thisHandler = (act.sa_flags & SA_SIGINFO)
? CAST_FROM_FN_PTR(address, act.sa_sigaction)
- : CAST_FROM_FN_PTR(address, act.sa_handler) ;
+ : CAST_FROM_FN_PTR(address, act.sa_handler);
- switch(sig) {
+ switch (sig) {
case SIGSEGV:
case SIGBUS:
case SIGFPE:
@@ -4662,22 +4656,22 @@ jint os::init_2(void)
// Allocate a single page and mark it as readable for safepoint polling
address polling_page = (address) ::mmap(NULL, Linux::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- guarantee( polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page" );
+ guarantee(polling_page != MAP_FAILED, "os::init_2: failed to allocate polling page");
- os::set_polling_page( polling_page );
+ os::set_polling_page(polling_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
#endif
if (!UseMembar) {
address mem_serialize_page = (address) ::mmap(NULL, Linux::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- guarantee( mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
- os::set_memory_serialize_page( mem_serialize_page );
+ guarantee(mem_serialize_page != MAP_FAILED, "mmap Failed for memory serialize page");
+ os::set_memory_serialize_page(mem_serialize_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
#endif
}
@@ -4819,13 +4813,13 @@ void os::init_3(void) {
// Mark the polling page as unreadable
void os::make_polling_page_unreadable(void) {
- if( !guard_memory((char*)_polling_page, Linux::page_size()) )
+ if (!guard_memory((char*)_polling_page, Linux::page_size()))
fatal("Could not disable polling page");
};
// Mark the polling page as readable
void os::make_polling_page_readable(void) {
- if( !linux_mprotect((char *)_polling_page, Linux::page_size(), PROT_READ)) {
+ if (!linux_mprotect((char *)_polling_page, Linux::page_size(), PROT_READ)) {
fatal("Could not enable polling page");
}
};
@@ -5288,7 +5282,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
snprintf(proc_name, 64, "/proc/self/task/%d/stat", tid);
fp = fopen(proc_name, "r");
- if ( fp == NULL ) return -1;
+ if (fp == NULL) return -1;
statlen = fread(stat, 1, 2047, fp);
stat[statlen] = '\0';
fclose(fp);
@@ -5300,7 +5294,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
// We don't really need to know the command string, just find the last
// occurrence of ")" and then start parsing from there. See bug 4726580.
s = strrchr(stat, ')');
- if (s == NULL ) return -1;
+ if (s == NULL) return -1;
// Skip blank chars
do s++; while (isspace(*s));
@@ -5309,7 +5303,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
&cdummy, &idummy, &idummy, &idummy, &idummy, &idummy,
&ldummy, &ldummy, &ldummy, &ldummy, &ldummy,
&user_time, &sys_time);
- if ( count != 13 ) return -1;
+ if (count != 13) return -1;
if (user_sys_cpu_time) {
return ((jlong)sys_time + (jlong)user_time) * (1000000000 / clock_tics_per_sec);
} else {
@@ -5468,9 +5462,9 @@ static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
int os::PlatformEvent::TryPark() {
for (;;) {
- const int v = _Event ;
- guarantee ((v == 0) || (v == 1), "invariant") ;
- if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
+ const int v = _Event;
+ guarantee((v == 0) || (v == 1), "invariant");
+ if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
}
}
@@ -5478,18 +5472,18 @@ void os::PlatformEvent::park() { // AKA "down()"
// Invariant: Only the thread associated with the Event/PlatformEvent
// may call park().
// TODO: assert that _Assoc != NULL or _Assoc == Self
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
+ guarantee(v >= 0, "invariant");
if (v == 0) {
// Do this the hard way by blocking ...
int status = pthread_mutex_lock(_mutex);
assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++ _nParked ;
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
while (_Event < 0) {
status = pthread_cond_wait(_cond, _mutex);
// for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
@@ -5497,28 +5491,28 @@ void os::PlatformEvent::park() { // AKA "down()"
if (status == ETIME) { status = EINTR; }
assert_status(status == 0 || status == EINTR, status, "cond_wait");
}
- -- _nParked ;
+ --_nParked;
- _Event = 0 ;
+ _Event = 0;
status = pthread_mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other.
OrderAccess::fence();
}
- guarantee (_Event >= 0, "invariant") ;
+ guarantee(_Event >= 0, "invariant");
}
int os::PlatformEvent::park(jlong millis) {
- guarantee (_nParked == 0, "invariant") ;
+ guarantee(_nParked == 0, "invariant");
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
- if (v != 0) return OS_OK ;
+ guarantee(v >= 0, "invariant");
+ if (v != 0) return OS_OK;
// We do this the hard way, by blocking the thread.
// Consider enforcing a minimum timeout value.
@@ -5528,8 +5522,8 @@ int os::PlatformEvent::park(jlong millis) {
int ret = OS_TIMEOUT;
int status = pthread_mutex_lock(_mutex);
assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++_nParked ;
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
// Object.wait(timo) will return because of
// (a) notification
@@ -5547,24 +5541,24 @@ int os::PlatformEvent::park(jlong millis) {
while (_Event < 0) {
status = os::Linux::safe_cond_timedwait(_cond, _mutex, &abst);
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
- pthread_cond_destroy (_cond);
- pthread_cond_init (_cond, os::Linux::condAttr()) ;
+ pthread_cond_destroy(_cond);
+ pthread_cond_init(_cond, os::Linux::condAttr());
}
assert_status(status == 0 || status == EINTR ||
status == ETIME || status == ETIMEDOUT,
status, "cond_timedwait");
- if (!FilterSpuriousWakeups) break ; // previous semantics
- if (status == ETIME || status == ETIMEDOUT) break ;
+ if (!FilterSpuriousWakeups) break; // previous semantics
+ if (status == ETIME || status == ETIMEDOUT) break;
// We consume and ignore EINTR and spurious wakeups.
}
- --_nParked ;
+ --_nParked;
if (_Event >= 0) {
ret = OS_OK;
}
- _Event = 0 ;
+ _Event = 0;
status = pthread_mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
- assert (_nParked == 0, "invariant") ;
+ assert(_nParked == 0, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other.
OrderAccess::fence();
@@ -5647,7 +5641,7 @@ void os::PlatformEvent::unpark() {
*/
static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
- assert (time > 0, "convertTime");
+ assert(time > 0, "convertTime");
time_t max_secs = 0;
if (!os::supports_monotonic_clock() || isAbsolute) {
@@ -5726,7 +5720,7 @@ void Parker::park(bool isAbsolute, jlong time) {
// Next, demultiplex/decode time arguments
timespec absTime;
- if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
+ if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
return;
}
if (time > 0) {
@@ -5748,11 +5742,11 @@ void Parker::park(bool isAbsolute, jlong time) {
return;
}
- int status ;
+ int status;
if (_counter > 0) { // no wait needed
_counter = 0;
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -5774,13 +5768,13 @@ void Parker::park(bool isAbsolute, jlong time) {
assert(_cur_index == -1, "invariant");
if (time == 0) {
_cur_index = REL_INDEX; // arbitrary choice when not timed
- status = pthread_cond_wait (&_cond[_cur_index], _mutex) ;
+ status = pthread_cond_wait(&_cond[_cur_index], _mutex);
} else {
_cur_index = isAbsolute ? ABS_INDEX : REL_INDEX;
- status = os::Linux::safe_cond_timedwait (&_cond[_cur_index], _mutex, &absTime) ;
+ status = os::Linux::safe_cond_timedwait(&_cond[_cur_index], _mutex, &absTime);
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
- pthread_cond_destroy (&_cond[_cur_index]) ;
- pthread_cond_init (&_cond[_cur_index], isAbsolute ? NULL : os::Linux::condAttr());
+ pthread_cond_destroy(&_cond[_cur_index]);
+ pthread_cond_init(&_cond[_cur_index], isAbsolute ? NULL : os::Linux::condAttr());
}
}
_cur_index = -1;
@@ -5792,9 +5786,9 @@ void Parker::park(bool isAbsolute, jlong time) {
pthread_sigmask(SIG_SETMASK, &oldsigs, NULL);
#endif
- _counter = 0 ;
- status = pthread_mutex_unlock(_mutex) ;
- assert_status(status == 0, status, "invariant") ;
+ _counter = 0;
+ status = pthread_mutex_unlock(_mutex);
+ assert_status(status == 0, status, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -5806,9 +5800,9 @@ void Parker::park(bool isAbsolute, jlong time) {
}
void Parker::unpark() {
- int s, status ;
+ int s, status;
status = pthread_mutex_lock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
s = _counter;
_counter = 1;
if (s < 1) {
@@ -5817,22 +5811,22 @@ void Parker::unpark() {
// thread is definitely parked
if (WorkAroundNPTLTimedWaitHang) {
status = pthread_cond_signal (&_cond[_cur_index]);
- assert (status == 0, "invariant");
+ assert(status == 0, "invariant");
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant");
+ assert(status == 0, "invariant");
} else {
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant");
+ assert(status == 0, "invariant");
status = pthread_cond_signal (&_cond[_cur_index]);
- assert (status == 0, "invariant");
+ assert(status == 0, "invariant");
}
} else {
pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
}
} else {
pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
}
}
diff --git a/hotspot/src/os/linux/vm/os_linux.hpp b/hotspot/src/os/linux/vm/os_linux.hpp
index 2dfda6be0cf..3e287387b05 100644
--- a/hotspot/src/os/linux/vm/os_linux.hpp
+++ b/hotspot/src/os/linux/vm/os_linux.hpp
@@ -287,16 +287,16 @@ public:
class PlatformEvent : public CHeapObj {
private:
- double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line
- volatile int _Event ;
- volatile int _nParked ;
- pthread_mutex_t _mutex [1] ;
- pthread_cond_t _cond [1] ;
- double PostPad [2] ;
- Thread * _Assoc ;
+ double CachePad[4]; // increase odds that _mutex is sole occupant of cache line
+ volatile int _Event;
+ volatile int _nParked;
+ pthread_mutex_t _mutex[1];
+ pthread_cond_t _cond[1];
+ double PostPad[2];
+ Thread * _Assoc;
public: // TODO-FIXME: make dtor private
- ~PlatformEvent() { guarantee (0, "invariant") ; }
+ ~PlatformEvent() { guarantee(0, "invariant"); }
public:
PlatformEvent() {
@@ -305,20 +305,20 @@ class PlatformEvent : public CHeapObj {
assert_status(status == 0, status, "cond_init");
status = pthread_mutex_init (_mutex, NULL);
assert_status(status == 0, status, "mutex_init");
- _Event = 0 ;
- _nParked = 0 ;
- _Assoc = NULL ;
+ _Event = 0;
+ _nParked = 0;
+ _Assoc = NULL;
}
// Use caution with reset() and fired() -- they may require MEMBARs
- void reset() { _Event = 0 ; }
+ void reset() { _Event = 0; }
int fired() { return _Event; }
- void park () ;
- void unpark () ;
- int TryPark () ;
- int park (jlong millis) ; // relative timed-wait only
- void SetAssociation (Thread * a) { _Assoc = a ; }
-} ;
+ void park();
+ void unpark();
+ int TryPark();
+ int park(jlong millis); // relative timed-wait only
+ void SetAssociation(Thread * a) { _Assoc = a; }
+};
class PlatformParker : public CHeapObj {
protected:
@@ -327,11 +327,11 @@ class PlatformParker : public CHeapObj {
ABS_INDEX = 1
};
int _cur_index; // which cond is in use: -1, 0, 1
- pthread_mutex_t _mutex [1] ;
- pthread_cond_t _cond [2] ; // one for relative times and one for abs.
+ pthread_mutex_t _mutex[1];
+ pthread_cond_t _cond[2]; // one for relative times and one for abs.
public: // TODO-FIXME: make dtor private
- ~PlatformParker() { guarantee (0, "invariant") ; }
+ ~PlatformParker() { guarantee(0, "invariant"); }
public:
PlatformParker() {
diff --git a/hotspot/src/os/solaris/vm/osThread_solaris.cpp b/hotspot/src/os/solaris/vm/osThread_solaris.cpp
index 2ccd164e15b..d0e945c0246 100644
--- a/hotspot/src/os/solaris/vm/osThread_solaris.cpp
+++ b/hotspot/src/os/solaris/vm/osThread_solaris.cpp
@@ -23,7 +23,6 @@
*/
// no precompiled headers
-#include "runtime/atomic.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp
index 5272029561b..5946fa25821 100644
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp
@@ -41,6 +41,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -212,13 +213,13 @@ Thread* ThreadLocalStorage::get_thread_via_cache_slowly(uintptr_t raw_id,
"sp must be inside of selected thread stack");
thread->set_self_raw_id(raw_id); // mark for quick retrieval
- _get_thread_cache[ index ] = thread;
+ _get_thread_cache[index] = thread;
}
return thread;
}
-static const double all_zero[ sizeof(Thread) / sizeof(double) + 1 ] = {0};
+static const double all_zero[sizeof(Thread) / sizeof(double) + 1] = {0};
#define NO_CACHED_THREAD ((Thread*)all_zero)
void ThreadLocalStorage::pd_set_thread(Thread* thread) {
@@ -270,8 +271,8 @@ static inline stack_t get_stack_info() {
}
address os::current_stack_base() {
- int r = thr_main() ;
- guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ;
+ int r = thr_main();
+ guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
bool is_primordial_thread = r;
// Workaround 4352906, avoid calls to thr_stksegment by
@@ -293,9 +294,9 @@ address os::current_stack_base() {
size_t os::current_stack_size() {
size_t size;
- int r = thr_main() ;
- guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ;
- if(!r) {
+ int r = thr_main();
+ guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
+ if (!r) {
size = get_stack_info().ss_size;
} else {
struct rlimit limits;
@@ -409,7 +410,7 @@ static bool find_processors_in_pset(psetid_t pset,
static bool find_processors_online(processorid_t** id_array,
uint* id_length) {
- const processorid_t MAX_PROCESSOR_ID = 100000 ;
+ const processorid_t MAX_PROCESSOR_ID = 100000;
// Find the number of processors online.
*id_length = sysconf(_SC_NPROCESSORS_ONLN);
// Make up an array to hold their ids.
@@ -436,7 +437,7 @@ static bool find_processors_online(processorid_t** id_array,
// we've got. Note that in the worst case find_processors_online() could
// return an empty set. (As a fall-back in the case of the empty set we
// could just return the ID of the current processor).
- *id_length = found ;
+ *id_length = found;
}
return true;
@@ -552,13 +553,13 @@ bool os::bind_to_processor(uint processor_id) {
}
bool os::getenv(const char* name, char* buffer, int len) {
- char* val = ::getenv( name );
- if ( val == NULL
+ char* val = ::getenv(name);
+ if (val == NULL
|| strlen(val) + 1 > len ) {
if (len > 0) buffer[0] = 0; // return a null string
return false;
}
- strcpy( buffer, val );
+ strcpy(buffer, val);
return true;
}
@@ -672,7 +673,7 @@ void os::init_system_properties_values() {
// Determine search path count and required buffer size.
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) {
- FREE_C_HEAP_ARRAY(char, buf, mtInternal);
+ FREE_C_HEAP_ARRAY(char, buf, mtInternal);
vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror());
}
@@ -683,7 +684,7 @@ void os::init_system_properties_values() {
// Obtain search path information.
if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) {
- FREE_C_HEAP_ARRAY(char, buf, mtInternal);
+ FREE_C_HEAP_ARRAY(char, buf, mtInternal);
FREE_C_HEAP_ARRAY(char, info, mtInternal);
vm_exit_during_initialization("dlinfo SERINFO request", dlerror());
}
@@ -794,7 +795,7 @@ bool os::obsolete_option(const JavaVMOption *option)
bool os::Solaris::valid_stack_address(Thread* thread, address sp) {
address stackStart = (address)thread->stack_base();
address stackEnd = (address)(stackStart - (address)thread->stack_size());
- if (sp < stackStart && sp >= stackEnd ) return true;
+ if (sp < stackStart && sp >= stackEnd) return true;
return false;
}
@@ -819,8 +820,8 @@ extern "C" void* java_start(void* thread_addr) {
Thread* thread = (Thread*)thread_addr;
OSThread* osthr = thread->osthread();
- osthr->set_lwp_id( _lwp_self() ); // Store lwp in case we are bound
- thread->_schedctl = (void *) schedctl_init () ;
+ osthr->set_lwp_id(_lwp_self()); // Store lwp in case we are bound
+ thread->_schedctl = (void *) schedctl_init();
if (UseNUMA) {
int lgrp_id = os::numa_get_group_id();
@@ -839,8 +840,8 @@ extern "C" void* java_start(void* thread_addr) {
// in java_to_os_priority. So we save the native priority
// in the osThread and recall it here.
- if ( osthr->thread_id() != -1 ) {
- if ( UseThreadPriorities ) {
+ if (osthr->thread_id() != -1) {
+ if (UseThreadPriorities) {
int prio = osthr->native_priority();
if (ThreadPriorityVerbose) {
tty->print_cr("Starting Thread " INTPTR_FORMAT ", LWP is "
@@ -882,7 +883,7 @@ static OSThread* create_os_thread(Thread* thread, thread_t thread_id) {
// Store info on the Solaris thread into the OSThread
osthread->set_thread_id(thread_id);
osthread->set_lwp_id(_lwp_self());
- thread->_schedctl = (void *) schedctl_init () ;
+ thread->_schedctl = (void *) schedctl_init();
if (UseNUMA) {
int lgrp_id = os::numa_get_group_id();
@@ -891,9 +892,9 @@ static OSThread* create_os_thread(Thread* thread, thread_t thread_id) {
}
}
- if ( ThreadPriorityVerbose ) {
+ if (ThreadPriorityVerbose) {
tty->print_cr("In create_os_thread, Thread " INTPTR_FORMAT ", LWP is " INTPTR_FORMAT "\n",
- osthread->thread_id(), osthread->lwp_id() );
+ osthread->thread_id(), osthread->lwp_id());
}
// Initial thread state is INITIALIZED, not SUSPENDED
@@ -974,9 +975,9 @@ bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) {
return false;
}
- if ( ThreadPriorityVerbose ) {
+ if (ThreadPriorityVerbose) {
char *thrtyp;
- switch ( thr_type ) {
+ switch (thr_type) {
case vm_thread:
thrtyp = (char *)"vm";
break;
@@ -1207,11 +1208,11 @@ void _handle_uncaught_cxx_exception() {
// First crack at OS-specific initialization, from inside the new thread.
void os::initialize_thread(Thread* thr) {
- int r = thr_main() ;
- guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ;
+ int r = thr_main();
+ guarantee(r == 0 || r == 1, "CR6501650 or CR6493689");
if (r) {
JavaThread* jt = (JavaThread *)thr;
- assert(jt != NULL,"Sanity check");
+ assert(jt != NULL, "Sanity check");
size_t stack_size;
address base = jt->stack_base();
if (Arguments::created_by_java_launcher()) {
@@ -1322,7 +1323,7 @@ int os::allocate_thread_local_storage() {
// JavaThread in Java code, and have stubs simply
// treat %g2 as a caller-save register, preserving it in a %lN.
thread_key_t tk;
- if (thr_keycreate( &tk, NULL ) )
+ if (thr_keycreate( &tk, NULL))
fatal(err_msg("os::allocate_thread_local_storage: thr_keycreate failed "
"(%s)", strerror(errno)));
return int(tk);
@@ -1347,7 +1348,7 @@ void os::thread_local_storage_at_put(int index, void* value) {
"(%s)", strerror(errno)));
}
} else {
- ThreadLocalStorage::set_thread_in_slot ((Thread *) value) ;
+ ThreadLocalStorage::set_thread_in_slot((Thread *) value);
}
}
@@ -1579,7 +1580,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
if (pelements == NULL) {
return false;
}
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
// really shouldn't be NULL but what the heck, check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
continue; // skip the empty path values
@@ -1591,7 +1592,7 @@ bool os::dll_build_name(char* buffer, size_t buflen,
}
}
// release the storage
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
if (pelements[i] != NULL) {
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
}
@@ -1795,7 +1796,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
bool failed_to_read_elf_head=
(sizeof(elf_head)!=
- (::read(file_descriptor, &elf_head,sizeof(elf_head)))) ;
+ (::read(file_descriptor, &elf_head,sizeof(elf_head))));
::close(file_descriptor);
if (failed_to_read_elf_head) {
@@ -1851,7 +1852,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
arch_t lib_arch={elf_head.e_machine,0,elf_head.e_ident[EI_CLASS], elf_head.e_ident[EI_DATA], NULL};
int running_arch_index=-1;
- for (unsigned int i=0 ; i < ARRAY_SIZE(arch_array) ; i++ ) {
+ for (unsigned int i=0; i < ARRAY_SIZE(arch_array); i++) {
if (running_arch_code == arch_array[i].code) {
running_arch_index = i;
}
@@ -1880,7 +1881,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
}
if (lib_arch.compat_class != arch_array[running_arch_index].compat_class) {
- if ( lib_arch.name!=NULL ) {
+ if (lib_arch.name!=NULL) {
::snprintf(diag_msg_buf, diag_msg_max_length-1,
" (Possible cause: can't load %s-bit .so on a %s-bit platform)",
lib_arch.name, arch_array[running_arch_index].name);
@@ -1969,7 +1970,7 @@ static bool check_addr0(outputStream* st) {
int fd = ::open("/proc/self/map",O_RDONLY);
if (fd >= 0) {
prmap_t p;
- while(::read(fd, &p, sizeof(p)) > 0) {
+ while (::read(fd, &p, sizeof(p)) > 0) {
if (p.pr_vaddr == 0x0) {
st->print("Warning: Address: 0x%x, Size: %dK, ",p.pr_vaddr, p.pr_size/1024, p.pr_mapname);
st->print("Mapped file: %s, ", p.pr_mapname[0] == '\0' ? "None" : p.pr_mapname);
@@ -2079,7 +2080,7 @@ static void print_signal_handler(outputStream* st, int sig,
address rh = VMError::get_resetted_sighandler(sig);
// May be, handler was resetted by VMError?
- if(rh != NULL) {
+ if (rh != NULL) {
handler = rh;
sa.sa_flags = VMError::get_resetted_sigflags(sig);
}
@@ -2088,11 +2089,11 @@ static void print_signal_handler(outputStream* st, int sig,
os::Posix::print_sa_flags(st, sa.sa_flags);
// Check: is it our handler?
- if(handler == CAST_FROM_FN_PTR(address, signalHandler) ||
+ if (handler == CAST_FROM_FN_PTR(address, signalHandler) ||
handler == CAST_FROM_FN_PTR(address, sigINTRHandler)) {
// It is our signal handler
// check for flags
- if(sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
+ if (sa.sa_flags != os::Solaris::get_our_sigflags(sig)) {
st->print(
", flags was changed from " PTR32_FORMAT ", consider using jsig library",
os::Solaris::get_our_sigflags(sig));
@@ -2403,7 +2404,7 @@ static int check_pending_signals(bool wait_for_signal) {
do {
thread->set_suspend_equivalent();
// cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
- while((ret = ::sema_wait(&sig_sem)) == EINTR)
+ while ((ret = ::sema_wait(&sig_sem)) == EINTR)
;
assert(ret == 0, "sema_wait() failed");
@@ -2635,7 +2636,7 @@ size_t os::numa_get_leaf_groups(int *ids, size_t size) {
}
if (!r) {
// That's a leaf node.
- assert (bottom <= cur, "Sanity check");
+ assert(bottom <= cur, "Sanity check");
// Check if the node has memory
if (Solaris::lgrp_resources(Solaris::lgrp_cookie(), ids[cur],
NULL, 0, LGRP_RSRC_MEM) > 0) {
@@ -3051,7 +3052,7 @@ bool os::Solaris::mpss_sanity_check(bool warn, size_t* page_size) {
const size_t size_limit =
FLAG_IS_DEFAULT(LargePageSizeInBytes) ? 4 * M : LargePageSizeInBytes;
int beg;
- for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */ ;
+ for (beg = 0; beg < n && _page_sizes[beg] > size_limit; ++beg) /* empty */;
const int end = MIN2((int)usable_count, n) - 1;
for (int cur = 0; cur < end; ++cur, ++beg) {
_page_sizes[cur] = _page_sizes[beg];
@@ -3186,11 +3187,6 @@ void os::yield() {
os::YieldResult os::NakedYield() { thr_yield(); return os::YIELD_UNKNOWN; }
-void os::yield_all() {
- // Yields to all threads, including threads with lower priorities
- os::sleep(Thread::current(), 1, false);
-}
-
// Interface for setting lwp priorities. If we are using T2 libthread,
// which forces the use of BoundThreads or we manually set UseBoundThreads,
// all of our threads will be assigned to real lwp's. Using the thr_setprio
@@ -3264,7 +3260,7 @@ static int java_MaxPriority_to_os_priority = 0; // Saved mapping
//
// Return errno or 0 if OK.
//
-static int lwp_priocntl_init () {
+static int lwp_priocntl_init() {
int rslt;
pcinfo_t ClassInfo;
pcparms_t ParmInfo;
@@ -3274,7 +3270,7 @@ static int lwp_priocntl_init () {
// If ThreadPriorityPolicy is 1, switch tables
if (ThreadPriorityPolicy == 1) {
- for (i = 0 ; i < CriticalPriority+1; i++)
+ for (i = 0; i < CriticalPriority+1; i++)
os::java_to_os_priority[i] = prio_policy1[i];
}
if (UseCriticalJavaThreadPriority) {
@@ -3373,12 +3369,12 @@ static int lwp_priocntl_init () {
} else {
// No clue - punt
if (ThreadPriorityVerbose)
- tty->print_cr ("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname);
+ tty->print_cr("Unknown scheduling class: %s ... \n", ClassInfo.pc_clname);
return EINVAL; // no clue, punt
}
if (ThreadPriorityVerbose) {
- tty->print_cr ("Thread priority Range: [%d..%d]\n", myMin, myMax);
+ tty->print_cr("Thread priority Range: [%d..%d]\n", myMin, myMax);
}
priocntl_enable = true; // Enable changing priorities
@@ -3424,7 +3420,7 @@ int set_lwp_class_and_priority(int ThreadID, int lwpid,
// TODO: elide set-to-same-value
// If something went wrong on init, don't change priorities.
- if ( !priocntl_enable ) {
+ if (!priocntl_enable) {
if (ThreadPriorityVerbose)
tty->print_cr("Trying to set priority but init failed, ignoring");
return EINVAL;
@@ -3432,9 +3428,9 @@ int set_lwp_class_and_priority(int ThreadID, int lwpid,
// If lwp hasn't started yet, just return
// the _start routine will call us again.
- if ( lwpid <= 0 ) {
+ if (lwpid <= 0) {
if (ThreadPriorityVerbose) {
- tty->print_cr ("deferring the set_lwp_class_and_priority of thread "
+ tty->print_cr("deferring the set_lwp_class_and_priority of thread "
INTPTR_FORMAT " to %d, lwpid not set",
ThreadID, newPrio);
}
@@ -3653,7 +3649,7 @@ OSReturn os::set_native_priority(Thread* thread, int newpri) {
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
int p;
- if ( !UseThreadPriorities ) {
+ if (!UseThreadPriorities) {
*priority_ptr = NormalPriority;
return OS_OK;
}
@@ -4099,7 +4095,7 @@ void os::Solaris::set_signal_handler(int sig, bool set_installed, bool oktochain
void os::run_periodic_checks() {
// A big source of grief is hijacking virt. addr 0x0 on Solaris,
// thereby preventing a NULL checks.
- if(!check_addr0_done) check_addr0_done = check_addr0(tty);
+ if (!check_addr0_done) check_addr0_done = check_addr0(tty);
if (check_signals == false) return;
@@ -4148,10 +4144,10 @@ void os::Solaris::check_signal_handler(int sig) {
address thisHandler = (act.sa_flags & SA_SIGINFO)
? CAST_FROM_FN_PTR(address, act.sa_sigaction)
- : CAST_FROM_FN_PTR(address, act.sa_handler) ;
+ : CAST_FROM_FN_PTR(address, act.sa_handler);
- switch(sig) {
+ switch (sig) {
case SIGSEGV:
case SIGBUS:
case SIGFPE:
@@ -4332,7 +4328,7 @@ os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
static address resolve_symbol_lazy(const char* name) {
address addr = (address) dlsym(RTLD_DEFAULT, name);
- if(addr == NULL) {
+ if (addr == NULL) {
// RTLD_DEFAULT was not defined on some early versions of 2.5.1
addr = (address) dlsym(RTLD_NEXT, name);
}
@@ -4341,7 +4337,7 @@ static address resolve_symbol_lazy(const char* name) {
static address resolve_symbol(const char* name) {
address addr = resolve_symbol_lazy(name);
- if(addr == NULL) {
+ if (addr == NULL) {
fatal(dlerror());
}
return addr;
@@ -4353,7 +4349,7 @@ void os::Solaris::libthread_init() {
lwp_priocntl_init();
// RTLD_DEFAULT was not defined on some early versions of 5.5.1
- if(func == NULL) {
+ if (func == NULL) {
func = (address) dlsym(RTLD_NEXT, "_thr_suspend_allmutators");
// Guarantee that this VM is running on an new enough OS (5.6 or
// later) that it will have a new enough libthread.so.
@@ -4384,7 +4380,7 @@ int_fnP_cond_tP os::Solaris::_cond_destroy;
int os::Solaris::_cond_scope = USYNC_THREAD;
void os::Solaris::synchronization_init() {
- if(UseLWPSynchronization) {
+ if (UseLWPSynchronization) {
os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_lock")));
os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_trylock")));
os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("_lwp_mutex_unlock")));
@@ -4404,7 +4400,7 @@ void os::Solaris::synchronization_init() {
os::Solaris::set_mutex_scope(USYNC_THREAD);
os::Solaris::set_cond_scope(USYNC_THREAD);
- if(UsePthreads) {
+ if (UsePthreads) {
os::Solaris::set_mutex_lock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_lock")));
os::Solaris::set_mutex_trylock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_trylock")));
os::Solaris::set_mutex_unlock(CAST_TO_FN_PTR(int_fnP_mutex_tP, resolve_symbol("pthread_mutex_unlock")));
@@ -4576,17 +4572,17 @@ jint os::init_2(void) {
os::set_polling_page(polling_page);
#ifndef PRODUCT
- if( Verbose && PrintMiscellaneous )
+ if (Verbose && PrintMiscellaneous)
tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
#endif
if (!UseMembar) {
- address mem_serialize_page = (address)Solaris::mmap_chunk( NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE );
- guarantee( mem_serialize_page != NULL, "mmap Failed for memory serialize page");
- os::set_memory_serialize_page( mem_serialize_page );
+ address mem_serialize_page = (address)Solaris::mmap_chunk(NULL, page_size, MAP_PRIVATE, PROT_READ | PROT_WRITE);
+ guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page");
+ os::set_memory_serialize_page(mem_serialize_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
#endif
}
@@ -4725,13 +4721,13 @@ void os::init_3(void) {
// Mark the polling page as unreadable
void os::make_polling_page_unreadable(void) {
- if( mprotect((char *)_polling_page, page_size, PROT_NONE) != 0 )
+ if (mprotect((char *)_polling_page, page_size, PROT_NONE) != 0)
fatal("Could not disable polling page");
};
// Mark the polling page as readable
void os::make_polling_page_readable(void) {
- if( mprotect((char *)_polling_page, page_size, PROT_READ) != 0 )
+ if (mprotect((char *)_polling_page, page_size, PROT_READ) != 0)
fatal("Could not enable polling page");
};
@@ -5221,7 +5217,7 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
getpid(),
thread->osthread()->lwp_id());
fd = ::open(proc_name, O_RDONLY);
- if ( fd == -1 ) return -1;
+ if (fd == -1) return -1;
do {
count = ::pread(fd,
@@ -5230,7 +5226,7 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
thr_time_off);
} while (count < 0 && errno == EINTR);
::close(fd);
- if ( count < 0 ) return -1;
+ if (count < 0) return -1;
if (user_sys_cpu_time) {
// user + system CPU time
@@ -5244,7 +5240,7 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
(jlong)prusage.pr_utime.tv_nsec;
}
- return(lwp_time);
+ return (lwp_time);
}
void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
@@ -5448,43 +5444,43 @@ static timestruc_t* compute_abstime(timestruc_t* abstime, jlong millis) {
int os::PlatformEvent::TryPark() {
for (;;) {
- const int v = _Event ;
- guarantee ((v == 0) || (v == 1), "invariant") ;
- if (Atomic::cmpxchg (0, &_Event, v) == v) return v ;
+ const int v = _Event;
+ guarantee((v == 0) || (v == 1), "invariant");
+ if (Atomic::cmpxchg(0, &_Event, v) == v) return v;
}
}
void os::PlatformEvent::park() { // AKA: down()
// Invariant: Only the thread associated with the Event/PlatformEvent
// may call park().
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
+ guarantee(v >= 0, "invariant");
if (v == 0) {
// Do this the hard way by blocking ...
// See http://monaco.sfbay/detail.jsf?cr=5094058.
// TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
// Only for SPARC >= V8PlusA
#if defined(__sparc) && defined(COMPILER2)
- if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
+ if (ClearFPUAtPark) { _mark_fpu_nosave(); }
#endif
int status = os::Solaris::mutex_lock(_mutex);
- assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++ _nParked ;
+ assert_status(status == 0, status, "mutex_lock");
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
while (_Event < 0) {
// for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
// Treat this the same as if the wait was interrupted
// With usr/lib/lwp going to kernel, always handle ETIME
status = os::Solaris::cond_wait(_cond, _mutex);
- if (status == ETIME) status = EINTR ;
+ if (status == ETIME) status = EINTR;
assert_status(status == 0 || status == EINTR, status, "cond_wait");
}
- -- _nParked ;
- _Event = 0 ;
+ --_nParked;
+ _Event = 0;
status = os::Solaris::mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
// Paranoia to ensure our locked and lock-free paths interact
@@ -5494,41 +5490,41 @@ void os::PlatformEvent::park() { // AKA: down()
}
int os::PlatformEvent::park(jlong millis) {
- guarantee (_nParked == 0, "invariant") ;
- int v ;
+ guarantee(_nParked == 0, "invariant");
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee (v >= 0, "invariant") ;
- if (v != 0) return OS_OK ;
+ guarantee(v >= 0, "invariant");
+ if (v != 0) return OS_OK;
int ret = OS_TIMEOUT;
timestruc_t abst;
- compute_abstime (&abst, millis);
+ compute_abstime(&abst, millis);
// See http://monaco.sfbay/detail.jsf?cr=5094058.
// For Solaris SPARC set fprs.FEF=0 prior to parking.
// Only for SPARC >= V8PlusA
#if defined(__sparc) && defined(COMPILER2)
- if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
+ if (ClearFPUAtPark) { _mark_fpu_nosave(); }
#endif
int status = os::Solaris::mutex_lock(_mutex);
assert_status(status == 0, status, "mutex_lock");
- guarantee (_nParked == 0, "invariant") ;
- ++ _nParked ;
+ guarantee(_nParked == 0, "invariant");
+ ++_nParked;
while (_Event < 0) {
int status = os::Solaris::cond_timedwait(_cond, _mutex, &abst);
assert_status(status == 0 || status == EINTR ||
status == ETIME || status == ETIMEDOUT,
status, "cond_timedwait");
- if (!FilterSpuriousWakeups) break ; // previous semantics
- if (status == ETIME || status == ETIMEDOUT) break ;
+ if (!FilterSpuriousWakeups) break; // previous semantics
+ if (status == ETIME || status == ETIMEDOUT) break;
// We consume and ignore EINTR and spurious wakeups.
}
- -- _nParked ;
- if (_Event >= 0) ret = OS_OK ;
- _Event = 0 ;
+ --_nParked;
+ if (_Event >= 0) ret = OS_OK;
+ _Event = 0;
status = os::Solaris::mutex_unlock(_mutex);
assert_status(status == 0, status, "mutex_unlock");
// Paranoia to ensure our locked and lock-free paths interact
@@ -5605,7 +5601,7 @@ void os::PlatformEvent::unpark() {
* years from "now".
*/
static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
- assert (time > 0, "convertTime");
+ assert(time > 0, "convertTime");
struct timeval now;
int status = gettimeofday(&now, NULL);
@@ -5664,7 +5660,7 @@ void Parker::park(bool isAbsolute, jlong time) {
// First, demultiplex/decode time arguments
timespec absTime;
- if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
+ if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all
return;
}
if (time > 0) {
@@ -5688,12 +5684,12 @@ void Parker::park(bool isAbsolute, jlong time) {
return;
}
- int status ;
+ int status;
if (_counter > 0) { // no wait needed
_counter = 0;
status = os::Solaris::mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
+ assert(status == 0, "invariant");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -5717,11 +5713,11 @@ void Parker::park(bool isAbsolute, jlong time) {
// TODO-FIXME: for Solaris SPARC set fprs.FEF=0 prior to parking.
// Only for SPARC >= V8PlusA
#if defined(__sparc) && defined(COMPILER2)
- if (ClearFPUAtPark) { _mark_fpu_nosave() ; }
+ if (ClearFPUAtPark) { _mark_fpu_nosave(); }
#endif
if (time == 0) {
- status = os::Solaris::cond_wait (_cond, _mutex) ;
+ status = os::Solaris::cond_wait(_cond, _mutex);
} else {
status = os::Solaris::cond_timedwait (_cond, _mutex, &absTime);
}
@@ -5734,9 +5730,9 @@ void Parker::park(bool isAbsolute, jlong time) {
#ifdef ASSERT
thr_sigsetmask(SIG_SETMASK, &oldsigs, NULL);
#endif
- _counter = 0 ;
+ _counter = 0;
status = os::Solaris::mutex_unlock(_mutex);
- assert_status(status == 0, status, "mutex_unlock") ;
+ assert_status(status == 0, status, "mutex_unlock");
// Paranoia to ensure our locked and lock-free paths interact
// correctly with each other and Java-level accesses.
OrderAccess::fence();
@@ -5748,17 +5744,17 @@ void Parker::park(bool isAbsolute, jlong time) {
}
void Parker::unpark() {
- int s, status ;
- status = os::Solaris::mutex_lock (_mutex) ;
- assert (status == 0, "invariant") ;
+ int s, status;
+ status = os::Solaris::mutex_lock(_mutex);
+ assert(status == 0, "invariant");
s = _counter;
_counter = 1;
- status = os::Solaris::mutex_unlock (_mutex) ;
- assert (status == 0, "invariant") ;
+ status = os::Solaris::mutex_unlock(_mutex);
+ assert(status == 0, "invariant");
if (s < 1) {
- status = os::Solaris::cond_signal (_cond) ;
- assert (status == 0, "invariant") ;
+ status = os::Solaris::cond_signal(_cond);
+ assert(status == 0, "invariant");
}
}
@@ -5925,14 +5921,14 @@ int os::timeout(int fd, long timeout) {
gettimeofday(&t, &aNull);
prevtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000;
- for(;;) {
+ for (;;) {
res = ::poll(&pfd, 1, timeout);
- if(res == OS_ERR && errno == EINTR) {
- if(timeout != -1) {
+ if (res == OS_ERR && errno == EINTR) {
+ if (timeout != -1) {
gettimeofday(&t, &aNull);
newtime = ((julong)t.tv_sec * 1000) + t.tv_usec /1000;
timeout -= newtime - prevtime;
- if(timeout <= 0)
+ if (timeout <= 0)
return OS_OK;
prevtime = newtime;
}
diff --git a/hotspot/src/os/solaris/vm/os_solaris.hpp b/hotspot/src/os/solaris/vm/os_solaris.hpp
index 7c5bedb4d41..28d1700ca62 100644
--- a/hotspot/src/os/solaris/vm/os_solaris.hpp
+++ b/hotspot/src/os/solaris/vm/os_solaris.hpp
@@ -301,48 +301,48 @@ class Solaris {
class PlatformEvent : public CHeapObj {
private:
- double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line
- volatile int _Event ;
- int _nParked ;
- int _pipev [2] ;
- mutex_t _mutex [1] ;
- cond_t _cond [1] ;
- double PostPad [2] ;
+ double CachePad[4]; // increase odds that _mutex is sole occupant of cache line
+ volatile int _Event;
+ int _nParked;
+ int _pipev[2];
+ mutex_t _mutex[1];
+ cond_t _cond[1];
+ double PostPad[2];
protected:
// Defining a protected ctor effectively gives us an abstract base class.
// That is, a PlatformEvent can never be instantiated "naked" but only
// as a part of a ParkEvent (recall that ParkEvent extends PlatformEvent).
// TODO-FIXME: make dtor private
- ~PlatformEvent() { guarantee (0, "invariant") ; }
+ ~PlatformEvent() { guarantee(0, "invariant"); }
PlatformEvent() {
int status;
status = os::Solaris::cond_init(_cond);
assert_status(status == 0, status, "cond_init");
status = os::Solaris::mutex_init(_mutex);
assert_status(status == 0, status, "mutex_init");
- _Event = 0 ;
- _nParked = 0 ;
- _pipev[0] = _pipev[1] = -1 ;
+ _Event = 0;
+ _nParked = 0;
+ _pipev[0] = _pipev[1] = -1;
}
public:
// Exercise caution using reset() and fired() -- they may require MEMBARs
- void reset() { _Event = 0 ; }
+ void reset() { _Event = 0; }
int fired() { return _Event; }
- void park () ;
- int park (jlong millis) ;
- int TryPark () ;
- void unpark () ;
-} ;
+ void park();
+ int park(jlong millis);
+ int TryPark();
+ void unpark();
+};
class PlatformParker : public CHeapObj {
protected:
- mutex_t _mutex [1] ;
- cond_t _cond [1] ;
+ mutex_t _mutex[1];
+ cond_t _cond[1];
public: // TODO-FIXME: make dtor private
- ~PlatformParker() { guarantee (0, "invariant") ; }
+ ~PlatformParker() { guarantee(0, "invariant"); }
public:
PlatformParker() {
@@ -352,6 +352,6 @@ class PlatformParker : public CHeapObj {
status = os::Solaris::mutex_init(_mutex);
assert_status(status == 0, status, "mutex_init");
}
-} ;
+};
#endif // OS_SOLARIS_VM_OS_SOLARIS_HPP
diff --git a/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp b/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp
index d7d6d378f1a..b5355335f39 100644
--- a/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp
+++ b/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp
@@ -29,7 +29,6 @@
#error "This file should only be included from thread.inline.hpp"
#endif
-#include "runtime/atomic.inline.hpp"
#include "runtime/thread.hpp"
#include "runtime/threadLocalStorage.hpp"
diff --git a/hotspot/src/os/windows/vm/osThread_windows.cpp b/hotspot/src/os/windows/vm/osThread_windows.cpp
index d65d0d6f557..7e8877a2099 100644
--- a/hotspot/src/os/windows/vm/osThread_windows.cpp
+++ b/hotspot/src/os/windows/vm/osThread_windows.cpp
@@ -23,7 +23,6 @@
*/
// no precompiled headers
-#include "runtime/atomic.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp
index 04b72a9d37d..b16362421b7 100644
--- a/hotspot/src/os/windows/vm/os_windows.cpp
+++ b/hotspot/src/os/windows/vm/os_windows.cpp
@@ -44,6 +44,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -125,11 +126,11 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH:
vm_lib_handle = hinst;
- if(ForceTimeHighResolution)
+ if (ForceTimeHighResolution)
timeBeginPeriod(1L);
break;
case DLL_PROCESS_DETACH:
- if(ForceTimeHighResolution)
+ if (ForceTimeHighResolution)
timeEndPeriod(1L);
// Workaround for issue when a custom launcher doesn't call
@@ -318,7 +319,7 @@ extern "C" void breakpoint() {
*/
address os::get_caller_pc(int n) {
#ifdef _NMT_NOINLINE_
- n ++;
+ n++;
#endif
address pc;
if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
@@ -345,10 +346,10 @@ address os::current_stack_base() {
// Add up the sizes of all the regions with the same
// AllocationBase.
- while( 1 )
+ while (1)
{
VirtualQuery(stack_bottom+stack_size, &minfo, sizeof(minfo));
- if ( stack_bottom == (address)minfo.AllocationBase )
+ if (stack_bottom == (address)minfo.AllocationBase)
stack_size += minfo.RegionSize;
else
break;
@@ -644,7 +645,7 @@ static jlong performance_frequency;
jlong as_long(LARGE_INTEGER x) {
jlong result = 0; // initialization to avoid warning
set_high(&result, x.HighPart);
- set_low(&result, x.LowPart);
+ set_low(&result, x.LowPart);
return result;
}
@@ -999,7 +1000,7 @@ void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char*
#endif
cwd = get_current_directory(NULL, 0);
- jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp",cwd, current_process_id());
+ jio_snprintf(buffer, bufferSize, "%s\\hs_err_pid%u.mdmp", cwd, current_process_id());
dumpFile = CreateFile(buffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (dumpFile == INVALID_HANDLE_VALUE) {
@@ -1217,7 +1218,7 @@ bool os::dll_build_name(char *buffer, size_t buflen,
if (pelements == NULL) {
return false;
}
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
char* path = pelements[i];
// Really shouldn't be NULL, but check can't hurt
size_t plen = (path == NULL) ? 0 : strlen(path);
@@ -1236,7 +1237,7 @@ bool os::dll_build_name(char *buffer, size_t buflen,
}
}
// release the storage
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
if (pelements[i] != NULL) {
FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal);
}
@@ -1271,12 +1272,12 @@ static bool _addr_in_ntdll( address addr )
MODULEINFO minfo;
hmod = GetModuleHandle("NTDLL.DLL");
- if ( hmod == NULL ) return false;
- if ( !os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
+ if (hmod == NULL) return false;
+ if (!os::PSApiDll::GetModuleInformation( GetCurrentProcess(), hmod,
&minfo, sizeof(MODULEINFO)) )
return false;
- if ( (addr >= minfo.lpBaseOfDll) &&
+ if ((addr >= minfo.lpBaseOfDll) &&
(addr < (address)((uintptr_t)minfo.lpBaseOfDll + (uintptr_t)minfo.SizeOfImage)))
return true;
else
@@ -1304,11 +1305,11 @@ typedef int (*EnumModulesCallbackFunc)(int, char *, address, unsigned, void *);
// enumerate_modules for Windows NT, using PSAPI
static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void * param)
{
- HANDLE hProcess ;
+ HANDLE hProcess;
# define MAX_NUM_MODULES 128
HMODULE modules[MAX_NUM_MODULES];
- static char filename[ MAX_PATH ];
+ static char filename[MAX_PATH];
int result = 0;
if (!os::PSApiDll::PSApiAvailable()) {
@@ -1316,13 +1317,13 @@ static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void
}
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
- FALSE, pid ) ;
+ FALSE, pid);
if (hProcess == NULL) return 0;
DWORD size_needed;
if (!os::PSApiDll::EnumProcessModules(hProcess, modules,
sizeof(modules), &size_needed)) {
- CloseHandle( hProcess );
+ CloseHandle(hProcess);
return 0;
}
@@ -1331,7 +1332,7 @@ static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void
for (int i = 0; i < MIN2(num_modules, MAX_NUM_MODULES); i++) {
// Get Full pathname:
- if(!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
+ if (!os::PSApiDll::GetModuleFileNameEx(hProcess, modules[i],
filename, sizeof(filename))) {
filename[0] = '\0';
}
@@ -1349,7 +1350,7 @@ static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void
if (result) break;
}
- CloseHandle( hProcess ) ;
+ CloseHandle(hProcess);
return result;
}
@@ -1357,8 +1358,8 @@ static int _enumerate_modules_winnt( int pid, EnumModulesCallbackFunc func, void
// enumerate_modules for Windows 95/98/ME, using TOOLHELP
static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, void *param)
{
- HANDLE hSnapShot ;
- static MODULEENTRY32 modentry ;
+ HANDLE hSnapShot;
+ static MODULEENTRY32 modentry;
int result = 0;
if (!os::Kernel32Dll::HelpToolsAvailable()) {
@@ -1366,22 +1367,22 @@ static int _enumerate_modules_windows( int pid, EnumModulesCallbackFunc func, vo
}
// Get a handle to a Toolhelp snapshot of the system
- hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid ) ;
- if( hSnapShot == INVALID_HANDLE_VALUE ) {
- return FALSE ;
+ hSnapShot = os::Kernel32Dll::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
+ if (hSnapShot == INVALID_HANDLE_VALUE) {
+ return FALSE;
}
// iterate through all modules
- modentry.dwSize = sizeof(MODULEENTRY32) ;
+ modentry.dwSize = sizeof(MODULEENTRY32);
bool not_done = os::Kernel32Dll::Module32First( hSnapShot, &modentry ) != 0;
- while( not_done ) {
+ while (not_done) {
// invoke the callback
result=func(pid, modentry.szExePath, (address)modentry.modBaseAddr,
modentry.modBaseSize, param);
if (result) break;
- modentry.dwSize = sizeof(MODULEENTRY32) ;
+ modentry.dwSize = sizeof(MODULEENTRY32);
not_done = os::Kernel32Dll::Module32Next( hSnapShot, &modentry ) != 0;
}
@@ -1941,7 +1942,7 @@ void os::signal_raise(int signal_number) {
// that raises SIGTERM for the latter cases.
//
static BOOL WINAPI consoleHandler(DWORD event) {
- switch(event) {
+ switch (event) {
case CTRL_C_EVENT:
if (is_error_reported()) {
// Ctrl-C is pressed during error reporting, likely because the error
@@ -1965,7 +1966,7 @@ static BOOL WINAPI consoleHandler(DWORD event) {
HANDLE handle = GetProcessWindowStation();
if (handle != NULL &&
GetUserObjectInformation(handle, UOI_FLAGS, &flags,
- sizeof( USEROBJECTFLAGS), NULL)) {
+ sizeof(USEROBJECTFLAGS), NULL)) {
// If it is a non-interactive session, let next handler to deal
// with it.
if ((flags.dwFlags & WSF_VISIBLE) == 0) {
@@ -1991,7 +1992,7 @@ static BOOL WINAPI consoleHandler(DWORD event) {
// Return maximum OS signal used + 1 for internal use only
// Used as exit signal for signal_thread
-int os::sigexitnum_pd(){
+int os::sigexitnum_pd() {
return NSIG;
}
@@ -2422,11 +2423,11 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
// process of write protecting the memory serialization page.
// It write enables the page immediately after protecting it
// so just return.
- if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
+ if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
JavaThread* thread = (JavaThread*) t;
PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
address addr = (address) exceptionRecord->ExceptionInformation[1];
- if ( os::is_memory_serialize_page(thread, addr) ) {
+ if (os::is_memory_serialize_page(thread, addr)) {
// Block current thread until the memory serialize page permission restored.
os::block_on_serialize_page_trap();
return EXCEPTION_CONTINUE_EXECUTION;
@@ -2543,7 +2544,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
//
PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
address addr = (address) exceptionRecord->ExceptionInformation[1];
- if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base() ) {
+ if (addr > thread->stack_yellow_zone_base() && addr < thread->stack_base()) {
addr = (address)((uintptr_t)addr &
(~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
os::commit_memory((char *)addr, thread->stack_base() - addr,
@@ -2623,7 +2624,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
// Compiled method patched to be non entrant? Following conditions must apply:
// 1. must be first instruction in bundle
// 2. must be a break instruction with appropriate code
- if((((uint64_t) pc & 0x0F) == 0) &&
+ if ((((uint64_t) pc & 0x0F) == 0) &&
(((IPF_Bundle*) pc)->get_slot0() == handle_wrong_method_break.bits())) {
return Handle_Exception(exceptionInfo,
(address)SharedRuntime::get_handle_wrong_method_stub());
@@ -2794,7 +2795,7 @@ public:
return (_numa_used_node_count > 1);
}
- int get_count() {return _numa_used_node_count;}
+ int get_count() { return _numa_used_node_count; }
int get_node_list_entry(int n) {
// for indexes out of range, returns -1
return (n < _numa_used_node_count ? _numa_used_node_list[n] : -1);
@@ -3112,14 +3113,14 @@ char* os::pd_reserve_memory(size_t bytes, char* addr, size_t alignment_hint) {
res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
} else {
elapsedTimer reserveTimer;
- if( Verbose && PrintMiscellaneous ) reserveTimer.start();
+ if (Verbose && PrintMiscellaneous) reserveTimer.start();
// in numa interleaving, we have to allocate pages individually
// (well really chunks of NUMAInterleaveGranularity size)
res = allocate_pages_individually(bytes, addr, MEM_RESERVE, PAGE_READWRITE);
if (res == NULL) {
warning("NUMA page allocation failed");
}
- if( Verbose && PrintMiscellaneous ) {
+ if (Verbose && PrintMiscellaneous) {
reserveTimer.stop();
tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes,
reserveTimer.milliseconds(), reserveTimer.ticks());
@@ -3450,14 +3451,14 @@ public:
int os::sleep(Thread* thread, jlong ms, bool interruptable) {
jlong limit = (jlong) MAXDWORD;
- while(ms > limit) {
+ while (ms > limit) {
int res;
if ((res = sleep(thread, limit, interruptable)) != OS_TIMEOUT)
return res;
ms -= limit;
}
- assert(thread == Thread::current(), "thread consistency check");
+ assert(thread == Thread::current(), "thread consistency check");
OSThread* osthread = thread->osthread();
OSThreadWaitState osts(osthread, false /* not Object.wait() */);
int result;
@@ -3473,8 +3474,8 @@ int os::sleep(Thread* thread, jlong ms, bool interruptable) {
HANDLE events[1];
events[0] = osthread->interrupt_event();
HighResolutionInterval *phri=NULL;
- if(!ForceTimeHighResolution)
- phri = new HighResolutionInterval( ms );
+ if (!ForceTimeHighResolution)
+ phri = new HighResolutionInterval(ms);
if (WaitForMultipleObjects(1, events, FALSE, (DWORD)ms) == WAIT_TIMEOUT) {
result = OS_TIMEOUT;
} else {
@@ -3511,26 +3512,21 @@ void os::infinite_sleep() {
}
}
-typedef BOOL (WINAPI * STTSignature)(void) ;
+typedef BOOL (WINAPI * STTSignature)(void);
os::YieldResult os::NakedYield() {
// Use either SwitchToThread() or Sleep(0)
// Consider passing back the return value from SwitchToThread().
if (os::Kernel32Dll::SwitchToThreadAvailable()) {
- return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
+ return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY;
} else {
Sleep(0);
}
- return os::YIELD_UNKNOWN ;
+ return os::YIELD_UNKNOWN;
}
void os::yield() { os::NakedYield(); }
-void os::yield_all() {
- // Yields to all threads, including threads with lower priorities
- Sleep(1);
-}
-
// Win32 only gives you access to seven real priorities at a time,
// so we compress Java's ten down to seven. It would be better
// if we dynamically adjusted relative priorities.
@@ -3574,7 +3570,7 @@ static int prio_init() {
}
}
if (UseCriticalJavaThreadPriority) {
- os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority] ;
+ os::java_to_os_priority[MaxPriority] = os::java_to_os_priority[CriticalPriority];
}
return 0;
}
@@ -3586,7 +3582,7 @@ OSReturn os::set_native_priority(Thread* thread, int priority) {
}
OSReturn os::get_native_priority(const Thread* const thread, int* priority_ptr) {
- if ( !UseThreadPriorities ) {
+ if (!UseThreadPriorities) {
*priority_ptr = java_to_os_priority[NormPriority];
return OS_OK;
}
@@ -3620,8 +3616,8 @@ void os::interrupt(Thread* thread) {
if (thread->is_Java_thread())
((JavaThread*)thread)->parker()->unpark();
- ParkEvent * ev = thread->_ParkEvent ;
- if (ev != NULL) ev->unpark() ;
+ ParkEvent * ev = thread->_ParkEvent;
+ if (ev != NULL) ev->unpark();
}
@@ -3715,7 +3711,7 @@ void os::win32::initialize_system_info() {
OSVERSIONINFOEX oi;
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx((OSVERSIONINFO*)&oi);
- switch(oi.dwPlatformId) {
+ switch (oi.dwPlatformId) {
case VER_PLATFORM_WIN32_WINDOWS: _is_nt = false; break;
case VER_PLATFORM_WIN32_NT:
_is_nt = true;
@@ -3898,29 +3894,29 @@ static jint initSock();
jint os::init_2(void) {
// Allocate a single page and mark it as readable for safepoint polling
address polling_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READONLY);
- guarantee( polling_page != NULL, "Reserve Failed for polling page");
+ guarantee(polling_page != NULL, "Reserve Failed for polling page");
address return_page = (address)VirtualAlloc(polling_page, os::vm_page_size(), MEM_COMMIT, PAGE_READONLY);
- guarantee( return_page != NULL, "Commit Failed for polling page");
+ guarantee(return_page != NULL, "Commit Failed for polling page");
- os::set_polling_page( polling_page );
+ os::set_polling_page(polling_page);
#ifndef PRODUCT
- if( Verbose && PrintMiscellaneous )
+ if (Verbose && PrintMiscellaneous)
tty->print("[SafePoint Polling address: " INTPTR_FORMAT "]\n", (intptr_t)polling_page);
#endif
if (!UseMembar) {
address mem_serialize_page = (address)VirtualAlloc(NULL, os::vm_page_size(), MEM_RESERVE, PAGE_READWRITE);
- guarantee( mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
+ guarantee(mem_serialize_page != NULL, "Reserve Failed for memory serialize page");
return_page = (address)VirtualAlloc(mem_serialize_page, os::vm_page_size(), MEM_COMMIT, PAGE_READWRITE);
- guarantee( return_page != NULL, "Commit Failed for memory serialize page");
+ guarantee(return_page != NULL, "Commit Failed for memory serialize page");
- os::set_memory_serialize_page( mem_serialize_page );
+ os::set_memory_serialize_page(mem_serialize_page);
#ifndef PRODUCT
- if(Verbose && PrintMiscellaneous)
+ if (Verbose && PrintMiscellaneous)
tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
#endif
}
@@ -4036,14 +4032,14 @@ void os::init_3(void) {
// Mark the polling page as unreadable
void os::make_polling_page_unreadable(void) {
DWORD old_status;
- if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status) )
+ if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_NOACCESS, &old_status))
fatal("Could not disable polling page");
};
// Mark the polling page as readable
void os::make_polling_page_readable(void) {
DWORD old_status;
- if( !VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status) )
+ if (!VirtualProtect((char *)_polling_page, os::vm_page_size(), PAGE_READONLY, &old_status))
fatal("Could not enable polling page");
};
@@ -4121,7 +4117,7 @@ jlong os::thread_cpu_time(Thread* thread, bool user_sys_cpu_time) {
FILETIME KernelTime;
FILETIME UserTime;
- if ( GetThreadTimes(thread->osthread()->thread_handle(),
+ if (GetThreadTimes(thread->osthread()->thread_handle(),
&CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
return -1;
else
@@ -4157,7 +4153,7 @@ bool os::is_thread_cpu_time_supported() {
FILETIME KernelTime;
FILETIME UserTime;
- if ( GetThreadTimes(GetCurrentThread(),
+ if (GetThreadTimes(GetCurrentThread(),
&CreationTime, &ExitTime, &KernelTime, &UserTime) == 0)
return false;
else
@@ -4391,7 +4387,7 @@ int os::ftruncate(int fd, jlong length) {
int os::fsync(int fd) {
HANDLE handle = (HANDLE)::_get_osfhandle(fd);
- if ( (!::FlushFileBuffers(handle)) &&
+ if ((!::FlushFileBuffers(handle)) &&
(GetLastError() != ERROR_ACCESS_DENIED) ) {
/* from winerror.h */
return -1;
@@ -4512,7 +4508,7 @@ static int stdinAvailable(int fd, long *pbytes) {
}
/* Examine input records for the number of bytes available */
- for(i=0; i 0 , "Invariant") ;
- int v ;
+ guarantee(_ParkHandle != NULL , "Invariant");
+ guarantee(Millis > 0 , "Invariant");
+ int v;
// CONSIDER: defer assigning a CreateEvent() handle to the Event until
// the initial park() operation.
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee ((v == 0) || (v == 1), "invariant") ;
- if (v != 0) return OS_OK ;
+ guarantee((v == 0) || (v == 1), "invariant");
+ if (v != 0) return OS_OK;
// Do this the hard way by blocking ...
// TODO: consider a brief spin here, gated on the success of recent
@@ -4820,59 +4816,59 @@ int os::PlatformEvent::park (jlong Millis) {
// In the future, however, we might want to track the accumulated wait time and
// adjust Millis accordingly if we encounter a spurious wakeup.
- const int MAXTIMEOUT = 0x10000000 ;
- DWORD rv = WAIT_TIMEOUT ;
+ const int MAXTIMEOUT = 0x10000000;
+ DWORD rv = WAIT_TIMEOUT;
while (_Event < 0 && Millis > 0) {
- DWORD prd = Millis ; // set prd = MAX (Millis, MAXTIMEOUT)
+ DWORD prd = Millis; // set prd = MAX (Millis, MAXTIMEOUT)
if (Millis > MAXTIMEOUT) {
- prd = MAXTIMEOUT ;
+ prd = MAXTIMEOUT;
}
- rv = ::WaitForSingleObject (_ParkHandle, prd) ;
- assert (rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed") ;
+ rv = ::WaitForSingleObject(_ParkHandle, prd);
+ assert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT, "WaitForSingleObject failed");
if (rv == WAIT_TIMEOUT) {
- Millis -= prd ;
+ Millis -= prd;
}
}
- v = _Event ;
- _Event = 0 ;
+ v = _Event;
+ _Event = 0;
// see comment at end of os::PlatformEvent::park() below:
- OrderAccess::fence() ;
+ OrderAccess::fence();
// If we encounter a nearly simultanous timeout expiry and unpark()
// we return OS_OK indicating we awoke via unpark().
// Implementor's license -- returning OS_TIMEOUT would be equally valid, however.
- return (v >= 0) ? OS_OK : OS_TIMEOUT ;
+ return (v >= 0) ? OS_OK : OS_TIMEOUT;
}
-void os::PlatformEvent::park () {
- guarantee (_ParkHandle != NULL, "Invariant") ;
+void os::PlatformEvent::park() {
+ guarantee(_ParkHandle != NULL, "Invariant");
// Invariant: Only the thread associated with the Event/PlatformEvent
// may call park().
- int v ;
+ int v;
for (;;) {
- v = _Event ;
- if (Atomic::cmpxchg (v-1, &_Event, v) == v) break ;
+ v = _Event;
+ if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
- guarantee ((v == 0) || (v == 1), "invariant") ;
- if (v != 0) return ;
+ guarantee((v == 0) || (v == 1), "invariant");
+ if (v != 0) return;
// Do this the hard way by blocking ...
// TODO: consider a brief spin here, gated on the success of recent
// spin attempts by this thread.
while (_Event < 0) {
- DWORD rv = ::WaitForSingleObject (_ParkHandle, INFINITE) ;
- assert (rv == WAIT_OBJECT_0, "WaitForSingleObject failed") ;
+ DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE);
+ assert(rv == WAIT_OBJECT_0, "WaitForSingleObject failed");
}
// Usually we'll find _Event == 0 at this point, but as
// an optional optimization we clear it, just in case can
// multiple unpark() operations drove _Event up to 1.
- _Event = 0 ;
- OrderAccess::fence() ;
- guarantee (_Event >= 0, "invariant") ;
+ _Event = 0;
+ OrderAccess::fence();
+ guarantee(_Event >= 0, "invariant");
}
void os::PlatformEvent::unpark() {
- guarantee (_ParkHandle != NULL, "Invariant") ;
+ guarantee(_ParkHandle != NULL, "Invariant");
// Transitions for _Event:
// 0 :=> 1
@@ -4907,7 +4903,7 @@ void os::PlatformEvent::unpark() {
void Parker::park(bool isAbsolute, jlong time) {
- guarantee (_ParkEvent != NULL, "invariant") ;
+ guarantee(_ParkEvent != NULL, "invariant");
// First, demultiplex/decode time arguments
if (time < 0) { // don't wait
return;
@@ -4941,7 +4937,7 @@ void Parker::park(bool isAbsolute, jlong time) {
OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */);
jt->set_suspend_equivalent();
- WaitForSingleObject(_ParkEvent, time);
+ WaitForSingleObject(_ParkEvent, time);
ResetEvent(_ParkEvent);
// If externally suspended while waiting, re-suspend
@@ -4952,7 +4948,7 @@ void Parker::park(bool isAbsolute, jlong time) {
}
void Parker::unpark() {
- guarantee (_ParkEvent != NULL, "invariant") ;
+ guarantee(_ParkEvent != NULL, "invariant");
SetEvent(_ParkEvent);
}
@@ -5040,7 +5036,7 @@ bool os::find(address addr, outputStream* st) {
LONG WINAPI os::win32::serialize_fault_filter(struct _EXCEPTION_POINTERS* e) {
DWORD exception_code = e->ExceptionRecord->ExceptionCode;
- if ( exception_code == EXCEPTION_ACCESS_VIOLATION ) {
+ if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
JavaThread* thread = (JavaThread*)ThreadLocalStorage::get_thread_slow();
PEXCEPTION_RECORD exceptionRecord = e->ExceptionRecord;
address addr = (address) exceptionRecord->ExceptionInformation[1];
diff --git a/hotspot/src/os/windows/vm/threadCritical_windows.cpp b/hotspot/src/os/windows/vm/threadCritical_windows.cpp
index c61a2961710..3ea83c1acb6 100644
--- a/hotspot/src/os/windows/vm/threadCritical_windows.cpp
+++ b/hotspot/src/os/windows/vm/threadCritical_windows.cpp
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/thread.inline.hpp"
#include "runtime/threadCritical.hpp"
diff --git a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
index ccfd54ba9de..d7fd74d219a 100644
--- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
+++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2012, 2013 SAP AG. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2012, 2014 SAP AG. 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
@@ -307,7 +307,7 @@ JVM_handle_linux_signal(int sig,
// doesn't work for us. We use:
((NativeInstruction*)pc)->is_safepoint_poll()) {
if (TraceTraps) {
- tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", pc);
+ tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
}
stub = SharedRuntime::get_poll_stub(pc);
}
@@ -316,7 +316,7 @@ JVM_handle_linux_signal(int sig,
else if (sig == SIGTRAP && TrapBasedICMissChecks &&
nativeInstruction_at(pc)->is_sigtrap_ic_miss_check()) {
if (TraceTraps) {
- tty->print_cr("trap: ic_miss_check at " INTPTR_FORMAT " (SIGTRAP)", pc);
+ tty->print_cr("trap: ic_miss_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
}
stub = SharedRuntime::get_ic_miss_stub();
}
@@ -325,7 +325,7 @@ JVM_handle_linux_signal(int sig,
else if (sig == SIGTRAP && TrapBasedNullChecks &&
nativeInstruction_at(pc)->is_sigtrap_null_check()) {
if (TraceTraps) {
- tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGTRAP)", pc);
+ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
}
stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
}
@@ -335,7 +335,7 @@ JVM_handle_linux_signal(int sig,
CodeCache::contains((void*) pc) &&
!MacroAssembler::needs_explicit_null_check((intptr_t) info->si_addr)) {
if (TraceTraps) {
- tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc);
+ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
}
stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
}
@@ -345,7 +345,7 @@ JVM_handle_linux_signal(int sig,
else if (sig == SIGTRAP && TrapBasedRangeChecks &&
nativeInstruction_at(pc)->is_sigtrap_range_check()) {
if (TraceTraps) {
- tty->print_cr("trap: range_check at " INTPTR_FORMAT " (SIGTRAP)", pc);
+ tty->print_cr("trap: range_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
}
stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
}
@@ -572,7 +572,7 @@ void os::print_context(outputStream *st, void *context) {
st->cr();
intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
- st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
+ st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", p2i(sp));
print_hex_dump(st, (address)sp, (address)(sp + 128), sizeof(intptr_t));
st->cr();
@@ -580,7 +580,7 @@ void os::print_context(outputStream *st, void *context) {
// point to garbage if entry point in an nmethod is corrupted. Leave
// this at the end, and hope for the best.
address pc = os::Linux::ucontext_get_pc(uc);
- st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
+ st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc));
print_hex_dump(st, pc - 64, pc + 64, /*instrsize=*/4);
st->cr();
}
diff --git a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
index 70dc8f0e5d8..2f3cdf9ac83 100644
--- a/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
+++ b/hotspot/src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp
@@ -55,7 +55,7 @@ int VM_Version::platform_features(int features) {
if (detect_niagara()) {
NOT_PRODUCT(if (PrintMiscellaneous && Verbose) tty->print_cr("Detected Linux on Niagara");)
- features = niagara1_m;
+ features = niagara1_m | T_family_m;
}
return features;
diff --git a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
index e78a2dba30b..7eccbe47013 100644
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
@@ -38,6 +38,7 @@
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/frame.inline.hpp"
#include "runtime/interfaceSupport.hpp"
diff --git a/hotspot/src/share/vm/asm/assembler.cpp b/hotspot/src/share/vm/asm/assembler.cpp
index 274aa872e6f..2141d93b0da 100644
--- a/hotspot/src/share/vm/asm/assembler.cpp
+++ b/hotspot/src/share/vm/asm/assembler.cpp
@@ -26,7 +26,6 @@
#include "asm/macroAssembler.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "asm/codeBuffer.hpp"
-#include "runtime/atomic.hpp"
#include "runtime/atomic.inline.hpp"
#include "runtime/icache.hpp"
#include "runtime/os.hpp"
diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
index 3c2e2ecf8fe..a472718a64e 100644
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
@@ -47,6 +47,7 @@
#include "memory/resourceArea.hpp"
#include "oops/objArrayKlass.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/interfaceSupport.hpp"
diff --git a/hotspot/src/share/vm/ci/ciConstantPoolCache.cpp b/hotspot/src/share/vm/ci/ciConstantPoolCache.cpp
index a277e421a32..6ceacdc5a5a 100644
--- a/hotspot/src/share/vm/ci/ciConstantPoolCache.cpp
+++ b/hotspot/src/share/vm/ci/ciConstantPoolCache.cpp
@@ -38,7 +38,7 @@ ciConstantPoolCache::ciConstantPoolCache(Arena* arena,
int expected_size) {
_elements =
new (arena) GrowableArray(arena, expected_size, 0, 0);
- _keys = new (arena) GrowableArray(arena, expected_size, 0, 0);
+ _keys = new (arena) GrowableArray(arena, expected_size, 0, 0);
}
// ------------------------------------------------------------------
diff --git a/hotspot/src/share/vm/ci/ciConstantPoolCache.hpp b/hotspot/src/share/vm/ci/ciConstantPoolCache.hpp
index 30ebcac2079..17cf77681e0 100644
--- a/hotspot/src/share/vm/ci/ciConstantPoolCache.hpp
+++ b/hotspot/src/share/vm/ci/ciConstantPoolCache.hpp
@@ -35,7 +35,7 @@
// Usage note: this klass has nothing to do with ConstantPoolCache*.
class ciConstantPoolCache : public ResourceObj {
private:
- GrowableArray* _keys;
+ GrowableArray* _keys;
GrowableArray* _elements;
int find(int index);
diff --git a/hotspot/src/share/vm/ci/ciEnv.cpp b/hotspot/src/share/vm/ci/ciEnv.cpp
index fbe7bbbd83c..18cf9add331 100644
--- a/hotspot/src/share/vm/ci/ciEnv.cpp
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp
@@ -512,24 +512,9 @@ ciKlass* ciEnv::get_klass_by_index_impl(constantPoolHandle cpool,
} else {
// Check if it's resolved if it's not a symbol constant pool entry.
klass = KlassHandle(THREAD, ConstantPool::klass_at_if_loaded(cpool, index));
-
- if (klass.is_null()) {
- // The klass has not been inserted into the constant pool.
// Try to look it up by name.
- {
- // We have to lock the cpool to keep the oop from being resolved
- // while we are accessing it.
- MonitorLockerEx ml(cpool->lock());
- constantTag tag = cpool->tag_at(index);
- if (tag.is_klass()) {
- // The klass has been inserted into the constant pool
- // very recently.
- klass = KlassHandle(THREAD, cpool->resolved_klass_at(index));
- } else {
- assert(cpool->tag_at(index).is_unresolved_klass(), "wrong tag");
- klass_name = cpool->unresolved_klass_at(index);
- }
- }
+ if (klass.is_null()) {
+ klass_name = cpool->klass_name_at(index);
}
}
diff --git a/hotspot/src/share/vm/ci/ciReplay.cpp b/hotspot/src/share/vm/ci/ciReplay.cpp
index 51897b26300..99b742d61dd 100644
--- a/hotspot/src/share/vm/ci/ciReplay.cpp
+++ b/hotspot/src/share/vm/ci/ciReplay.cpp
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2013, 2014, 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
@@ -686,7 +686,7 @@ class CompileReplay : public StackObj {
switch (cp->tag_at(i).value()) {
case JVM_CONSTANT_UnresolvedClass: {
if (tag == JVM_CONSTANT_Class) {
- tty->print_cr("Resolving klass %s at %d", cp->unresolved_klass_at(i)->as_utf8(), i);
+ tty->print_cr("Resolving klass %s at %d", cp->klass_name_at(i)->as_utf8(), i);
Klass* k = cp->klass_at(i, CHECK);
}
break;
diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp
index 608b43ae150..e58b280b07b 100644
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp
@@ -510,7 +510,7 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) {
jbyte tag = cp->tag_at(index).value();
switch (tag) {
case JVM_CONSTANT_UnresolvedClass: {
- Symbol* class_name = cp->unresolved_klass_at(index);
+ Symbol* class_name = cp->klass_name_at(index);
// check the name, even if _cp_patches will overwrite it
verify_legal_class_name(class_name, CHECK_(nullHandle));
break;
@@ -2984,9 +2984,12 @@ void ClassFileParser::parse_classfile_attributes(ClassFileParser::ClassAnnotatio
} else if (tag == vmSymbols::tag_enclosing_method()) {
if (parsed_enclosingmethod_attribute) {
classfile_parse_error("Multiple EnclosingMethod attributes in class file %s", CHECK);
- } else {
+ } else {
parsed_enclosingmethod_attribute = true;
}
+ guarantee_property(attribute_length == 4,
+ "Wrong EnclosingMethod attribute length %u in class file %s",
+ attribute_length, CHECK);
cfs->guarantee_more(4, CHECK); // class_index, method_index
enclosing_method_class_index = cfs->get_u2_fast();
enclosing_method_method_index = cfs->get_u2_fast();
@@ -3158,7 +3161,7 @@ instanceKlassHandle ClassFileParser::parse_super_class(int super_class_index,
if (_need_verify)
is_array = super_klass->oop_is_array();
} else if (_need_verify) {
- is_array = (_cp->unresolved_klass_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY);
+ is_array = (_cp->klass_name_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY);
}
if (_need_verify) {
guarantee_property(!is_array,
@@ -3852,7 +3855,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
"Invalid this class index %u in constant pool in class file %s",
this_class_index, CHECK_(nullHandle));
- Symbol* class_name = cp->unresolved_klass_at(this_class_index);
+ Symbol* class_name = cp->klass_name_at(this_class_index);
assert(class_name != NULL, "class_name can't be null");
// It's important to set parsed_name *before* resolving the super class.
@@ -4067,6 +4070,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
this_klass->set_major_version(major_version);
this_klass->set_has_default_methods(has_default_methods);
+ if (!host_klass.is_null()) {
+ assert (this_klass->is_anonymous(), "should be the same");
+ this_klass->set_host_klass(host_klass());
+ }
+
// Set up Method*::intrinsic_id as soon as we know the names of methods.
// (We used to do this lazily, but now we query it in Rewriter,
// which is eagerly done for every method, so we might as well do it now,
@@ -4131,8 +4139,8 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
}
// Allocate mirror and initialize static fields
- java_lang_Class::create_mirror(this_klass, protection_domain, CHECK_(nullHandle));
-
+ java_lang_Class::create_mirror(this_klass, class_loader, protection_domain,
+ CHECK_(nullHandle));
// Generate any default methods - default methods are interface methods
// that have a default implementation. This is new with Lambda project.
@@ -4664,9 +4672,7 @@ bool ClassFileParser::has_illegal_visibility(jint flags) {
}
bool ClassFileParser::is_supported_version(u2 major, u2 minor) {
- u2 max_version =
- JDK_Version::is_gte_jdk17x_version() ? JAVA_MAX_SUPPORTED_VERSION :
- (JDK_Version::is_gte_jdk16x_version() ? JAVA_6_VERSION : JAVA_1_5_VERSION);
+ u2 max_version = JAVA_MAX_SUPPORTED_VERSION;
return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
(major <= max_version) &&
((major != max_version) ||
diff --git a/hotspot/src/share/vm/classfile/classLoader.cpp b/hotspot/src/share/vm/classfile/classLoader.cpp
index 8366c8fc4ce..46d979ed1df 100644
--- a/hotspot/src/share/vm/classfile/classLoader.cpp
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp
@@ -1126,7 +1126,7 @@ void ClassLoader::verify() {
// JDK 1.3 version
-typedef struct real_jzentry13 { /* Zip file entry */
+typedef struct real_jzentry { /* Zip file entry */
char *name; /* entry name */
jint time; /* modification time */
jint size; /* size of uncompressed data */
@@ -1135,9 +1135,9 @@ typedef struct real_jzentry13 { /* Zip file entry */
char *comment; /* optional zip file comment */
jbyte *extra; /* optional extra data */
jint pos; /* position of LOC header (if negative) or data */
-} real_jzentry13;
+} real_jzentry;
-typedef struct real_jzfile13 { /* Zip file */
+typedef struct real_jzfile { /* Zip file */
char *name; /* zip file name */
jint refs; /* number of active references */
jint fd; /* open file descriptor */
@@ -1148,42 +1148,14 @@ typedef struct real_jzfile13 { /* Zip file */
jint total; /* total number of entries */
unsigned short *table; /* Hash chain heads: indexes into entries */
jint tablelen; /* number of hash eads */
- real_jzfile13 *next; /* next zip file in search list */
+ real_jzfile *next; /* next zip file in search list */
jzentry *cache; /* we cache the most recently freed jzentry */
/* Information on metadata names in META-INF directory */
char **metanames; /* array of meta names (may have null names) */
jint metacount; /* number of slots in metanames array */
/* If there are any per-entry comments, they are in the comments array */
char **comments;
-} real_jzfile13;
-
-// JDK 1.2 version
-typedef struct real_jzentry12 { /* Zip file entry */
- char *name; /* entry name */
- jint time; /* modification time */
- jint size; /* size of uncompressed data */
- jint csize; /* size of compressed data (zero if uncompressed) */
- jint crc; /* crc of uncompressed data */
- char *comment; /* optional zip file comment */
- jbyte *extra; /* optional extra data */
- jint pos; /* position of LOC header (if negative) or data */
- struct real_jzentry12 *next; /* next entry in hash table */
-} real_jzentry12;
-
-typedef struct real_jzfile12 { /* Zip file */
- char *name; /* zip file name */
- jint refs; /* number of active references */
- jint fd; /* open file descriptor */
- void *lock; /* read lock */
- char *comment; /* zip file comment */
- char *msg; /* zip error message */
- real_jzentry12 *entries; /* array of zip entries */
- jint total; /* total number of entries */
- real_jzentry12 **table; /* hash table of entries */
- jint tablelen; /* number of buckets */
- jzfile *next; /* next zip file in search list */
-} real_jzfile12;
-
+} real_jzfile;
void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) {
// For now we only compile all methods in all classes in zip/jar files
@@ -1197,10 +1169,14 @@ bool ClassPathDirEntry::is_rt_jar() {
}
void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
- if (JDK_Version::is_jdk12x_version()) {
- compile_the_world12(loader, THREAD);
- } else {
- compile_the_world13(loader, THREAD);
+ real_jzfile* zip = (real_jzfile*) _zip;
+ tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
+ tty->cr();
+ // Iterate over all entries in zip file
+ for (int n = 0; ; n++) {
+ real_jzentry * ze = (real_jzentry *)((*GetNextEntry)(_zip, n));
+ if (ze == NULL) break;
+ ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
}
if (HAS_PENDING_EXCEPTION) {
if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
@@ -1213,54 +1189,8 @@ void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
}
}
-// Version that works for JDK 1.3.x
-void ClassPathZipEntry::compile_the_world13(Handle loader, TRAPS) {
- real_jzfile13* zip = (real_jzfile13*) _zip;
- tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
- tty->cr();
- // Iterate over all entries in zip file
- for (int n = 0; ; n++) {
- real_jzentry13 * ze = (real_jzentry13 *)((*GetNextEntry)(_zip, n));
- if (ze == NULL) break;
- ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
- }
-}
-
-
-// Version that works for JDK 1.2.x
-void ClassPathZipEntry::compile_the_world12(Handle loader, TRAPS) {
- real_jzfile12* zip = (real_jzfile12*) _zip;
- tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
- tty->cr();
- // Iterate over all entries in zip file
- for (int n = 0; ; n++) {
- real_jzentry12 * ze = (real_jzentry12 *)((*GetNextEntry)(_zip, n));
- if (ze == NULL) break;
- ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
- }
-}
-
bool ClassPathZipEntry::is_rt_jar() {
- if (JDK_Version::is_jdk12x_version()) {
- return is_rt_jar12();
- } else {
- return is_rt_jar13();
- }
-}
-
-// JDK 1.3 version
-bool ClassPathZipEntry::is_rt_jar13() {
- real_jzfile13* zip = (real_jzfile13*) _zip;
- int len = (int)strlen(zip->name);
- // Check whether zip name ends in "rt.jar"
- // This will match other archives named rt.jar as well, but this is
- // only used for debugging.
- return (len >= 6) && (strcasecmp(zip->name + len - 6, "rt.jar") == 0);
-}
-
-// JDK 1.2 version
-bool ClassPathZipEntry::is_rt_jar12() {
- real_jzfile12* zip = (real_jzfile12*) _zip;
+ real_jzfile* zip = (real_jzfile*) _zip;
int len = (int)strlen(zip->name);
// Check whether zip name ends in "rt.jar"
// This will match other archives named rt.jar as well, but this is
diff --git a/hotspot/src/share/vm/classfile/classLoader.hpp b/hotspot/src/share/vm/classfile/classLoader.hpp
index e03cfad1b57..2cfcde6387e 100644
--- a/hotspot/src/share/vm/classfile/classLoader.hpp
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -111,11 +111,7 @@ class ClassPathZipEntry: public ClassPathEntry {
void contents_do(void f(const char* name, void* context), void* context);
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
- NOT_PRODUCT(void compile_the_world12(Handle loader, TRAPS);) // JDK 1.2 version
- NOT_PRODUCT(void compile_the_world13(Handle loader, TRAPS);) // JDK 1.3 version
NOT_PRODUCT(bool is_rt_jar();)
- NOT_PRODUCT(bool is_rt_jar12();)
- NOT_PRODUCT(bool is_rt_jar13();)
};
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp
index bc88beb4343..d04c46b7dde 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp
@@ -57,6 +57,7 @@
#include "memory/metadataFactory.hpp"
#include "memory/metaspaceShared.hpp"
#include "memory/oopFactory.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/jniHandles.hpp"
#include "runtime/mutex.hpp"
#include "runtime/safepoint.hpp"
@@ -549,6 +550,7 @@ bool ClassLoaderData::contains_klass(Klass* klass) {
// GC root of class loader data created.
ClassLoaderData* ClassLoaderDataGraph::_head = NULL;
ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL;
+ClassLoaderData* ClassLoaderDataGraph::_saved_unloading = NULL;
ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL;
bool ClassLoaderDataGraph::_should_purge = false;
@@ -624,6 +626,12 @@ void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* kl
}
}
+void ClassLoaderDataGraph::cld_do(CLDClosure* cl) {
+ for (ClassLoaderData* cld = _head; cl != NULL && cld != NULL; cld = cld->next()) {
+ cl->do_cld(cld);
+ }
+}
+
void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
cld->classes_do(klass_closure);
@@ -650,7 +658,9 @@ void ClassLoaderDataGraph::loaded_classes_do(KlassClosure* klass_closure) {
void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
- for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) {
+ // Only walk the head until any clds not purged from prior unloading
+ // (CMS doesn't purge right away).
+ for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) {
cld->classes_do(f);
}
}
@@ -698,6 +708,11 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
ClassLoaderData* data = _head;
ClassLoaderData* prev = NULL;
bool seen_dead_loader = false;
+
+ // Save previous _unloading pointer for CMS which may add to unloading list before
+ // purging and we don't want to rewalk the previously unloaded class loader data.
+ _saved_unloading = _unloading;
+
// mark metadata seen on the stack and code cache so we can delete
// unneeded entries.
bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.hpp b/hotspot/src/share/vm/classfile/classLoaderData.hpp
index 5be3caa6515..35088a7fbbe 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp
@@ -66,6 +66,7 @@ class ClassLoaderDataGraph : public AllStatic {
static ClassLoaderData* _unloading;
// CMS support.
static ClassLoaderData* _saved_head;
+ static ClassLoaderData* _saved_unloading;
static bool _should_purge;
static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
@@ -77,6 +78,7 @@ class ClassLoaderDataGraph : public AllStatic {
static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
+ static void cld_do(CLDClosure* cl);
static void classes_do(KlassClosure* klass_closure);
static void classes_do(void f(Klass* const));
static void methods_do(void f(Method*));
@@ -186,8 +188,6 @@ class ClassLoaderData : public CHeapObj {
JNIHandleBlock* handles() const;
void set_handles(JNIHandleBlock* handles);
- Mutex* metaspace_lock() const { return _metaspace_lock; }
-
// GC interface.
void clear_claimed() { _claimed = 0; }
bool claimed() const { return _claimed == 1; }
@@ -215,6 +215,8 @@ class ClassLoaderData : public CHeapObj {
return _the_null_class_loader_data;
}
+ Mutex* metaspace_lock() const { return _metaspace_lock; }
+
bool is_anonymous() const { return _is_anonymous; }
static void init_null_class_loader_data() {
diff --git a/hotspot/src/share/vm/classfile/classLoaderStats.cpp b/hotspot/src/share/vm/classfile/classLoaderStats.cpp
new file mode 100644
index 00000000000..4eb98ed321c
--- /dev/null
+++ b/hotspot/src/share/vm/classfile/classLoaderStats.cpp
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "classfile/classLoaderStats.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+
+class ClassStatsClosure : public KlassClosure {
+public:
+ int _num_classes;
+
+ ClassStatsClosure() :
+ _num_classes(0) {
+ }
+
+ virtual void do_klass(Klass* k) {
+ _num_classes++;
+ }
+};
+
+
+void ClassLoaderStatsClosure::do_cld(ClassLoaderData* cld) {
+ oop cl = cld->class_loader();
+ ClassLoaderStats* cls;
+
+ // The hashtable key is the ClassLoader oop since we want to account
+ // for "real" classes and anonymous classes together
+ ClassLoaderStats** cls_ptr = _stats->get(cl);
+ if (cls_ptr == NULL) {
+ cls = new ClassLoaderStats();
+ _stats->put(cl, cls);
+ _total_loaders++;
+ } else {
+ cls = *cls_ptr;
+ }
+
+ if (!cld->is_anonymous()) {
+ cls->_cld = cld;
+ }
+
+ cls->_class_loader = cl;
+ if (cl != NULL) {
+ cls->_parent = java_lang_ClassLoader::parent(cl);
+ addEmptyParents(cls->_parent);
+ }
+
+ ClassStatsClosure csc;
+ cld->classes_do(&csc);
+ if(cld->is_anonymous()) {
+ cls->_anon_classes_count += csc._num_classes;
+ } else {
+ cls->_classes_count = csc._num_classes;
+ }
+ _total_classes += csc._num_classes;
+
+ Metaspace* ms = cld->metaspace_or_null();
+ if (ms != NULL) {
+ if(cld->is_anonymous()) {
+ cls->_anon_chunk_sz += ms->allocated_chunks_bytes();
+ cls->_anon_block_sz += ms->allocated_blocks_bytes();
+ } else {
+ cls->_chunk_sz = ms->allocated_chunks_bytes();
+ cls->_block_sz = ms->allocated_blocks_bytes();
+ }
+ _total_chunk_sz += ms->allocated_chunks_bytes();
+ _total_block_sz += ms->allocated_blocks_bytes();
+ }
+}
+
+
+// Handles the difference in pointer width on 32 and 64 bit platforms
+#ifdef _LP64
+ #define SPACE "%8s"
+#else
+ #define SPACE "%s"
+#endif
+
+
+bool ClassLoaderStatsClosure::do_entry(oop const& key, ClassLoaderStats* const& cls) {
+ Klass* class_loader_klass = (cls->_class_loader == NULL ? NULL : cls->_class_loader->klass());
+ Klass* parent_klass = (cls->_parent == NULL ? NULL : cls->_parent->klass());
+
+ _out->print(INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT " " UINTX_FORMAT_W(6) " " SIZE_FORMAT_W(8) " " SIZE_FORMAT_W(8) " ",
+ p2i(class_loader_klass), p2i(parent_klass), p2i(cls->_cld),
+ cls->_classes_count,
+ cls->_chunk_sz, cls->_block_sz);
+ if (class_loader_klass != NULL) {
+ _out->print("%s", class_loader_klass->external_name());
+ } else {
+ _out->print("");
+ }
+ _out->cr();
+ if (cls->_anon_classes_count > 0) {
+ _out->print_cr(SPACE SPACE SPACE " " UINTX_FORMAT_W(6) " " SIZE_FORMAT_W(8) " " SIZE_FORMAT_W(8) " + unsafe anonymous classes",
+ "", "", "",
+ cls->_anon_classes_count,
+ cls->_anon_chunk_sz, cls->_anon_block_sz);
+ }
+ return true;
+}
+
+
+void ClassLoaderStatsClosure::print() {
+ _out->print_cr("ClassLoader" SPACE " Parent" SPACE " CLD*" SPACE " Classes ChunkSz BlockSz Type", "", "", "");
+ _stats->iterate(this);
+ _out->print("Total = " UINTX_FORMAT_W(-6), _total_loaders);
+ _out->print(SPACE SPACE SPACE " ", "", "", "");
+ _out->print_cr(UINTX_FORMAT_W(6) " " SIZE_FORMAT_W(8) " " SIZE_FORMAT_W(8) " ",
+ _total_classes,
+ _total_chunk_sz,
+ _total_block_sz);
+ _out->print_cr("ChunkSz: Total size of all allocated metaspace chunks");
+ _out->print_cr("BlockSz: Total size of all allocated metaspace blocks (each chunk has several blocks)");
+}
+
+
+void ClassLoaderStatsClosure::addEmptyParents(oop cl) {
+ while (cl != NULL && java_lang_ClassLoader::loader_data(cl) == NULL) {
+ // This classloader has not loaded any classes
+ ClassLoaderStats** cls_ptr = _stats->get(cl);
+ if (cls_ptr == NULL) {
+ // It does not exist in our table - add it
+ ClassLoaderStats* cls = new ClassLoaderStats();
+ cls->_class_loader = cl;
+ cls->_parent = java_lang_ClassLoader::parent(cl);
+ _stats->put(cl, cls);
+ _total_loaders++;
+ }
+
+ cl = java_lang_ClassLoader::parent(cl);
+ }
+}
+
+
+void ClassLoaderStatsVMOperation::doit() {
+ ClassLoaderStatsClosure clsc (_out);
+ ClassLoaderDataGraph::cld_do(&clsc);
+ clsc.print();
+}
+
+
+void ClassLoaderStatsDCmd::execute(DCmdSource source, TRAPS) {
+ ClassLoaderStatsVMOperation op(output());
+ VMThread::execute(&op);
+}
diff --git a/hotspot/src/share/vm/classfile/classLoaderStats.hpp b/hotspot/src/share/vm/classfile/classLoaderStats.hpp
new file mode 100644
index 00000000000..89e0e473b3b
--- /dev/null
+++ b/hotspot/src/share/vm/classfile/classLoaderStats.hpp
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
+#define SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
+
+
+#include "classfile/classLoaderData.hpp"
+#include "oops/klass.hpp"
+#include "oops/oopsHierarchy.hpp"
+#include "runtime/vm_operations.hpp"
+#include "services/diagnosticCommand.hpp"
+#include "utilities/resourceHash.hpp"
+
+
+class ClassLoaderStatsDCmd : public DCmd {
+public:
+ ClassLoaderStatsDCmd(outputStream* output, bool heap) :
+ DCmd(output, heap) {
+ }
+
+ static const char* name() {
+ return "VM.classloader_stats";
+ }
+
+ static const char* description() {
+ return "Print statistics about all ClassLoaders.";
+ }
+
+ static const char* impact() {
+ return "Low";
+ }
+
+ virtual void execute(DCmdSource source, TRAPS);
+
+ static int num_arguments() {
+ return 0;
+ }
+
+ static const JavaPermission permission() {
+ JavaPermission p = {"java.lang.management.ManagementPermission",
+ "monitor", NULL};
+ return p;
+ }
+};
+
+
+class ClassLoaderStats : public ResourceObj {
+public:
+ ClassLoaderData* _cld;
+ oop _class_loader;
+ oop _parent;
+
+ size_t _chunk_sz;
+ size_t _block_sz;
+ uintx _classes_count;
+
+ size_t _anon_chunk_sz;
+ size_t _anon_block_sz;
+ uintx _anon_classes_count;
+
+ ClassLoaderStats() :
+ _cld(0),
+ _class_loader(0),
+ _parent(0),
+ _chunk_sz(0),
+ _block_sz(0),
+ _classes_count(0),
+ _anon_block_sz(0),
+ _anon_chunk_sz(0),
+ _anon_classes_count(0) {
+ }
+};
+
+
+class ClassLoaderStatsClosure : public CLDClosure {
+protected:
+ static bool oop_equals(oop const& s1, oop const& s2) {
+ return s1 == s2;
+ }
+
+ static unsigned oop_hash(oop const& s1) {
+ unsigned hash = (unsigned)((uintptr_t)&s1);
+ return hash ^ (hash >> LogMinObjAlignment);
+ }
+
+ typedef ResourceHashtable StatsTable;
+
+ outputStream* _out;
+ StatsTable* _stats;
+ uintx _total_loaders;
+ uintx _total_classes;
+ size_t _total_chunk_sz;
+ size_t _total_block_sz;
+
+public:
+ ClassLoaderStatsClosure(outputStream* out) :
+ _out(out),
+ _total_loaders(0),
+ _total_block_sz(0),
+ _total_chunk_sz(0),
+ _total_classes(0),
+ _stats(new StatsTable()) {
+ }
+
+ virtual void do_cld(ClassLoaderData* cld);
+ virtual bool do_entry(oop const& key, ClassLoaderStats* const& cls);
+ void print();
+
+private:
+ void addEmptyParents(oop cl);
+};
+
+
+class ClassLoaderStatsVMOperation : public VM_Operation {
+ outputStream* _out;
+
+public:
+ ClassLoaderStatsVMOperation(outputStream* out) :
+ _out(out) {
+ }
+
+ VMOp_Type type() const {
+ return VMOp_ClassLoaderStatsOperation;
+ }
+
+ void doit();
+};
+
+#endif // SHARE_VM_CLASSFILE_CLASSLOADERSTATS_HPP
diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp
index 628ddf910b7..d4fa4642661 100644
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp
@@ -558,7 +558,7 @@ void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) {
}
}
}
- create_mirror(k, Handle(NULL), CHECK);
+ create_mirror(k, Handle(NULL), Handle(NULL), CHECK);
}
void java_lang_Class::initialize_mirror_fields(KlassHandle k,
@@ -578,7 +578,8 @@ void java_lang_Class::initialize_mirror_fields(KlassHandle k,
InstanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, mirror, CHECK);
}
-void java_lang_Class::create_mirror(KlassHandle k, Handle protection_domain, TRAPS) {
+void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
+ Handle protection_domain, TRAPS) {
assert(k->java_mirror() == NULL, "should only assign mirror once");
// Use this moment of initialization to cache modifier_flags also,
// to support Class.getModifiers(). Instance classes recalculate
@@ -633,6 +634,9 @@ void java_lang_Class::create_mirror(KlassHandle k, Handle protection_domain, TRA
}
}
+ // set the classLoader field in the java_lang_Class instance
+ set_class_loader(mirror(), class_loader());
+
// Setup indirection from klass->mirror last
// after any exceptions can happen during allocations.
if (!k.is_null()) {
@@ -694,6 +698,18 @@ void java_lang_Class::set_signers(oop java_class, objArrayOop signers) {
}
+void java_lang_Class::set_class_loader(oop java_class, oop loader) {
+ // jdk7 runs Queens in bootstrapping and jdk8-9 has no coordinated pushes yet.
+ if (_class_loader_offset != 0) {
+ java_class->obj_field_put(_class_loader_offset, loader);
+ }
+}
+
+oop java_lang_Class::class_loader(oop java_class) {
+ assert(_class_loader_offset != 0, "must be set");
+ return java_class->obj_field(_class_loader_offset);
+}
+
oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
// This should be improved by adding a field at the Java level or by
// introducing a new VM klass (see comment in ClassFileParser)
@@ -853,13 +869,17 @@ void java_lang_Class::compute_offsets() {
compute_optional_offset(classRedefinedCount_offset,
klass_oop, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
+ // Needs to be optional because the old build runs Queens during bootstrapping
+ // and jdk8-9 doesn't have coordinated pushes yet.
+ compute_optional_offset(_class_loader_offset,
+ klass_oop, vmSymbols::classLoader_name(),
+ vmSymbols::classloader_signature());
+
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
}
int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
- if (!JDK_Version::is_gte_jdk15x_version()
- || classRedefinedCount_offset == -1) {
- // The classRedefinedCount field is only present starting in 1.5.
+ if (classRedefinedCount_offset == -1) {
// If we don't have an offset for it then just return -1 as a marker.
return -1;
}
@@ -868,9 +888,7 @@ int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
}
void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
- if (!JDK_Version::is_gte_jdk15x_version()
- || classRedefinedCount_offset == -1) {
- // The classRedefinedCount field is only present starting in 1.5.
+ if (classRedefinedCount_offset == -1) {
// If we don't have an offset for it then nothing to set.
return;
}
@@ -1000,9 +1018,7 @@ oop java_lang_Thread::inherited_access_control_context(oop java_thread) {
jlong java_lang_Thread::stackSize(oop java_thread) {
- // The stackSize field is only present starting in 1.4
if (_stackSize_offset > 0) {
- assert(JDK_Version::is_gte_jdk14x_version(), "sanity check");
return java_thread->long_field(_stackSize_offset);
} else {
return 0;
@@ -1078,7 +1094,7 @@ bool java_lang_Thread::set_park_event(oop java_thread, jlong ptr) {
const char* java_lang_Thread::thread_status_name(oop java_thread) {
- assert(JDK_Version::is_gte_jdk15x_version() && _thread_status_offset != 0, "Must have thread status");
+ assert(_thread_status_offset != 0, "Must have thread status");
ThreadStatus status = (java_lang_Thread::ThreadStatus)java_thread->int_field(_thread_status_offset);
switch (status) {
case NEW : return "NEW";
@@ -1217,7 +1233,6 @@ void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {
}
void java_lang_Throwable::clear_stacktrace(oop throwable) {
- assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4");
set_stacktrace(throwable, NULL);
}
@@ -1548,12 +1563,9 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle met
// Start out by clearing the backtrace for this object, in case the VM
// runs out of memory while allocating the stack trace
set_backtrace(throwable(), NULL);
- if (JDK_Version::is_gte_jdk14x_version()) {
- // New since 1.4, clear lazily constructed Java level stacktrace if
- // refilling occurs
- // This is unnecessary in 1.7+ but harmless
- clear_stacktrace(throwable());
- }
+ // Clear lazily constructed Java level stacktrace if refilling occurs
+ // This is unnecessary in 1.7+ but harmless
+ clear_stacktrace(throwable());
int max_depth = MaxJavaStackTraceDepth;
JavaThread* thread = (JavaThread*)THREAD;
@@ -1739,13 +1751,9 @@ void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle t
if (chunk_count >= max_chunks) break;
}
- // For Java 7+ we support the Throwable immutability protocol defined for Java 7. This support
- // was missing in 7u0 so in 7u0 there is a workaround in the Throwable class. That workaround
- // can be removed in a JDK using this JVM version
- if (JDK_Version::is_gte_jdk17x_version()) {
- java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());
- assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");
- }
+ // We support the Throwable immutability protocol defined for Java 7.
+ java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());
+ assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");
}
@@ -3022,8 +3030,7 @@ bool java_lang_ClassLoader::isAncestor(oop loader, oop cl) {
// based on non-null field
// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it
bool java_lang_ClassLoader::parallelCapable(oop class_loader) {
- if (!JDK_Version::is_gte_jdk17x_version()
- || parallelCapable_offset == -1) {
+ if (parallelCapable_offset == -1) {
// Default for backward compatibility is false
return false;
}
@@ -3088,6 +3095,7 @@ int java_lang_Class::_klass_offset;
int java_lang_Class::_array_klass_offset;
int java_lang_Class::_oop_size_offset;
int java_lang_Class::_static_oop_field_count_offset;
+int java_lang_Class::_class_loader_offset;
int java_lang_Class::_protection_domain_offset;
int java_lang_Class::_init_lock_offset;
int java_lang_Class::_signers_offset;
@@ -3219,7 +3227,6 @@ void java_nio_Buffer::compute_offsets() {
void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
if (_owner_offset != 0) return;
- assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
Klass* k = SystemDictionary::abstract_ownable_synchronizer_klass();
compute_offset(_owner_offset, k,
@@ -3309,15 +3316,10 @@ void JavaClasses::compute_offsets() {
java_lang_reflect_Method::compute_offsets();
java_lang_reflect_Constructor::compute_offsets();
java_lang_reflect_Field::compute_offsets();
- if (JDK_Version::is_gte_jdk14x_version()) {
- java_nio_Buffer::compute_offsets();
- }
- if (JDK_Version::is_gte_jdk15x_version()) {
- sun_reflect_ConstantPool::compute_offsets();
- sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
- }
- if (JDK_Version::is_gte_jdk18x_version())
- java_lang_reflect_Parameter::compute_offsets();
+ java_nio_Buffer::compute_offsets();
+ sun_reflect_ConstantPool::compute_offsets();
+ sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
+ java_lang_reflect_Parameter::compute_offsets();
// generated interpreter code wants to know about the offsets we just computed:
AbstractAssembler::update_delayed_values();
@@ -3502,7 +3504,7 @@ void JavaClasses::check_offsets() {
// into merlin "for some time." Without it, the vm will fail with early
// merlin builds.
- if (CheckAssertionStatusDirectives && JDK_Version::is_gte_jdk14x_version()) {
+ if (CheckAssertionStatusDirectives) {
const char* nm = "java/lang/AssertionStatusDirectives";
const char* sig = "[Ljava/lang/String;";
CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classes, sig);
diff --git a/hotspot/src/share/vm/classfile/javaClasses.hpp b/hotspot/src/share/vm/classfile/javaClasses.hpp
index 60c65fe968a..2c25b6e6c51 100644
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp
@@ -240,19 +240,23 @@ class java_lang_Class : AllStatic {
static int _protection_domain_offset;
static int _init_lock_offset;
static int _signers_offset;
+ static int _class_loader_offset;
static bool offsets_computed;
static int classRedefinedCount_offset;
+
static GrowableArray* _fixup_mirror_list;
static void set_init_lock(oop java_class, oop init_lock);
static void set_protection_domain(oop java_class, oop protection_domain);
+ static void set_class_loader(oop java_class, oop class_loader);
static void initialize_mirror_fields(KlassHandle k, Handle mirror, Handle protection_domain, TRAPS);
public:
static void compute_offsets();
// Instance creation
- static void create_mirror(KlassHandle k, Handle protection_domain, TRAPS);
+ static void create_mirror(KlassHandle k, Handle class_loader,
+ Handle protection_domain, TRAPS);
static void fixup_mirror(KlassHandle k, TRAPS);
static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);
// Conversion
@@ -290,6 +294,8 @@ class java_lang_Class : AllStatic {
static objArrayOop signers(oop java_class);
static void set_signers(oop java_class, objArrayOop signers);
+ static oop class_loader(oop java_class);
+
static int oop_size(oop java_class);
static void set_oop_size(oop java_class, int size);
static int static_oop_field_count(oop java_class);
diff --git a/hotspot/src/share/vm/classfile/stringTable.cpp b/hotspot/src/share/vm/classfile/stringTable.cpp
index 07ccbd354dc..4958e5ce7ee 100644
--- a/hotspot/src/share/vm/classfile/stringTable.cpp
+++ b/hotspot/src/share/vm/classfile/stringTable.cpp
@@ -33,6 +33,7 @@
#include "memory/gcLocker.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.inline2.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/hashtable.inline.hpp"
#if INCLUDE_ALL_GCS
diff --git a/hotspot/src/share/vm/classfile/symbolTable.cpp b/hotspot/src/share/vm/classfile/symbolTable.cpp
index dddf271e42a..00761e478ad 100644
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp
@@ -33,6 +33,7 @@
#include "memory/gcLocker.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.inline2.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/hashtable.inline.hpp"
diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp
index d09de41114d..4a6e1c3e377 100644
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp
@@ -997,7 +997,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
if (host_klass.not_null() && k.not_null()) {
- k->set_host_klass(host_klass());
// If it's anonymous, initialize it now, since nobody else will.
{
@@ -1754,8 +1753,6 @@ void SystemDictionary::methods_do(void f(Method*)) {
// Lazily load klasses
void SystemDictionary::load_abstract_ownable_synchronizer_klass(TRAPS) {
- assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
-
// if multiple threads calling this function, only one thread will load
// the class. The other threads will find the loaded version once the
// class is loaded.
diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp
index 4e1b75dc241..f26a9d8c56e 100644
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp
@@ -139,14 +139,13 @@ class Ticks;
do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre ) \
\
/* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \
- /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \
- do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
- do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
+ do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Pre ) \
+ do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Pre ) \
do_klass(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt ) \
- do_klass(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15 ) \
- do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15 ) \
+ do_klass(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt ) \
+ do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt ) \
do_klass(reflect_CallerSensitive_klass, sun_reflect_CallerSensitive, Opt ) \
\
/* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
@@ -169,7 +168,6 @@ class Ticks;
\
/* It's NULL in non-1.4 JDKs. */ \
do_klass(StackTraceElement_klass, java_lang_StackTraceElement, Opt ) \
- /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
do_klass(nio_Buffer_klass, java_nio_Buffer, Opt ) \
\
@@ -209,10 +207,8 @@ class SystemDictionary : AllStatic {
// Options after this point will use resolve_or_null instead.
Opt, // preload tried; NULL if not present
- Opt_Only_JDK14NewRef, // preload tried; use only with NewReflection
- Opt_Only_JDK15, // preload tried; use only with JDK1.5+
OPTION_LIMIT,
- CEIL_LG_OPTION_LIMIT = 4 // OPTION_LIMIT <= (1<instruction_address();
+
+ assert(ic_call != NULL, "ic_call address must be set");
+ assert(nm != NULL, "must pass nmethod");
+ assert(nm->contains(ic_call), "must be in nmethod");
+
+ // Search for the ic_call at the given address.
+ RelocIterator iter(nm, ic_call, ic_call+1);
+ bool ret = iter.next();
+ assert(ret == true, "relocInfo must exist at this address");
+ assert(iter.addr() == ic_call, "must find ic_call");
+ if (iter.type() == relocInfo::virtual_call_type) {
+ virtual_call_Relocation* r = iter.virtual_call_reloc();
+ _is_optimized = false;
+ _value = nativeMovConstReg_at(r->cached_value());
+ } else {
+ assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
+ _is_optimized = true;
+ _value = NULL;
+ }
+}
bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
assert(CompiledIC_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "");
diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp
index 86264436755..795c700fa1b 100644
--- a/hotspot/src/share/vm/code/nmethod.cpp
+++ b/hotspot/src/share/vm/code/nmethod.cpp
@@ -37,6 +37,7 @@
#include "oops/methodData.hpp"
#include "prims/jvmtiRedefineClassesTrace.hpp"
#include "prims/jvmtiImpl.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/sweeper.hpp"
@@ -363,26 +364,29 @@ void nmethod::add_exception_cache_entry(ExceptionCache* new_entry) {
set_exception_cache(new_entry);
}
-void nmethod::remove_from_exception_cache(ExceptionCache* ec) {
+void nmethod::clean_exception_cache(BoolObjectClosure* is_alive) {
ExceptionCache* prev = NULL;
ExceptionCache* curr = exception_cache();
- assert(curr != NULL, "nothing to remove");
- // find the previous and next entry of ec
- while (curr != ec) {
- prev = curr;
- curr = curr->next();
- assert(curr != NULL, "ExceptionCache not found");
- }
- // now: curr == ec
- ExceptionCache* next = curr->next();
- if (prev == NULL) {
- set_exception_cache(next);
- } else {
- prev->set_next(next);
- }
- delete curr;
-}
+ while (curr != NULL) {
+ ExceptionCache* next = curr->next();
+
+ Klass* ex_klass = curr->exception_type();
+ if (ex_klass != NULL && !ex_klass->is_loader_alive(is_alive)) {
+ if (prev == NULL) {
+ set_exception_cache(next);
+ } else {
+ prev->set_next(next);
+ }
+ delete curr;
+ // prev stays the same.
+ } else {
+ prev = curr;
+ }
+
+ curr = next;
+ }
+}
// public method for accessing the exception cache
// These are the public access methods.
@@ -668,8 +672,10 @@ nmethod::nmethod(
_hotness_counter = NMethodSweeper::hotness_counter_reset_val();
code_buffer->copy_values_to(this);
- if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
- CodeCache::add_scavenge_root_nmethod(this);
+ if (ScavengeRootsInCode) {
+ if (detect_scavenge_root_oops()) {
+ CodeCache::add_scavenge_root_nmethod(this);
+ }
Universe::heap()->register_nmethod(this);
}
debug_only(verify_scavenge_root_oops());
@@ -753,8 +759,10 @@ nmethod::nmethod(
_hotness_counter = NMethodSweeper::hotness_counter_reset_val();
code_buffer->copy_values_to(this);
- if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
- CodeCache::add_scavenge_root_nmethod(this);
+ if (ScavengeRootsInCode) {
+ if (detect_scavenge_root_oops()) {
+ CodeCache::add_scavenge_root_nmethod(this);
+ }
Universe::heap()->register_nmethod(this);
}
DEBUG_ONLY(verify_scavenge_root_oops();)
@@ -869,8 +877,10 @@ nmethod::nmethod(
code_buffer->copy_values_to(this);
debug_info->copy_to(this);
dependencies->copy_to(this);
- if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
- CodeCache::add_scavenge_root_nmethod(this);
+ if (ScavengeRootsInCode) {
+ if (detect_scavenge_root_oops()) {
+ CodeCache::add_scavenge_root_nmethod(this);
+ }
Universe::heap()->register_nmethod(this);
}
debug_only(verify_scavenge_root_oops());
@@ -1612,15 +1622,7 @@ void nmethod::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred)
}
// Exception cache
- ExceptionCache* ec = exception_cache();
- while (ec != NULL) {
- Klass* ex_klass = ec->exception_type();
- ExceptionCache* next_ec = ec->next();
- if (ex_klass != NULL && !ex_klass->is_loader_alive(is_alive)) {
- remove_from_exception_cache(ec);
- }
- ec = next_ec;
- }
+ clean_exception_cache(is_alive);
// If class unloading occurred we first iterate over all inline caches and
// clear ICs where the cached oop is referring to an unloaded klass or method.
diff --git a/hotspot/src/share/vm/code/nmethod.hpp b/hotspot/src/share/vm/code/nmethod.hpp
index fa57e9e504d..5ffbde6ad70 100644
--- a/hotspot/src/share/vm/code/nmethod.hpp
+++ b/hotspot/src/share/vm/code/nmethod.hpp
@@ -529,7 +529,7 @@ public:
void set_exception_cache(ExceptionCache *ec) { _exception_cache = ec; }
address handler_for_exception_and_pc(Handle exception, address pc);
void add_handler_for_exception_and_pc(Handle exception, address pc, address handler);
- void remove_from_exception_cache(ExceptionCache* ec);
+ void clean_exception_cache(BoolObjectClosure* is_alive);
// implicit exceptions support
address continuation_for_implicit_exception(address pc);
diff --git a/hotspot/src/share/vm/compiler/compileBroker.cpp b/hotspot/src/share/vm/compiler/compileBroker.cpp
index ff292fbd747..b97a554192d 100644
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp
@@ -36,6 +36,7 @@
#include "oops/oop.inline.hpp"
#include "prims/nativeLookup.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/init.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -589,11 +590,10 @@ void CompileTask::log_task_done(CompileLog* log) {
/**
- * Add a CompileTask to a CompileQueue
+ * Add a CompileTask to a CompileQueue.
*/
void CompileQueue::add(CompileTask* task) {
assert(lock()->owned_by_self(), "must own lock");
- assert(!CompileBroker::is_compilation_disabled_forever(), "Do not add task if compilation is turned off forever");
task->set_next(NULL);
task->set_prev(NULL);
@@ -639,8 +639,11 @@ void CompileQueue::free_all() {
while (next != NULL) {
CompileTask* current = next;
next = current->next();
- // Wake up thread that blocks on the compile task.
- current->lock()->notify();
+ {
+ // Wake up thread that blocks on the compile task.
+ MutexLocker ct_lock(current->lock());
+ current->lock()->notify();
+ }
// Put the task back on the freelist.
CompileTask::free(current);
}
diff --git a/hotspot/src/share/vm/compiler/methodLiveness.cpp b/hotspot/src/share/vm/compiler/methodLiveness.cpp
index 0c1d9b09232..eda1ab156b3 100644
--- a/hotspot/src/share/vm/compiler/methodLiveness.cpp
+++ b/hotspot/src/share/vm/compiler/methodLiveness.cpp
@@ -475,7 +475,7 @@ MethodLivenessResult MethodLiveness::get_liveness_at(int entry_bci) {
bci = 0;
}
- MethodLivenessResult answer((uintptr_t*)NULL,0);
+ MethodLivenessResult answer((BitMap::bm_word_t*)NULL,0);
if (_block_count > 0) {
if (TimeLivenessAnalysis) _time_total.start();
@@ -1000,7 +1000,7 @@ bool MethodLiveness::BasicBlock::merge_exception(BitMap other) {
}
MethodLivenessResult MethodLiveness::BasicBlock::get_liveness_at(ciMethod* method, int bci) {
- MethodLivenessResult answer(NEW_RESOURCE_ARRAY(uintptr_t, _analyzer->bit_map_size_words()),
+ MethodLivenessResult answer(NEW_RESOURCE_ARRAY(BitMap::bm_word_t, _analyzer->bit_map_size_words()),
_analyzer->bit_map_size_bits());
answer.set_is_valid();
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
index 1c9f4cba5f2..5f2b6a6b523 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
@@ -26,6 +26,7 @@
#define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_HPP
#include "memory/genOopClosures.hpp"
+#include "memory/iterator.hpp"
/////////////////////////////////////////////////////////////////
// Closures used by ConcurrentMarkSweepGeneration's collector
@@ -48,33 +49,13 @@ class Par_MarkFromRootsClosure;
} \
}
-// Applies the given oop closure to all oops in all klasses visited.
-class CMKlassClosure : public KlassClosure {
- friend class CMSOopClosure;
- friend class CMSOopsInGenClosure;
-
- OopClosure* _oop_closure;
-
- // Used when _oop_closure couldn't be set in an initialization list.
- void initialize(OopClosure* oop_closure) {
- assert(_oop_closure == NULL, "Should only be called once");
- _oop_closure = oop_closure;
- }
+// TODO: This duplication of the MetadataAwareOopClosure class is only needed
+// because some CMS OopClosures derive from OopsInGenClosure. It would be
+// good to get rid of them completely.
+class MetadataAwareOopsInGenClosure: public OopsInGenClosure {
+ KlassToOopClosure _klass_closure;
public:
- CMKlassClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) { }
-
- void do_klass(Klass* k);
-};
-
-// The base class for all CMS marking closures.
-// It's used to proxy through the metadata to the oops defined in them.
-class CMSOopClosure: public ExtendedOopClosure {
- CMKlassClosure _klass_closure;
- public:
- CMSOopClosure() : ExtendedOopClosure() {
- _klass_closure.initialize(this);
- }
- CMSOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) {
+ MetadataAwareOopsInGenClosure() {
_klass_closure.initialize(this);
}
@@ -87,26 +68,7 @@ class CMSOopClosure: public ExtendedOopClosure {
virtual void do_class_loader_data(ClassLoaderData* cld);
};
-// TODO: This duplication of the CMSOopClosure class is only needed because
-// some CMS OopClosures derive from OopsInGenClosure. It would be good
-// to get rid of them completely.
-class CMSOopsInGenClosure: public OopsInGenClosure {
- CMKlassClosure _klass_closure;
- public:
- CMSOopsInGenClosure() {
- _klass_closure.initialize(this);
- }
-
- virtual bool do_metadata() { return do_metadata_nv(); }
- inline bool do_metadata_nv() { return true; }
-
- virtual void do_klass(Klass* k);
- void do_klass_nv(Klass* k);
-
- virtual void do_class_loader_data(ClassLoaderData* cld);
-};
-
-class MarkRefsIntoClosure: public CMSOopsInGenClosure {
+class MarkRefsIntoClosure: public MetadataAwareOopsInGenClosure {
private:
const MemRegion _span;
CMSBitMap* _bitMap;
@@ -118,7 +80,7 @@ class MarkRefsIntoClosure: public CMSOopsInGenClosure {
virtual void do_oop(narrowOop* p);
};
-class Par_MarkRefsIntoClosure: public CMSOopsInGenClosure {
+class Par_MarkRefsIntoClosure: public MetadataAwareOopsInGenClosure {
private:
const MemRegion _span;
CMSBitMap* _bitMap;
@@ -132,7 +94,7 @@ class Par_MarkRefsIntoClosure: public CMSOopsInGenClosure {
// A variant of the above used in certain kinds of CMS
// marking verification.
-class MarkRefsIntoVerifyClosure: public CMSOopsInGenClosure {
+class MarkRefsIntoVerifyClosure: public MetadataAwareOopsInGenClosure {
private:
const MemRegion _span;
CMSBitMap* _verification_bm;
@@ -147,7 +109,7 @@ class MarkRefsIntoVerifyClosure: public CMSOopsInGenClosure {
};
// The non-parallel version (the parallel version appears further below).
-class PushAndMarkClosure: public CMSOopClosure {
+class PushAndMarkClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
MemRegion _span;
@@ -177,7 +139,7 @@ class PushAndMarkClosure: public CMSOopClosure {
// synchronization (for instance, via CAS). The marking stack
// used in the non-parallel case above is here replaced with
// an OopTaskQueue structure to allow efficient work stealing.
-class Par_PushAndMarkClosure: public CMSOopClosure {
+class Par_PushAndMarkClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
MemRegion _span;
@@ -198,7 +160,7 @@ class Par_PushAndMarkClosure: public CMSOopClosure {
};
// The non-parallel version (the parallel version appears further below).
-class MarkRefsIntoAndScanClosure: public CMSOopsInGenClosure {
+class MarkRefsIntoAndScanClosure: public MetadataAwareOopsInGenClosure {
private:
MemRegion _span;
CMSBitMap* _bit_map;
@@ -239,7 +201,7 @@ class MarkRefsIntoAndScanClosure: public CMSOopsInGenClosure {
// stack and the bitMap are shared, so access needs to be suitably
// synchronized. An OopTaskQueue structure, supporting efficient
// work stealing, replaces a CMSMarkStack for storing grey objects.
-class Par_MarkRefsIntoAndScanClosure: public CMSOopsInGenClosure {
+class Par_MarkRefsIntoAndScanClosure: public MetadataAwareOopsInGenClosure {
private:
MemRegion _span;
CMSBitMap* _bit_map;
@@ -265,7 +227,7 @@ class Par_MarkRefsIntoAndScanClosure: public CMSOopsInGenClosure {
// This closure is used during the concurrent marking phase
// following the first checkpoint. Its use is buried in
// the closure MarkFromRootsClosure.
-class PushOrMarkClosure: public CMSOopClosure {
+class PushOrMarkClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
MemRegion _span;
@@ -298,7 +260,7 @@ class PushOrMarkClosure: public CMSOopClosure {
// This closure is used during the concurrent marking phase
// following the first checkpoint. Its use is buried in
// the closure Par_MarkFromRootsClosure.
-class Par_PushOrMarkClosure: public CMSOopClosure {
+class Par_PushOrMarkClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
MemRegion _whole_span;
@@ -338,7 +300,7 @@ class Par_PushOrMarkClosure: public CMSOopClosure {
// processing phase of the CMS final checkpoint step, as
// well as during the concurrent precleaning of the discovered
// reference lists.
-class CMSKeepAliveClosure: public CMSOopClosure {
+class CMSKeepAliveClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
const MemRegion _span;
@@ -358,7 +320,7 @@ class CMSKeepAliveClosure: public CMSOopClosure {
inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
};
-class CMSInnerParMarkAndPushClosure: public CMSOopClosure {
+class CMSInnerParMarkAndPushClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
MemRegion _span;
@@ -379,7 +341,7 @@ class CMSInnerParMarkAndPushClosure: public CMSOopClosure {
// A parallel (MT) version of the above, used when
// reference processing is parallel; the only difference
// is in the do_oop method.
-class CMSParKeepAliveClosure: public CMSOopClosure {
+class CMSParKeepAliveClosure: public MetadataAwareOopClosure {
private:
MemRegion _span;
OopTaskQueue* _work_queue;
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp
index 499ba4b3bea..2980f0d272f 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp
@@ -44,33 +44,20 @@ inline void Par_MarkRefsIntoAndScanClosure::trim_queue(uint max) {
}
}
-// CMSOopClosure and CMSoopsInGenClosure are duplicated,
+// MetadataAwareOopClosure and MetadataAwareOopsInGenClosure are duplicated,
// until we get rid of OopsInGenClosure.
-inline void CMSOopClosure::do_klass(Klass* k) { do_klass_nv(k); }
-inline void CMSOopsInGenClosure::do_klass(Klass* k) { do_klass_nv(k); }
-
-inline void CMSOopClosure::do_klass_nv(Klass* k) {
- ClassLoaderData* cld = k->class_loader_data();
- do_class_loader_data(cld);
-}
-inline void CMSOopsInGenClosure::do_klass_nv(Klass* k) {
+inline void MetadataAwareOopsInGenClosure::do_klass_nv(Klass* k) {
ClassLoaderData* cld = k->class_loader_data();
do_class_loader_data(cld);
}
+inline void MetadataAwareOopsInGenClosure::do_klass(Klass* k) { do_klass_nv(k); }
-inline void CMSOopClosure::do_class_loader_data(ClassLoaderData* cld) {
+inline void MetadataAwareOopsInGenClosure::do_class_loader_data(ClassLoaderData* cld) {
assert(_klass_closure._oop_closure == this, "Must be");
bool claim = true; // Must claim the class loader data before processing.
cld->oops_do(_klass_closure._oop_closure, &_klass_closure, claim);
}
-inline void CMSOopsInGenClosure::do_class_loader_data(ClassLoaderData* cld) {
- assert(_klass_closure._oop_closure == this, "Must be");
-
- bool claim = true; // Must claim the class loader data before processing.
- cld->oops_do(_klass_closure._oop_closure, &_klass_closure, claim);
-}
-
#endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_CMSOOPCLOSURES_INLINE_HPP
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
index 8cd65e36dca..c0daf2c32ec 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
@@ -49,13 +49,14 @@
#include "memory/genCollectedHeap.hpp"
#include "memory/genMarkSweep.hpp"
#include "memory/genOopClosures.inline.hpp"
-#include "memory/iterator.hpp"
+#include "memory/iterator.inline.hpp"
#include "memory/padded.hpp"
#include "memory/referencePolicy.hpp"
#include "memory/resourceArea.hpp"
#include "memory/tenuredGeneration.hpp"
#include "oops/oop.inline.hpp"
#include "prims/jvmtiExport.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/globals_extension.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/java.hpp"
@@ -2024,7 +2025,7 @@ void CMSCollector::do_compaction_work(bool clear_all_soft_refs) {
SerialOldTracer* gc_tracer = GenMarkSweep::gc_tracer();
gc_tracer->report_gc_start(gch->gc_cause(), gc_timer->gc_start());
- GCTraceTime t("CMS:MSC ", PrintGCDetails && Verbose, true, NULL);
+ GCTraceTime t("CMS:MSC ", PrintGCDetails && Verbose, true, NULL, gc_tracer->gc_id());
if (PrintGC && Verbose && !(GCCause::is_user_requested_gc(gch->gc_cause()))) {
gclog_or_tty->print_cr("Compact ConcurrentMarkSweepGeneration after %d "
"collections passed to foreground collector", _full_gcs_since_conc_gc);
@@ -2534,8 +2535,10 @@ void CMSCollector::collect_in_foreground(bool clear_all_soft_refs, GCCause::Caus
assert(ConcurrentMarkSweepThread::vm_thread_has_cms_token(),
"VM thread should have CMS token");
+ // The gc id is created in register_foreground_gc_start if this collection is synchronous
+ const GCId gc_id = _collectorState == InitialMarking ? GCId::peek() : _gc_tracer_cm->gc_id();
NOT_PRODUCT(GCTraceTime t("CMS:MS (foreground) ", PrintGCDetails && Verbose,
- true, NULL);)
+ true, NULL, gc_id);)
if (UseAdaptiveSizePolicy) {
size_policy()->ms_collection_begin();
}
@@ -3120,7 +3123,7 @@ void CMSCollector::verify_after_remark_work_2() {
// Mark from roots one level into CMS
MarkRefsIntoVerifyClosure notOlder(_span, verification_mark_bm(),
markBitMap());
- CMKlassClosure klass_closure(¬Older);
+ KlassToOopClosure klass_closure(¬Older);
gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel.
gch->gen_process_strong_roots(_cmsGen->level(),
@@ -3538,6 +3541,7 @@ class CMSPhaseAccounting: public StackObj {
public:
CMSPhaseAccounting(CMSCollector *collector,
const char *phase,
+ const GCId gc_id,
bool print_cr = true);
~CMSPhaseAccounting();
@@ -3546,6 +3550,7 @@ class CMSPhaseAccounting: public StackObj {
const char *_phase;
elapsedTimer _wallclock;
bool _print_cr;
+ const GCId _gc_id;
public:
// Not MT-safe; so do not pass around these StackObj's
@@ -3561,15 +3566,15 @@ class CMSPhaseAccounting: public StackObj {
CMSPhaseAccounting::CMSPhaseAccounting(CMSCollector *collector,
const char *phase,
+ const GCId gc_id,
bool print_cr) :
- _collector(collector), _phase(phase), _print_cr(print_cr) {
+ _collector(collector), _phase(phase), _print_cr(print_cr), _gc_id(gc_id) {
if (PrintCMSStatistics != 0) {
_collector->resetYields();
}
if (PrintGCDetails) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(_gc_id);
gclog_or_tty->print_cr("[%s-concurrent-%s-start]",
_collector->cmsGen()->short_name(), _phase);
}
@@ -3583,8 +3588,7 @@ CMSPhaseAccounting::~CMSPhaseAccounting() {
_collector->stopTimer();
_wallclock.stop();
if (PrintGCDetails) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(_gc_id);
gclog_or_tty->print("[%s-concurrent-%s: %3.3f/%3.3f secs]",
_collector->cmsGen()->short_name(),
_phase, _collector->timerValue(), _wallclock.seconds());
@@ -3682,7 +3686,7 @@ void CMSCollector::checkpointRootsInitialWork(bool asynch) {
setup_cms_unloading_and_verification_state();
NOT_PRODUCT(GCTraceTime t("\ncheckpointRootsInitialWork",
- PrintGCDetails && Verbose, true, _gc_timer_cm);)
+ PrintGCDetails && Verbose, true, _gc_timer_cm, _gc_tracer_cm->gc_id());)
if (UseAdaptiveSizePolicy) {
size_policy()->checkpoint_roots_initial_begin();
}
@@ -3740,7 +3744,7 @@ void CMSCollector::checkpointRootsInitialWork(bool asynch) {
gch->set_par_threads(0);
} else {
// The serial version.
- CMKlassClosure klass_closure(¬Older);
+ KlassToOopClosure klass_closure(¬Older);
gch->rem_set()->prepare_for_younger_refs_iterate(false); // Not parallel.
gch->gen_process_strong_roots(_cmsGen->level(),
true, // younger gens are roots
@@ -3799,7 +3803,7 @@ bool CMSCollector::markFromRoots(bool asynch) {
CMSTokenSyncWithLocks ts(true, bitMapLock());
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- CMSPhaseAccounting pa(this, "mark", !PrintGCDetails);
+ CMSPhaseAccounting pa(this, "mark", _gc_tracer_cm->gc_id(), !PrintGCDetails);
res = markFromRootsWork(asynch);
if (res) {
_collectorState = Precleaning;
@@ -4202,7 +4206,7 @@ void CMSConcMarkingTask::do_scan_and_mark(int i, CompactibleFreeListSpace* sp) {
pst->all_tasks_completed();
}
-class Par_ConcMarkingClosure: public CMSOopClosure {
+class Par_ConcMarkingClosure: public MetadataAwareOopClosure {
private:
CMSCollector* _collector;
CMSConcMarkingTask* _task;
@@ -4215,7 +4219,7 @@ class Par_ConcMarkingClosure: public CMSOopClosure {
public:
Par_ConcMarkingClosure(CMSCollector* collector, CMSConcMarkingTask* task, OopTaskQueue* work_queue,
CMSBitMap* bit_map, CMSMarkStack* overflow_stack):
- CMSOopClosure(collector->ref_processor()),
+ MetadataAwareOopClosure(collector->ref_processor()),
_collector(collector),
_task(task),
_span(collector->_span),
@@ -4522,7 +4526,7 @@ void CMSCollector::preclean() {
_start_sampling = false;
}
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- CMSPhaseAccounting pa(this, "preclean", !PrintGCDetails);
+ CMSPhaseAccounting pa(this, "preclean", _gc_tracer_cm->gc_id(), !PrintGCDetails);
preclean_work(CMSPrecleanRefLists1, CMSPrecleanSurvivors1);
}
CMSTokenSync x(true); // is cms thread
@@ -4551,7 +4555,7 @@ void CMSCollector::abortable_preclean() {
// we will never do an actual abortable preclean cycle.
if (get_eden_used() > CMSScheduleRemarkEdenSizeThreshold) {
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- CMSPhaseAccounting pa(this, "abortable-preclean", !PrintGCDetails);
+ CMSPhaseAccounting pa(this, "abortable-preclean", _gc_tracer_cm->gc_id(), !PrintGCDetails);
// We need more smarts in the abortable preclean
// loop below to deal with cases where allocation
// in young gen is very very slow, and our precleaning
@@ -4696,7 +4700,7 @@ size_t CMSCollector::preclean_work(bool clean_refs, bool clean_survivor) {
GCTimer *gc_timer = NULL; // Currently not tracing concurrent phases
rp->preclean_discovered_references(
rp->is_alive_non_header(), &keep_alive, &complete_trace, &yield_cl,
- gc_timer);
+ gc_timer, _gc_tracer_cm->gc_id());
}
if (clean_survivor) { // preclean the active survivor space(s)
@@ -4986,7 +4990,7 @@ size_t CMSCollector::preclean_card_table(ConcurrentMarkSweepGeneration* gen,
}
class PrecleanKlassClosure : public KlassClosure {
- CMKlassClosure _cm_klass_closure;
+ KlassToOopClosure _cm_klass_closure;
public:
PrecleanKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {}
void do_klass(Klass* k) {
@@ -5039,7 +5043,7 @@ void CMSCollector::checkpointRootsFinal(bool asynch,
// expect it to be false and set to true
FlagSetting fl(gch->_is_gc_active, false);
NOT_PRODUCT(GCTraceTime t("Scavenge-Before-Remark",
- PrintGCDetails && Verbose, true, _gc_timer_cm);)
+ PrintGCDetails && Verbose, true, _gc_timer_cm, _gc_tracer_cm->gc_id());)
int level = _cmsGen->level() - 1;
if (level >= 0) {
gch->do_collection(true, // full (i.e. force, see below)
@@ -5068,7 +5072,7 @@ void CMSCollector::checkpointRootsFinal(bool asynch,
void CMSCollector::checkpointRootsFinalWork(bool asynch,
bool clear_all_soft_refs, bool init_mark_was_synchronous) {
- NOT_PRODUCT(GCTraceTime tr("checkpointRootsFinalWork", PrintGCDetails, false, _gc_timer_cm);)
+ NOT_PRODUCT(GCTraceTime tr("checkpointRootsFinalWork", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());)
assert(haveFreelistLocks(), "must have free list locks");
assert_lock_strong(bitMapLock());
@@ -5123,11 +5127,11 @@ void CMSCollector::checkpointRootsFinalWork(bool asynch,
// the most recent young generation GC, minus those cleaned up by the
// concurrent precleaning.
if (CMSParallelRemarkEnabled && CollectedHeap::use_parallel_gc_threads()) {
- GCTraceTime t("Rescan (parallel) ", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("Rescan (parallel) ", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
do_remark_parallel();
} else {
GCTraceTime t("Rescan (non-parallel) ", PrintGCDetails, false,
- _gc_timer_cm);
+ _gc_timer_cm, _gc_tracer_cm->gc_id());
do_remark_non_parallel();
}
}
@@ -5140,7 +5144,7 @@ void CMSCollector::checkpointRootsFinalWork(bool asynch,
verify_overflow_empty();
{
- NOT_PRODUCT(GCTraceTime ts("refProcessingWork", PrintGCDetails, false, _gc_timer_cm);)
+ NOT_PRODUCT(GCTraceTime ts("refProcessingWork", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());)
refProcessingWork(asynch, clear_all_soft_refs);
}
verify_work_stacks_empty();
@@ -5224,7 +5228,7 @@ void CMSParInitialMarkTask::work(uint worker_id) {
_timer.start();
GenCollectedHeap* gch = GenCollectedHeap::heap();
Par_MarkRefsIntoClosure par_mri_cl(_collector->_span, &(_collector->_markBitMap));
- CMKlassClosure klass_closure(&par_mri_cl);
+ KlassToOopClosure klass_closure(&par_mri_cl);
// ---------- young gen roots --------------
{
@@ -5298,7 +5302,7 @@ class CMSParRemarkTask: public CMSParMarkTask {
};
class RemarkKlassClosure : public KlassClosure {
- CMKlassClosure _cm_klass_closure;
+ KlassToOopClosure _cm_klass_closure;
public:
RemarkKlassClosure(OopClosure* oop_closure) : _cm_klass_closure(oop_closure) {}
void do_klass(Klass* k) {
@@ -5921,7 +5925,7 @@ void CMSCollector::do_remark_non_parallel() {
NULL, // space is set further below
&_markBitMap, &_markStack, &mrias_cl);
{
- GCTraceTime t("grey object rescan", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("grey object rescan", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
// Iterate over the dirty cards, setting the corresponding bits in the
// mod union table.
{
@@ -5958,7 +5962,7 @@ void CMSCollector::do_remark_non_parallel() {
Universe::verify();
}
{
- GCTraceTime t("root rescan", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("root rescan", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
verify_work_stacks_empty();
@@ -5978,7 +5982,7 @@ void CMSCollector::do_remark_non_parallel() {
}
{
- GCTraceTime t("visit unhandled CLDs", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("visit unhandled CLDs", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
verify_work_stacks_empty();
@@ -5997,7 +6001,7 @@ void CMSCollector::do_remark_non_parallel() {
}
{
- GCTraceTime t("dirty klass scan", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("dirty klass scan", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
verify_work_stacks_empty();
@@ -6199,7 +6203,7 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
_span, &_markBitMap, &_markStack,
&cmsKeepAliveClosure, false /* !preclean */);
{
- GCTraceTime t("weak refs processing", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("weak refs processing", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
ReferenceProcessorStats stats;
if (rp->processing_is_mt()) {
@@ -6224,13 +6228,15 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
&cmsKeepAliveClosure,
&cmsDrainMarkingStackClosure,
&task_executor,
- _gc_timer_cm);
+ _gc_timer_cm,
+ _gc_tracer_cm->gc_id());
} else {
stats = rp->process_discovered_references(&_is_alive_closure,
&cmsKeepAliveClosure,
&cmsDrainMarkingStackClosure,
NULL,
- _gc_timer_cm);
+ _gc_timer_cm,
+ _gc_tracer_cm->gc_id());
}
_gc_tracer_cm->report_gc_reference_stats(stats);
@@ -6241,7 +6247,7 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
if (should_unload_classes()) {
{
- GCTraceTime t("class unloading", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("class unloading", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
// Unload classes and purge the SystemDictionary.
bool purged_class = SystemDictionary::do_unloading(&_is_alive_closure);
@@ -6254,7 +6260,7 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
}
{
- GCTraceTime t("scrub symbol table", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("scrub symbol table", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
// Clean up unreferenced symbols in symbol table.
SymbolTable::unlink();
}
@@ -6263,7 +6269,7 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
// CMS doesn't use the StringTable as hard roots when class unloading is turned off.
// Need to check if we really scanned the StringTable.
if ((roots_scanning_options() & SharedHeap::SO_Strings) == 0) {
- GCTraceTime t("scrub string table", PrintGCDetails, false, _gc_timer_cm);
+ GCTraceTime t("scrub string table", PrintGCDetails, false, _gc_timer_cm, _gc_tracer_cm->gc_id());
// Delete entries for dead interned strings.
StringTable::unlink(&_is_alive_closure);
}
@@ -6330,7 +6336,7 @@ void CMSCollector::sweep(bool asynch) {
_intra_sweep_timer.start();
if (asynch) {
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- CMSPhaseAccounting pa(this, "sweep", !PrintGCDetails);
+ CMSPhaseAccounting pa(this, "sweep", _gc_tracer_cm->gc_id(), !PrintGCDetails);
// First sweep the old gen
{
CMSTokenSyncWithLocks ts(true, _cmsGen->freelistLock(),
@@ -6551,7 +6557,7 @@ void CMSCollector::reset(bool asynch) {
// Clear the mark bitmap (no grey objects to start with)
// for the next cycle.
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- CMSPhaseAccounting cmspa(this, "reset", !PrintGCDetails);
+ CMSPhaseAccounting cmspa(this, "reset", _gc_tracer_cm->gc_id(), !PrintGCDetails);
HeapWord* curAddr = _markBitMap.startWord();
while (curAddr < _markBitMap.endWord()) {
@@ -6617,7 +6623,7 @@ void CMSCollector::reset(bool asynch) {
void CMSCollector::do_CMS_operation(CMS_op_type op, GCCause::Cause gc_cause) {
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- GCTraceTime t(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
+ GCTraceTime t(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer_cm->gc_id());
TraceCollectorStats tcs(counters());
switch (op) {
@@ -7735,7 +7741,7 @@ PushAndMarkVerifyClosure::PushAndMarkVerifyClosure(
CMSCollector* collector, MemRegion span,
CMSBitMap* verification_bm, CMSBitMap* cms_bm,
CMSMarkStack* mark_stack):
- CMSOopClosure(collector->ref_processor()),
+ MetadataAwareOopClosure(collector->ref_processor()),
_collector(collector),
_span(span),
_verification_bm(verification_bm),
@@ -7788,7 +7794,7 @@ PushOrMarkClosure::PushOrMarkClosure(CMSCollector* collector,
MemRegion span,
CMSBitMap* bitMap, CMSMarkStack* markStack,
HeapWord* finger, MarkFromRootsClosure* parent) :
- CMSOopClosure(collector->ref_processor()),
+ MetadataAwareOopClosure(collector->ref_processor()),
_collector(collector),
_span(span),
_bitMap(bitMap),
@@ -7805,7 +7811,7 @@ Par_PushOrMarkClosure::Par_PushOrMarkClosure(CMSCollector* collector,
HeapWord* finger,
HeapWord** global_finger_addr,
Par_MarkFromRootsClosure* parent) :
- CMSOopClosure(collector->ref_processor()),
+ MetadataAwareOopClosure(collector->ref_processor()),
_collector(collector),
_whole_span(collector->_span),
_span(span),
@@ -7854,11 +7860,6 @@ void Par_PushOrMarkClosure::handle_stack_overflow(HeapWord* lost) {
_overflow_stack->expand(); // expand the stack if possible
}
-void CMKlassClosure::do_klass(Klass* k) {
- assert(_oop_closure != NULL, "Not initialized?");
- k->oops_do(_oop_closure);
-}
-
void PushOrMarkClosure::do_oop(oop obj) {
// Ignore mark word because we are running concurrent with mutators.
assert(obj->is_oop_or_null(true), "expected an oop or NULL");
@@ -7956,7 +7957,7 @@ PushAndMarkClosure::PushAndMarkClosure(CMSCollector* collector,
CMSBitMap* mod_union_table,
CMSMarkStack* mark_stack,
bool concurrent_precleaning):
- CMSOopClosure(rp),
+ MetadataAwareOopClosure(rp),
_collector(collector),
_span(span),
_bit_map(bit_map),
@@ -8029,7 +8030,7 @@ Par_PushAndMarkClosure::Par_PushAndMarkClosure(CMSCollector* collector,
ReferenceProcessor* rp,
CMSBitMap* bit_map,
OopTaskQueue* work_queue):
- CMSOopClosure(rp),
+ MetadataAwareOopClosure(rp),
_collector(collector),
_span(span),
_bit_map(bit_map),
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
index 09740b6d57c..7e3ef58605f 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
@@ -1444,7 +1444,7 @@ class Par_MarkFromRootsClosure: public BitMapClosure {
// The following closures are used to do certain kinds of verification of
// CMS marking.
-class PushAndMarkVerifyClosure: public CMSOopClosure {
+class PushAndMarkVerifyClosure: public MetadataAwareOopClosure {
CMSCollector* _collector;
MemRegion _span;
CMSBitMap* _verification_bm;
diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp
index ca1a1124643..1b23ecbb554 100644
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp
@@ -56,7 +56,7 @@ void VM_CMS_Operation::release_and_notify_pending_list_lock() {
void VM_CMS_Operation::verify_before_gc() {
if (VerifyBeforeGC &&
GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
- GCTraceTime tm("Verify Before", false, false, _collector->_gc_timer_cm);
+ GCTraceTime tm("Verify Before", false, false, _collector->_gc_timer_cm, _collector->_gc_tracer_cm->gc_id());
HandleMark hm;
FreelistLocker x(_collector);
MutexLockerEx y(_collector->bitMapLock(), Mutex::_no_safepoint_check_flag);
@@ -68,7 +68,7 @@ void VM_CMS_Operation::verify_before_gc() {
void VM_CMS_Operation::verify_after_gc() {
if (VerifyAfterGC &&
GenCollectedHeap::heap()->total_collections() >= VerifyGCStartAt) {
- GCTraceTime tm("Verify After", false, false, _collector->_gc_timer_cm);
+ GCTraceTime tm("Verify After", false, false, _collector->_gc_timer_cm, _collector->_gc_tracer_cm->gc_id());
HandleMark hm;
FreelistLocker x(_collector);
MutexLockerEx y(_collector->bitMapLock(), Mutex::_no_safepoint_check_flag);
diff --git a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
index 07b92d0fbe5..b1d255051be 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/g1/g1CollectorPolicy.hpp"
#include "gc_implementation/g1/g1ErgoVerbose.hpp"
#include "memory/space.inline.hpp"
+#include "runtime/atomic.inline.hpp"
// Even though we don't use the GC efficiency in our heuristics as
// much as we used to, we still order according to GC efficiency. This
diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
index 24c62d775bd..aba4dbb11f3 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp
@@ -45,6 +45,7 @@
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/java.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/prefetch.inline.hpp"
#include "services/memTracker.hpp"
@@ -127,7 +128,7 @@ bool CMBitMap::allocate(ReservedSpace heap_rs) {
}
assert(_virtual_space.committed_size() == brs.size(),
"didn't reserve backing store for all of concurrent marking bit map?");
- _bm.set_map((uintptr_t*)_virtual_space.low());
+ _bm.set_map((BitMap::bm_word_t*)_virtual_space.low());
assert(_virtual_space.committed_size() << (_shifter + LogBitsPerByte) >=
_bmWordSize, "inconsistency in bit map sizing");
_bm.set_size(_bmWordSize >> _shifter);
@@ -511,6 +512,7 @@ ConcurrentMark::ConcurrentMark(G1CollectedHeap* g1h, ReservedSpace heap_rs) :
_has_overflown(false),
_concurrent(false),
_has_aborted(false),
+ _aborted_gc_id(GCId::undefined()),
_restart_for_overflow(false),
_concurrent_marking_in_progress(false),
@@ -1020,8 +1022,7 @@ void ConcurrentMark::enter_first_sync_barrier(uint worker_id) {
force_overflow()->update();
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-mark-reset-for-overflow]");
}
}
@@ -2469,7 +2470,7 @@ void ConcurrentMark::weakRefsWork(bool clear_all_soft_refs) {
if (G1Log::finer()) {
gclog_or_tty->put(' ');
}
- GCTraceTime t("GC ref-proc", G1Log::finer(), false, g1h->gc_timer_cm());
+ GCTraceTime t("GC ref-proc", G1Log::finer(), false, g1h->gc_timer_cm(), concurrent_gc_id());
ReferenceProcessor* rp = g1h->ref_processor_cm();
@@ -2526,7 +2527,8 @@ void ConcurrentMark::weakRefsWork(bool clear_all_soft_refs) {
&g1_keep_alive,
&g1_drain_mark_stack,
executor,
- g1h->gc_timer_cm());
+ g1h->gc_timer_cm(),
+ concurrent_gc_id());
g1h->gc_tracer_cm()->report_gc_reference_stats(stats);
// The do_oop work routines of the keep_alive and drain_marking_stack
@@ -3261,6 +3263,12 @@ void ConcurrentMark::abort() {
}
_first_overflow_barrier_sync.abort();
_second_overflow_barrier_sync.abort();
+ const GCId& gc_id = _g1h->gc_tracer_cm()->gc_id();
+ if (!gc_id.is_undefined()) {
+ // We can do multiple full GCs before ConcurrentMarkThread::run() gets a chance
+ // to detect that it was aborted. Only keep track of the first GC id that we aborted.
+ _aborted_gc_id = gc_id;
+ }
_has_aborted = true;
SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
@@ -3275,6 +3283,13 @@ void ConcurrentMark::abort() {
_g1h->register_concurrent_cycle_end();
}
+const GCId& ConcurrentMark::concurrent_gc_id() {
+ if (has_aborted()) {
+ return _aborted_gc_id;
+ }
+ return _g1h->gc_tracer_cm()->gc_id();
+}
+
static void print_ms_time_info(const char* prefix, const char* name,
NumberSeq& ns) {
gclog_or_tty->print_cr("%s%5d %12s: total time = %8.2f s (avg = %8.2f ms).",
diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
index 9d049a2a255..1e4ad366c75 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp
@@ -26,6 +26,7 @@
#define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP
#include "gc_implementation/g1/heapRegionSet.hpp"
+#include "gc_implementation/shared/gcId.hpp"
#include "utilities/taskqueue.hpp"
class G1CollectedHeap;
@@ -444,6 +445,7 @@ protected:
volatile bool _concurrent;
// Set at the end of a Full GC so that marking aborts
volatile bool _has_aborted;
+ GCId _aborted_gc_id;
// Used when remark aborts due to an overflow to indicate that
// another concurrent marking phase should start
@@ -824,6 +826,8 @@ public:
bool has_aborted() { return _has_aborted; }
+ const GCId& concurrent_gc_id();
+
// This prints the global/local fingers. It is used for debugging.
NOT_PRODUCT(void print_finger();)
diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
index ad11c016e66..f8392143db8 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
@@ -1,4 +1,4 @@
-/*
+ /*
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -29,6 +29,7 @@
#include "gc_implementation/g1/g1Log.hpp"
#include "gc_implementation/g1/g1MMUTracker.hpp"
#include "gc_implementation/g1/vm_operations_g1.hpp"
+#include "gc_implementation/shared/gcTrace.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/vmThread.hpp"
@@ -111,8 +112,7 @@ void ConcurrentMarkThread::run() {
double scan_start = os::elapsedTime();
if (!cm()->has_aborted()) {
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-root-region-scan-start]");
}
@@ -120,8 +120,7 @@ void ConcurrentMarkThread::run() {
double scan_end = os::elapsedTime();
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-root-region-scan-end, %1.7lf secs]",
scan_end - scan_start);
}
@@ -129,8 +128,7 @@ void ConcurrentMarkThread::run() {
double mark_start_sec = os::elapsedTime();
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-mark-start]");
}
@@ -153,8 +151,7 @@ void ConcurrentMarkThread::run() {
}
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-mark-end, %1.7lf secs]",
mark_end_sec - mark_start_sec);
}
@@ -169,8 +166,7 @@ void ConcurrentMarkThread::run() {
"in remark (restart #%d).", iter);
}
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-mark-restart-for-overflow]");
}
}
@@ -213,8 +209,7 @@ void ConcurrentMarkThread::run() {
double cleanup_start_sec = os::elapsedTime();
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-cleanup-start]");
}
@@ -234,8 +229,7 @@ void ConcurrentMarkThread::run() {
double cleanup_end_sec = os::elapsedTime();
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-cleanup-end, %1.7lf secs]",
cleanup_end_sec - cleanup_start_sec);
}
@@ -276,8 +270,7 @@ void ConcurrentMarkThread::run() {
if (cm()->has_aborted()) {
if (G1Log::fine()) {
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(cm()->concurrent_gc_id());
gclog_or_tty->print_cr("[GC concurrent-mark-abort]");
}
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
index 6e84e514aa7..32b1f763f25 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
@@ -26,7 +26,7 @@
#include "gc_implementation/g1/dirtyCardQueue.hpp"
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
#include "gc_implementation/g1/heapRegionRemSet.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/safepoint.hpp"
#include "runtime/thread.inline.hpp"
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp
index 14d0126e224..c07fa50f04d 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
+#include "gc_implementation/g1/heapRegion.hpp"
#include "memory/space.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/java.hpp"
@@ -98,6 +99,20 @@ bool G1BlockOffsetSharedArray::is_card_boundary(HeapWord* p) const {
return (delta & right_n_bits(LogN_words)) == (size_t)NoBits;
}
+void G1BlockOffsetSharedArray::set_offset_array(HeapWord* left, HeapWord* right, u_char offset) {
+ check_index(index_for(right - 1), "right address out of range");
+ assert(left < right, "Heap addresses out of order");
+ size_t num_cards = pointer_delta(right, left) >> LogN_words;
+ if (UseMemSetInBOT) {
+ memset(&_offset_array[index_for(left)], offset, num_cards);
+ } else {
+ size_t i = index_for(left);
+ const size_t end = i + num_cards;
+ for (; i < end; i++) {
+ _offset_array[i] = offset;
+ }
+ }
+}
//////////////////////////////////////////////////////////////////////
// G1BlockOffsetArray
@@ -107,7 +122,7 @@ G1BlockOffsetArray::G1BlockOffsetArray(G1BlockOffsetSharedArray* array,
MemRegion mr, bool init_to_zero) :
G1BlockOffsetTable(mr.start(), mr.end()),
_unallocated_block(_bottom),
- _array(array), _csp(NULL),
+ _array(array), _gsp(NULL),
_init_to_zero(init_to_zero) {
assert(_bottom <= _end, "arguments out of order");
if (!_init_to_zero) {
@@ -117,9 +132,8 @@ G1BlockOffsetArray::G1BlockOffsetArray(G1BlockOffsetSharedArray* array,
}
}
-void G1BlockOffsetArray::set_space(Space* sp) {
- _sp = sp;
- _csp = sp->toContiguousSpace();
+void G1BlockOffsetArray::set_space(G1OffsetTableContigSpace* sp) {
+ _gsp = sp;
}
// The arguments follow the normal convention of denoting
@@ -378,7 +392,7 @@ G1BlockOffsetArray::block_start_unsafe_const(const void* addr) const {
}
// Otherwise, find the block start using the table.
HeapWord* q = block_at_or_preceding(addr, false, 0);
- HeapWord* n = q + _sp->block_size(q);
+ HeapWord* n = q + block_size(q);
return forward_to_block_containing_addr_const(q, n, addr);
}
@@ -406,31 +420,17 @@ G1BlockOffsetArray::forward_to_block_containing_addr_slow(HeapWord* q,
err_msg("next_boundary is beyond the end of the covered region "
" next_boundary " PTR_FORMAT " _array->_end " PTR_FORMAT,
next_boundary, _array->_end));
- if (csp() != NULL) {
- if (addr >= csp()->top()) return csp()->top();
- while (next_boundary < addr) {
- while (n <= next_boundary) {
- q = n;
- oop obj = oop(q);
- if (obj->klass_or_null() == NULL) return q;
- n += obj->size();
- }
- assert(q <= next_boundary && n > next_boundary, "Consequence of loop");
- // [q, n) is the block that crosses the boundary.
- alloc_block_work2(&next_boundary, &next_index, q, n);
- }
- } else {
- while (next_boundary < addr) {
- while (n <= next_boundary) {
- q = n;
- oop obj = oop(q);
- if (obj->klass_or_null() == NULL) return q;
- n += _sp->block_size(q);
- }
- assert(q <= next_boundary && n > next_boundary, "Consequence of loop");
- // [q, n) is the block that crosses the boundary.
- alloc_block_work2(&next_boundary, &next_index, q, n);
+ if (addr >= gsp()->top()) return gsp()->top();
+ while (next_boundary < addr) {
+ while (n <= next_boundary) {
+ q = n;
+ oop obj = oop(q);
+ if (obj->klass_or_null() == NULL) return q;
+ n += obj->size();
}
+ assert(q <= next_boundary && n > next_boundary, "Consequence of loop");
+ // [q, n) is the block that crosses the boundary.
+ alloc_block_work2(&next_boundary, &next_index, q, n);
}
return forward_to_block_containing_addr_const(q, n, addr);
}
@@ -637,7 +637,7 @@ block_start_unsafe_const(const void* addr) const {
assert(_bottom <= addr && addr < _end,
"addr must be covered by this Array");
HeapWord* q = block_at_or_preceding(addr, true, _next_offset_index-1);
- HeapWord* n = q + _sp->block_size(q);
+ HeapWord* n = q + block_size(q);
return forward_to_block_containing_addr_const(q, n, addr);
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp
index 56dca4d26f8..5395899f143 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp
@@ -52,8 +52,8 @@
// consolidation.
// Forward declarations
-class ContiguousSpace;
class G1BlockOffsetSharedArray;
+class G1OffsetTableContigSpace;
class G1BlockOffsetTable VALUE_OBJ_CLASS_SPEC {
friend class VMStructs;
@@ -157,6 +157,8 @@ private:
return _offset_array[index];
}
+ void set_offset_array(HeapWord* left, HeapWord* right, u_char offset);
+
void set_offset_array(size_t index, u_char offset) {
check_index(index, "index out of range");
check_offset(offset, "offset too large");
@@ -170,21 +172,6 @@ private:
_offset_array[index] = (u_char) pointer_delta(high, low);
}
- void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) {
- check_index(index_for(right - 1), "right address out of range");
- assert(left < right, "Heap addresses out of order");
- size_t num_cards = pointer_delta(right, left) >> LogN_words;
- if (UseMemSetInBOT) {
- memset(&_offset_array[index_for(left)], offset, num_cards);
- } else {
- size_t i = index_for(left);
- const size_t end = i + num_cards;
- for (; i < end; i++) {
- _offset_array[i] = offset;
- }
- }
- }
-
void set_offset_array(size_t left, size_t right, u_char offset) {
check_index(right, "right index out of range");
assert(left <= right, "indexes out of order");
@@ -281,11 +268,7 @@ private:
G1BlockOffsetSharedArray* _array;
// The space that owns this subregion.
- Space* _sp;
-
- // If "_sp" is a contiguous space, the field below is the view of "_sp"
- // as a contiguous space, else NULL.
- ContiguousSpace* _csp;
+ G1OffsetTableContigSpace* _gsp;
// If true, array entries are initialized to 0; otherwise, they are
// initialized to point backwards to the beginning of the covered region.
@@ -310,7 +293,9 @@ private:
protected:
- ContiguousSpace* csp() const { return _csp; }
+ G1OffsetTableContigSpace* gsp() const { return _gsp; }
+
+ inline size_t block_size(const HeapWord* p) const;
// Returns the address of a block whose start is at most "addr".
// If "has_max_index" is true, "assumes "max_index" is the last valid one
@@ -363,7 +348,7 @@ public:
// "this" to be passed as a parameter to a member constructor for
// the containing concrete subtype of Space.
// This would be legal C++, but MS VC++ doesn't allow it.
- void set_space(Space* sp);
+ void set_space(G1OffsetTableContigSpace* sp);
// Resets the covered region to the given "mr".
void set_region(MemRegion mr);
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp
index 5ae3bc1cdeb..24f97f35dcb 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp
@@ -26,6 +26,7 @@
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1BLOCKOFFSETTABLE_INLINE_HPP
#include "gc_implementation/g1/g1BlockOffsetTable.hpp"
+#include "gc_implementation/g1/heapRegion.hpp"
#include "memory/space.hpp"
inline HeapWord* G1BlockOffsetTable::block_start(const void* addr) {
@@ -69,6 +70,11 @@ G1BlockOffsetSharedArray::address_for_index(size_t index) const {
return result;
}
+inline size_t
+G1BlockOffsetArray::block_size(const HeapWord* p) const {
+ return gsp()->block_size(p);
+}
+
inline HeapWord*
G1BlockOffsetArray::block_at_or_preceding(const void* addr,
bool has_max_index,
@@ -88,7 +94,7 @@ G1BlockOffsetArray::block_at_or_preceding(const void* addr,
// to go back by.
size_t n_cards_back = BlockOffsetArray::entry_to_cards_back(offset);
q -= (N_words * n_cards_back);
- assert(q >= _sp->bottom(), "Went below bottom!");
+ assert(q >= gsp()->bottom(), "Went below bottom!");
index -= n_cards_back;
offset = _array->offset_array(index);
}
@@ -101,21 +107,12 @@ inline HeapWord*
G1BlockOffsetArray::
forward_to_block_containing_addr_const(HeapWord* q, HeapWord* n,
const void* addr) const {
- if (csp() != NULL) {
- if (addr >= csp()->top()) return csp()->top();
- while (n <= addr) {
- q = n;
- oop obj = oop(q);
- if (obj->klass_or_null() == NULL) return q;
- n += obj->size();
- }
- } else {
- while (n <= addr) {
- q = n;
- oop obj = oop(q);
- if (obj->klass_or_null() == NULL) return q;
- n += _sp->block_size(q);
- }
+ if (addr >= gsp()->top()) return gsp()->top();
+ while (n <= addr) {
+ q = n;
+ oop obj = oop(q);
+ if (obj->klass_or_null() == NULL) return q;
+ n += obj->size();
}
assert(q <= n, "wrong order for q and addr");
assert(addr < n, "wrong order for addr and n");
@@ -126,7 +123,7 @@ inline HeapWord*
G1BlockOffsetArray::forward_to_block_containing_addr(HeapWord* q,
const void* addr) {
if (oop(q)->klass_or_null() == NULL) return q;
- HeapWord* n = q + _sp->block_size(q);
+ HeapWord* n = q + block_size(q);
// In the normal case, where the query "addr" is a card boundary, and the
// offset table chunks are the same size as cards, the block starting at
// "q" will contain addr, so the test below will fail, and we'll fall
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
index a1dbb6f1b18..f020f0d53a1 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
@@ -62,6 +62,7 @@
#include "memory/referenceProcessor.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/prefetch.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/vmThread.hpp"
@@ -433,14 +434,6 @@ HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
return hr;
}
-void G1CollectedHeap::stop_conc_gc_threads() {
- _cg1r->stop();
- _cmThread->stop();
- if (G1StringDedup::is_enabled()) {
- G1StringDedup::stop();
- }
-}
-
#ifdef ASSERT
// A region is added to the collection set as it is retired
// so an address p can point to a region which will be in the
@@ -1306,7 +1299,7 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
{
- GCTraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, NULL);
+ GCTraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, NULL, gc_tracer->gc_id());
TraceCollectorStats tcs(g1mm()->full_collection_counters());
TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
@@ -2174,20 +2167,14 @@ jint G1CollectedHeap::initialize() {
}
void G1CollectedHeap::stop() {
-#if 0
- // Stopping concurrent worker threads is currently disabled until
- // some bugs in concurrent mark has been resolve. Without fixing
- // those bugs first we risk haning during VM exit when trying to
- // stop these threads.
-
- // Abort any ongoing concurrent root region scanning and stop all
- // concurrent threads. We do this to make sure these threads do
- // not continue to execute and access resources (e.g. gclog_or_tty)
+ // Stop all concurrent threads. We do this to make sure these threads
+ // do not continue to execute and access resources (e.g. gclog_or_tty)
// that are destroyed during shutdown.
- _cm->root_regions()->abort();
- _cm->root_regions()->wait_until_scan_finished();
- stop_conc_gc_threads();
-#endif
+ _cg1r->stop();
+ _cmThread->stop();
+ if (G1StringDedup::is_enabled()) {
+ G1StringDedup::stop();
+ }
}
size_t G1CollectedHeap::conservative_max_heap_alignment() {
@@ -3872,8 +3859,7 @@ void G1CollectedHeap::log_gc_header() {
return;
}
- gclog_or_tty->date_stamp(PrintGCDateStamps);
- gclog_or_tty->stamp(PrintGCTimeStamps);
+ gclog_or_tty->gclog_stamp(_gc_tracer_stw->gc_id());
GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
.append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)")
@@ -5354,17 +5340,14 @@ public:
class G1CopyingKeepAliveClosure: public OopClosure {
G1CollectedHeap* _g1h;
OopClosure* _copy_non_heap_obj_cl;
- OopsInHeapRegionClosure* _copy_metadata_obj_cl;
G1ParScanThreadState* _par_scan_state;
public:
G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
OopClosure* non_heap_obj_cl,
- OopsInHeapRegionClosure* metadata_obj_cl,
G1ParScanThreadState* pss):
_g1h(g1h),
_copy_non_heap_obj_cl(non_heap_obj_cl),
- _copy_metadata_obj_cl(metadata_obj_cl),
_par_scan_state(pss)
{}
@@ -5397,7 +5380,7 @@ public:
_par_scan_state->push_on_queue(p);
} else {
assert(!Metaspace::contains((const void*)p),
- err_msg("Otherwise need to call _copy_metadata_obj_cl->do_oop(p) "
+ err_msg("Unexpectedly found a pointer from metadata: "
PTR_FORMAT, p));
_copy_non_heap_obj_cl->do_oop(p);
}
@@ -5492,22 +5475,18 @@ public:
pss.set_evac_failure_closure(&evac_failure_cl);
G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
- G1ParScanMetadataClosure only_copy_metadata_cl(_g1h, &pss, NULL);
G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
- G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
- OopsInHeapRegionClosure* copy_metadata_cl = &only_copy_metadata_cl;
if (_g1h->g1_policy()->during_initial_mark_pause()) {
// We also need to mark copied objects.
copy_non_heap_cl = ©_mark_non_heap_cl;
- copy_metadata_cl = ©_mark_metadata_cl;
}
// Keep alive closure.
- G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
+ G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss);
// Complete GC closure
G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
@@ -5602,18 +5581,14 @@ public:
G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
- G1ParScanMetadataClosure only_copy_metadata_cl(_g1h, &pss, NULL);
G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
- G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(_g1h, &pss, NULL);
OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
- OopsInHeapRegionClosure* copy_metadata_cl = &only_copy_metadata_cl;
if (_g1h->g1_policy()->during_initial_mark_pause()) {
// We also need to mark copied objects.
copy_non_heap_cl = ©_mark_non_heap_cl;
- copy_metadata_cl = ©_mark_metadata_cl;
}
// Is alive closure
@@ -5621,7 +5596,7 @@ public:
// Copying keep alive closure. Applied to referent objects that need
// to be copied.
- G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, copy_metadata_cl, &pss);
+ G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss);
ReferenceProcessor* rp = _g1h->ref_processor_cm();
@@ -5727,22 +5702,18 @@ void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
assert(pss.refs()->is_empty(), "pre-condition");
G1ParScanExtRootClosure only_copy_non_heap_cl(this, &pss, NULL);
- G1ParScanMetadataClosure only_copy_metadata_cl(this, &pss, NULL);
G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
- G1ParScanAndMarkMetadataClosure copy_mark_metadata_cl(this, &pss, NULL);
OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
- OopsInHeapRegionClosure* copy_metadata_cl = &only_copy_metadata_cl;
if (_g1h->g1_policy()->during_initial_mark_pause()) {
// We also need to mark copied objects.
copy_non_heap_cl = ©_mark_non_heap_cl;
- copy_metadata_cl = ©_mark_metadata_cl;
}
// Keep alive closure.
- G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, copy_metadata_cl, &pss);
+ G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, &pss);
// Serial Complete GC closure
G1STWDrainQueueClosure drain_queue(this, &pss);
@@ -5757,7 +5728,8 @@ void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
&keep_alive,
&drain_queue,
NULL,
- _gc_timer_stw);
+ _gc_timer_stw,
+ _gc_tracer_stw->gc_id());
} else {
// Parallel reference processing
assert(rp->num_q() == no_of_gc_workers, "sanity");
@@ -5768,7 +5740,8 @@ void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
&keep_alive,
&drain_queue,
&par_task_executor,
- _gc_timer_stw);
+ _gc_timer_stw,
+ _gc_tracer_stw->gc_id());
}
_gc_tracer_stw->report_gc_reference_stats(stats);
@@ -7007,7 +6980,7 @@ public:
return;
}
- if (ScavengeRootsInCode && nm->detect_scavenge_root_oops()) {
+ if (ScavengeRootsInCode) {
_g1h->register_nmethod(nm);
}
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
index 77918a64aae..f4d0baae983 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp
@@ -1684,8 +1684,6 @@ public:
void print_all_rsets() PRODUCT_RETURN;
public:
- void stop_conc_gc_threads();
-
size_t pending_card_num();
size_t cards_scanned();
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
index 8e361b63638..3dc72522c07 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/g1/g1GCPhaseTimes.hpp"
#include "gc_implementation/g1/g1Log.hpp"
#include "gc_implementation/g1/g1StringDedup.hpp"
+#include "runtime/atomic.inline.hpp"
// Helper class for avoiding interleaved logging
class LineBuffer: public StackObj {
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp
index 9020961df88..a75ba66e06f 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp
@@ -28,7 +28,7 @@
#include "gc_implementation/g1/g1HotCardCache.hpp"
#include "gc_implementation/g1/g1RemSet.hpp"
#include "gc_implementation/g1/heapRegion.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
G1HotCardCache::G1HotCardCache(G1CollectedHeap *g1h):
_g1h(g1h), _hot_cache(NULL), _use_cache(false), _card_counts(g1h) {}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp
index d8bda059bb8..ae3b83072da 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp
@@ -44,6 +44,7 @@
#include "oops/instanceRefKlass.hpp"
#include "oops/oop.inline.hpp"
#include "prims/jvmtiExport.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/synchronizer.hpp"
@@ -123,7 +124,7 @@ void G1MarkSweep::allocate_stacks() {
void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
bool clear_all_softrefs) {
// Recursively traverse all live objects and mark them
- GCTraceTime tm("phase 1", G1Log::fine() && Verbose, true, gc_timer());
+ GCTraceTime tm("phase 1", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
GenMarkSweep::trace(" 1");
SharedHeap* sh = SharedHeap::heap();
@@ -146,7 +147,8 @@ void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
&GenMarkSweep::keep_alive,
&GenMarkSweep::follow_stack_closure,
NULL,
- gc_timer());
+ gc_timer(),
+ gc_tracer()->gc_id());
gc_tracer()->report_gc_reference_stats(stats);
@@ -260,7 +262,7 @@ void G1MarkSweep::mark_sweep_phase2() {
G1CollectedHeap* g1h = G1CollectedHeap::heap();
- GCTraceTime tm("phase 2", G1Log::fine() && Verbose, true, gc_timer());
+ GCTraceTime tm("phase 2", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
GenMarkSweep::trace("2");
// find the first region
@@ -297,7 +299,7 @@ void G1MarkSweep::mark_sweep_phase3() {
G1CollectedHeap* g1h = G1CollectedHeap::heap();
// Adjust the pointers to reflect the new locations
- GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer());
+ GCTraceTime tm("phase 3", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
GenMarkSweep::trace("3");
SharedHeap* sh = SharedHeap::heap();
@@ -358,7 +360,7 @@ void G1MarkSweep::mark_sweep_phase4() {
// to use a higher index (saved from phase2) when verifying perm_gen.
G1CollectedHeap* g1h = G1CollectedHeap::heap();
- GCTraceTime tm("phase 4", G1Log::fine() && Verbose, true, gc_timer());
+ GCTraceTime tm("phase 4", G1Log::fine() && Verbose, true, gc_timer(), gc_tracer()->gc_id());
GenMarkSweep::trace("4");
G1SpaceCompactClosure blk;
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp
index e741a0f7951..53d88d9cb64 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp
@@ -26,6 +26,7 @@
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
#include "gc_implementation/g1/heapRegion.hpp"
#include "gc_implementation/g1/satbQueue.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/thread.inline.hpp"
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp
index d353d7ebd2d..4bf636594e2 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp
@@ -31,6 +31,7 @@
#include "gc_implementation/g1/g1StringDedupStat.hpp"
#include "gc_implementation/g1/g1StringDedupTable.hpp"
#include "gc_implementation/g1/g1StringDedupThread.hpp"
+#include "runtime/atomic.inline.hpp"
bool G1StringDedup::_enabled = false;
@@ -211,3 +212,16 @@ G1StringDedupUnlinkOrOopsDoClosure::~G1StringDedupUnlinkOrOopsDoClosure() {
G1StringDedupTable::finish_rehash(_rehashed_table);
}
}
+
+// Atomically claims the next available queue for exclusive access by
+// the current thread. Returns the queue number of the claimed queue.
+size_t G1StringDedupUnlinkOrOopsDoClosure::claim_queue() {
+ return (size_t)Atomic::add_ptr(1, &_next_queue) - 1;
+}
+
+// Atomically claims the next available table partition for exclusive
+// access by the current thread. Returns the table bucket number where
+// the claimed partition starts.
+size_t G1StringDedupUnlinkOrOopsDoClosure::claim_table_partition(size_t partition_size) {
+ return (size_t)Atomic::add_ptr(partition_size, &_next_bucket) - partition_size;
+}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp
index 68f700f6585..80ee1fd02ad 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp
@@ -84,6 +84,7 @@
#include "memory/allocation.hpp"
#include "oops/oop.hpp"
+#include "runtime/atomic.hpp"
class OopClosure;
class BoolObjectClosure;
@@ -174,16 +175,12 @@ public:
// Atomically claims the next available queue for exclusive access by
// the current thread. Returns the queue number of the claimed queue.
- size_t claim_queue() {
- return (size_t)Atomic::add_ptr(1, &_next_queue) - 1;
- }
+ size_t claim_queue();
// Atomically claims the next available table partition for exclusive
// access by the current thread. Returns the table bucket number where
// the claimed partition starts.
- size_t claim_table_partition(size_t partition_size) {
- return (size_t)Atomic::add_ptr(partition_size, &_next_bucket) - partition_size;
- }
+ size_t claim_table_partition(size_t partition_size);
// Applies and returns the result from the is_alive closure, or
// returns true if no such closure was provided.
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp
index 8ae53e353bc..723abbae095 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp
@@ -26,6 +26,7 @@
#include "classfile/javaClasses.hpp"
#include "gc_implementation/g1/g1StringDedupQueue.hpp"
#include "memory/gcLocker.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#include "utilities/stack.inline.hpp"
diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp
index 2187fbe89b3..3069770313e 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/g1/g1StringDedupTable.hpp"
#include "gc_implementation/g1/g1StringDedupThread.hpp"
#include "gc_implementation/g1/g1StringDedupQueue.hpp"
+#include "runtime/atomic.inline.hpp"
G1StringDedupThread* G1StringDedupThread::_thread = NULL;
diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
index c12e3fe840c..037d76ca8aa 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp
@@ -34,6 +34,7 @@
#include "memory/iterator.hpp"
#include "memory/space.inline.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
@@ -48,7 +49,7 @@ HeapRegionDCTOC::HeapRegionDCTOC(G1CollectedHeap* g1,
HeapRegion* hr, ExtendedOopClosure* cl,
CardTableModRefBS::PrecisionStyle precision,
FilterKind fk) :
- ContiguousSpaceDCTOC(hr, cl, precision, NULL),
+ DirtyCardToOopClosure(hr, cl, precision, NULL),
_hr(hr), _fk(fk), _g1(g1) { }
FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
@@ -77,19 +78,18 @@ HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
return cur;
}
-void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
- HeapWord* bottom,
- HeapWord* top,
- ExtendedOopClosure* cl) {
+void HeapRegionDCTOC::walk_mem_region(MemRegion mr,
+ HeapWord* bottom,
+ HeapWord* top) {
G1CollectedHeap* g1h = _g1;
int oop_size;
ExtendedOopClosure* cl2 = NULL;
- FilterIntoCSClosure intoCSFilt(this, g1h, cl);
- FilterOutOfRegionClosure outOfRegionFilt(_hr, cl);
+ FilterIntoCSClosure intoCSFilt(this, g1h, _cl);
+ FilterOutOfRegionClosure outOfRegionFilt(_hr, _cl);
switch (_fk) {
- case NoFilterKind: cl2 = cl; break;
+ case NoFilterKind: cl2 = _cl; break;
case IntoCSFilterKind: cl2 = &intoCSFilt; break;
case OutOfRegionFilterKind: cl2 = &outOfRegionFilt; break;
default: ShouldNotReachHere();
@@ -111,17 +111,17 @@ void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
// We replicate the loop below for several kinds of possible filters.
switch (_fk) {
case NoFilterKind:
- bottom = walk_mem_region_loop(cl, g1h, _hr, bottom, top);
+ bottom = walk_mem_region_loop(_cl, g1h, _hr, bottom, top);
break;
case IntoCSFilterKind: {
- FilterIntoCSClosure filt(this, g1h, cl);
+ FilterIntoCSClosure filt(this, g1h, _cl);
bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
break;
}
case OutOfRegionFilterKind: {
- FilterOutOfRegionClosure filt(_hr, cl);
+ FilterOutOfRegionClosure filt(_hr, _cl);
bottom = walk_mem_region_loop(&filt, g1h, _hr, bottom, top);
break;
}
diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp
index 25ffe1c8264..0b9fce740fb 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp
@@ -25,7 +25,7 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_HPP
#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_HPP
-#include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
+#include "gc_implementation/g1/g1BlockOffsetTable.hpp"
#include "gc_implementation/g1/g1_specialized_oop_closures.hpp"
#include "gc_implementation/g1/survRateGroup.hpp"
#include "gc_implementation/shared/ageTable.hpp"
@@ -71,7 +71,7 @@ class nmethod;
// in the concurrent marker used by G1 to filter remembered
// sets.
-class HeapRegionDCTOC : public ContiguousSpaceDCTOC {
+class HeapRegionDCTOC : public DirtyCardToOopClosure {
public:
// Specification of possible DirtyCardToOopClosure filtering.
enum FilterKind {
@@ -85,39 +85,13 @@ protected:
FilterKind _fk;
G1CollectedHeap* _g1;
- void walk_mem_region_with_cl(MemRegion mr,
- HeapWord* bottom, HeapWord* top,
- ExtendedOopClosure* cl);
-
- // We don't specialize this for FilteringClosure; filtering is handled by
- // the "FilterKind" mechanism. But we provide this to avoid a compiler
- // warning.
- void walk_mem_region_with_cl(MemRegion mr,
- HeapWord* bottom, HeapWord* top,
- FilteringClosure* cl) {
- HeapRegionDCTOC::walk_mem_region_with_cl(mr, bottom, top,
- (ExtendedOopClosure*)cl);
- }
-
- // Get the actual top of the area on which the closure will
- // operate, given where the top is assumed to be (the end of the
- // memory region passed to do_MemRegion) and where the object
- // at the top is assumed to start. For example, an object may
- // start at the top but actually extend past the assumed top,
- // in which case the top becomes the end of the object.
- HeapWord* get_actual_top(HeapWord* top, HeapWord* top_obj) {
- return ContiguousSpaceDCTOC::get_actual_top(top, top_obj);
- }
-
// Walk the given memory region from bottom to (actual) top
// looking for objects and applying the oop closure (_cl) to
// them. The base implementation of this treats the area as
// blocks, where a block may or may not be an object. Sub-
// classes should override this to provide more accurate
// or possibly more efficient walking.
- void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top) {
- Filtering_DCTOC::walk_mem_region(mr, bottom, top);
- }
+ void walk_mem_region(MemRegion mr, HeapWord* bottom, HeapWord* top);
public:
HeapRegionDCTOC(G1CollectedHeap* g1,
diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp
index d88bc07ad07..b85c448d161 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.inline.hpp
@@ -25,6 +25,8 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP
#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP
+#include "gc_implementation/g1/g1BlockOffsetTable.inline.hpp"
+
inline HeapWord* G1OffsetTableContigSpace::allocate(size_t size) {
HeapWord* res = ContiguousSpace::allocate(size);
if (res != NULL) {
diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp
index 382a3fb32ec..08f016d83d9 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp
@@ -32,6 +32,7 @@
#include "memory/padded.inline.hpp"
#include "memory/space.inline.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "utilities/bitMap.inline.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/growableArray.hpp"
diff --git a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp
index fe33cef7d28..bdb5899c928 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.cpp
@@ -29,6 +29,7 @@
#include "memory/allocation.inline.hpp"
#include "memory/cardTableModRefBS.hpp"
#include "memory/space.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutexLocker.hpp"
#define SPARSE_PRT_VERBOSE 0
diff --git a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
index 9f298da3873..1c3c17b5ccf 100644
--- a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
+++ b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
@@ -226,7 +226,7 @@ void VM_CGC_Operation::release_and_notify_pending_list_lock() {
void VM_CGC_Operation::doit() {
gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
- GCTraceTime t(_printGCMessage, G1Log::fine(), true, G1CollectedHeap::heap()->gc_timer_cm());
+ GCTraceTime t(_printGCMessage, G1Log::fine(), true, G1CollectedHeap::heap()->gc_timer_cm(), G1CollectedHeap::heap()->concurrent_mark()->concurrent_gc_id());
SharedHeap* sh = SharedHeap::heap();
// This could go away if CollectedHeap gave access to _gc_is_active...
if (sh != NULL) {
diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp
index 5e979965731..c97f97516f1 100644
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp
@@ -47,6 +47,7 @@
#include "oops/objArrayOop.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/handles.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/java.hpp"
@@ -955,7 +956,7 @@ void ParNewGeneration::collect(bool full,
size_policy->minor_collection_begin();
}
- GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL);
+ GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL, gc_tracer.gc_id());
// Capture heap used before collection (for printing).
size_t gch_prev_used = gch->used();
@@ -1013,14 +1014,14 @@ void ParNewGeneration::collect(bool full,
ParNewRefProcTaskExecutor task_executor(*this, thread_state_set);
stats = rp->process_discovered_references(&is_alive, &keep_alive,
&evacuate_followers, &task_executor,
- _gc_timer);
+ _gc_timer, gc_tracer.gc_id());
} else {
thread_state_set.flush();
gch->set_par_threads(0); // 0 ==> non-parallel.
gch->save_marks();
stats = rp->process_discovered_references(&is_alive, &keep_alive,
&evacuate_followers, NULL,
- _gc_timer);
+ _gc_timer, gc_tracer.gc_id());
}
gc_tracer.report_gc_reference_stats(stats);
if (!promotion_failed()) {
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
index 76a368b692c..320e649e7c9 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
@@ -26,6 +26,7 @@
#include "gc_implementation/parallelScavenge/parMarkBitMap.hpp"
#include "gc_implementation/parallelScavenge/psParallelCompact.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/os.hpp"
#include "utilities/bitMap.inline.hpp"
#include "services/memTracker.hpp"
@@ -71,7 +72,7 @@ ParMarkBitMap::initialize(MemRegion covered_region)
if (_virtual_space != NULL && _virtual_space->expand_by(_reserved_byte_size)) {
_region_start = covered_region.start();
_region_size = covered_region.word_size();
- idx_t* map = (idx_t*)_virtual_space->reserved_low_addr();
+ BitMap::bm_word_t* map = (BitMap::bm_word_t*)_virtual_space->reserved_low_addr();
_beg_bits.set_map(map);
_beg_bits.set_size(bits / 2);
_end_bits.set_map(map + words / 2);
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp
index 5037c207c62..01790ef9310 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp
@@ -53,7 +53,7 @@ void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
ResourceMark rm;
NOT_PRODUCT(GCTraceTime tm("ThreadRootsMarkingTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
@@ -82,7 +82,7 @@ void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
assert(Universe::heap()->is_gc_active(), "called outside gc");
NOT_PRODUCT(GCTraceTime tm("MarkFromRootsTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
@@ -153,7 +153,7 @@ void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
assert(Universe::heap()->is_gc_active(), "called outside gc");
NOT_PRODUCT(GCTraceTime tm("RefProcTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
@@ -209,7 +209,7 @@ void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {
assert(Universe::heap()->is_gc_active(), "called outside gc");
NOT_PRODUCT(GCTraceTime tm("StealMarkingTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
@@ -242,7 +242,7 @@ void StealRegionCompactionTask::do_it(GCTaskManager* manager, uint which) {
assert(Universe::heap()->is_gc_active(), "called outside gc");
NOT_PRODUCT(GCTraceTime tm("StealRegionCompactionTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
@@ -309,7 +309,7 @@ UpdateDensePrefixTask::UpdateDensePrefixTask(
void UpdateDensePrefixTask::do_it(GCTaskManager* manager, uint which) {
NOT_PRODUCT(GCTraceTime tm("UpdateDensePrefixTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
@@ -324,7 +324,7 @@ void DrainStacksCompactionTask::do_it(GCTaskManager* manager, uint which) {
assert(Universe::heap()->is_gc_active(), "called outside gc");
NOT_PRODUCT(GCTraceTime tm("DrainStacksCompactionTask",
- PrintGCDetails && TraceParallelOldGCTasks, true, NULL));
+ PrintGCDetails && TraceParallelOldGCTasks, true, NULL, PSParallelCompact::gc_tracer()->gc_id()));
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(which);
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp
index 415d6294795..f838787bfdc 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp
@@ -34,6 +34,7 @@
#include "oops/objArrayKlass.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "utilities/stack.inline.hpp"
PSOldGen* ParCompactionManager::_old_gen = NULL;
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
index bb829f99602..51867d1622f 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp
@@ -170,7 +170,7 @@ bool PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- GCTraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
+ GCTraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer->gc_id());
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
@@ -521,7 +521,7 @@ void PSMarkSweep::deallocate_stacks() {
void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
// Recursively traverse all live objects and mark them
- GCTraceTime tm("phase 1", PrintGCDetails && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 1", PrintGCDetails && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace(" 1");
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
@@ -556,7 +556,7 @@ void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
ref_processor()->setup_policy(clear_all_softrefs);
const ReferenceProcessorStats& stats =
ref_processor()->process_discovered_references(
- is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, _gc_timer);
+ is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL, _gc_timer, _gc_tracer->gc_id());
gc_tracer()->report_gc_reference_stats(stats);
}
@@ -582,7 +582,7 @@ void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
void PSMarkSweep::mark_sweep_phase2() {
- GCTraceTime tm("phase 2", PrintGCDetails && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 2", PrintGCDetails && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("2");
// Now all live objects are marked, compute the new object addresses.
@@ -612,7 +612,7 @@ static PSAlwaysTrueClosure always_true;
void PSMarkSweep::mark_sweep_phase3() {
// Adjust the pointers to reflect the new locations
- GCTraceTime tm("phase 3", PrintGCDetails && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 3", PrintGCDetails && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("3");
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
@@ -655,7 +655,7 @@ void PSMarkSweep::mark_sweep_phase3() {
void PSMarkSweep::mark_sweep_phase4() {
EventMark m("4 compact heap");
- GCTraceTime tm("phase 4", PrintGCDetails && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 4", PrintGCDetails && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("4");
// All pointers are now adjusted, move objects accordingly
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
index cba23adae9f..9f552fd1874 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp
@@ -51,6 +51,7 @@
#include "oops/methodData.hpp"
#include "oops/oop.inline.hpp"
#include "oops/oop.pcgc.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/safepoint.hpp"
#include "runtime/vmThread.hpp"
@@ -979,7 +980,7 @@ void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values)
// at each young gen gc. Do the update unconditionally (even though a
// promotion failure does not swap spaces) because an unknown number of minor
// collections will have swapped the spaces an unknown number of times.
- GCTraceTime tm("pre compact", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("pre compact", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParallelScavengeHeap* heap = gc_heap();
_space_info[from_space_id].set_space(heap->young_gen()->from_space());
_space_info[to_space_id].set_space(heap->young_gen()->to_space());
@@ -1022,7 +1023,7 @@ void PSParallelCompact::pre_compact(PreGCValues* pre_gc_values)
void PSParallelCompact::post_compact()
{
- GCTraceTime tm("post compact", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("post compact", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
for (unsigned int id = old_space_id; id < last_space_id; ++id) {
// Clear the marking bitmap, summary data and split info.
@@ -1848,7 +1849,7 @@ void PSParallelCompact::summary_phase_msg(SpaceId dst_space_id,
void PSParallelCompact::summary_phase(ParCompactionManager* cm,
bool maximum_compaction)
{
- GCTraceTime tm("summary phase", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("summary phase", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
// trace("2");
#ifdef ASSERT
@@ -2057,7 +2058,7 @@ bool PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) {
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- GCTraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
+ GCTraceTime t1(GCCauseString("Full GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer.gc_id());
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(true /* Full GC */,gc_cause);
@@ -2359,7 +2360,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
bool maximum_heap_compaction,
ParallelOldTracer *gc_tracer) {
// Recursively traverse all live objects and mark them
- GCTraceTime tm("marking phase", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("marking phase", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParallelScavengeHeap* heap = gc_heap();
uint parallel_gc_threads = heap->gc_task_manager()->workers();
@@ -2374,7 +2375,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
ClassLoaderDataGraph::clear_claimed_marks();
{
- GCTraceTime tm_m("par mark", print_phases(), true, &_gc_timer);
+ GCTraceTime tm_m("par mark", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParallelScavengeHeap::ParStrongRootsScope psrs;
@@ -2403,24 +2404,24 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
// Process reference objects found during marking
{
- GCTraceTime tm_r("reference processing", print_phases(), true, &_gc_timer);
+ GCTraceTime tm_r("reference processing", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ReferenceProcessorStats stats;
if (ref_processor()->processing_is_mt()) {
RefProcTaskExecutor task_executor;
stats = ref_processor()->process_discovered_references(
is_alive_closure(), &mark_and_push_closure, &follow_stack_closure,
- &task_executor, &_gc_timer);
+ &task_executor, &_gc_timer, _gc_tracer.gc_id());
} else {
stats = ref_processor()->process_discovered_references(
is_alive_closure(), &mark_and_push_closure, &follow_stack_closure, NULL,
- &_gc_timer);
+ &_gc_timer, _gc_tracer.gc_id());
}
gc_tracer->report_gc_reference_stats(stats);
}
- GCTraceTime tm_c("class unloading", print_phases(), true, &_gc_timer);
+ GCTraceTime tm_c("class unloading", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
// This is the point where the entire marking should have completed.
assert(cm->marking_stacks_empty(), "Marking should have completed");
@@ -2459,7 +2460,7 @@ static PSAlwaysTrueClosure always_true;
void PSParallelCompact::adjust_roots() {
// Adjust the pointers to reflect the new locations
- GCTraceTime tm("adjust roots", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("adjust roots", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
// Need new claim bits when tracing through and adjusting pointers.
ClassLoaderDataGraph::clear_claimed_marks();
@@ -2495,7 +2496,7 @@ void PSParallelCompact::adjust_roots() {
void PSParallelCompact::enqueue_region_draining_tasks(GCTaskQueue* q,
uint parallel_gc_threads)
{
- GCTraceTime tm("drain task setup", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("drain task setup", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
// Find the threads that are active
unsigned int which = 0;
@@ -2569,7 +2570,7 @@ void PSParallelCompact::enqueue_region_draining_tasks(GCTaskQueue* q,
void PSParallelCompact::enqueue_dense_prefix_tasks(GCTaskQueue* q,
uint parallel_gc_threads) {
- GCTraceTime tm("dense prefix task setup", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("dense prefix task setup", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParallelCompactData& sd = PSParallelCompact::summary_data();
@@ -2651,7 +2652,7 @@ void PSParallelCompact::enqueue_region_stealing_tasks(
GCTaskQueue* q,
ParallelTaskTerminator* terminator_ptr,
uint parallel_gc_threads) {
- GCTraceTime tm("steal task setup", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("steal task setup", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
// Once a thread has drained it's stack, it should try to steal regions from
// other threads.
@@ -2699,7 +2700,7 @@ void PSParallelCompact::write_block_fill_histogram(outputStream* const out)
void PSParallelCompact::compact() {
// trace("5");
- GCTraceTime tm("compaction phase", print_phases(), true, &_gc_timer);
+ GCTraceTime tm("compaction phase", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
@@ -2716,7 +2717,7 @@ void PSParallelCompact::compact() {
enqueue_region_stealing_tasks(q, &terminator, active_gc_threads);
{
- GCTraceTime tm_pc("par compact", print_phases(), true, &_gc_timer);
+ GCTraceTime tm_pc("par compact", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
gc_task_manager()->execute_and_wait(q);
@@ -2730,7 +2731,7 @@ void PSParallelCompact::compact() {
{
// Update the deferred objects, if any. Any compaction manager can be used.
- GCTraceTime tm_du("deferred updates", print_phases(), true, &_gc_timer);
+ GCTraceTime tm_du("deferred updates", print_phases(), true, &_gc_timer, _gc_tracer.gc_id());
ParCompactionManager* cm = ParCompactionManager::manager_array(0);
for (unsigned int id = old_space_id; id < last_space_id; ++id) {
update_deferred_objects(cm, SpaceId(id));
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp
index 9d37b133b05..c098e455741 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp
@@ -1004,6 +1004,10 @@ class PSParallelCompact : AllStatic {
static bool _dwl_initialized;
#endif // #ifdef ASSERT
+
+ public:
+ static ParallelOldTracer* gc_tracer() { return &_gc_tracer; }
+
private:
static void initialize_space_info();
diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
index e71122529b1..7371832d5a3 100644
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp
@@ -332,7 +332,7 @@ bool PSScavenge::invoke_no_policy() {
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL);
+ GCTraceTime t1(GCCauseString("GC", gc_cause), PrintGC, !PrintGCDetails, NULL, _gc_tracer.gc_id());
TraceCollectorStats tcs(counters());
TraceMemoryManagerStats tms(false /* not full GC */,gc_cause);
@@ -398,7 +398,7 @@ bool PSScavenge::invoke_no_policy() {
// We'll use the promotion manager again later.
PSPromotionManager* promotion_manager = PSPromotionManager::vm_thread_promotion_manager();
{
- GCTraceTime tm("Scavenge", false, false, &_gc_timer);
+ GCTraceTime tm("Scavenge", false, false, &_gc_timer, _gc_tracer.gc_id());
ParallelScavengeHeap::ParStrongRootsScope psrs;
GCTaskQueue* q = GCTaskQueue::create();
@@ -440,7 +440,7 @@ bool PSScavenge::invoke_no_policy() {
// Process reference objects discovered during scavenge
{
- GCTraceTime tm("References", false, false, &_gc_timer);
+ GCTraceTime tm("References", false, false, &_gc_timer, _gc_tracer.gc_id());
reference_processor()->setup_policy(false); // not always_clear
reference_processor()->set_active_mt_degree(active_workers);
@@ -451,10 +451,10 @@ bool PSScavenge::invoke_no_policy() {
PSRefProcTaskExecutor task_executor;
stats = reference_processor()->process_discovered_references(
&_is_alive_closure, &keep_alive, &evac_followers, &task_executor,
- &_gc_timer);
+ &_gc_timer, _gc_tracer.gc_id());
} else {
stats = reference_processor()->process_discovered_references(
- &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer);
+ &_is_alive_closure, &keep_alive, &evac_followers, NULL, &_gc_timer, _gc_tracer.gc_id());
}
_gc_tracer.report_gc_reference_stats(stats);
@@ -469,7 +469,7 @@ bool PSScavenge::invoke_no_policy() {
}
{
- GCTraceTime tm("StringTable", false, false, &_gc_timer);
+ GCTraceTime tm("StringTable", false, false, &_gc_timer, _gc_tracer.gc_id());
// Unlink any dead interned Strings and process the remaining live ones.
PSScavengeRootsClosure root_closure(promotion_manager);
StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure);
@@ -641,7 +641,7 @@ bool PSScavenge::invoke_no_policy() {
NOT_PRODUCT(reference_processor()->verify_no_references_recorded());
{
- GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer);
+ GCTraceTime tm("Prune Scavenge Root Methods", false, false, &_gc_timer, _gc_tracer.gc_id());
CodeCache::prune_scavenge_root_nmethods();
}
diff --git a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp
index 634d0a5ddc5..d69035625ad 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp
@@ -28,6 +28,7 @@
#include "memory/collectorPolicy.hpp"
#include "memory/resourceArea.hpp"
#include "memory/sharedHeap.hpp"
+#include "runtime/atomic.inline.hpp"
#include "utilities/copy.hpp"
/* Copyright (c) 1992-2009 Oracle and/or its affiliates, and Stanford University.
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcId.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcId.cpp
new file mode 100644
index 00000000000..ced64a46204
--- /dev/null
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcId.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "gc_implementation/shared/gcId.hpp"
+#include "runtime/safepoint.hpp"
+
+uint GCId::_next_id = 0;
+
+const GCId GCId::create() {
+ return GCId(_next_id++);
+}
+const GCId GCId::peek() {
+ return GCId(_next_id);
+}
+const GCId GCId::undefined() {
+ return GCId(UNDEFINED);
+}
+bool GCId::is_undefined() const {
+ return _id == UNDEFINED;
+}
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcId.hpp b/hotspot/src/share/vm/gc_implementation/shared/gcId.hpp
new file mode 100644
index 00000000000..1d2decc6bb5
--- /dev/null
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcId.hpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_GCID_HPP
+#define SHARE_VM_GC_IMPLEMENTATION_SHARED_GCID_HPP
+
+#include "memory/allocation.hpp"
+
+class GCId VALUE_OBJ_CLASS_SPEC {
+ private:
+ uint _id;
+ GCId(uint id) : _id(id) {}
+ GCId() { } // Unused
+
+ static uint _next_id;
+ static const uint UNDEFINED = (uint)-1;
+
+ public:
+ uint id() const {
+ assert(_id != UNDEFINED, "Using undefined GC ID");
+ return _id;
+ }
+ bool is_undefined() const;
+
+ static const GCId create();
+ static const GCId peek();
+ static const GCId undefined();
+};
+
+#endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_GCID_HPP
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp
index 994d468bbc5..ddac9531667 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp
@@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "gc_implementation/shared/copyFailedInfo.hpp"
#include "gc_implementation/shared/gcHeapSummary.hpp"
+#include "gc_implementation/shared/gcId.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
#include "gc_implementation/shared/gcTrace.hpp"
#include "gc_implementation/shared/objectCountEventSender.hpp"
@@ -38,19 +39,14 @@
#include "gc_implementation/g1/evacuationInfo.hpp"
#endif
-#define assert_unset_gc_id() assert(_shared_gc_info.id() == SharedGCInfo::UNSET_GCID, "GC already started?")
-#define assert_set_gc_id() assert(_shared_gc_info.id() != SharedGCInfo::UNSET_GCID, "GC not started?")
-
-static GCId GCTracer_next_gc_id = 0;
-static GCId create_new_gc_id() {
- return GCTracer_next_gc_id++;
-}
+#define assert_unset_gc_id() assert(_shared_gc_info.gc_id().is_undefined(), "GC already started?")
+#define assert_set_gc_id() assert(!_shared_gc_info.gc_id().is_undefined(), "GC not started?")
void GCTracer::report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp) {
assert_unset_gc_id();
- GCId gc_id = create_new_gc_id();
- _shared_gc_info.set_id(gc_id);
+ GCId gc_id = GCId::create();
+ _shared_gc_info.set_gc_id(gc_id);
_shared_gc_info.set_cause(cause);
_shared_gc_info.set_start_timestamp(timestamp);
}
@@ -62,7 +58,7 @@ void GCTracer::report_gc_start(GCCause::Cause cause, const Ticks& timestamp) {
}
bool GCTracer::has_reported_gc_start() const {
- return _shared_gc_info.id() != SharedGCInfo::UNSET_GCID;
+ return !_shared_gc_info.gc_id().is_undefined();
}
void GCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) {
@@ -81,7 +77,7 @@ void GCTracer::report_gc_end(const Ticks& timestamp, TimePartitions* time_partit
report_gc_end_impl(timestamp, time_partitions);
- _shared_gc_info.set_id(SharedGCInfo::UNSET_GCID);
+ _shared_gc_info.set_gc_id(GCId::undefined());
}
void GCTracer::report_gc_reference_stats(const ReferenceProcessorStats& rps) const {
@@ -132,7 +128,7 @@ void GCTracer::report_object_count_after_gc(BoolObjectClosure* is_alive_cl) {
if (!cit.allocation_failed()) {
HeapInspection hi(false, false, false, NULL);
hi.populate_table(&cit, is_alive_cl);
- ObjectCountEventSenderClosure event_sender(_shared_gc_info.id(), cit.size_of_instances_in_words(), Ticks::now());
+ ObjectCountEventSenderClosure event_sender(_shared_gc_info.gc_id(), cit.size_of_instances_in_words(), Ticks::now());
cit.iterate(&event_sender);
}
}
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp
index 3b55211a724..dd13344155f 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp
@@ -27,6 +27,7 @@
#include "gc_interface/gcCause.hpp"
#include "gc_interface/gcName.hpp"
+#include "gc_implementation/shared/gcId.hpp"
#include "gc_implementation/shared/gcWhen.hpp"
#include "gc_implementation/shared/copyFailedInfo.hpp"
#include "memory/allocation.hpp"
@@ -38,7 +39,6 @@
#include "utilities/macros.hpp"
#include "utilities/ticks.hpp"
-typedef uint GCId;
class EvacuationInfo;
class GCHeapSummary;
@@ -50,11 +50,8 @@ class TimePartitions;
class BoolObjectClosure;
class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
- public:
- static const GCId UNSET_GCID = (GCId)-1;
-
private:
- GCId _id;
+ GCId _gc_id;
GCName _name;
GCCause::Cause _cause;
Ticks _start_timestamp;
@@ -64,7 +61,7 @@ class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
public:
SharedGCInfo(GCName name) :
- _id(UNSET_GCID),
+ _gc_id(GCId::undefined()),
_name(name),
_cause(GCCause::_last_gc_cause),
_start_timestamp(),
@@ -73,8 +70,8 @@ class SharedGCInfo VALUE_OBJ_CLASS_SPEC {
_longest_pause() {
}
- void set_id(GCId id) { _id = id; }
- GCId id() const { return _id; }
+ void set_gc_id(GCId gc_id) { _gc_id = gc_id; }
+ const GCId& gc_id() const { return _gc_id; }
void set_start_timestamp(const Ticks& timestamp) { _start_timestamp = timestamp; }
const Ticks start_timestamp() const { return _start_timestamp; }
@@ -131,10 +128,11 @@ class GCTracer : public ResourceObj {
void report_gc_reference_stats(const ReferenceProcessorStats& rp) const;
void report_object_count_after_gc(BoolObjectClosure* object_filter) NOT_SERVICES_RETURN;
bool has_reported_gc_start() const;
+ const GCId& gc_id() { return _shared_gc_info.gc_id(); }
protected:
GCTracer(GCName name) : _shared_gc_info(name) {}
- virtual void report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp);
+ void report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp);
virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions);
private:
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp
index 95ca83a4a1d..5462135a014 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp
@@ -43,7 +43,7 @@ typedef uintptr_t TraceAddress;
void GCTracer::send_garbage_collection_event() const {
EventGCGarbageCollection event(UNTIMED);
if (event.should_commit()) {
- event.set_gcId(_shared_gc_info.id());
+ event.set_gcId(_shared_gc_info.gc_id().id());
event.set_name(_shared_gc_info.name());
event.set_cause((u2) _shared_gc_info.cause());
event.set_sumOfPauses(_shared_gc_info.sum_of_pauses());
@@ -57,7 +57,7 @@ void GCTracer::send_garbage_collection_event() const {
void GCTracer::send_reference_stats_event(ReferenceType type, size_t count) const {
EventGCReferenceStatistics e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_type((u1)type);
e.set_count(count);
e.commit();
@@ -68,7 +68,7 @@ void GCTracer::send_metaspace_chunk_free_list_summary(GCWhen::Type when, Metaspa
const MetaspaceChunkFreeListSummary& summary) const {
EventMetaspaceChunkFreeListSummary e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_when(when);
e.set_metadataType(mdtype);
@@ -91,7 +91,7 @@ void GCTracer::send_metaspace_chunk_free_list_summary(GCWhen::Type when, Metaspa
void ParallelOldTracer::send_parallel_old_event() const {
EventGCParallelOld e(UNTIMED);
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_densePrefix((TraceAddress)_parallel_old_gc_info.dense_prefix());
e.set_starttime(_shared_gc_info.start_timestamp());
e.set_endtime(_shared_gc_info.end_timestamp());
@@ -102,7 +102,7 @@ void ParallelOldTracer::send_parallel_old_event() const {
void YoungGCTracer::send_young_gc_event() const {
EventGCYoungGarbageCollection e(UNTIMED);
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_tenuringThreshold(_tenuring_threshold);
e.set_starttime(_shared_gc_info.start_timestamp());
e.set_endtime(_shared_gc_info.end_timestamp());
@@ -113,7 +113,7 @@ void YoungGCTracer::send_young_gc_event() const {
void OldGCTracer::send_old_gc_event() const {
EventGCOldGarbageCollection e(UNTIMED);
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_starttime(_shared_gc_info.start_timestamp());
e.set_endtime(_shared_gc_info.end_timestamp());
e.commit();
@@ -132,7 +132,7 @@ static TraceStructCopyFailed to_trace_struct(const CopyFailedInfo& cf_info) {
void YoungGCTracer::send_promotion_failed_event(const PromotionFailedInfo& pf_info) const {
EventPromotionFailed e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_data(to_trace_struct(pf_info));
e.set_thread(pf_info.thread()->thread_id());
e.commit();
@@ -143,7 +143,7 @@ void YoungGCTracer::send_promotion_failed_event(const PromotionFailedInfo& pf_in
void OldGCTracer::send_concurrent_mode_failure_event() {
EventConcurrentModeFailure e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.commit();
}
}
@@ -152,7 +152,7 @@ void OldGCTracer::send_concurrent_mode_failure_event() {
void G1NewTracer::send_g1_young_gc_event() {
EventGCG1GarbageCollection e(UNTIMED);
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_type(_g1_young_gc_info.type());
e.set_starttime(_shared_gc_info.start_timestamp());
e.set_endtime(_shared_gc_info.end_timestamp());
@@ -163,7 +163,7 @@ void G1NewTracer::send_g1_young_gc_event() {
void G1NewTracer::send_evacuation_info_event(EvacuationInfo* info) {
EventEvacuationInfo e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_cSetRegions(info->collectionset_regions());
e.set_cSetUsedBefore(info->collectionset_used_before());
e.set_cSetUsedAfter(info->collectionset_used_after());
@@ -179,7 +179,7 @@ void G1NewTracer::send_evacuation_info_event(EvacuationInfo* info) {
void G1NewTracer::send_evacuation_failed_event(const EvacuationFailedInfo& ef_info) const {
EventEvacuationFailed e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_data(to_trace_struct(ef_info));
e.commit();
}
@@ -206,17 +206,17 @@ static TraceStructObjectSpace to_trace_struct(const SpaceSummary& summary) {
}
class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
- GCId _id;
+ GCId _gc_id;
GCWhen::Type _when;
public:
- GCHeapSummaryEventSender(GCId id, GCWhen::Type when) : _id(id), _when(when) {}
+ GCHeapSummaryEventSender(GCId gc_id, GCWhen::Type when) : _gc_id(gc_id), _when(when) {}
void visit(const GCHeapSummary* heap_summary) const {
const VirtualSpaceSummary& heap_space = heap_summary->heap();
EventGCHeapSummary e;
if (e.should_commit()) {
- e.set_gcId(_id);
+ e.set_gcId(_gc_id.id());
e.set_when((u1)_when);
e.set_heapSpace(to_trace_struct(heap_space));
e.set_heapUsed(heap_summary->used());
@@ -236,7 +236,7 @@ class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
EventPSHeapSummary e;
if (e.should_commit()) {
- e.set_gcId(_id);
+ e.set_gcId(_gc_id.id());
e.set_when((u1)_when);
e.set_oldSpace(to_trace_struct(ps_heap_summary->old()));
@@ -251,7 +251,7 @@ class GCHeapSummaryEventSender : public GCHeapSummaryVisitor {
};
void GCTracer::send_gc_heap_summary_event(GCWhen::Type when, const GCHeapSummary& heap_summary) const {
- GCHeapSummaryEventSender visitor(_shared_gc_info.id(), when);
+ GCHeapSummaryEventSender visitor(_shared_gc_info.gc_id(), when);
heap_summary.accept(&visitor);
}
@@ -268,7 +268,7 @@ static TraceStructMetaspaceSizes to_trace_struct(const MetaspaceSizes& sizes) {
void GCTracer::send_meta_space_summary_event(GCWhen::Type when, const MetaspaceSummary& meta_space_summary) const {
EventMetaspaceSummary e;
if (e.should_commit()) {
- e.set_gcId(_shared_gc_info.id());
+ e.set_gcId(_shared_gc_info.gc_id().id());
e.set_when((u1) when);
e.set_gcThreshold(meta_space_summary.capacity_until_GC());
e.set_metaspace(to_trace_struct(meta_space_summary.meta_space()));
@@ -287,7 +287,7 @@ class PhaseSender : public PhaseVisitor {
void send_phase(PausePhase* pause) {
T event(UNTIMED);
if (event.should_commit()) {
- event.set_gcId(_gc_id);
+ event.set_gcId(_gc_id.id());
event.set_name(pause->name());
event.set_starttime(pause->start());
event.set_endtime(pause->end());
@@ -311,7 +311,7 @@ class PhaseSender : public PhaseVisitor {
};
void GCTracer::send_phase_events(TimePartitions* time_partitions) const {
- PhaseSender phase_reporter(_shared_gc_info.id());
+ PhaseSender phase_reporter(_shared_gc_info.gc_id());
TimePartitionPhasesIterator iter(time_partitions);
while (iter.has_next()) {
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.cpp
index 033ca6b779d..83890611ec5 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.cpp
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "gc_implementation/shared/gcTimer.hpp"
+#include "gc_implementation/shared/gcTrace.hpp"
#include "gc_implementation/shared/gcTraceTime.hpp"
#include "runtime/globals.hpp"
#include "runtime/os.hpp"
@@ -34,7 +35,7 @@
#include "utilities/ticks.inline.hpp"
-GCTraceTime::GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer) :
+GCTraceTime::GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer, GCId gc_id) :
_title(title), _doit(doit), _print_cr(print_cr), _timer(timer), _start_counter() {
if (_doit || _timer != NULL) {
_start_counter.stamp();
@@ -52,6 +53,9 @@ GCTraceTime::GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* t
gclog_or_tty->stamp();
gclog_or_tty->print(": ");
}
+ if (PrintGCID) {
+ gclog_or_tty->print("#%u: ", gc_id.id());
+ }
gclog_or_tty->print("[%s", title);
gclog_or_tty->flush();
}
diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.hpp b/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.hpp
index 83df182f90c..30e494baa52 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.hpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/gcTraceTime.hpp
@@ -25,6 +25,7 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACETIME_HPP
#define SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACETIME_HPP
+#include "gc_implementation/shared/gcTrace.hpp"
#include "prims/jni_md.h"
#include "utilities/ticks.hpp"
@@ -38,7 +39,7 @@ class GCTraceTime {
Ticks _start_counter;
public:
- GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer);
+ GCTraceTime(const char* title, bool doit, bool print_cr, GCTimer* timer, GCId gc_id);
~GCTraceTime();
};
diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
index 8590e850b60..965aedea053 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/shared/spaceDecorator.hpp"
#include "memory/sharedHeap.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/thread.inline.hpp"
PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp
index 17a3ecbc14a..f5661fbb412 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "runtime/atomic.inline.hpp"
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
#include "gc_implementation/shared/mutableSpace.hpp"
diff --git a/hotspot/src/share/vm/gc_implementation/shared/objectCountEventSender.cpp b/hotspot/src/share/vm/gc_implementation/shared/objectCountEventSender.cpp
index 7504a21c2cd..4e0dc6077a6 100644
--- a/hotspot/src/share/vm/gc_implementation/shared/objectCountEventSender.cpp
+++ b/hotspot/src/share/vm/gc_implementation/shared/objectCountEventSender.cpp
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
+#include "gc_implementation/shared/gcId.hpp"
#include "gc_implementation/shared/objectCountEventSender.hpp"
#include "memory/heapInspection.hpp"
#include "trace/tracing.hpp"
@@ -38,7 +39,7 @@ void ObjectCountEventSender::send(const KlassInfoEntry* entry, GCId gc_id, const
"Only call this method if the event is enabled");
EventObjectCountAfterGC event(UNTIMED);
- event.set_gcId(gc_id);
+ event.set_gcId(gc_id.id());
event.set_class(entry->klass());
event.set_count(entry->count());
event.set_totalSize(entry->words() * BytesPerWord);
diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp
index 1304092002e..ddad402c259 100644
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp
@@ -558,13 +558,13 @@ void CollectedHeap::resize_all_tlabs() {
void CollectedHeap::pre_full_gc_dump(GCTimer* timer) {
if (HeapDumpBeforeFullGC) {
- GCTraceTime tt("Heap Dump (before full gc): ", PrintGCDetails, false, timer);
+ GCTraceTime tt("Heap Dump (before full gc): ", PrintGCDetails, false, timer, GCId::create());
// We are doing a "major" collection and a heap dump before
// major collection has been requested.
HeapDumper::dump_heap();
}
if (PrintClassHistogramBeforeFullGC) {
- GCTraceTime tt("Class Histogram (before full gc): ", PrintGCDetails, true, timer);
+ GCTraceTime tt("Class Histogram (before full gc): ", PrintGCDetails, true, timer, GCId::create());
VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */);
inspector.doit();
}
@@ -572,11 +572,11 @@ void CollectedHeap::pre_full_gc_dump(GCTimer* timer) {
void CollectedHeap::post_full_gc_dump(GCTimer* timer) {
if (HeapDumpAfterFullGC) {
- GCTraceTime tt("Heap Dump (after full gc): ", PrintGCDetails, false, timer);
+ GCTraceTime tt("Heap Dump (after full gc): ", PrintGCDetails, false, timer, GCId::create());
HeapDumper::dump_heap();
}
if (PrintClassHistogramAfterFullGC) {
- GCTraceTime tt("Class Histogram (after full gc): ", PrintGCDetails, true, timer);
+ GCTraceTime tt("Class Histogram (after full gc): ", PrintGCDetails, true, timer, GCId::create());
VM_GC_HeapInspection inspector(gclog_or_tty, false /* ! full gc */);
inspector.doit();
}
diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
index 6c30983c2ea..323f67fc1f6 100644
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, 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
@@ -37,6 +37,7 @@
#include "oops/oop.inline.hpp"
#include "prims/jvmtiExport.hpp"
#include "prims/jvmtiThreadState.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/frame.inline.hpp"
#include "runtime/handles.inline.hpp"
@@ -2782,11 +2783,11 @@ run:
if (TraceExceptions) {
ttyLocker ttyl;
ResourceMark rm;
- tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), (void*)except_oop());
+ tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), p2i(except_oop()));
tty->print_cr(" thrown in interpreter method <%s>", METHOD->print_value_string());
tty->print_cr(" at bci %d, continuing at %d for thread " INTPTR_FORMAT,
- istate->bcp() - (intptr_t)METHOD->code_base(),
- continuation_bci, THREAD);
+ (int)(istate->bcp() - METHOD->code_base()),
+ (int)continuation_bci, p2i(THREAD));
}
// for AbortVMOnException flag
NOT_PRODUCT(Exceptions::debug_check_abort(except_oop));
@@ -2798,11 +2799,11 @@ run:
if (TraceExceptions) {
ttyLocker ttyl;
ResourceMark rm;
- tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), (void*)except_oop());
+ tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), p2i(except_oop()));
tty->print_cr(" thrown in interpreter method <%s>", METHOD->print_value_string());
tty->print_cr(" at bci %d, unwinding for thread " INTPTR_FORMAT,
- istate->bcp() - (intptr_t)METHOD->code_base(),
- THREAD);
+ (int)(istate->bcp() - METHOD->code_base()),
+ p2i(THREAD));
}
// for AbortVMOnException flag
NOT_PRODUCT(Exceptions::debug_check_abort(except_oop));
@@ -3401,7 +3402,7 @@ BytecodeInterpreter::print() {
tty->print_cr("osr._osr_buf: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_buf);
tty->print_cr("osr._osr_entry: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_entry);
tty->print_cr("prev_link: " INTPTR_FORMAT, (uintptr_t) this->_prev_link);
- tty->print_cr("native_mirror: " INTPTR_FORMAT, (void*) this->_oop_temp);
+ tty->print_cr("native_mirror: " INTPTR_FORMAT, (uintptr_t) this->_oop_temp);
tty->print_cr("stack_base: " INTPTR_FORMAT, (uintptr_t) this->_stack_base);
tty->print_cr("stack_limit: " INTPTR_FORMAT, (uintptr_t) this->_stack_limit);
tty->print_cr("monitor_base: " INTPTR_FORMAT, (uintptr_t) this->_monitor_base);
diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp
index 095a989cc01..86b6c22822f 100644
--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp
+++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2012, 2013 SAP AG. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2012, 2014 SAP AG. 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
@@ -86,11 +86,11 @@
" \t-> " PTR_FORMAT "(%d)", \
(int) THREAD->osthread()->thread_id(), \
BCI(), \
- MDX(), \
+ p2i(MDX()), \
(MDX() == NULL \
? 0 \
: istate->method()->method_data()->dp_to_di((address)MDX())), \
- mdx, \
+ p2i(mdx), \
istate->method()->method_data()->dp_to_di((address)mdx) \
); \
}; \
@@ -107,7 +107,7 @@
MethodData *md = istate->method()->method_data(); \
tty->cr(); \
tty->print("method data at mdx " PTR_FORMAT "(0) for", \
- md->data_layout_at(md->bci_to_di(0))); \
+ p2i(md->data_layout_at(md->bci_to_di(0)))); \
istate->method()->print_short_name(tty); \
tty->cr(); \
if (md != NULL) { \
@@ -115,7 +115,7 @@
address mdx = (address) MDX(); \
if (mdx != NULL) { \
tty->print_cr("current mdx " PTR_FORMAT "(%d)", \
- mdx, \
+ p2i(mdx), \
istate->method()->method_data()->dp_to_di(mdx)); \
} \
} else { \
diff --git a/hotspot/src/share/vm/interpreter/bytecodes.cpp b/hotspot/src/share/vm/interpreter/bytecodes.cpp
index 0f78210fcc9..5c26a4a751f 100644
--- a/hotspot/src/share/vm/interpreter/bytecodes.cpp
+++ b/hotspot/src/share/vm/interpreter/bytecodes.cpp
@@ -541,9 +541,6 @@ void Bytecodes::initialize() {
def(_shouldnotreachhere , "_shouldnotreachhere" , "b" , NULL , T_VOID , 0, false);
- // platform specific JVM bytecodes
- pd_initialize();
-
// compare can_trap information for each bytecode with the
// can_trap information for the corresponding base bytecode
// (if a rewritten bytecode can trap, so must the base bytecode)
diff --git a/hotspot/src/share/vm/interpreter/bytecodes.hpp b/hotspot/src/share/vm/interpreter/bytecodes.hpp
index 2cb49c98cb1..04a1f564abc 100644
--- a/hotspot/src/share/vm/interpreter/bytecodes.hpp
+++ b/hotspot/src/share/vm/interpreter/bytecodes.hpp
@@ -287,23 +287,6 @@ class Bytecodes: AllStatic {
_shouldnotreachhere, // For debugging
- // Platform specific JVM bytecodes
-#ifdef TARGET_ARCH_x86
-# include "bytecodes_x86.hpp"
-#endif
-#ifdef TARGET_ARCH_sparc
-# include "bytecodes_sparc.hpp"
-#endif
-#ifdef TARGET_ARCH_zero
-# include "bytecodes_zero.hpp"
-#endif
-#ifdef TARGET_ARCH_arm
-# include "bytecodes_arm.hpp"
-#endif
-#ifdef TARGET_ARCH_ppc
-# include "bytecodes_ppc.hpp"
-#endif
-
number_of_codes
};
@@ -348,8 +331,6 @@ class Bytecodes: AllStatic {
static void def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap);
static void def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap, Code java_code);
- static void pd_initialize(); // platform specific initialization
- static Code pd_base_code_for(Code code); // platform specific base_code_for implementation
// Verify that bcp points into method
#ifdef ASSERT
diff --git a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
index 0f79ab5072f..42a721839a8 100644
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
@@ -42,6 +42,7 @@
#include "oops/symbol.hpp"
#include "prims/jvmtiExport.hpp"
#include "prims/nativeLookup.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/deoptimization.hpp"
diff --git a/hotspot/src/share/vm/interpreter/linkResolver.cpp b/hotspot/src/share/vm/interpreter/linkResolver.cpp
index d732cb2eec5..6fbb3bfa6f1 100644
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp
@@ -945,12 +945,8 @@ void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method
Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
current_klass() :
InstanceKlass::cast(current_klass())->host_klass();
- // As of the fix for 4486457 we disable verification for all of the
- // dynamically-generated bytecodes associated with the 1.4
- // reflection implementation, not just those associated with
- // sun/reflect/SerializationConstructorAccessor.
- bool is_reflect = JDK_Version::is_gte_jdk14x_version() &&
- klass_to_check->is_subclass_of(
+ // Disable verification for the dynamically-generated reflection bytecodes.
+ bool is_reflect = klass_to_check->is_subclass_of(
SystemDictionary::reflect_MagicAccessorImpl_klass());
if (!is_reflect &&
diff --git a/hotspot/src/share/vm/memory/allocation.cpp b/hotspot/src/share/vm/memory/allocation.cpp
index c0254d9123f..588b01981d0 100644
--- a/hotspot/src/share/vm/memory/allocation.cpp
+++ b/hotspot/src/share/vm/memory/allocation.cpp
@@ -29,7 +29,7 @@
#include "memory/metaspaceShared.hpp"
#include "memory/resourceArea.hpp"
#include "memory/universe.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/os.hpp"
#include "runtime/task.hpp"
#include "runtime/threadCritical.hpp"
diff --git a/hotspot/src/share/vm/memory/cardTableRS.cpp b/hotspot/src/share/vm/memory/cardTableRS.cpp
index 56af890a421..7c9d3618673 100644
--- a/hotspot/src/share/vm/memory/cardTableRS.cpp
+++ b/hotspot/src/share/vm/memory/cardTableRS.cpp
@@ -29,6 +29,7 @@
#include "memory/generation.hpp"
#include "memory/space.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/java.hpp"
#include "runtime/os.hpp"
#include "utilities/macros.hpp"
diff --git a/hotspot/src/share/vm/memory/defNewGeneration.cpp b/hotspot/src/share/vm/memory/defNewGeneration.cpp
index bf51090df12..1a904b5c636 100644
--- a/hotspot/src/share/vm/memory/defNewGeneration.cpp
+++ b/hotspot/src/share/vm/memory/defNewGeneration.cpp
@@ -41,6 +41,7 @@
#include "memory/space.inline.hpp"
#include "oops/instanceRefKlass.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/java.hpp"
#include "runtime/prefetch.inline.hpp"
#include "runtime/thread.inline.hpp"
@@ -585,7 +586,7 @@ void DefNewGeneration::collect(bool full,
init_assuming_no_promotion_failure();
- GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL);
+ GCTraceTime t1(GCCauseString("GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL, gc_tracer.gc_id());
// Capture heap used before collection (for printing).
size_t gch_prev_used = gch->used();
@@ -641,7 +642,7 @@ void DefNewGeneration::collect(bool full,
rp->setup_policy(clear_all_soft_refs);
const ReferenceProcessorStats& stats =
rp->process_discovered_references(&is_alive, &keep_alive, &evacuate_followers,
- NULL, _gc_timer);
+ NULL, _gc_timer, gc_tracer.gc_id());
gc_tracer.report_gc_reference_stats(stats);
if (!_promotion_failed) {
diff --git a/hotspot/src/share/vm/memory/gcLocker.cpp b/hotspot/src/share/vm/memory/gcLocker.cpp
index 96742637939..fae40920a87 100644
--- a/hotspot/src/share/vm/memory/gcLocker.cpp
+++ b/hotspot/src/share/vm/memory/gcLocker.cpp
@@ -26,6 +26,7 @@
#include "memory/gcLocker.inline.hpp"
#include "memory/resourceArea.hpp"
#include "memory/sharedHeap.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/thread.inline.hpp"
volatile jint GC_locker::_jni_lock_count = 0;
@@ -59,6 +60,17 @@ void GC_locker::verify_critical_count() {
assert(_jni_lock_count == count, "must be equal");
}
}
+
+// In debug mode track the locking state at all times
+void GC_locker::increment_debug_jni_lock_count() {
+ assert(_debug_jni_lock_count >= 0, "bad value");
+ Atomic::inc(&_debug_jni_lock_count);
+}
+
+void GC_locker::decrement_debug_jni_lock_count() {
+ assert(_debug_jni_lock_count > 0, "bad value");
+ Atomic::dec(&_debug_jni_lock_count);
+}
#endif
bool GC_locker::check_active_before_gc() {
diff --git a/hotspot/src/share/vm/memory/gcLocker.hpp b/hotspot/src/share/vm/memory/gcLocker.hpp
index f12aa675552..161bd42993f 100644
--- a/hotspot/src/share/vm/memory/gcLocker.hpp
+++ b/hotspot/src/share/vm/memory/gcLocker.hpp
@@ -94,18 +94,8 @@ class GC_locker: public AllStatic {
}
// In debug mode track the locking state at all times
- static void increment_debug_jni_lock_count() {
-#ifdef ASSERT
- assert(_debug_jni_lock_count >= 0, "bad value");
- Atomic::inc(&_debug_jni_lock_count);
-#endif
- }
- static void decrement_debug_jni_lock_count() {
-#ifdef ASSERT
- assert(_debug_jni_lock_count > 0, "bad value");
- Atomic::dec(&_debug_jni_lock_count);
-#endif
- }
+ static void increment_debug_jni_lock_count() NOT_DEBUG_RETURN;
+ static void decrement_debug_jni_lock_count() NOT_DEBUG_RETURN;
// Set the current lock count
static void set_jni_lock_count(int count) {
diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp
index a774f4051e6..bdb915ebb0c 100644
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp
@@ -28,6 +28,7 @@
#include "classfile/vmSymbols.hpp"
#include "code/icBuffer.hpp"
#include "gc_implementation/shared/collectorCounters.hpp"
+#include "gc_implementation/shared/gcTrace.hpp"
#include "gc_implementation/shared/gcTraceTime.hpp"
#include "gc_implementation/shared/vmGCOperations.hpp"
#include "gc_interface/collectedHeap.inline.hpp"
@@ -384,7 +385,9 @@ void GenCollectedHeap::do_collection(bool full,
const char* gc_cause_prefix = complete ? "Full GC" : "GC";
gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
- GCTraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, NULL);
+ // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later
+ // so we can assume here that the next GC id is what we want.
+ GCTraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, NULL, GCId::peek());
gc_prologue(complete);
increment_total_collections(complete);
@@ -417,7 +420,9 @@ void GenCollectedHeap::do_collection(bool full,
}
// Timer for individual generations. Last argument is false: no CR
// FIXME: We should try to start the timing earlier to cover more of the GC pause
- GCTraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, NULL);
+ // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later
+ // so we can assume here that the next GC id is what we want.
+ GCTraceTime t1(_gens[i]->short_name(), PrintGCDetails, false, NULL, GCId::peek());
TraceCollectorStats tcs(_gens[i]->counters());
TraceMemoryManagerStats tmms(_gens[i]->kind(),gc_cause());
diff --git a/hotspot/src/share/vm/memory/genMarkSweep.cpp b/hotspot/src/share/vm/memory/genMarkSweep.cpp
index 64d7c3eaa61..dcd7308843e 100644
--- a/hotspot/src/share/vm/memory/genMarkSweep.cpp
+++ b/hotspot/src/share/vm/memory/genMarkSweep.cpp
@@ -69,7 +69,7 @@ void GenMarkSweep::invoke_at_safepoint(int level, ReferenceProcessor* rp, bool c
_ref_processor = rp;
rp->setup_policy(clear_all_softrefs);
- GCTraceTime t1(GCCauseString("Full GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL);
+ GCTraceTime t1(GCCauseString("Full GC", gch->gc_cause()), PrintGC && !PrintGCDetails, true, NULL, _gc_tracer->gc_id());
gch->trace_heap_before_gc(_gc_tracer);
@@ -193,7 +193,7 @@ void GenMarkSweep::deallocate_stacks() {
void GenMarkSweep::mark_sweep_phase1(int level,
bool clear_all_softrefs) {
// Recursively traverse all live objects and mark them
- GCTraceTime tm("phase 1", PrintGC && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 1", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace(" 1");
GenCollectedHeap* gch = GenCollectedHeap::heap();
@@ -220,7 +220,7 @@ void GenMarkSweep::mark_sweep_phase1(int level,
ref_processor()->setup_policy(clear_all_softrefs);
const ReferenceProcessorStats& stats =
ref_processor()->process_discovered_references(
- &is_alive, &keep_alive, &follow_stack_closure, NULL, _gc_timer);
+ &is_alive, &keep_alive, &follow_stack_closure, NULL, _gc_timer, _gc_tracer->gc_id());
gc_tracer()->report_gc_reference_stats(stats);
}
@@ -262,7 +262,7 @@ void GenMarkSweep::mark_sweep_phase2() {
GenCollectedHeap* gch = GenCollectedHeap::heap();
- GCTraceTime tm("phase 2", PrintGC && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 2", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("2");
gch->prepare_for_compaction();
@@ -279,7 +279,7 @@ void GenMarkSweep::mark_sweep_phase3(int level) {
GenCollectedHeap* gch = GenCollectedHeap::heap();
// Adjust the pointers to reflect the new locations
- GCTraceTime tm("phase 3", PrintGC && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 3", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("3");
// Need new claim bits for the pointer adjustment tracing.
@@ -327,7 +327,7 @@ void GenMarkSweep::mark_sweep_phase4() {
// to use a higher index (saved from phase2) when verifying perm_gen.
GenCollectedHeap* gch = GenCollectedHeap::heap();
- GCTraceTime tm("phase 4", PrintGC && Verbose, true, _gc_timer);
+ GCTraceTime tm("phase 4", PrintGC && Verbose, true, _gc_timer, _gc_tracer->gc_id());
trace("4");
GenCompactClosure blk;
diff --git a/hotspot/src/share/vm/memory/guardedMemory.cpp b/hotspot/src/share/vm/memory/guardedMemory.cpp
new file mode 100644
index 00000000000..763548fd35d
--- /dev/null
+++ b/hotspot/src/share/vm/memory/guardedMemory.cpp
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+#include "precompiled.hpp"
+#include "memory/allocation.hpp"
+#include "memory/allocation.inline.hpp"
+#include "memory/guardedMemory.hpp"
+#include "runtime/os.hpp"
+
+void* GuardedMemory::wrap_copy(const void* ptr, const size_t len, const void* tag) {
+ size_t total_sz = GuardedMemory::get_total_size(len);
+ void* outerp = os::malloc(total_sz, mtInternal);
+ if (outerp != NULL) {
+ GuardedMemory guarded(outerp, len, tag);
+ void* innerp = guarded.get_user_ptr();
+ memcpy(innerp, ptr, len);
+ return innerp;
+ }
+ return NULL; // OOM
+}
+
+bool GuardedMemory::free_copy(void* p) {
+ if (p == NULL) {
+ return true;
+ }
+ GuardedMemory guarded((u_char*)p);
+ bool verify_ok = guarded.verify_guards();
+
+ /* always attempt to free, pass problem on to any nested memchecker */
+ os::free(guarded.release_for_freeing());
+
+ return verify_ok;
+}
+
+void GuardedMemory::print_on(outputStream* st) const {
+ if (_base_addr == NULL) {
+ st->print_cr("GuardedMemory(" PTR_FORMAT ") not associated to any memory", p2i(this));
+ return;
+ }
+ st->print_cr("GuardedMemory(" PTR_FORMAT ") base_addr=" PTR_FORMAT
+ " tag=" PTR_FORMAT " user_size=" SIZE_FORMAT " user_data=" PTR_FORMAT,
+ p2i(this), p2i(_base_addr), p2i(get_tag()), get_user_size(), p2i(get_user_ptr()));
+
+ Guard* guard = get_head_guard();
+ st->print_cr(" Header guard @" PTR_FORMAT " is %s", p2i(guard), (guard->verify() ? "OK" : "BROKEN"));
+ guard = get_tail_guard();
+ st->print_cr(" Trailer guard @" PTR_FORMAT " is %s", p2i(guard), (guard->verify() ? "OK" : "BROKEN"));
+
+ u_char udata = *get_user_ptr();
+ switch (udata) {
+ case uninitBlockPad:
+ st->print_cr(" User data appears unused");
+ break;
+ case freeBlockPad:
+ st->print_cr(" User data appears to have been freed");
+ break;
+ default:
+ st->print_cr(" User data appears to be in use");
+ break;
+ }
+}
+
+// test code...
+
+#ifndef PRODUCT
+
+static void guarded_memory_test_check(void* p, size_t sz, void* tag) {
+ assert(p != NULL, "NULL pointer given to check");
+ u_char* c = (u_char*) p;
+ GuardedMemory guarded(c);
+ assert(guarded.get_tag() == tag, "Tag is not the same as supplied");
+ assert(guarded.get_user_ptr() == c, "User pointer is not the same as supplied");
+ assert(guarded.get_user_size() == sz, "User size is not the same as supplied");
+ assert(guarded.verify_guards(), "Guard broken");
+}
+
+void GuardedMemory::test_guarded_memory() {
+ // Test the basic characteristics...
+ size_t total_sz = GuardedMemory::get_total_size(1);
+ assert(total_sz > 1 && total_sz >= (sizeof(GuardHeader) + 1 + sizeof(Guard)), "Unexpected size");
+ u_char* basep = (u_char*) os::malloc(total_sz, mtInternal);
+
+ GuardedMemory guarded(basep, 1, (void*)0xf000f000);
+
+ assert(*basep == badResourceValue, "Expected guard in the form of badResourceValue");
+ u_char* userp = guarded.get_user_ptr();
+ assert(*userp == uninitBlockPad, "Expected uninitialized data in the form of uninitBlockPad");
+ guarded_memory_test_check(userp, 1, (void*)0xf000f000);
+
+ void* freep = guarded.release_for_freeing();
+ assert((u_char*)freep == basep, "Expected the same pointer guard was ");
+ assert(*userp == freeBlockPad, "Expected user data to be free block padded");
+ assert(!guarded.verify_guards(), "Expected failed");
+ os::free(freep);
+
+ // Test a number of odd sizes...
+ size_t sz = 0;
+ do {
+ void* p = os::malloc(GuardedMemory::get_total_size(sz), mtInternal);
+ void* up = guarded.wrap_with_guards(p, sz, (void*)1);
+ memset(up, 0, sz);
+ guarded_memory_test_check(up, sz, (void*)1);
+ os::free(guarded.release_for_freeing());
+ sz = (sz << 4) + 1;
+ } while (sz < (256 * 1024));
+
+ // Test buffer overrun into head...
+ basep = (u_char*) os::malloc(GuardedMemory::get_total_size(1), mtInternal);
+ guarded.wrap_with_guards(basep, 1);
+ *basep = 0;
+ assert(!guarded.verify_guards(), "Expected failure");
+ os::free(basep);
+
+ // Test buffer overrun into tail with a number of odd sizes...
+ sz = 1;
+ do {
+ void* p = os::malloc(GuardedMemory::get_total_size(sz), mtInternal);
+ void* up = guarded.wrap_with_guards(p, sz, (void*)1);
+ memset(up, 0, sz + 1); // Buffer-overwrite (within guard)
+ assert(!guarded.verify_guards(), "Guard was not broken as expected");
+ os::free(guarded.release_for_freeing());
+ sz = (sz << 4) + 1;
+ } while (sz < (256 * 1024));
+
+ // Test wrap_copy/wrap_free...
+ assert(GuardedMemory::free_copy(NULL), "Expected free NULL to be OK");
+
+ const char* str = "Check my bounds out";
+ size_t str_sz = strlen(str) + 1;
+ char* str_copy = (char*) GuardedMemory::wrap_copy(str, str_sz);
+ guarded_memory_test_check(str_copy, str_sz, NULL);
+ assert(strcmp(str, str_copy) == 0, "Not identical copy");
+ assert(GuardedMemory::free_copy(str_copy), "Free copy failed to verify");
+
+ void* no_data = NULL;
+ void* no_data_copy = GuardedMemory::wrap_copy(no_data, 0);
+ assert(GuardedMemory::free_copy(no_data_copy), "Expected valid guards even for no data copy");
+}
+
+#endif // !PRODUCT
+
diff --git a/hotspot/src/share/vm/memory/guardedMemory.hpp b/hotspot/src/share/vm/memory/guardedMemory.hpp
new file mode 100644
index 00000000000..0d37bb03361
--- /dev/null
+++ b/hotspot/src/share/vm/memory/guardedMemory.hpp
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_MEMORY_GUARDED_MEMORY_HPP
+#define SHARE_VM_MEMORY_GUARDED_MEMORY_HPP
+
+#include "memory/allocation.hpp"
+#include "utilities/globalDefinitions.hpp"
+
+/**
+ * Guarded memory for detecting buffer overrun.
+ *
+ * Allows allocations to be wrapped with padded bytes of a known byte pattern,
+ * that is a "guard". Guard patterns may be verified to detect buffer overruns.
+ *
+ * Primarily used by "debug malloc" and "checked JNI".
+ *
+ * Memory layout:
+ *
+ * |Offset | Content | Description |
+ * |------------------------------------------------------------
+ * |base_addr | 0xABABABABABABABAB | Head guard |
+ * |+16 | | User data size |
+ * |+sizeof(uintptr_t) | | Tag word |
+ * |+sizeof(void*) | 0xF1 ( | User data |
+ * |+user_size | 0xABABABABABABABAB | Tail guard |
+ * -------------------------------------------------------------
+ *
+ * Where:
+ * - guard padding uses "badResourceValue" (0xAB)
+ * - tag word is general purpose
+ * - user data
+ * -- initially padded with "uninitBlockPad" (0xF1),
+ * -- to "freeBlockPad" (0xBA), when freed
+ *
+ * Usage:
+ *
+ * * Allocations: one may wrap allocations with guard memory:
+ *
+ * Thing* alloc_thing() {
+ * void* mem = user_alloc_fn(GuardedMemory::get_total_size(sizeof(thing)));
+ * GuardedMemory guarded(mem, sizeof(thing));
+ * return (Thing*) guarded.get_user_ptr();
+ * }
+ *
+ * * Verify: memory guards are still in tact
+ *
+ * bool verify_thing(Thing* thing) {
+ * GuardedMemory guarded((void*)thing);
+ * return guarded.verify_guards();
+ * }
+ *
+ * * Free: one may mark bytes as freed (further debugging support)
+ *
+ * void free_thing(Thing* thing) {
+ * GuardedMemory guarded((void*)thing);
+ * assert(guarded.verify_guards(), "Corrupt thing");
+ * user_free_fn(guards.release_for_freeing();
+ * }
+ *
+ */
+class GuardedMemory : StackObj { // Wrapper on stack
+
+ // Private inner classes for memory layout...
+
+protected:
+
+ /**
+ * Guard class for header and trailer known pattern to test for overwrites.
+ */
+ class Guard { // Class for raw memory (no vtbl allowed)
+ friend class GuardedMemory;
+ protected:
+ enum {
+ GUARD_SIZE = 16
+ };
+
+ u_char _guard[GUARD_SIZE];
+
+ public:
+
+ void build() {
+ u_char* c = _guard; // Possibly unaligned if tail guard
+ u_char* end = c + GUARD_SIZE;
+ while (c < end) {
+ *c = badResourceValue;
+ c++;
+ }
+ }
+
+ bool verify() const {
+ u_char* c = (u_char*) _guard;
+ u_char* end = c + GUARD_SIZE;
+ while (c < end) {
+ if (*c != badResourceValue) {
+ return false;
+ }
+ c++;
+ }
+ return true;
+ }
+
+ }; // GuardedMemory::Guard
+
+ /**
+ * Header guard and size
+ */
+ class GuardHeader : Guard {
+ friend class GuardedMemory;
+ protected:
+ // Take care in modifying fields here, will effect alignment
+ // e.g. x86 ABI 16 byte stack alignment
+ union {
+ uintptr_t __unused_full_word1;
+ size_t _user_size;
+ };
+ void* _tag;
+ public:
+ void set_user_size(const size_t usz) { _user_size = usz; }
+ size_t get_user_size() const { return _user_size; }
+
+ void set_tag(const void* tag) { _tag = (void*) tag; }
+ void* get_tag() const { return _tag; }
+
+ }; // GuardedMemory::GuardHeader
+
+ // Guarded Memory...
+
+ protected:
+ u_char* _base_addr;
+
+ public:
+
+ /**
+ * Create new guarded memory.
+ *
+ * Wraps, starting at the given "base_ptr" with guards. Use "get_user_ptr()"
+ * to return a pointer suitable for user data.
+ *
+ * @param base_ptr allocation wishing to be wrapped, must be at least "GuardedMemory::get_total_size()" bytes.
+ * @param user_size the size of the user data to be wrapped.
+ * @param tag optional general purpose tag.
+ */
+ GuardedMemory(void* base_ptr, const size_t user_size, const void* tag = NULL) {
+ wrap_with_guards(base_ptr, user_size, tag);
+ }
+
+ /**
+ * Wrap existing guarded memory.
+ *
+ * To use this constructor, one must have created guarded memory with
+ * "GuardedMemory(void*, size_t, void*)" (or indirectly via helper, e.g. "wrap_copy()").
+ *
+ * @param user_p existing wrapped memory.
+ */
+ GuardedMemory(void* userp) {
+ u_char* user_ptr = (u_char*) userp;
+ assert((uintptr_t)user_ptr > (sizeof(GuardHeader) + 0x1000), "Invalid pointer");
+ _base_addr = (user_ptr - sizeof(GuardHeader));
+ }
+
+ /**
+ * Create new guarded memory.
+ *
+ * Wraps, starting at the given "base_ptr" with guards. Allows reuse of stack allocated helper.
+ *
+ * @param base_ptr allocation wishing to be wrapped, must be at least "GuardedMemory::get_total_size()" bytes.
+ * @param user_size the size of the user data to be wrapped.
+ * @param tag optional general purpose tag.
+ *
+ * @return user data pointer (inner pointer to supplied "base_ptr").
+ */
+ void* wrap_with_guards(void* base_ptr, size_t user_size, const void* tag = NULL) {
+ assert(base_ptr != NULL, "Attempt to wrap NULL with memory guard");
+ _base_addr = (u_char*)base_ptr;
+ get_head_guard()->build();
+ get_head_guard()->set_user_size(user_size);
+ get_tail_guard()->build();
+ set_tag(tag);
+ set_user_bytes(uninitBlockPad);
+ assert(verify_guards(), "Expected valid memory guards");
+ return get_user_ptr();
+ }
+
+ /**
+ * Verify head and tail guards.
+ *
+ * @return true if guards are intact, false would indicate a buffer overrun.
+ */
+ bool verify_guards() const {
+ if (_base_addr != NULL) {
+ return (get_head_guard()->verify() && get_tail_guard()->verify());
+ }
+ return false;
+ }
+
+ /**
+ * Set the general purpose tag.
+ *
+ * @param tag general purpose tag.
+ */
+ void set_tag(const void* tag) { get_head_guard()->set_tag(tag); }
+
+ /**
+ * Return the general purpose tag.
+ *
+ * @return the general purpose tag, defaults to NULL.
+ */
+ void* get_tag() const { return get_head_guard()->get_tag(); }
+
+ /**
+ * Return the size of the user data.
+ *
+ * @return the size of the user data.
+ */
+ size_t get_user_size() const {
+ assert(_base_addr != NULL, "Not wrapping any memory");
+ return get_head_guard()->get_user_size();
+ }
+
+ /**
+ * Return the user data pointer.
+ *
+ * @return the user data pointer.
+ */
+ u_char* get_user_ptr() const {
+ assert(_base_addr != NULL, "Not wrapping any memory");
+ return _base_addr + sizeof(GuardHeader);
+ }
+
+ /**
+ * Release the wrapped pointer for resource freeing.
+ *
+ * Pads the user data with "freeBlockPad", and dis-associates the helper.
+ *
+ * @return the original base pointer used to wrap the data.
+ */
+ void* release_for_freeing() {
+ set_user_bytes(freeBlockPad);
+ return release();
+ }
+
+ /**
+ * Dis-associate the help from the original base address.
+ *
+ * @return the original base pointer used to wrap the data.
+ */
+ void* release() {
+ void* p = (void*) _base_addr;
+ _base_addr = NULL;
+ return p;
+ }
+
+ virtual void print_on(outputStream* st) const;
+
+ protected:
+ GuardHeader* get_head_guard() const { return (GuardHeader*) _base_addr; }
+ Guard* get_tail_guard() const { return (Guard*) (get_user_ptr() + get_user_size()); };
+ void set_user_bytes(u_char ch) {
+ memset(get_user_ptr(), ch, get_user_size());
+ }
+
+ public:
+ /**
+ * Return the total size required for wrapping the given user size.
+ *
+ * @return the total size required for wrapping the given user size.
+ */
+ static size_t get_total_size(size_t user_size) {
+ size_t total_size = sizeof(GuardHeader) + user_size + sizeof(Guard);
+ assert(total_size > user_size, "Unexpected wrap-around");
+ return total_size;
+ }
+
+ // Helper functions...
+
+ /**
+ * Wrap a copy of size "len" of "ptr".
+ *
+ * @param ptr the memory to be copied
+ * @param len the length of the copy
+ * @param tag optional general purpose tag (see GuardedMemory::get_tag())
+ *
+ * @return guarded wrapped memory pointer to the user area, or NULL if OOM.
+ */
+ static void* wrap_copy(const void* p, const size_t len, const void* tag = NULL);
+
+ /**
+ * Free wrapped copy.
+ *
+ * Frees memory copied with "wrap_copy()".
+ *
+ * @param p memory returned by "wrap_copy()".
+ *
+ * @return true if guards were verified as intact. false indicates a buffer overrun.
+ */
+ static bool free_copy(void* p);
+
+ // Testing...
+#ifndef PRODUCT
+ static void test_guarded_memory(void);
+#endif
+}; // GuardedMemory
+
+#endif // SHARE_VM_MEMORY_GUARDED_MEMORY_HPP
diff --git a/hotspot/src/share/vm/memory/iterator.cpp b/hotspot/src/share/vm/memory/iterator.cpp
index f69eb4ed75d..6cd8e965922 100644
--- a/hotspot/src/share/vm/memory/iterator.cpp
+++ b/hotspot/src/share/vm/memory/iterator.cpp
@@ -27,6 +27,7 @@
#include "oops/oop.inline.hpp"
void KlassToOopClosure::do_klass(Klass* k) {
+ assert(_oop_closure != NULL, "Not initialized?");
k->oops_do(_oop_closure);
}
diff --git a/hotspot/src/share/vm/memory/iterator.hpp b/hotspot/src/share/vm/memory/iterator.hpp
index 81a845e5056..e91d42974b1 100644
--- a/hotspot/src/share/vm/memory/iterator.hpp
+++ b/hotspot/src/share/vm/memory/iterator.hpp
@@ -115,9 +115,19 @@ class CLDClosure : public Closure {
};
class KlassToOopClosure : public KlassClosure {
+ friend class MetadataAwareOopClosure;
+ friend class MetadataAwareOopsInGenClosure;
+
OopClosure* _oop_closure;
- public:
- KlassToOopClosure(OopClosure* oop_closure) : _oop_closure(oop_closure) {}
+
+ // Used when _oop_closure couldn't be set in an initialization list.
+ void initialize(OopClosure* oop_closure) {
+ assert(_oop_closure == NULL, "Should only be called once");
+ _oop_closure = oop_closure;
+ }
+
+public:
+ KlassToOopClosure(OopClosure* oop_closure = NULL) : _oop_closure(oop_closure) {}
virtual void do_klass(Klass* k);
};
@@ -135,6 +145,29 @@ class CLDToOopClosure : public CLDClosure {
void do_cld(ClassLoaderData* cld);
};
+// The base class for all concurrent marking closures,
+// that participates in class unloading.
+// It's used to proxy through the metadata to the oops defined in them.
+class MetadataAwareOopClosure: public ExtendedOopClosure {
+ KlassToOopClosure _klass_closure;
+
+ public:
+ MetadataAwareOopClosure() : ExtendedOopClosure() {
+ _klass_closure.initialize(this);
+ }
+ MetadataAwareOopClosure(ReferenceProcessor* rp) : ExtendedOopClosure(rp) {
+ _klass_closure.initialize(this);
+ }
+
+ virtual bool do_metadata() { return do_metadata_nv(); }
+ inline bool do_metadata_nv() { return true; }
+
+ virtual void do_klass(Klass* k);
+ void do_klass_nv(Klass* k);
+
+ virtual void do_class_loader_data(ClassLoaderData* cld);
+};
+
// ObjectClosure is used for iterating through an object space
class ObjectClosure : public Closure {
@@ -318,4 +351,16 @@ class SymbolClosure : public StackObj {
}
};
+
+// Helper defines for ExtendOopClosure
+
+#define if_do_metadata_checked(closure, nv_suffix) \
+ /* Make sure the non-virtual and the virtual versions match. */ \
+ assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
+ "Inconsistency in do_metadata"); \
+ if (closure->do_metadata##nv_suffix())
+
+#define assert_should_ignore_metadata(closure, nv_suffix) \
+ assert(!closure->do_metadata##nv_suffix(), "Code to handle metadata is not implemented")
+
#endif // SHARE_VM_MEMORY_ITERATOR_HPP
diff --git a/hotspot/src/share/vm/memory/iterator.inline.hpp b/hotspot/src/share/vm/memory/iterator.inline.hpp
new file mode 100644
index 00000000000..cef12666012
--- /dev/null
+++ b/hotspot/src/share/vm/memory/iterator.inline.hpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_MEMORY_ITERATOR_INLINE_HPP
+#define SHARE_VM_MEMORY_ITERATOR_INLINE_HPP
+
+#include "classfile/classLoaderData.hpp"
+#include "memory/iterator.hpp"
+#include "oops/klass.hpp"
+#include "utilities/debug.hpp"
+
+inline void MetadataAwareOopClosure::do_class_loader_data(ClassLoaderData* cld) {
+ assert(_klass_closure._oop_closure == this, "Must be");
+
+ bool claim = true; // Must claim the class loader data before processing.
+ cld->oops_do(_klass_closure._oop_closure, &_klass_closure, claim);
+}
+
+inline void MetadataAwareOopClosure::do_klass_nv(Klass* k) {
+ ClassLoaderData* cld = k->class_loader_data();
+ do_class_loader_data(cld);
+}
+
+inline void MetadataAwareOopClosure::do_klass(Klass* k) { do_klass_nv(k); }
+
+#endif // SHARE_VM_MEMORY_ITERATOR_INLINE_HPP
diff --git a/hotspot/src/share/vm/memory/metaspace.cpp b/hotspot/src/share/vm/memory/metaspace.cpp
index d2d1ba7992e..2f52e388d52 100644
--- a/hotspot/src/share/vm/memory/metaspace.cpp
+++ b/hotspot/src/share/vm/memory/metaspace.cpp
@@ -697,6 +697,7 @@ class SpaceManager : public CHeapObj {
size_t allocated_blocks_words() const { return _allocated_blocks_words; }
size_t allocated_blocks_bytes() const { return _allocated_blocks_words * BytesPerWord; }
size_t allocated_chunks_words() const { return _allocated_chunks_words; }
+ size_t allocated_chunks_bytes() const { return _allocated_chunks_words * BytesPerWord; }
size_t allocated_chunks_count() const { return _allocated_chunks_count; }
bool is_humongous(size_t word_size) { return word_size > medium_chunk_size(); }
@@ -3365,6 +3366,16 @@ size_t Metaspace::capacity_bytes_slow(MetadataType mdtype) const {
return capacity_words_slow(mdtype) * BytesPerWord;
}
+size_t Metaspace::allocated_blocks_bytes() const {
+ return vsm()->allocated_blocks_bytes() +
+ (using_class_space() ? class_vsm()->allocated_blocks_bytes() : 0);
+}
+
+size_t Metaspace::allocated_chunks_bytes() const {
+ return vsm()->allocated_chunks_bytes() +
+ (using_class_space() ? class_vsm()->allocated_chunks_bytes() : 0);
+}
+
void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
assert(!SafepointSynchronize::is_at_safepoint()
|| Thread::current()->is_VM_thread(), "should be the VM thread");
diff --git a/hotspot/src/share/vm/memory/metaspace.hpp b/hotspot/src/share/vm/memory/metaspace.hpp
index baa25cd6d35..545bf0e7fbd 100644
--- a/hotspot/src/share/vm/memory/metaspace.hpp
+++ b/hotspot/src/share/vm/memory/metaspace.hpp
@@ -226,6 +226,9 @@ class Metaspace : public CHeapObj {
size_t used_bytes_slow(MetadataType mdtype) const;
size_t capacity_bytes_slow(MetadataType mdtype) const;
+ size_t allocated_blocks_bytes() const;
+ size_t allocated_chunks_bytes() const;
+
static MetaWord* allocate(ClassLoaderData* loader_data, size_t word_size,
bool read_only, MetaspaceObj::Type type, TRAPS);
void deallocate(MetaWord* ptr, size_t byte_size, bool is_class);
diff --git a/hotspot/src/share/vm/memory/referenceProcessor.cpp b/hotspot/src/share/vm/memory/referenceProcessor.cpp
index 2a074f21f15..cb14dd8541b 100644
--- a/hotspot/src/share/vm/memory/referenceProcessor.cpp
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp
@@ -190,7 +190,8 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
OopClosure* keep_alive,
VoidClosure* complete_gc,
AbstractRefProcTaskExecutor* task_executor,
- GCTimer* gc_timer) {
+ GCTimer* gc_timer,
+ GCId gc_id) {
NOT_PRODUCT(verify_ok_to_handle_reflists());
assert(!enqueuing_is_done(), "If here enqueuing should not be complete");
@@ -212,7 +213,7 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
// Soft references
size_t soft_count = 0;
{
- GCTraceTime tt("SoftReference", trace_time, false, gc_timer);
+ GCTraceTime tt("SoftReference", trace_time, false, gc_timer, gc_id);
soft_count =
process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true,
is_alive, keep_alive, complete_gc, task_executor);
@@ -223,7 +224,7 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
// Weak references
size_t weak_count = 0;
{
- GCTraceTime tt("WeakReference", trace_time, false, gc_timer);
+ GCTraceTime tt("WeakReference", trace_time, false, gc_timer, gc_id);
weak_count =
process_discovered_reflist(_discoveredWeakRefs, NULL, true,
is_alive, keep_alive, complete_gc, task_executor);
@@ -232,7 +233,7 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
// Final references
size_t final_count = 0;
{
- GCTraceTime tt("FinalReference", trace_time, false, gc_timer);
+ GCTraceTime tt("FinalReference", trace_time, false, gc_timer, gc_id);
final_count =
process_discovered_reflist(_discoveredFinalRefs, NULL, false,
is_alive, keep_alive, complete_gc, task_executor);
@@ -241,7 +242,7 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
// Phantom references
size_t phantom_count = 0;
{
- GCTraceTime tt("PhantomReference", trace_time, false, gc_timer);
+ GCTraceTime tt("PhantomReference", trace_time, false, gc_timer, gc_id);
phantom_count =
process_discovered_reflist(_discoveredPhantomRefs, NULL, false,
is_alive, keep_alive, complete_gc, task_executor);
@@ -253,7 +254,7 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
// thus use JNI weak references to circumvent the phantom references and
// resurrect a "post-mortem" object.
{
- GCTraceTime tt("JNI Weak Reference", trace_time, false, gc_timer);
+ GCTraceTime tt("JNI Weak Reference", trace_time, false, gc_timer, gc_id);
if (task_executor != NULL) {
task_executor->set_single_threaded_mode();
}
@@ -1251,14 +1252,15 @@ void ReferenceProcessor::preclean_discovered_references(
OopClosure* keep_alive,
VoidClosure* complete_gc,
YieldClosure* yield,
- GCTimer* gc_timer) {
+ GCTimer* gc_timer,
+ GCId gc_id) {
NOT_PRODUCT(verify_ok_to_handle_reflists());
// Soft references
{
GCTraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC,
- false, gc_timer);
+ false, gc_timer, gc_id);
for (uint i = 0; i < _max_num_q; i++) {
if (yield->should_return()) {
return;
@@ -1271,7 +1273,7 @@ void ReferenceProcessor::preclean_discovered_references(
// Weak references
{
GCTraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC,
- false, gc_timer);
+ false, gc_timer, gc_id);
for (uint i = 0; i < _max_num_q; i++) {
if (yield->should_return()) {
return;
@@ -1284,7 +1286,7 @@ void ReferenceProcessor::preclean_discovered_references(
// Final references
{
GCTraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC,
- false, gc_timer);
+ false, gc_timer, gc_id);
for (uint i = 0; i < _max_num_q; i++) {
if (yield->should_return()) {
return;
@@ -1297,7 +1299,7 @@ void ReferenceProcessor::preclean_discovered_references(
// Phantom references
{
GCTraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC,
- false, gc_timer);
+ false, gc_timer, gc_id);
for (uint i = 0; i < _max_num_q; i++) {
if (yield->should_return()) {
return;
diff --git a/hotspot/src/share/vm/memory/referenceProcessor.hpp b/hotspot/src/share/vm/memory/referenceProcessor.hpp
index 26ac9f1c5d4..d4d2b89866e 100644
--- a/hotspot/src/share/vm/memory/referenceProcessor.hpp
+++ b/hotspot/src/share/vm/memory/referenceProcessor.hpp
@@ -25,6 +25,7 @@
#ifndef SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
#define SHARE_VM_MEMORY_REFERENCEPROCESSOR_HPP
+#include "gc_implementation/shared/gcTrace.hpp"
#include "memory/referencePolicy.hpp"
#include "memory/referenceProcessorStats.hpp"
#include "memory/referenceType.hpp"
@@ -349,7 +350,8 @@ class ReferenceProcessor : public CHeapObj {
OopClosure* keep_alive,
VoidClosure* complete_gc,
YieldClosure* yield,
- GCTimer* gc_timer);
+ GCTimer* gc_timer,
+ GCId gc_id);
// Delete entries in the discovered lists that have
// either a null referent or are not active. Such
@@ -480,7 +482,8 @@ class ReferenceProcessor : public CHeapObj {
OopClosure* keep_alive,
VoidClosure* complete_gc,
AbstractRefProcTaskExecutor* task_executor,
- GCTimer *gc_timer);
+ GCTimer *gc_timer,
+ GCId gc_id);
// Enqueue references at end of GC (called by the garbage collector)
bool enqueue_discovered_references(AbstractRefProcTaskExecutor* task_executor = NULL);
diff --git a/hotspot/src/share/vm/memory/space.cpp b/hotspot/src/share/vm/memory/space.cpp
index ae29692a62b..396a743ac3b 100644
--- a/hotspot/src/share/vm/memory/space.cpp
+++ b/hotspot/src/share/vm/memory/space.cpp
@@ -37,6 +37,7 @@
#include "oops/oop.inline.hpp"
#include "oops/oop.inline2.hpp"
#include "runtime/java.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/prefetch.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/safepoint.hpp"
diff --git a/hotspot/src/share/vm/memory/specialized_oop_closures.hpp b/hotspot/src/share/vm/memory/specialized_oop_closures.hpp
index 24986b95089..b4e2fa33a22 100644
--- a/hotspot/src/share/vm/memory/specialized_oop_closures.hpp
+++ b/hotspot/src/share/vm/memory/specialized_oop_closures.hpp
@@ -25,7 +25,6 @@
#ifndef SHARE_VM_MEMORY_SPECIALIZED_OOP_CLOSURES_HPP
#define SHARE_VM_MEMORY_SPECIALIZED_OOP_CLOSURES_HPP
-#include "runtime/atomic.hpp"
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
#include "gc_implementation/g1/g1_specialized_oop_closures.hpp"
diff --git a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp
index cf3fefbfe3a..60e645fa6ff 100644
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp
@@ -27,7 +27,6 @@
#include "gc_interface/collectedHeap.hpp"
#include "memory/threadLocalAllocBuffer.hpp"
-#include "runtime/atomic.hpp"
#include "runtime/thread.hpp"
#include "utilities/copy.hpp"
diff --git a/hotspot/src/share/vm/memory/universe.cpp b/hotspot/src/share/vm/memory/universe.cpp
index 0250f1a1b8d..9d5a2a6cbae 100644
--- a/hotspot/src/share/vm/memory/universe.cpp
+++ b/hotspot/src/share/vm/memory/universe.cpp
@@ -53,6 +53,7 @@
#include "oops/typeArrayKlass.hpp"
#include "prims/jvmtiRedefineClassesTrace.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/handles.inline.hpp"
@@ -1000,9 +1001,6 @@ void universe2_init() {
}
-// This function is defined in JVM.cpp
-extern void initialize_converter_functions();
-
bool universe_post_init() {
assert(!is_init_completed(), "Error: initialization not yet completed!");
Universe::_fully_initialized = true;
@@ -1144,11 +1142,6 @@ bool universe_post_init() {
SystemDictionary::ProtectionDomain_klass(), m);;
}
- // The following is initializing converter functions for serialization in
- // JVM.cpp. If we clean up the StrictMath code above we may want to find
- // a better solution for this as well.
- initialize_converter_functions();
-
// This needs to be done before the first scavenge/gc, since
// it's an input to soft ref clearing policy.
{
diff --git a/hotspot/src/share/vm/oops/arrayKlass.cpp b/hotspot/src/share/vm/oops/arrayKlass.cpp
index c55992f0749..e8a367a3766 100644
--- a/hotspot/src/share/vm/oops/arrayKlass.cpp
+++ b/hotspot/src/share/vm/oops/arrayKlass.cpp
@@ -93,7 +93,7 @@ void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_kl
ResourceMark rm(THREAD);
k->initialize_supers(super_klass(), CHECK);
k->vtable()->initialize_vtable(false, CHECK);
- java_lang_Class::create_mirror(k, Handle(NULL), CHECK);
+ java_lang_Class::create_mirror(k, Handle(NULL), Handle(NULL), CHECK);
}
GrowableArray* ArrayKlass::compute_secondary_supers(int num_extra_slots) {
diff --git a/hotspot/src/share/vm/oops/compiledICHolder.cpp b/hotspot/src/share/vm/oops/compiledICHolder.cpp
index 72268079296..c17ca240a85 100644
--- a/hotspot/src/share/vm/oops/compiledICHolder.cpp
+++ b/hotspot/src/share/vm/oops/compiledICHolder.cpp
@@ -27,11 +27,27 @@
#include "oops/klass.hpp"
#include "oops/method.hpp"
#include "oops/oop.inline2.hpp"
+#include "runtime/atomic.inline.hpp"
volatile int CompiledICHolder::_live_count;
volatile int CompiledICHolder::_live_not_claimed_count;
+CompiledICHolder::CompiledICHolder(Method* method, Klass* klass)
+ : _holder_method(method), _holder_klass(klass) {
+#ifdef ASSERT
+ Atomic::inc(&_live_count);
+ Atomic::inc(&_live_not_claimed_count);
+#endif // ASSERT
+}
+
+#ifdef ASSERT
+CompiledICHolder::~CompiledICHolder() {
+ assert(_live_count > 0, "underflow");
+ Atomic::dec(&_live_count);
+}
+#endif // ASSERT
+
// Printing
void CompiledICHolder::print_on(outputStream* st) const {
@@ -51,3 +67,11 @@ void CompiledICHolder::verify_on(outputStream* st) {
guarantee(holder_method()->is_method(), "should be method");
guarantee(holder_klass()->is_klass(), "should be klass");
}
+
+#ifdef ASSERT
+
+void CompiledICHolder::claim() {
+ Atomic::dec(&_live_not_claimed_count);
+}
+
+#endif // ASSERT
diff --git a/hotspot/src/share/vm/oops/compiledICHolder.hpp b/hotspot/src/share/vm/oops/compiledICHolder.hpp
index d3ca41f6ba8..c3e899fde88 100644
--- a/hotspot/src/share/vm/oops/compiledICHolder.hpp
+++ b/hotspot/src/share/vm/oops/compiledICHolder.hpp
@@ -26,6 +26,7 @@
#define SHARE_VM_OOPS_COMPILEDICHOLDEROOP_HPP
#include "oops/oop.hpp"
+#include "utilities/macros.hpp"
// A CompiledICHolder* is a helper object for the inline cache implementation.
// It holds an intermediate value (method+klass pair) used when converting from
@@ -50,20 +51,8 @@ class CompiledICHolder : public CHeapObj {
public:
// Constructor
- CompiledICHolder(Method* method, Klass* klass)
- : _holder_method(method), _holder_klass(klass) {
-#ifdef ASSERT
- Atomic::inc(&_live_count);
- Atomic::inc(&_live_not_claimed_count);
-#endif
- }
-
- ~CompiledICHolder() {
-#ifdef ASSERT
- assert(_live_count > 0, "underflow");
- Atomic::dec(&_live_count);
-#endif
- }
+ CompiledICHolder(Method* method, Klass* klass);
+ ~CompiledICHolder() NOT_DEBUG_RETURN;
static int live_count() { return _live_count; }
static int live_not_claimed_count() { return _live_not_claimed_count; }
@@ -91,11 +80,7 @@ class CompiledICHolder : public CHeapObj {
const char* internal_name() const { return "{compiledICHolder}"; }
- void claim() {
-#ifdef ASSERT
- Atomic::dec(&_live_not_claimed_count);
-#endif
- }
+ void claim() NOT_DEBUG_RETURN;
};
#endif // SHARE_VM_OOPS_COMPILEDICHOLDEROOP_HPP
diff --git a/hotspot/src/share/vm/oops/constantPool.cpp b/hotspot/src/share/vm/oops/constantPool.cpp
index b45fe508a64..111d55b3af7 100644
--- a/hotspot/src/share/vm/oops/constantPool.cpp
+++ b/hotspot/src/share/vm/oops/constantPool.cpp
@@ -71,7 +71,6 @@ ConstantPool::ConstantPool(Array* tags) {
// only set to non-zero if constant pool is merged by RedefineClasses
set_version(0);
- set_lock(new Monitor(Monitor::nonleaf + 2, "A constant pool lock"));
// initialize tag array
int length = tags->length();
@@ -100,9 +99,6 @@ void ConstantPool::deallocate_contents(ClassLoaderData* loader_data) {
void ConstantPool::release_C_heap_structures() {
// walk constant pool and decrement symbol reference counts
unreference_symbols();
-
- delete _lock;
- set_lock(NULL);
}
objArrayOop ConstantPool::resolved_references() const {
@@ -146,8 +142,7 @@ void ConstantPool::initialize_resolved_references(ClassLoaderData* loader_data,
// CDS support. Create a new resolved_references array.
void ConstantPool::restore_unshareable_info(TRAPS) {
- // Only create the new resolved references array and lock if it hasn't been
- // attempted before
+ // Only create the new resolved references array if it hasn't been attempted before
if (resolved_references() != NULL) return;
// restore the C++ vtable from the shared archive
@@ -163,9 +158,6 @@ void ConstantPool::restore_unshareable_info(TRAPS) {
ClassLoaderData* loader_data = pool_holder()->class_loader_data();
set_resolved_references(loader_data->add_handle(refs_handle));
}
-
- // Also need to recreate the mutex. Make sure this matches the constructor
- set_lock(new Monitor(Monitor::nonleaf + 2, "A constant pool lock"));
}
}
@@ -176,7 +168,6 @@ void ConstantPool::remove_unshareable_info() {
set_resolved_reference_length(
resolved_references() != NULL ? resolved_references()->length() : 0);
set_resolved_references(NULL);
- set_lock(NULL);
}
int ConstantPool::cp_to_object_index(int cp_index) {
@@ -186,11 +177,41 @@ int ConstantPool::cp_to_object_index(int cp_index) {
return (i < 0) ? _no_index_sentinel : i;
}
-Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS) {
- // A resolved constantPool entry will contain a Klass*, otherwise a Symbol*.
- // It is not safe to rely on the tag bit's here, since we don't have a lock, and the entry and
- // tag is not updated atomicly.
+void ConstantPool::trace_class_resolution(constantPoolHandle this_cp, KlassHandle k) {
+ ResourceMark rm;
+ int line_number = -1;
+ const char * source_file = NULL;
+ if (JavaThread::current()->has_last_Java_frame()) {
+ // try to identify the method which called this function.
+ vframeStream vfst(JavaThread::current());
+ if (!vfst.at_end()) {
+ line_number = vfst.method()->line_number_from_bci(vfst.bci());
+ Symbol* s = vfst.method()->method_holder()->source_file_name();
+ if (s != NULL) {
+ source_file = s->as_C_string();
+ }
+ }
+ }
+ if (k() != this_cp->pool_holder()) {
+ // only print something if the classes are different
+ if (source_file != NULL) {
+ tty->print("RESOLVE %s %s %s:%d\n",
+ this_cp->pool_holder()->external_name(),
+ InstanceKlass::cast(k())->external_name(), source_file, line_number);
+ } else {
+ tty->print("RESOLVE %s %s\n",
+ this_cp->pool_holder()->external_name(),
+ InstanceKlass::cast(k())->external_name());
+ }
+ }
+}
+Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS) {
+ assert(THREAD->is_Java_thread(), "must be a Java thread");
+
+ // A resolved constantPool entry will contain a Klass*, otherwise a Symbol*.
+ // It is not safe to rely on the tag bit's here, since we don't have a lock, and
+ // the entry and tag is not updated atomicly.
CPSlot entry = this_cp->slot_at(which);
if (entry.is_resolved()) {
assert(entry.get_klass()->is_klass(), "must be");
@@ -198,115 +219,51 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS)
return entry.get_klass();
}
- // Acquire lock on constant oop while doing update. After we get the lock, we check if another object
- // already has updated the object
- assert(THREAD->is_Java_thread(), "must be a Java thread");
- bool do_resolve = false;
- bool in_error = false;
-
- // Create a handle for the mirror. This will preserve the resolved class
- // until the loader_data is registered.
- Handle mirror_handle;
-
- Symbol* name = NULL;
- Handle loader;
- { MonitorLockerEx ml(this_cp->lock());
-
- if (this_cp->tag_at(which).is_unresolved_klass()) {
- if (this_cp->tag_at(which).is_unresolved_klass_in_error()) {
- in_error = true;
- } else {
- do_resolve = true;
- name = this_cp->unresolved_klass_at(which);
- loader = Handle(THREAD, this_cp->pool_holder()->class_loader());
- }
- }
- } // unlocking constantPool
-
-
- // The original attempt to resolve this constant pool entry failed so find the
- // class of the original error and throw another error of the same class (JVMS 5.4.3).
- // If there is a detail message, pass that detail message to the error constructor.
- // The JVMS does not strictly require us to duplicate the same detail message,
- // or any internal exception fields such as cause or stacktrace. But since the
- // detail message is often a class name or other literal string, we will repeat it if
- // we can find it in the symbol table.
- if (in_error) {
+ // This tag doesn't change back to unresolved class unless at a safepoint.
+ if (this_cp->tag_at(which).is_unresolved_klass_in_error()) {
+ // The original attempt to resolve this constant pool entry failed so find the
+ // class of the original error and throw another error of the same class
+ // (JVMS 5.4.3).
+ // If there is a detail message, pass that detail message to the error.
+ // The JVMS does not strictly require us to duplicate the same detail message,
+ // or any internal exception fields such as cause or stacktrace. But since the
+ // detail message is often a class name or other literal string, we will repeat it
+ // if we can find it in the symbol table.
throw_resolution_error(this_cp, which, CHECK_0);
+ ShouldNotReachHere();
}
- if (do_resolve) {
- // this_cp must be unlocked during resolve_or_fail
- oop protection_domain = this_cp->pool_holder()->protection_domain();
- Handle h_prot (THREAD, protection_domain);
- Klass* kk = SystemDictionary::resolve_or_fail(name, loader, h_prot, true, THREAD);
- KlassHandle k;
- if (!HAS_PENDING_EXCEPTION) {
- k = KlassHandle(THREAD, kk);
- // preserve the resolved klass.
- mirror_handle = Handle(THREAD, kk->java_mirror());
- // Do access check for klasses
- verify_constant_pool_resolve(this_cp, k, THREAD);
- }
+ Handle mirror_handle;
+ Symbol* name = entry.get_symbol();
+ Handle loader (THREAD, this_cp->pool_holder()->class_loader());
+ Handle protection_domain (THREAD, this_cp->pool_holder()->protection_domain());
+ Klass* kk = SystemDictionary::resolve_or_fail(name, loader, protection_domain, true, THREAD);
+ KlassHandle k (THREAD, kk);
+ if (!HAS_PENDING_EXCEPTION) {
+ // preserve the resolved klass from unloading
+ mirror_handle = Handle(THREAD, kk->java_mirror());
+ // Do access check for klasses
+ verify_constant_pool_resolve(this_cp, k, THREAD);
+ }
- // Failed to resolve class. We must record the errors so that subsequent attempts
- // to resolve this constant pool entry fail with the same error (JVMS 5.4.3).
- if (HAS_PENDING_EXCEPTION) {
- MonitorLockerEx ml(this_cp->lock());
+ // Failed to resolve class. We must record the errors so that subsequent attempts
+ // to resolve this constant pool entry fail with the same error (JVMS 5.4.3).
+ if (HAS_PENDING_EXCEPTION) {
+ save_and_throw_exception(this_cp, which, constantTag(JVM_CONSTANT_UnresolvedClass), CHECK_0);
+ }
- // some other thread has beaten us and has resolved the class.
- if (this_cp->tag_at(which).is_klass()) {
- CLEAR_PENDING_EXCEPTION;
- entry = this_cp->resolved_klass_at(which);
- return entry.get_klass();
- }
+ // Make this class loader depend upon the class loader owning the class reference
+ ClassLoaderData* this_key = this_cp->pool_holder()->class_loader_data();
+ this_key->record_dependency(k(), CHECK_NULL); // Can throw OOM
- // The tag could have changed to in-error before the lock but we have to
- // handle that here for the class case.
- save_and_throw_exception(this_cp, which, constantTag(JVM_CONSTANT_UnresolvedClass), CHECK_0);
- }
-
- if (TraceClassResolution && !k()->oop_is_array()) {
- // skip resolving the constant pool so that this code get's
- // called the next time some bytecodes refer to this class.
- ResourceMark rm;
- int line_number = -1;
- const char * source_file = NULL;
- if (JavaThread::current()->has_last_Java_frame()) {
- // try to identify the method which called this function.
- vframeStream vfst(JavaThread::current());
- if (!vfst.at_end()) {
- line_number = vfst.method()->line_number_from_bci(vfst.bci());
- Symbol* s = vfst.method()->method_holder()->source_file_name();
- if (s != NULL) {
- source_file = s->as_C_string();
- }
- }
- }
- if (k() != this_cp->pool_holder()) {
- // only print something if the classes are different
- if (source_file != NULL) {
- tty->print("RESOLVE %s %s %s:%d\n",
- this_cp->pool_holder()->external_name(),
- InstanceKlass::cast(k())->external_name(), source_file, line_number);
- } else {
- tty->print("RESOLVE %s %s\n",
- this_cp->pool_holder()->external_name(),
- InstanceKlass::cast(k())->external_name());
- }
- }
+ if (TraceClassResolution && !k->oop_is_array()) {
+ // skip resolving the constant pool so that this code gets
+ // called the next time some bytecodes refer to this class.
+ trace_class_resolution(this_cp, k);
return k();
} else {
- MonitorLockerEx ml(this_cp->lock());
- // Only updated constant pool - if it is resolved.
- do_resolve = this_cp->tag_at(which).is_unresolved_klass();
- if (do_resolve) {
- ClassLoaderData* this_key = this_cp->pool_holder()->class_loader_data();
- this_key->record_dependency(k(), CHECK_NULL); // Can throw OOM
this_cp->klass_at_put(which, k());
}
- }
- }
entry = this_cp->resolved_klass_at(which);
assert(entry.is_resolved() && entry.get_klass()->is_klass(), "must be resolved at this point");
@@ -576,7 +533,7 @@ Symbol* ConstantPool::exception_message(constantPoolHandle this_cp, int which, c
switch (tag.value()) {
case JVM_CONSTANT_UnresolvedClass:
// return the class name in the error message
- message = this_cp->unresolved_klass_at(which);
+ message = this_cp->klass_name_at(which);
break;
case JVM_CONSTANT_MethodHandle:
// return the method handle name in the error message
@@ -606,7 +563,6 @@ void ConstantPool::throw_resolution_error(constantPoolHandle this_cp, int which,
// in the resolution error table, so that the same exception is thrown again.
void ConstantPool::save_and_throw_exception(constantPoolHandle this_cp, int which,
constantTag tag, TRAPS) {
- assert(this_cp->lock()->is_locked(), "constant pool lock should be held");
Symbol* error = PENDING_EXCEPTION->klass()->name();
int error_tag = tag.error_value();
@@ -620,7 +576,14 @@ void ConstantPool::save_and_throw_exception(constantPoolHandle this_cp, int whic
} else if (this_cp->tag_at(which).value() != error_tag) {
Symbol* message = exception_message(this_cp, which, tag, PENDING_EXCEPTION);
SystemDictionary::add_resolution_error(this_cp, which, error, message);
- this_cp->tag_at_put(which, error_tag);
+ // CAS in the tag. If a thread beat us to registering this error that's fine.
+ // If another thread resolved the reference, this is an error. The resolution
+ // must deterministically get an error. So why do we save this?
+ // We save this because jvmti can add classes to the bootclass path after this
+ // error, so it needs to get the same error if the error is first.
+ jbyte old_tag = Atomic::cmpxchg((jbyte)error_tag,
+ (jbyte*)this_cp->tag_addr_at(which), (jbyte)tag.value());
+ assert(old_tag == error_tag || old_tag == tag.value(), "should not be resolved otherwise");
} else {
// some other thread put this in error state
throw_resolution_error(this_cp, which, CHECK);
@@ -710,7 +673,6 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index
THREAD);
result_oop = value();
if (HAS_PENDING_EXCEPTION) {
- MonitorLockerEx ml(this_cp->lock()); // lock cpool to change tag.
save_and_throw_exception(this_cp, index, tag, CHECK_NULL);
}
break;
@@ -727,7 +689,6 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index
Handle value = SystemDictionary::find_method_handle_type(signature, klass, THREAD);
result_oop = value();
if (HAS_PENDING_EXCEPTION) {
- MonitorLockerEx ml(this_cp->lock()); // lock cpool to change tag.
save_and_throw_exception(this_cp, index, tag, CHECK_NULL);
}
break;
@@ -765,22 +726,17 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index
}
if (cache_index >= 0) {
- // Cache the oop here also.
- Handle result_handle(THREAD, result_oop);
- MonitorLockerEx ml(this_cp->lock()); // don't know if we really need this
- oop result = this_cp->resolved_references()->obj_at(cache_index);
- // Benign race condition: resolved_references may already be filled in while we were trying to lock.
+ // Benign race condition: resolved_references may already be filled in.
// The important thing here is that all threads pick up the same result.
// It doesn't matter which racing thread wins, as long as only one
// result is used by all threads, and all future queries.
- // That result may be either a resolved constant or a failure exception.
- if (result == NULL) {
- this_cp->resolved_references()->obj_at_put(cache_index, result_handle());
- return result_handle();
+ oop old_result = this_cp->resolved_references()->atomic_compare_exchange_oop(cache_index, result_oop, NULL);
+ if (old_result == NULL) {
+ return result_oop; // was installed
} else {
// Return the winning thread's result. This can be different than
- // result_handle() for MethodHandles.
- return result;
+ // the result here for MethodHandles.
+ return old_result;
}
} else {
return result_oop;
@@ -853,9 +809,8 @@ bool ConstantPool::klass_name_at_matches(instanceKlassHandle k,
}
-// Iterate over symbols and decrement ones which are Symbol*s.
-// This is done during GC so do not need to lock constantPool unless we
-// have per-thread safepoints.
+// Iterate over symbols and decrement ones which are Symbol*s
+// This is done during GC.
// Only decrement the UTF8 symbols. Unresolved classes and strings point to
// these symbols but didn't increment the reference count.
void ConstantPool::unreference_symbols() {
@@ -987,8 +942,8 @@ bool ConstantPool::compare_entry_to(int index1, constantPoolHandle cp2,
case JVM_CONSTANT_UnresolvedClass:
{
- Symbol* k1 = unresolved_klass_at(index1);
- Symbol* k2 = cp2->unresolved_klass_at(index2);
+ Symbol* k1 = klass_name_at(index1);
+ Symbol* k2 = cp2->klass_name_at(index2);
if (k1 == k2) {
return true;
}
@@ -1970,7 +1925,6 @@ void ConstantPool::print_entry_on(const int index, outputStream* st) {
break;
case JVM_CONSTANT_UnresolvedClass : // fall-through
case JVM_CONSTANT_UnresolvedClassInError: {
- // unresolved_klass_at requires lock or safe world.
CPSlot entry = slot_at(index);
if (entry.is_resolved()) {
entry.get_klass()->print_value_on(st);
diff --git a/hotspot/src/share/vm/oops/constantPool.hpp b/hotspot/src/share/vm/oops/constantPool.hpp
index 99c766ab7c5..5c5ea1c76e2 100644
--- a/hotspot/src/share/vm/oops/constantPool.hpp
+++ b/hotspot/src/share/vm/oops/constantPool.hpp
@@ -112,12 +112,12 @@ class ConstantPool : public Metadata {
int _version;
} _saved;
- Monitor* _lock;
-
void set_tags(Array* tags) { _tags = tags; }
void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); }
void release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); }
+ u1* tag_addr_at(int which) const { return tags()->adr_at(which); }
+
void set_operands(Array* operands) { _operands = operands; }
int flags() const { return _flags; }
@@ -362,14 +362,6 @@ class ConstantPool : public Metadata {
return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
}
- // This method should only be used with a cpool lock or during parsing or gc
- Symbol* unresolved_klass_at(int which) { // Temporary until actual use
- Symbol* s = CPSlot((Symbol*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_symbol();
- // check that the klass is still unresolved.
- assert(tag_at(which).is_unresolved_klass(), "Corrupted constant pool");
- return s;
- }
-
// RedefineClasses() API support:
Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
@@ -818,6 +810,8 @@ class ConstantPool : public Metadata {
static Klass* klass_at_impl(constantPoolHandle this_cp, int which, TRAPS);
static oop string_at_impl(constantPoolHandle this_cp, int which, int obj_index, TRAPS);
+ static void trace_class_resolution(constantPoolHandle this_cp, KlassHandle k);
+
// Resolve string constants (to prevent allocation during compilation)
static void resolve_string_constants_impl(constantPoolHandle this_cp, TRAPS);
@@ -848,8 +842,6 @@ class ConstantPool : public Metadata {
void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
int resolved_reference_length() const { return _saved._resolved_reference_length; }
- void set_lock(Monitor* lock) { _lock = lock; }
- Monitor* lock() { return _lock; }
// Decrease ref counts of symbols that are in the constant pool
// when the holder class is unloaded
diff --git a/hotspot/src/share/vm/oops/cpCache.cpp b/hotspot/src/share/vm/oops/cpCache.cpp
index d601367ba99..64f16f78467 100644
--- a/hotspot/src/share/vm/oops/cpCache.cpp
+++ b/hotspot/src/share/vm/oops/cpCache.cpp
@@ -32,6 +32,7 @@
#include "oops/oop.inline.hpp"
#include "prims/jvmtiRedefineClassesTrace.hpp"
#include "prims/methodHandles.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "utilities/macros.hpp"
@@ -286,7 +287,9 @@ void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
// the lock, so that when the losing writer returns, he can use the linked
// cache entry.
- MonitorLockerEx ml(cpool->lock());
+ // Use the lock from the metaspace for this, which cannot stop for safepoint.
+ Mutex* metaspace_lock = cpool->pool_holder()->class_loader_data()->metaspace_lock();
+ MutexLockerEx ml(metaspace_lock, Mutex::_no_safepoint_check_flag);
if (!is_f1_null()) {
return;
}
diff --git a/hotspot/src/share/vm/oops/instanceClassLoaderKlass.cpp b/hotspot/src/share/vm/oops/instanceClassLoaderKlass.cpp
index a92167a9a7d..131ecbfb040 100644
--- a/hotspot/src/share/vm/oops/instanceClassLoaderKlass.cpp
+++ b/hotspot/src/share/vm/oops/instanceClassLoaderKlass.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/shared/markSweep.inline.hpp"
#include "gc_interface/collectedHeap.inline.hpp"
#include "memory/genOopClosures.inline.hpp"
+#include "memory/iterator.inline.hpp"
#include "memory/oopFactory.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/instanceClassLoaderKlass.hpp"
@@ -44,12 +45,6 @@
#include "oops/oop.pcgc.inline.hpp"
#endif // INCLUDE_ALL_GCS
-#define if_do_metadata_checked(closure, nv_suffix) \
- /* Make sure the non-virtual and the virtual versions match. */ \
- assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
- "Inconsistency in do_metadata"); \
- if (closure->do_metadata##nv_suffix())
-
// Macro to define InstanceClassLoaderKlass::oop_oop_iterate for virtual/nonvirtual for
// all closures. Macros calling macros above for each oop size.
// Since ClassLoader objects have only a pointer to the loader_data, they are not
diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp
index bcf9dc0a097..91d00f8fdea 100644
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp
@@ -35,6 +35,7 @@
#include "jvmtifiles/jvmti.h"
#include "memory/genOopClosures.inline.hpp"
#include "memory/heapInspection.hpp"
+#include "memory/iterator.inline.hpp"
#include "memory/metadataFactory.hpp"
#include "memory/oopFactory.hpp"
#include "oops/fieldStreams.hpp"
@@ -51,6 +52,7 @@
#include "prims/jvmtiRedefineClasses.hpp"
#include "prims/jvmtiThreadState.hpp"
#include "prims/methodComparator.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/fieldDescriptor.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/javaCalls.hpp"
@@ -2113,12 +2115,6 @@ void InstanceKlass::oop_follow_contents(ParCompactionManager* cm,
// closure's do_metadata() method dictates whether the given closure should be
// applied to the klass ptr in the object header.
-#define if_do_metadata_checked(closure, nv_suffix) \
- /* Make sure the non-virtual and the virtual versions match. */ \
- assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
- "Inconsistency in do_metadata"); \
- if (closure->do_metadata##nv_suffix())
-
#define InstanceKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
\
int InstanceKlass::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \
@@ -2142,10 +2138,9 @@ int InstanceKlass::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure)
int InstanceKlass::oop_oop_iterate_backwards##nv_suffix(oop obj, \
OopClosureType* closure) { \
SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::ik); \
- /* header */ \
- if_do_metadata_checked(closure, nv_suffix) { \
- closure->do_klass##nv_suffix(obj->klass()); \
- } \
+ \
+ assert_should_ignore_metadata(closure, nv_suffix); \
+ \
/* instance variables */ \
InstanceKlass_OOP_MAP_REVERSE_ITERATE( \
obj, \
diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp
index 57b06870290..d6c919e9462 100644
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp
@@ -32,7 +32,6 @@
#include "oops/fieldInfo.hpp"
#include "oops/instanceOop.hpp"
#include "oops/klassVtable.hpp"
-#include "runtime/atomic.hpp"
#include "runtime/handles.hpp"
#include "runtime/os.hpp"
#include "utilities/accessFlags.hpp"
diff --git a/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp b/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp
index fd05124f855..2fd8e48397c 100644
--- a/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp
+++ b/hotspot/src/share/vm/oops/instanceMirrorKlass.cpp
@@ -28,6 +28,7 @@
#include "gc_implementation/shared/markSweep.inline.hpp"
#include "gc_interface/collectedHeap.inline.hpp"
#include "memory/genOopClosures.inline.hpp"
+#include "memory/iterator.inline.hpp"
#include "memory/oopFactory.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/instanceMirrorKlass.hpp"
@@ -241,12 +242,6 @@ int InstanceMirrorKlass::oop_adjust_pointers(oop obj) {
return oop_size(obj); \
-#define if_do_metadata_checked(closure, nv_suffix) \
- /* Make sure the non-virtual and the virtual versions match. */ \
- assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
- "Inconsistency in do_metadata"); \
- if (closure->do_metadata##nv_suffix())
-
// Macro to define InstanceMirrorKlass::oop_oop_iterate for virtual/nonvirtual for
// all closures. Macros calling macros above for each oop size.
diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp
index d81dceb8f37..77e2561258f 100644
--- a/hotspot/src/share/vm/oops/klass.cpp
+++ b/hotspot/src/share/vm/oops/klass.cpp
@@ -508,7 +508,7 @@ void Klass::restore_unshareable_info(TRAPS) {
// Only recreate it if not present. A previous attempt to restore may have
// gotten an OOM later but keep the mirror if it was created.
if (java_mirror() == NULL) {
- java_lang_Class::create_mirror(this, Handle(NULL), CHECK);
+ java_lang_Class::create_mirror(this, Handle(NULL), Handle(NULL), CHECK);
}
}
diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp
index 01ef61f2386..4549c68871f 100644
--- a/hotspot/src/share/vm/oops/method.cpp
+++ b/hotspot/src/share/vm/oops/method.cpp
@@ -1023,8 +1023,7 @@ bool Method::is_ignored_by_security_stack_walk() const {
// This is Method.invoke() -- ignore it
return true;
}
- if (JDK_Version::is_gte_jdk14x_version() &&
- method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) {
+ if (method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) {
// This is an auxilary frame -- ignore it
return true;
}
diff --git a/hotspot/src/share/vm/oops/objArrayKlass.cpp b/hotspot/src/share/vm/oops/objArrayKlass.cpp
index 40b6d1b7ca8..0d17ce64dfd 100644
--- a/hotspot/src/share/vm/oops/objArrayKlass.cpp
+++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp
@@ -29,6 +29,7 @@
#include "gc_implementation/shared/markSweep.inline.hpp"
#include "gc_interface/collectedHeap.inline.hpp"
#include "memory/genOopClosures.inline.hpp"
+#include "memory/iterator.inline.hpp"
#include "memory/metadataFactory.hpp"
#include "memory/resourceArea.hpp"
#include "memory/universe.inline.hpp"
@@ -476,12 +477,6 @@ void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm,
}
#endif // INCLUDE_ALL_GCS
-#define if_do_metadata_checked(closure, nv_suffix) \
- /* Make sure the non-virtual and the virtual versions match. */ \
- assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
- "Inconsistency in do_metadata"); \
- if (closure->do_metadata##nv_suffix())
-
#define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
\
int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj, \
diff --git a/hotspot/src/share/vm/oops/objArrayOop.cpp b/hotspot/src/share/vm/oops/objArrayOop.cpp
index 00c4abe5ec3..2d91b46a680 100644
--- a/hotspot/src/share/vm/oops/objArrayOop.cpp
+++ b/hotspot/src/share/vm/oops/objArrayOop.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -27,6 +27,22 @@
#include "oops/objArrayOop.hpp"
#include "oops/oop.inline.hpp"
+oop objArrayOopDesc::atomic_compare_exchange_oop(int index, oop exchange_value,
+ oop compare_value) {
+ volatile HeapWord* dest;
+ if (UseCompressedOops) {
+ dest = (HeapWord*)obj_at_addr(index);
+ } else {
+ dest = (HeapWord*)obj_at_addr(index);
+ }
+ oop res = oopDesc::atomic_compare_exchange_oop(exchange_value, dest, compare_value, true);
+ // update card mark if success
+ if (res == compare_value) {
+ update_barrier_set((void*)dest, exchange_value);
+ }
+ return res;
+}
+
#define ObjArrayOop_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
\
int objArrayOopDesc::oop_iterate_range(OopClosureType* blk, int start, int end) { \
diff --git a/hotspot/src/share/vm/oops/objArrayOop.hpp b/hotspot/src/share/vm/oops/objArrayOop.hpp
index 0cf5d0395e0..897452a6624 100644
--- a/hotspot/src/share/vm/oops/objArrayOop.hpp
+++ b/hotspot/src/share/vm/oops/objArrayOop.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -95,6 +95,9 @@ private:
oop_store(obj_at_addr(index), value);
}
}
+
+ oop atomic_compare_exchange_oop(int index, oop exchange_value, oop compare_value);
+
// Sizing
static int header_size() { return arrayOopDesc::header_size(T_OBJECT); }
int object_size() { return object_size(length()); }
diff --git a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp
index 596bbc6d123..5a8d4d0afaf 100644
--- a/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp
+++ b/hotspot/src/share/vm/oops/oop.pcgc.inline.hpp
@@ -26,6 +26,7 @@
#define SHARE_VM_OOPS_OOP_PCGC_INLINE_HPP
#include "utilities/macros.hpp"
+#include "runtime/atomic.inline.hpp"
#if INCLUDE_ALL_GCS
#include "gc_implementation/parNew/parNewGeneration.hpp"
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
diff --git a/hotspot/src/share/vm/oops/symbol.cpp b/hotspot/src/share/vm/oops/symbol.cpp
index cab865503fa..d3d1f13b63f 100644
--- a/hotspot/src/share/vm/oops/symbol.cpp
+++ b/hotspot/src/share/vm/oops/symbol.cpp
@@ -26,11 +26,11 @@
#include "precompiled.hpp"
#include "classfile/altHashing.hpp"
#include "classfile/classLoaderData.hpp"
+#include "memory/allocation.inline.hpp"
+#include "memory/resourceArea.hpp"
#include "oops/symbol.hpp"
#include "runtime/atomic.inline.hpp"
#include "runtime/os.hpp"
-#include "memory/allocation.inline.hpp"
-#include "memory/resourceArea.hpp"
Symbol::Symbol(const u1* name, int length, int refcount) {
_refcount = refcount;
diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp
index 0036e76518e..9c8ae35a04e 100644
--- a/hotspot/src/share/vm/opto/compile.cpp
+++ b/hotspot/src/share/vm/opto/compile.cpp
@@ -3411,7 +3411,7 @@ void Compile::verify_graph_edges(bool no_dead_code) {
_root->verify_edges(visited);
if (no_dead_code) {
// Now make sure that no visited node is used by an unvisited node.
- bool dead_nodes = 0;
+ bool dead_nodes = false;
Unique_Node_List checked(area);
while (visited.size() > 0) {
Node* n = visited.pop();
@@ -3422,14 +3422,16 @@ void Compile::verify_graph_edges(bool no_dead_code) {
if (visited.member(use)) continue; // already in the graph
if (use->is_Con()) continue; // a dead ConNode is OK
// At this point, we have found a dead node which is DU-reachable.
- if (dead_nodes++ == 0)
+ if (!dead_nodes) {
tty->print_cr("*** Dead nodes reachable via DU edges:");
+ dead_nodes = true;
+ }
use->dump(2);
tty->print_cr("---");
checked.push(use); // No repeats; pretend it is now checked.
}
}
- assert(dead_nodes == 0, "using nodes must be reachable from root");
+ assert(!dead_nodes, "using nodes must be reachable from root");
}
}
}
diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp
index 2b2f11f9b4e..a8321b07753 100644
--- a/hotspot/src/share/vm/opto/matcher.cpp
+++ b/hotspot/src/share/vm/opto/matcher.cpp
@@ -36,7 +36,6 @@
#include "opto/runtime.hpp"
#include "opto/type.hpp"
#include "opto/vectornode.hpp"
-#include "runtime/atomic.hpp"
#include "runtime/os.hpp"
#ifdef TARGET_ARCH_MODEL_x86_32
# include "adfiles/ad_x86_32.hpp"
diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp
index 632a03f2304..dba4f047b5a 100644
--- a/hotspot/src/share/vm/opto/runtime.cpp
+++ b/hotspot/src/share/vm/opto/runtime.cpp
@@ -55,6 +55,7 @@
#include "opto/mulnode.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/interfaceSupport.hpp"
diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp
index 6bbe5feb691..6eebcad45aa 100644
--- a/hotspot/src/share/vm/prims/jni.cpp
+++ b/hotspot/src/share/vm/prims/jni.cpp
@@ -59,6 +59,7 @@
#include "prims/jvm_misc.hpp"
#include "prims/jvmtiExport.hpp"
#include "prims/jvmtiThreadState.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/fieldDescriptor.hpp"
#include "runtime/fprofiler.hpp"
@@ -3336,13 +3337,7 @@ static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) {
directBufferSupportInitializeEnded = 1;
} else {
while (!directBufferSupportInitializeEnded && !directBufferSupportInitializeFailed) {
- // Set state as yield_all can call os:sleep. On Solaris, yield_all calls
- // os::sleep which requires the VM state transition. On other platforms, it
- // is not necessary. The following call to change the VM state is purposely
- // put inside the loop to avoid potential deadlock when multiple threads
- // try to call this method. See 6791815 for more details.
- ThreadInVMfromNative tivn(thread);
- os::yield_all();
+ os::yield();
}
}
@@ -3858,6 +3853,7 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
#if INCLUDE_ALL_GCS
#include "gc_implementation/g1/heapRegionRemSet.hpp"
#endif
+#include "memory/guardedMemory.hpp"
#include "utilities/quickSort.hpp"
#include "utilities/ostream.hpp"
#if INCLUDE_VM_STRUCTS
@@ -3901,6 +3897,7 @@ void execute_internal_vm_tests() {
run_unit_test(arrayOopDesc::test_max_array_length());
run_unit_test(CollectedHeap::test_is_in());
run_unit_test(QuickSort::test_quick_sort());
+ run_unit_test(GuardedMemory::test_guarded_memory());
run_unit_test(AltHashing::test_alt_hash());
run_unit_test(test_loggc_filename());
run_unit_test(TestNewSize_test());
diff --git a/hotspot/src/share/vm/prims/jniCheck.cpp b/hotspot/src/share/vm/prims/jniCheck.cpp
index 0d5ffab1cdc..cdce2643775 100644
--- a/hotspot/src/share/vm/prims/jniCheck.cpp
+++ b/hotspot/src/share/vm/prims/jniCheck.cpp
@@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
+#include "memory/guardedMemory.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/oop.inline.hpp"
#include "oops/symbol.hpp"
@@ -52,6 +53,8 @@
# include "jniTypes_ppc.hpp"
#endif
+// Complain every extra number of unplanned local refs
+#define CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD 32
// Heap objects are allowed to be directly referenced only in VM code,
// not in native code.
@@ -167,12 +170,42 @@ static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {
* SUPPORT FUNCTIONS
*/
+/**
+ * Check whether or not a programmer has actually checked for exceptions. According
+ * to the JNI Specification ("jni/spec/design.html#java_exceptions"):
+ *
+ * There are two cases where the programmer needs to check for exceptions without
+ * being able to first check an error code:
+ *
+ * - The JNI functions that invoke a Java method return the result of the Java method.
+ * The programmer must call ExceptionOccurred() to check for possible exceptions
+ * that occurred during the execution of the Java method.
+ *
+ * - Some of the JNI array access functions do not return an error code, but may
+ * throw an ArrayIndexOutOfBoundsException or ArrayStoreException.
+ *
+ * In all other cases, a non-error return value guarantees that no exceptions have been thrown.
+ */
static inline void
-functionEnterCritical(JavaThread* thr)
-{
+check_pending_exception(JavaThread* thr) {
if (thr->has_pending_exception()) {
NativeReportJNIWarning(thr, "JNI call made with exception pending");
}
+ if (thr->is_pending_jni_exception_check()) {
+ IN_VM(
+ tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",
+ thr->get_pending_jni_exception_check());
+ thr->print_stack();
+ )
+ thr->clear_pending_jni_exception_check(); // Just complain once
+ }
+}
+
+
+static inline void
+functionEnterCritical(JavaThread* thr)
+{
+ check_pending_exception(thr);
}
static inline void
@@ -186,9 +219,7 @@ functionEnter(JavaThread* thr)
if (thr->in_critical()) {
tty->print_cr("%s", warn_other_function_in_critical);
}
- if (thr->has_pending_exception()) {
- NativeReportJNIWarning(thr, "JNI call made with exception pending");
- }
+ check_pending_exception(thr);
}
static inline void
@@ -200,9 +231,20 @@ functionEnterExceptionAllowed(JavaThread* thr)
}
static inline void
-functionExit(JNIEnv *env)
+functionExit(JavaThread* thr)
{
- /* nothing to do at this time */
+ JNIHandleBlock* handles = thr->active_handles();
+ size_t planned_capacity = handles->get_planned_capacity();
+ size_t live_handles = handles->get_number_of_live_handles();
+ if (live_handles > planned_capacity) {
+ IN_VM(
+ tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",
+ live_handles, planned_capacity);
+ thr->print_stack();
+ )
+ // Complain just the once, reset to current + warn threshold
+ handles->set_planned_capacity(live_handles + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
+ }
}
static inline void
@@ -323,6 +365,74 @@ check_is_obj_array(JavaThread* thr, jarray jArray) {
}
}
+/*
+ * Copy and wrap array elements for bounds checking.
+ * Remember the original elements (GuardedMemory::get_tag())
+ */
+static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
+ void* orig_elements) {
+ void* result;
+ IN_VM(
+ oop a = JNIHandles::resolve_non_null(array);
+ size_t len = arrayOop(a)->length() <<
+ TypeArrayKlass::cast(a->klass())->log2_element_size();
+ result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
+ )
+ return result;
+}
+
+static void* check_wrapped_array(JavaThread* thr, const char* fn_name,
+ void* obj, void* carray, size_t* rsz) {
+ if (carray == NULL) {
+ tty->print_cr("%s: elements vector NULL" PTR_FORMAT, fn_name, p2i(obj));
+ NativeReportJNIFatalError(thr, "Elements vector NULL");
+ }
+ GuardedMemory guarded(carray);
+ void* orig_result = guarded.get_tag();
+ if (!guarded.verify_guards()) {
+ tty->print_cr("ReleasePrimitiveArrayCritical: release array failed bounds "
+ "check, incorrect pointer returned ? array: " PTR_FORMAT " carray: "
+ PTR_FORMAT, p2i(obj), p2i(carray));
+ guarded.print_on(tty);
+ NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "
+ "failed bounds check");
+ }
+ if (orig_result == NULL) {
+ tty->print_cr("ReleasePrimitiveArrayCritical: unrecognized elements. array: "
+ PTR_FORMAT " carray: " PTR_FORMAT, p2i(obj), p2i(carray));
+ guarded.print_on(tty);
+ NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "
+ "unrecognized elements");
+ }
+ if (rsz != NULL) {
+ *rsz = guarded.get_user_size();
+ }
+ return orig_result;
+}
+
+static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name,
+ void* obj, void* carray, jint mode) {
+ size_t sz;
+ void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz);
+ switch (mode) {
+ case 0:
+ memcpy(orig_result, carray, sz);
+ GuardedMemory::free_copy(carray);
+ break;
+ case JNI_COMMIT:
+ memcpy(orig_result, carray, sz);
+ break;
+ case JNI_ABORT:
+ GuardedMemory::free_copy(carray);
+ break;
+ default:
+ tty->print_cr("%s: Unrecognized mode %i releasing array "
+ PTR_FORMAT " elements " PTR_FORMAT, fn_name, mode, p2i(obj), p2i(carray));
+ NativeReportJNIFatalError(thr, "Unrecognized array release mode");
+ }
+ return orig_result;
+}
+
oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {
if (JNIHandles::is_frame_handle(thr, obj) ||
JNIHandles::is_local_handle(thr, obj) ||
@@ -439,7 +549,7 @@ JNI_ENTRY_CHECKED(jclass,
jniCheck::validate_object(thr, loader);
)
jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -451,7 +561,7 @@ JNI_ENTRY_CHECKED(jclass,
jniCheck::validate_class_descriptor(thr, name);
)
jclass result = UNCHECKED()->FindClass(env, name);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -463,7 +573,7 @@ JNI_ENTRY_CHECKED(jmethodID,
jniCheck::validate_object(thr, method);
)
jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -475,7 +585,7 @@ JNI_ENTRY_CHECKED(jfieldID,
jniCheck::validate_object(thr, field);
)
jfieldID result = UNCHECKED()->FromReflectedField(env, field);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -491,7 +601,7 @@ JNI_ENTRY_CHECKED(jobject,
)
jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
isStatic);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -503,7 +613,7 @@ JNI_ENTRY_CHECKED(jclass,
jniCheck::validate_class(thr, sub, true);
)
jclass result = UNCHECKED()->GetSuperclass(env, sub);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -517,7 +627,7 @@ JNI_ENTRY_CHECKED(jboolean,
jniCheck::validate_class(thr, sup, true);
)
jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -532,7 +642,7 @@ JNI_ENTRY_CHECKED(jobject,
)
jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,
isStatic);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -550,7 +660,7 @@ JNI_ENTRY_CHECKED(jint,
}
)
jint result = UNCHECKED()->Throw(env, obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -565,15 +675,16 @@ JNI_ENTRY_CHECKED(jint,
jniCheck::validate_throwable_klass(thr, k);
)
jint result = UNCHECKED()->ThrowNew(env, clazz, msg);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
JNI_ENTRY_CHECKED(jthrowable,
checked_jni_ExceptionOccurred(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
jthrowable result = UNCHECKED()->ExceptionOccurred(env);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -581,22 +692,24 @@ JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionDescribe(JNIEnv *env))
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionDescribe(env);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_ExceptionClear(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
UNCHECKED()->ExceptionClear(env);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
checked_jni_FatalError(JNIEnv *env,
const char *msg))
+ thr->clear_pending_jni_exception_check();
functionEnter(thr);
UNCHECKED()->FatalError(env, msg);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jint,
@@ -606,7 +719,10 @@ JNI_ENTRY_CHECKED(jint,
if (capacity < 0)
NativeReportJNIFatalError(thr, "negative capacity");
jint result = UNCHECKED()->PushLocalFrame(env, capacity);
- functionExit(env);
+ if (result == JNI_OK) {
+ thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
+ }
+ functionExit(thr);
return result;
JNI_END
@@ -615,7 +731,7 @@ JNI_ENTRY_CHECKED(jobject,
jobject result))
functionEnterExceptionAllowed(thr);
jobject res = UNCHECKED()->PopLocalFrame(env, result);
- functionExit(env);
+ functionExit(thr);
return res;
JNI_END
@@ -629,7 +745,7 @@ JNI_ENTRY_CHECKED(jobject,
}
)
jobject result = UNCHECKED()->NewGlobalRef(env,lobj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -645,7 +761,7 @@ JNI_ENTRY_CHECKED(void,
}
)
UNCHECKED()->DeleteGlobalRef(env,gref);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -660,7 +776,7 @@ JNI_ENTRY_CHECKED(void,
"Invalid local JNI handle passed to DeleteLocalRef");
)
UNCHECKED()->DeleteLocalRef(env, obj);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
@@ -681,7 +797,7 @@ JNI_ENTRY_CHECKED(jboolean,
}
)
jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -695,7 +811,7 @@ JNI_ENTRY_CHECKED(jobject,
}
)
jobject result = UNCHECKED()->NewLocalRef(env, ref);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -707,7 +823,10 @@ JNI_ENTRY_CHECKED(jint,
NativeReportJNIFatalError(thr, "negative capacity");
}
jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);
- functionExit(env);
+ if (result == JNI_OK) {
+ thr->active_handles()->set_planned_capacity(capacity + CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
+ }
+ functionExit(thr);
return result;
JNI_END
@@ -719,7 +838,7 @@ JNI_ENTRY_CHECKED(jobject,
jniCheck::validate_class(thr, clazz, false);
)
jobject result = UNCHECKED()->AllocObject(env,clazz);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -737,7 +856,7 @@ JNI_ENTRY_CHECKED(jobject,
va_start(args, methodID);
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
va_end(args);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -752,7 +871,7 @@ JNI_ENTRY_CHECKED(jobject,
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -767,7 +886,7 @@ JNI_ENTRY_CHECKED(jobject,
jniCheck::validate_jmethod_id(thr, methodID);
)
jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -779,7 +898,7 @@ JNI_ENTRY_CHECKED(jclass,
jniCheck::validate_object(thr, obj);
)
jclass result = UNCHECKED()->GetObjectClass(env,obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -793,7 +912,7 @@ JNI_ENTRY_CHECKED(jboolean,
jniCheck::validate_class(thr, clazz, true);
)
jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -807,7 +926,7 @@ JNI_ENTRY_CHECKED(jmethodID,
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -826,7 +945,8 @@ JNI_ENTRY_CHECKED(ResultType, \
ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \
args); \
va_end(args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("Call"#Result"Method"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -841,7 +961,8 @@ JNI_ENTRY_CHECKED(ResultType, \
) \
ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -856,7 +977,8 @@ JNI_ENTRY_CHECKED(ResultType, \
) \
ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \
+ functionExit(thr); \
return result; \
JNI_END
@@ -883,7 +1005,8 @@ JNI_ENTRY_CHECKED(void,
va_start(args,methodID);
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
va_end(args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallVoidMethod");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -896,7 +1019,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallVoidMethodV");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -909,7 +1033,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_call_object(thr, obj, methodID);
)
UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallVoidMethodA");
+ functionExit(thr);
JNI_END
#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \
@@ -932,7 +1057,8 @@ JNI_ENTRY_CHECKED(ResultType, \
methodID,\
args); \
va_end(args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -952,7 +1078,8 @@ JNI_ENTRY_CHECKED(ResultType, \
clazz, \
methodID,\
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -972,7 +1099,8 @@ JNI_ENTRY_CHECKED(ResultType, \
clazz, \
methodID,\
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \
+ functionExit(thr); \
return result; \
JNI_END
@@ -1001,7 +1129,8 @@ JNI_ENTRY_CHECKED(void,
va_start(args,methodID);
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
va_end(args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1016,7 +1145,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1031,7 +1161,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_call_class(thr, clazz, methodID);
)
UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
@@ -1044,7 +1175,7 @@ JNI_ENTRY_CHECKED(jfieldID,
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1058,7 +1189,7 @@ JNI_ENTRY_CHECKED(ReturnType, \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \
- functionExit(env); \
+ functionExit(thr); \
return result; \
JNI_END
@@ -1083,7 +1214,7 @@ JNI_ENTRY_CHECKED(void, \
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
) \
UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \
- functionExit(env); \
+ functionExit(thr); \
JNI_END
WRAPPER_SetField(jobject, Object, T_OBJECT)
@@ -1107,7 +1238,7 @@ JNI_ENTRY_CHECKED(jmethodID,
jniCheck::validate_class(thr, clazz, false);
)
jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1129,7 +1260,8 @@ JNI_ENTRY_CHECKED(ReturnType, \
methodID, \
args); \
va_end(args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -1147,7 +1279,8 @@ JNI_ENTRY_CHECKED(ReturnType, \
clazz, \
methodID, \
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \
+ functionExit(thr); \
return result; \
JNI_END \
\
@@ -1165,7 +1298,8 @@ JNI_ENTRY_CHECKED(ReturnType, \
clazz, \
methodID, \
args); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \
+ functionExit(thr); \
return result; \
JNI_END
@@ -1193,7 +1327,8 @@ JNI_ENTRY_CHECKED(void,
va_start(args,methodID);
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
va_end(args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallStaticVoidMethod");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1207,7 +1342,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallStaticVoidMethodV");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1221,7 +1357,8 @@ JNI_ENTRY_CHECKED(void,
jniCheck::validate_class(thr, cls, false);
)
UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
- functionExit(env);
+ thr->set_pending_jni_exception_check("CallStaticVoidMethodA");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jfieldID,
@@ -1234,7 +1371,7 @@ JNI_ENTRY_CHECKED(jfieldID,
jniCheck::validate_class(thr, clazz, false);
)
jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1251,7 +1388,7 @@ JNI_ENTRY_CHECKED(ReturnType, \
ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \
clazz, \
fieldID); \
- functionExit(env); \
+ functionExit(thr); \
return result; \
JNI_END
@@ -1277,7 +1414,7 @@ JNI_ENTRY_CHECKED(void, \
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
) \
UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \
- functionExit(env); \
+ functionExit(thr); \
JNI_END
WRAPPER_SetStaticField(jobject, Object, T_OBJECT)
@@ -1297,7 +1434,7 @@ JNI_ENTRY_CHECKED(jstring,
jsize len))
functionEnter(thr);
jstring result = UNCHECKED()->NewString(env,unicode,len);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1309,12 +1446,12 @@ JNI_ENTRY_CHECKED(jsize,
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringLength(env,str);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
// Arbitrary (but well-known) tag
-const jint STRING_TAG = 0x47114711;
+const void* STRING_TAG = (void*)0x47114711;
JNI_ENTRY_CHECKED(const jchar *,
checked_jni_GetStringChars(JNIEnv *env,
@@ -1324,21 +1461,22 @@ JNI_ENTRY_CHECKED(const jchar *,
IN_VM(
checkString(thr, str);
)
- jchar* newResult = NULL;
+ jchar* new_result = NULL;
const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");
if (result != NULL) {
size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination
- jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal);
- *tagLocation = STRING_TAG;
- newResult = (jchar*) (tagLocation + 1);
- memcpy(newResult, result, len * sizeof(jchar));
+ len *= sizeof(jchar);
+ new_result = (jchar*) GuardedMemory::wrap_copy(result, len, STRING_TAG);
+ if (new_result == NULL) {
+ vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringChars");
+ }
// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result);
}
- functionExit(env);
- return newResult;
+ functionExit(thr);
+ return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1354,13 +1492,25 @@ JNI_ENTRY_CHECKED(void,
UNCHECKED()->ReleaseStringChars(env,str,chars);
}
else {
- jint* tagLocation = ((jint*) chars) - 1;
- if (*tagLocation != STRING_TAG) {
- NativeReportJNIFatalError(thr, "ReleaseStringChars called on something not allocated by GetStringChars");
- }
- UNCHECKED()->ReleaseStringChars(env,str,(const jchar*)tagLocation);
+ GuardedMemory guarded((void*)chars);
+ if (!guarded.verify_guards()) {
+ tty->print_cr("ReleaseStringChars: release chars failed bounds check. "
+ "string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));
+ guarded.print_on(tty);
+ NativeReportJNIFatalError(thr, "ReleaseStringChars: "
+ "release chars failed bounds check.");
+ }
+ if (guarded.get_tag() != STRING_TAG) {
+ tty->print_cr("ReleaseStringChars: called on something not allocated "
+ "by GetStringChars. string: " PTR_FORMAT " chars: " PTR_FORMAT,
+ p2i(str), p2i(chars));
+ NativeReportJNIFatalError(thr, "ReleaseStringChars called on something "
+ "not allocated by GetStringChars");
+ }
+ UNCHECKED()->ReleaseStringChars(env, str,
+ (const jchar*) guarded.release_for_freeing());
}
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jstring,
@@ -1368,7 +1518,7 @@ JNI_ENTRY_CHECKED(jstring,
const char *utf))
functionEnter(thr);
jstring result = UNCHECKED()->NewStringUTF(env,utf);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1380,12 +1530,12 @@ JNI_ENTRY_CHECKED(jsize,
checkString(thr, str);
)
jsize result = UNCHECKED()->GetStringUTFLength(env,str);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
// Arbitrary (but well-known) tag - different than GetStringChars
-const jint STRING_UTF_TAG = 0x48124812;
+const void* STRING_UTF_TAG = (void*) 0x48124812;
JNI_ENTRY_CHECKED(const char *,
checked_jni_GetStringUTFChars(JNIEnv *env,
@@ -1395,21 +1545,21 @@ JNI_ENTRY_CHECKED(const char *,
IN_VM(
checkString(thr, str);
)
- char* newResult = NULL;
+ char* new_result = NULL;
const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");
if (result != NULL) {
size_t len = strlen(result) + 1; // + 1 for NULL termination
- jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal);
- *tagLocation = STRING_UTF_TAG;
- newResult = (char*) (tagLocation + 1);
- strcpy(newResult, result);
+ new_result = (char*) GuardedMemory::wrap_copy(result, len, STRING_UTF_TAG);
+ if (new_result == NULL) {
+ vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringUTFChars");
+ }
// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
FreeHeap((char*)result, mtInternal);
}
- functionExit(env);
- return newResult;
+ functionExit(thr);
+ return new_result;
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1425,13 +1575,25 @@ JNI_ENTRY_CHECKED(void,
UNCHECKED()->ReleaseStringUTFChars(env,str,chars);
}
else {
- jint* tagLocation = ((jint*) chars) - 1;
- if (*tagLocation != STRING_UTF_TAG) {
- NativeReportJNIFatalError(thr, "ReleaseStringUTFChars called on something not allocated by GetStringUTFChars");
- }
- UNCHECKED()->ReleaseStringUTFChars(env,str,(const char*)tagLocation);
+ GuardedMemory guarded((void*)chars);
+ if (!guarded.verify_guards()) {
+ tty->print_cr("ReleaseStringUTFChars: release chars failed bounds check. "
+ "string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));
+ guarded.print_on(tty);
+ NativeReportJNIFatalError(thr, "ReleaseStringUTFChars: "
+ "release chars failed bounds check.");
+ }
+ if (guarded.get_tag() != STRING_UTF_TAG) {
+ tty->print_cr("ReleaseStringUTFChars: called on something not "
+ "allocated by GetStringUTFChars. string: " PTR_FORMAT " chars: "
+ PTR_FORMAT, p2i(str), p2i(chars));
+ NativeReportJNIFatalError(thr, "ReleaseStringUTFChars "
+ "called on something not allocated by GetStringUTFChars");
+ }
+ UNCHECKED()->ReleaseStringUTFChars(env, str,
+ (const char*) guarded.release_for_freeing());
}
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jsize,
@@ -1442,7 +1604,7 @@ JNI_ENTRY_CHECKED(jsize,
check_is_array(thr, array);
)
jsize result = UNCHECKED()->GetArrayLength(env,array);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1453,7 +1615,7 @@ JNI_ENTRY_CHECKED(jobjectArray,
jobject init))
functionEnter(thr);
jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1466,7 +1628,8 @@ JNI_ENTRY_CHECKED(jobject,
check_is_obj_array(thr, array);
)
jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
- functionExit(env);
+ thr->set_pending_jni_exception_check("GetObjectArrayElement");
+ functionExit(thr);
return result;
JNI_END
@@ -1480,7 +1643,8 @@ JNI_ENTRY_CHECKED(void,
check_is_obj_array(thr, array);
)
UNCHECKED()->SetObjectArrayElement(env,array,index,val);
- functionExit(env);
+ thr->set_pending_jni_exception_check("SetObjectArrayElement");
+ functionExit(thr);
JNI_END
#define WRAPPER_NewScalarArray(Return, Result) \
@@ -1489,7 +1653,7 @@ JNI_ENTRY_CHECKED(Return, \
jsize len)) \
functionEnter(thr); \
Return result = UNCHECKED()->New##Result##Array(env,len); \
- functionExit(env); \
+ functionExit(thr); \
return (Return) result; \
JNI_END
@@ -1514,7 +1678,10 @@ JNI_ENTRY_CHECKED(ElementType *, \
ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \
array, \
isCopy); \
- functionExit(env); \
+ if (result != NULL) { \
+ result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \
+ } \
+ functionExit(thr); \
return result; \
JNI_END
@@ -1538,13 +1705,11 @@ JNI_ENTRY_CHECKED(void, \
check_primitive_array_type(thr, array, ElementTag); \
ASSERT_OOPS_ALLOWED; \
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
- /* cannot check validity of copy, unless every request is logged by
- * checking code. Implementation of this check is deferred until a
- * subsequent release.
- */ \
) \
- UNCHECKED()->Release##Result##ArrayElements(env,array,elems,mode); \
- functionExit(env); \
+ ElementType* orig_result = (ElementType *) check_wrapped_array_release( \
+ thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \
+ UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \
+ functionExit(thr); \
JNI_END
WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)
@@ -1568,7 +1733,8 @@ JNI_ENTRY_CHECKED(void, \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("Get"#Result"ArrayRegion"); \
+ functionExit(thr); \
JNI_END
WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
@@ -1592,7 +1758,8 @@ JNI_ENTRY_CHECKED(void, \
check_primitive_array_type(thr, array, ElementTag); \
) \
UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \
- functionExit(env); \
+ thr->set_pending_jni_exception_check("Set"#Result"ArrayRegion"); \
+ functionExit(thr); \
JNI_END
WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
@@ -1611,7 +1778,7 @@ JNI_ENTRY_CHECKED(jint,
jint nMethods))
functionEnter(thr);
jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1620,7 +1787,7 @@ JNI_ENTRY_CHECKED(jint,
jclass clazz))
functionEnter(thr);
jint result = UNCHECKED()->UnregisterNatives(env,clazz);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1632,7 +1799,7 @@ JNI_ENTRY_CHECKED(jint,
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorEnter(env,obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1644,7 +1811,7 @@ JNI_ENTRY_CHECKED(jint,
jniCheck::validate_object(thr, obj);
)
jint result = UNCHECKED()->MonitorExit(env,obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1653,7 +1820,7 @@ JNI_ENTRY_CHECKED(jint,
JavaVM **vm))
functionEnter(thr);
jint result = UNCHECKED()->GetJavaVM(env,vm);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1668,7 +1835,8 @@ JNI_ENTRY_CHECKED(void,
checkString(thr, str);
)
UNCHECKED()->GetStringRegion(env, str, start, len, buf);
- functionExit(env);
+ thr->set_pending_jni_exception_check("GetStringRegion");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void,
@@ -1682,7 +1850,8 @@ JNI_ENTRY_CHECKED(void,
checkString(thr, str);
)
UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);
- functionExit(env);
+ thr->set_pending_jni_exception_check("GetStringUTFRegion");
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(void *,
@@ -1694,7 +1863,10 @@ JNI_ENTRY_CHECKED(void *,
check_is_primitive_array(thr, array);
)
void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);
- functionExit(env);
+ if (result != NULL) {
+ result = check_jni_wrap_copy_array(thr, array, result);
+ }
+ functionExit(thr);
return result;
JNI_END
@@ -1707,11 +1879,10 @@ JNI_ENTRY_CHECKED(void,
IN_VM(
check_is_primitive_array(thr, array);
)
- /* The Hotspot JNI code does not use the parameters, so just check the
- * array parameter as a minor sanity check
- */
- UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, carray, mode);
- functionExit(env);
+ // Check the element array...
+ void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);
+ UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(const jchar*,
@@ -1723,7 +1894,7 @@ JNI_ENTRY_CHECKED(const jchar*,
checkString(thr, string);
)
const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1739,7 +1910,7 @@ JNI_ENTRY_CHECKED(void,
* string parameter as a minor sanity check
*/
UNCHECKED()->ReleaseStringCritical(env, str, chars);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jweak,
@@ -1752,7 +1923,7 @@ JNI_ENTRY_CHECKED(jweak,
}
)
jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1761,14 +1932,15 @@ JNI_ENTRY_CHECKED(void,
jweak ref))
functionEnterExceptionAllowed(thr);
UNCHECKED()->DeleteWeakGlobalRef(env, ref);
- functionExit(env);
+ functionExit(thr);
JNI_END
JNI_ENTRY_CHECKED(jboolean,
checked_jni_ExceptionCheck(JNIEnv *env))
+ thr->clear_pending_jni_exception_check();
functionEnterExceptionAllowed(thr);
jboolean result = UNCHECKED()->ExceptionCheck(env);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1778,7 +1950,7 @@ JNI_ENTRY_CHECKED(jobject,
jlong capacity))
functionEnter(thr);
jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1787,7 +1959,7 @@ JNI_ENTRY_CHECKED(void *,
jobject buf))
functionEnter(thr);
void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1796,7 +1968,7 @@ JNI_ENTRY_CHECKED(jlong,
jobject buf))
functionEnter(thr);
jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1809,7 +1981,7 @@ JNI_ENTRY_CHECKED(jobjectRefType,
jniCheck::validate_object(thr, obj);
)
jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
@@ -1818,7 +1990,7 @@ JNI_ENTRY_CHECKED(jint,
checked_jni_GetVersion(JNIEnv *env))
functionEnter(thr);
jint result = UNCHECKED()->GetVersion(env);
- functionExit(env);
+ functionExit(thr);
return result;
JNI_END
diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp
index 5b96377b24a..0dbeea8a8a4 100644
--- a/hotspot/src/share/vm/prims/jvm.cpp
+++ b/hotspot/src/share/vm/prims/jvm.cpp
@@ -44,6 +44,7 @@
#include "prims/nativeLookup.hpp"
#include "prims/privilegedStack.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/dtraceJSDT.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/init.hpp"
@@ -55,6 +56,7 @@
#include "runtime/os.hpp"
#include "runtime/perfData.hpp"
#include "runtime/reflection.hpp"
+#include "runtime/thread.inline.hpp"
#include "runtime/vframe.hpp"
#include "runtime/vm_operations.hpp"
#include "services/attachListener.hpp"
@@ -3923,50 +3925,6 @@ JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {
}
-// Support for Serialization
-
-typedef jfloat (JNICALL *IntBitsToFloatFn )(JNIEnv* env, jclass cb, jint value);
-typedef jdouble (JNICALL *LongBitsToDoubleFn)(JNIEnv* env, jclass cb, jlong value);
-typedef jint (JNICALL *FloatToIntBitsFn )(JNIEnv* env, jclass cb, jfloat value);
-typedef jlong (JNICALL *DoubleToLongBitsFn)(JNIEnv* env, jclass cb, jdouble value);
-
-static IntBitsToFloatFn int_bits_to_float_fn = NULL;
-static LongBitsToDoubleFn long_bits_to_double_fn = NULL;
-static FloatToIntBitsFn float_to_int_bits_fn = NULL;
-static DoubleToLongBitsFn double_to_long_bits_fn = NULL;
-
-
-void initialize_converter_functions() {
- if (JDK_Version::is_gte_jdk14x_version()) {
- // These functions only exist for compatibility with 1.3.1 and earlier
- return;
- }
-
- // called from universe_post_init()
- assert(
- int_bits_to_float_fn == NULL &&
- long_bits_to_double_fn == NULL &&
- float_to_int_bits_fn == NULL &&
- double_to_long_bits_fn == NULL ,
- "initialization done twice"
- );
- // initialize
- int_bits_to_float_fn = CAST_TO_FN_PTR(IntBitsToFloatFn , NativeLookup::base_library_lookup("java/lang/Float" , "intBitsToFloat" , "(I)F"));
- long_bits_to_double_fn = CAST_TO_FN_PTR(LongBitsToDoubleFn, NativeLookup::base_library_lookup("java/lang/Double", "longBitsToDouble", "(J)D"));
- float_to_int_bits_fn = CAST_TO_FN_PTR(FloatToIntBitsFn , NativeLookup::base_library_lookup("java/lang/Float" , "floatToIntBits" , "(F)I"));
- double_to_long_bits_fn = CAST_TO_FN_PTR(DoubleToLongBitsFn, NativeLookup::base_library_lookup("java/lang/Double", "doubleToLongBits", "(D)J"));
- // verify
- assert(
- int_bits_to_float_fn != NULL &&
- long_bits_to_double_fn != NULL &&
- float_to_int_bits_fn != NULL &&
- double_to_long_bits_fn != NULL ,
- "initialization failed"
- );
-}
-
-
-
// Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
diff --git a/hotspot/src/share/vm/prims/jvmtiEnv.cpp b/hotspot/src/share/vm/prims/jvmtiEnv.cpp
index 765cbcd6290..7d6b121e5fa 100644
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp
@@ -258,9 +258,6 @@ JvmtiEnv::RetransformClasses(jint class_count, const jclass* classes) {
// VM representation. We don't attach the reconstituted class
// bytes to the InstanceKlass here because they have not been
// validated and we're not at a safepoint.
- constantPoolHandle constants(current_thread, ikh->constants());
- MonitorLockerEx ml(constants->lock()); // lock constant pool while we query it
-
JvmtiClassFileReconstituter reconstituter(ikh);
if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
return reconstituter.get_error();
@@ -2445,9 +2442,6 @@ JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* con
}
instanceKlassHandle ikh(thread, k_oop);
- constantPoolHandle constants(thread, ikh->constants());
- MonitorLockerEx ml(constants->lock()); // lock constant pool while we query it
-
JvmtiConstantPoolReconstituter reconstituter(ikh);
if (reconstituter.get_error() != JVMTI_ERROR_NONE) {
return reconstituter.get_error();
@@ -2467,6 +2461,7 @@ JvmtiEnv::GetConstantPool(oop k_mirror, jint* constant_pool_count_ptr, jint* con
return reconstituter.get_error();
}
+ constantPoolHandle constants(thread, ikh->constants());
*constant_pool_count_ptr = constants->length();
*constant_pool_byte_count_ptr = cpool_size;
*constant_pool_bytes_ptr = cpool_bytes;
diff --git a/hotspot/src/share/vm/prims/jvmtiImpl.cpp b/hotspot/src/share/vm/prims/jvmtiImpl.cpp
index 0d6d00d4ec6..328e9d869af 100644
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp
@@ -32,7 +32,7 @@
#include "prims/jvmtiEventController.inline.hpp"
#include "prims/jvmtiImpl.hpp"
#include "prims/jvmtiRedefineClasses.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/handles.hpp"
#include "runtime/handles.inline.hpp"
diff --git a/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp b/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp
index 4be4d277055..003f12f0c0a 100644
--- a/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "prims/jvmtiRawMonitor.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/thread.inline.hpp"
diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp
index 4dd10cfca57..955e34d5034 100644
--- a/hotspot/src/share/vm/prims/unsafe.cpp
+++ b/hotspot/src/share/vm/prims/unsafe.cpp
@@ -31,6 +31,7 @@
#include "memory/allocation.inline.hpp"
#include "prims/jni.h"
#include "prims/jvm.h"
+#include "runtime/atomic.inline.hpp"
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/prefetch.inline.hpp"
@@ -185,64 +186,7 @@ jint Unsafe_invocation_key_to_method_slot(jint key) {
// Get/SetObject must be special-cased, since it works with handles.
-// The xxx140 variants for backward compatibility do not allow a full-width offset.
-UNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
- UnsafeWrapper("Unsafe_GetObject");
- if (obj == NULL) THROW_0(vmSymbols::java_lang_NullPointerException());
- GET_OOP_FIELD(obj, offset, v)
- jobject ret = JNIHandles::make_local(env, v);
-#if INCLUDE_ALL_GCS
- // We could be accessing the referent field in a reference
- // object. If G1 is enabled then we need to register a non-null
- // referent with the SATB barrier.
- if (UseG1GC) {
- bool needs_barrier = false;
-
- if (ret != NULL) {
- if (offset == java_lang_ref_Reference::referent_offset) {
- oop o = JNIHandles::resolve_non_null(obj);
- Klass* k = o->klass();
- if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
- assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
- needs_barrier = true;
- }
- }
- }
-
- if (needs_barrier) {
- oop referent = JNIHandles::resolve(ret);
- G1SATBCardTableModRefBS::enqueue(referent);
- }
- }
-#endif // INCLUDE_ALL_GCS
- return ret;
-UNSAFE_END
-
-UNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
- UnsafeWrapper("Unsafe_SetObject");
- if (obj == NULL) THROW(vmSymbols::java_lang_NullPointerException());
- oop x = JNIHandles::resolve(x_h);
- //SET_FIELD(obj, offset, oop, x);
- oop p = JNIHandles::resolve(obj);
- if (UseCompressedOops) {
- if (x != NULL) {
- // If there is a heap base pointer, we are obliged to emit a store barrier.
- oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x);
- } else {
- narrowOop n = oopDesc::encode_heap_oop_not_null(x);
- *(narrowOop*)index_oop_from_field_offset_long(p, offset) = n;
- }
- } else {
- if (x != NULL) {
- // If there is a heap base pointer, we are obliged to emit a store barrier.
- oop_store((oop*)index_oop_from_field_offset_long(p, offset), x);
- } else {
- *(oop*)index_oop_from_field_offset_long(p, offset) = x;
- }
- }
-UNSAFE_END
-
-// The normal variants allow a null base pointer with an arbitrary address.
+// These functions allow a null base pointer with an arbitrary address.
// But if the base pointer is non-null, the offset should make some sense.
// That is, it should be in the range [0, MAX_OBJECT_SIZE].
UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
@@ -948,6 +892,14 @@ UNSAFE_ENTRY(jclass, Unsafe_DefineClass(JNIEnv *env, jobject unsafe, jstring nam
}
UNSAFE_END
+static jobject get_class_loader(JNIEnv* env, jclass cls) {
+ if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
+ return NULL;
+ }
+ Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls));
+ oop loader = k->class_loader();
+ return JNIHandles::make_local(env, loader);
+}
UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length))
UnsafeWrapper("Unsafe_DefineClass");
@@ -956,7 +908,7 @@ UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring na
int depthFromDefineClass0 = 1;
jclass caller = JVM_GetCallerClass(env, depthFromDefineClass0);
- jobject loader = (caller == NULL) ? NULL : JVM_GetClassLoader(env, caller);
+ jobject loader = (caller == NULL) ? NULL : get_class_loader(env, caller);
jobject pd = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller);
return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd);
@@ -1350,9 +1302,6 @@ UNSAFE_END
// These are the methods for 1.4.0
static JNINativeMethod methods_140[] = {
- {CC"getObject", CC"("OBJ"I)"OBJ"", FN_PTR(Unsafe_GetObject140)},
- {CC"putObject", CC"("OBJ"I"OBJ")V", FN_PTR(Unsafe_SetObject140)},
-
DECLARE_GETSETOOP_140(Boolean, Z),
DECLARE_GETSETOOP_140(Byte, B),
DECLARE_GETSETOOP_140(Short, S),
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index 3c032fbf270..c2b41d44f04 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -222,10 +222,8 @@ void Arguments::init_version_specific_system_properties() {
const char* spec_vendor = "Sun Microsystems Inc.";
uint32_t spec_version = 0;
- if (JDK_Version::is_gte_jdk17x_version()) {
- spec_vendor = "Oracle Corporation";
- spec_version = JDK_Version::current().major_version();
- }
+ spec_vendor = "Oracle Corporation";
+ spec_version = JDK_Version::current().major_version();
jio_snprintf(buffer, bufsz, "1." UINT32_FORMAT, spec_version);
PropertyList_add(&_system_properties,
@@ -2455,6 +2453,8 @@ bool Arguments::check_vm_args_consistency() {
warning("The VM option CICompilerCountPerCPU overrides CICompilerCount.");
}
+ status &= check_vm_args_consistency_ext();
+
return status;
}
@@ -3699,14 +3699,6 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
PrintGC = true;
}
- if (!JDK_Version::is_gte_jdk18x_version()) {
- // To avoid changing the log format for 7 updates this flag is only
- // true by default in JDK8 and above.
- if (FLAG_IS_DEFAULT(PrintGCCause)) {
- FLAG_SET_DEFAULT(PrintGCCause, false);
- }
- }
-
// Set object alignment values.
set_object_alignment();
diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp
index 69551e3c96e..a6329dab66e 100644
--- a/hotspot/src/share/vm/runtime/arguments.hpp
+++ b/hotspot/src/share/vm/runtime/arguments.hpp
@@ -462,6 +462,7 @@ class Arguments : AllStatic {
static void check_deprecated_gc_flags();
// Check consistency or otherwise of VM argument settings
static bool check_vm_args_consistency();
+ static bool check_vm_args_consistency_ext();
// Check stack pages settings
static bool check_stack_pages();
// Used by os_solaris
diff --git a/langtools/test/tools/javac/diags/examples/EnumAsIdentifier.java b/hotspot/src/share/vm/runtime/arguments_ext.cpp
similarity index 83%
rename from langtools/test/tools/javac/diags/examples/EnumAsIdentifier.java
rename to hotspot/src/share/vm/runtime/arguments_ext.cpp
index bfa3d211ad3..5edd449b3da 100644
--- a/langtools/test/tools/javac/diags/examples/EnumAsIdentifier.java
+++ b/hotspot/src/share/vm/runtime/arguments_ext.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -19,11 +19,12 @@
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
+ *
*/
-// key: compiler.warn.enum.as.identifier
-// options: -source 1.3 -Xlint:-options
+#include "precompiled.hpp"
+#include "runtime/arguments.hpp"
-class EnumAsIdentifier {
- int enum;
+bool Arguments::check_vm_args_consistency_ext() {
+ return true;
}
diff --git a/hotspot/src/share/vm/runtime/atomic.hpp b/hotspot/src/share/vm/runtime/atomic.hpp
index 5b46b530b51..b2b56171362 100644
--- a/hotspot/src/share/vm/runtime/atomic.hpp
+++ b/hotspot/src/share/vm/runtime/atomic.hpp
@@ -116,7 +116,7 @@ class Atomic : AllStatic {
atomic_decl
#else
#define ATOMIC_SHORT_PAIR(atomic_decl, non_atomic_decl) \
- atomic_decl ; \
+ atomic_decl; \
non_atomic_decl
#endif
diff --git a/hotspot/src/share/vm/runtime/biasedLocking.cpp b/hotspot/src/share/vm/runtime/biasedLocking.cpp
index c8c2acf37df..f89f71bca6a 100644
--- a/hotspot/src/share/vm/runtime/biasedLocking.cpp
+++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp
@@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "oops/klass.inline.hpp"
#include "oops/markOop.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/basicLock.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/task.hpp"
diff --git a/hotspot/src/share/vm/runtime/extendedPC.hpp b/hotspot/src/share/vm/runtime/extendedPC.hpp
index 7a1ca4abe45..ea937416ac5 100644
--- a/hotspot/src/share/vm/runtime/extendedPC.hpp
+++ b/hotspot/src/share/vm/runtime/extendedPC.hpp
@@ -25,6 +25,9 @@
#ifndef SHARE_VM_RUNTIME_EXTENDEDPC_HPP
#define SHARE_VM_RUNTIME_EXTENDEDPC_HPP
+#include "memory/allocation.hpp"
+#include "utilities/globalDefinitions.hpp"
+
// An ExtendedPC contains the _pc from a signal handler in a platform
// independent way.
diff --git a/hotspot/src/share/vm/runtime/frame.cpp b/hotspot/src/share/vm/runtime/frame.cpp
index 2f7cb8f186a..5768693b406 100644
--- a/hotspot/src/share/vm/runtime/frame.cpp
+++ b/hotspot/src/share/vm/runtime/frame.cpp
@@ -44,6 +44,7 @@
#include "runtime/signature.hpp"
#include "runtime/stubCodeGenerator.hpp"
#include "runtime/stubRoutines.hpp"
+#include "runtime/thread.inline.hpp"
#include "utilities/decoder.hpp"
#ifdef TARGET_ARCH_x86
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 1dbf51c8632..56cafb65600 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -2299,6 +2299,9 @@ class CommandLineFlags {
manageable(bool, PrintGCTimeStamps, false, \
"Print timestamps at garbage collection") \
\
+ manageable(bool, PrintGCID, true, \
+ "Print an identifier for each garbage collection") \
+ \
product(bool, PrintGCTaskTimeStamps, false, \
"Print timestamps for individual gc worker thread tasks") \
\
diff --git a/hotspot/src/share/vm/runtime/handles.cpp b/hotspot/src/share/vm/runtime/handles.cpp
index e80b6d79828..5d358538930 100644
--- a/hotspot/src/share/vm/runtime/handles.cpp
+++ b/hotspot/src/share/vm/runtime/handles.cpp
@@ -26,6 +26,7 @@
#include "memory/allocation.inline.hpp"
#include "oops/constantPool.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/thread.inline.hpp"
#ifdef TARGET_OS_FAMILY_linux
diff --git a/hotspot/src/share/vm/runtime/interfaceSupport.cpp b/hotspot/src/share/vm/runtime/interfaceSupport.cpp
index 09757155d9d..25953f3d3bc 100644
--- a/hotspot/src/share/vm/runtime/interfaceSupport.cpp
+++ b/hotspot/src/share/vm/runtime/interfaceSupport.cpp
@@ -28,6 +28,7 @@
#include "gc_interface/collectedHeap.inline.hpp"
#include "memory/genCollectedHeap.hpp"
#include "memory/resourceArea.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/init.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/orderAccess.inline.hpp"
diff --git a/hotspot/src/share/vm/runtime/java.cpp b/hotspot/src/share/vm/runtime/java.cpp
index e852b56ef54..3a075117afe 100644
--- a/hotspot/src/share/vm/runtime/java.cpp
+++ b/hotspot/src/share/vm/runtime/java.cpp
@@ -501,9 +501,6 @@ void before_exit(JavaThread * thread) {
os::infinite_sleep();
}
- // Stop any ongoing concurrent GC work
- Universe::heap()->stop();
-
// Terminate watcher thread - must before disenrolling any periodic task
if (PeriodicTask::num_tasks() > 0)
WatcherThread::stop();
@@ -518,10 +515,8 @@ void before_exit(JavaThread * thread) {
StatSampler::disengage();
StatSampler::destroy();
- // We do not need to explicitly stop concurrent GC threads because the
- // JVM will be taken down at a safepoint when such threads are inactive --
- // except for some concurrent G1 threads, see (comment in)
- // Threads::destroy_vm().
+ // Stop concurrent GC threads
+ Universe::heap()->stop();
// Print GC/heap related information.
if (PrintGCDetails) {
diff --git a/hotspot/src/share/vm/runtime/java.hpp b/hotspot/src/share/vm/runtime/java.hpp
index e5bae38c171..02ac99ebb60 100644
--- a/hotspot/src/share/vm/runtime/java.hpp
+++ b/hotspot/src/share/vm/runtime/java.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, 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
@@ -197,58 +197,6 @@ class JDK_Version VALUE_OBJ_CLASS_SPEC {
_runtime_version = version;
}
- // Convenience methods for queries on the current major/minor version
- static bool is_jdk12x_version() {
- return current().compare_major(2) == 0;
- }
-
- static bool is_jdk13x_version() {
- return current().compare_major(3) == 0;
- }
-
- static bool is_jdk14x_version() {
- return current().compare_major(4) == 0;
- }
-
- static bool is_jdk15x_version() {
- return current().compare_major(5) == 0;
- }
-
- static bool is_jdk16x_version() {
- return current().compare_major(6) == 0;
- }
-
- static bool is_jdk17x_version() {
- return current().compare_major(7) == 0;
- }
-
- static bool is_jdk18x_version() {
- return current().compare_major(8) == 0;
- }
-
- static bool is_gte_jdk13x_version() {
- return current().compare_major(3) >= 0;
- }
-
- static bool is_gte_jdk14x_version() {
- return current().compare_major(4) >= 0;
- }
-
- static bool is_gte_jdk15x_version() {
- return current().compare_major(5) >= 0;
- }
-
- static bool is_gte_jdk16x_version() {
- return current().compare_major(6) >= 0;
- }
-
- static bool is_gte_jdk17x_version() {
- return current().compare_major(7) >= 0;
- }
-
- static bool is_gte_jdk18x_version() {
- return current().compare_major(8) >= 0;
- }
};
#endif // SHARE_VM_RUNTIME_JAVA_HPP
diff --git a/hotspot/src/share/vm/runtime/jniHandles.cpp b/hotspot/src/share/vm/runtime/jniHandles.cpp
index 7ff38335029..9ce7ce8ae44 100644
--- a/hotspot/src/share/vm/runtime/jniHandles.cpp
+++ b/hotspot/src/share/vm/runtime/jniHandles.cpp
@@ -298,6 +298,7 @@ JNIHandleBlock* JNIHandleBlock::allocate_block(Thread* thread) {
block->_top = 0;
block->_next = NULL;
block->_pop_frame_link = NULL;
+ block->_planned_capacity = block_size_in_oops;
// _last, _free_list & _allocate_before_rebuild initialized in allocate_handle
debug_only(block->_last = NULL);
debug_only(block->_free_list = NULL);
@@ -531,6 +532,12 @@ int JNIHandleBlock::length() const {
return result;
}
+const size_t JNIHandleBlock::get_number_of_live_handles() {
+ CountHandleClosure counter;
+ oops_do(&counter);
+ return counter.count();
+}
+
// This method is not thread-safe, i.e., must be called while holding a lock on the
// structure.
long JNIHandleBlock::memory_usage() const {
diff --git a/hotspot/src/share/vm/runtime/jniHandles.hpp b/hotspot/src/share/vm/runtime/jniHandles.hpp
index 1bd97c3cf09..069a1f35cfa 100644
--- a/hotspot/src/share/vm/runtime/jniHandles.hpp
+++ b/hotspot/src/share/vm/runtime/jniHandles.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, 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
@@ -112,6 +112,9 @@ class JNIHandleBlock : public CHeapObj {
oop* _free_list; // Handle free list
int _allocate_before_rebuild; // Number of blocks to allocate before rebuilding free list
+ // Check JNI, "planned capacity" for current frame (or push/ensure)
+ size_t _planned_capacity;
+
#ifndef PRODUCT
JNIHandleBlock* _block_list_link; // Link for list below
static JNIHandleBlock* _block_list; // List of all allocated blocks (for debugging only)
@@ -152,6 +155,11 @@ class JNIHandleBlock : public CHeapObj {
// Traversal of weak handles. Unreachable oops are cleared.
void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f);
+ // Checked JNI support
+ void set_planned_capacity(size_t planned_capacity) { _planned_capacity = planned_capacity; }
+ const size_t get_planned_capacity() { return _planned_capacity; }
+ const size_t get_number_of_live_handles();
+
// Debugging
bool chain_contains(jobject handle) const; // Does this block or following blocks contain handle
bool contains(jobject handle) const; // Does this block contain handle
diff --git a/hotspot/src/share/vm/runtime/mutex.cpp b/hotspot/src/share/vm/runtime/mutex.cpp
index 34c9366f0d1..f903c00291c 100644
--- a/hotspot/src/share/vm/runtime/mutex.cpp
+++ b/hotspot/src/share/vm/runtime/mutex.cpp
@@ -24,6 +24,7 @@
*/
#include "precompiled.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/mutex.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/osThread.hpp"
@@ -269,62 +270,62 @@ PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
#define CASPTR(a,c,s) intptr_t(Atomic::cmpxchg_ptr ((void *)(s),(void *)(a),(void *)(c)))
#define UNS(x) (uintptr_t(x))
-#define TRACE(m) { static volatile int ctr = 0 ; int x = ++ctr ; if ((x & (x-1))==0) { ::printf ("%d:%s\n", x, #m); ::fflush(stdout); }}
+#define TRACE(m) { static volatile int ctr = 0; int x = ++ctr; if ((x & (x-1))==0) { ::printf ("%d:%s\n", x, #m); ::fflush(stdout); }}
// Simplistic low-quality Marsaglia SHIFT-XOR RNG.
// Bijective except for the trailing mask operation.
// Useful for spin loops as the compiler can't optimize it away.
static inline jint MarsagliaXORV (jint x) {
- if (x == 0) x = 1|os::random() ;
+ if (x == 0) x = 1|os::random();
x ^= x << 6;
x ^= ((unsigned)x) >> 21;
- x ^= x << 7 ;
- return x & 0x7FFFFFFF ;
+ x ^= x << 7;
+ return x & 0x7FFFFFFF;
}
static int Stall (int its) {
- static volatile jint rv = 1 ;
- volatile int OnFrame = 0 ;
- jint v = rv ^ UNS(OnFrame) ;
+ static volatile jint rv = 1;
+ volatile int OnFrame = 0;
+ jint v = rv ^ UNS(OnFrame);
while (--its >= 0) {
- v = MarsagliaXORV (v) ;
+ v = MarsagliaXORV(v);
}
// Make this impossible for the compiler to optimize away,
// but (mostly) avoid W coherency sharing on MP systems.
- if (v == 0x12345) rv = v ;
- return v ;
+ if (v == 0x12345) rv = v;
+ return v;
}
-int Monitor::TryLock () {
- intptr_t v = _LockWord.FullWord ;
+int Monitor::TryLock() {
+ intptr_t v = _LockWord.FullWord;
for (;;) {
- if ((v & _LBIT) != 0) return 0 ;
- const intptr_t u = CASPTR (&_LockWord, v, v|_LBIT) ;
- if (v == u) return 1 ;
- v = u ;
+ if ((v & _LBIT) != 0) return 0;
+ const intptr_t u = CASPTR(&_LockWord, v, v|_LBIT);
+ if (v == u) return 1;
+ v = u;
}
}
-int Monitor::TryFast () {
+int Monitor::TryFast() {
// Optimistic fast-path form ...
// Fast-path attempt for the common uncontended case.
// Avoid RTS->RTO $ coherence upgrade on typical SMP systems.
- intptr_t v = CASPTR (&_LockWord, 0, _LBIT) ; // agro ...
- if (v == 0) return 1 ;
+ intptr_t v = CASPTR(&_LockWord, 0, _LBIT); // agro ...
+ if (v == 0) return 1;
for (;;) {
- if ((v & _LBIT) != 0) return 0 ;
- const intptr_t u = CASPTR (&_LockWord, v, v|_LBIT) ;
- if (v == u) return 1 ;
- v = u ;
+ if ((v & _LBIT) != 0) return 0;
+ const intptr_t u = CASPTR(&_LockWord, v, v|_LBIT);
+ if (v == u) return 1;
+ v = u;
}
}
-int Monitor::ILocked () {
- const intptr_t w = _LockWord.FullWord & 0xFF ;
- assert (w == 0 || w == _LBIT, "invariant") ;
- return w == _LBIT ;
+int Monitor::ILocked() {
+ const intptr_t w = _LockWord.FullWord & 0xFF;
+ assert(w == 0 || w == _LBIT, "invariant");
+ return w == _LBIT;
}
// Polite TATAS spinlock with exponential backoff - bounded spin.
@@ -342,38 +343,38 @@ int Monitor::ILocked () {
// See synchronizer.cpp for details and rationale.
int Monitor::TrySpin (Thread * const Self) {
- if (TryLock()) return 1 ;
- if (!os::is_MP()) return 0 ;
+ if (TryLock()) return 1;
+ if (!os::is_MP()) return 0;
- int Probes = 0 ;
- int Delay = 0 ;
- int Steps = 0 ;
- int SpinMax = NativeMonitorSpinLimit ;
- int flgs = NativeMonitorFlags ;
+ int Probes = 0;
+ int Delay = 0;
+ int Steps = 0;
+ int SpinMax = NativeMonitorSpinLimit;
+ int flgs = NativeMonitorFlags;
for (;;) {
intptr_t v = _LockWord.FullWord;
if ((v & _LBIT) == 0) {
if (CASPTR (&_LockWord, v, v|_LBIT) == v) {
- return 1 ;
+ return 1;
}
- continue ;
+ continue;
}
if ((flgs & 8) == 0) {
- SpinPause () ;
+ SpinPause();
}
// Periodically increase Delay -- variable Delay form
// conceptually: delay *= 1 + 1/Exponent
- ++ Probes;
- if (Probes > SpinMax) return 0 ;
+ ++Probes;
+ if (Probes > SpinMax) return 0;
if ((Probes & 0x7) == 0) {
- Delay = ((Delay << 1)|1) & 0x7FF ;
+ Delay = ((Delay << 1)|1) & 0x7FF;
// CONSIDER: Delay += 1 + (Delay/4); Delay &= 0x7FF ;
}
- if (flgs & 2) continue ;
+ if (flgs & 2) continue;
// Consider checking _owner's schedctl state, if OFFPROC abort spin.
// If the owner is OFFPROC then it's unlike that the lock will be dropped
@@ -389,48 +390,48 @@ int Monitor::TrySpin (Thread * const Self) {
// spin loop. N1 and brethren write-around the L1$ over the xbar into the L2$.
// Furthermore, they don't have a W$ like traditional SPARC processors.
// We currently use a Marsaglia Shift-Xor RNG loop.
- Steps += Delay ;
+ Steps += Delay;
if (Self != NULL) {
- jint rv = Self->rng[0] ;
- for (int k = Delay ; --k >= 0; ) {
- rv = MarsagliaXORV (rv) ;
- if ((flgs & 4) == 0 && SafepointSynchronize::do_call_back()) return 0 ;
+ jint rv = Self->rng[0];
+ for (int k = Delay; --k >= 0;) {
+ rv = MarsagliaXORV(rv);
+ if ((flgs & 4) == 0 && SafepointSynchronize::do_call_back()) return 0;
}
- Self->rng[0] = rv ;
+ Self->rng[0] = rv;
} else {
- Stall (Delay) ;
+ Stall(Delay);
}
}
}
static int ParkCommon (ParkEvent * ev, jlong timo) {
// Diagnostic support - periodically unwedge blocked threads
- intx nmt = NativeMonitorTimeout ;
+ intx nmt = NativeMonitorTimeout;
if (nmt > 0 && (nmt < timo || timo <= 0)) {
- timo = nmt ;
+ timo = nmt;
}
- int err = OS_OK ;
+ int err = OS_OK;
if (0 == timo) {
- ev->park() ;
+ ev->park();
} else {
- err = ev->park(timo) ;
+ err = ev->park(timo);
}
- return err ;
+ return err;
}
inline int Monitor::AcquireOrPush (ParkEvent * ESelf) {
- intptr_t v = _LockWord.FullWord ;
+ intptr_t v = _LockWord.FullWord;
for (;;) {
if ((v & _LBIT) == 0) {
- const intptr_t u = CASPTR (&_LockWord, v, v|_LBIT) ;
- if (u == v) return 1 ; // indicate acquired
- v = u ;
+ const intptr_t u = CASPTR(&_LockWord, v, v|_LBIT);
+ if (u == v) return 1; // indicate acquired
+ v = u;
} else {
// Anticipate success ...
- ESelf->ListNext = (ParkEvent *) (v & ~_LBIT) ;
- const intptr_t u = CASPTR (&_LockWord, v, intptr_t(ESelf)|_LBIT) ;
- if (u == v) return 0 ; // indicate pushed onto cxq
- v = u ;
+ ESelf->ListNext = (ParkEvent *)(v & ~_LBIT);
+ const intptr_t u = CASPTR(&_LockWord, v, intptr_t(ESelf)|_LBIT);
+ if (u == v) return 0; // indicate pushed onto cxq
+ v = u;
}
// Interference - LockWord change - just retry
}
@@ -444,33 +445,33 @@ inline int Monitor::AcquireOrPush (ParkEvent * ESelf) {
// _owner is a higher-level logical concept.
void Monitor::ILock (Thread * Self) {
- assert (_OnDeck != Self->_MutexEvent, "invariant") ;
+ assert(_OnDeck != Self->_MutexEvent, "invariant");
if (TryFast()) {
Exeunt:
- assert (ILocked(), "invariant") ;
- return ;
+ assert(ILocked(), "invariant");
+ return;
}
- ParkEvent * const ESelf = Self->_MutexEvent ;
- assert (_OnDeck != ESelf, "invariant") ;
+ ParkEvent * const ESelf = Self->_MutexEvent;
+ assert(_OnDeck != ESelf, "invariant");
// As an optimization, spinners could conditionally try to set ONDECK to _LBIT
// Synchronizer.cpp uses a similar optimization.
- if (TrySpin (Self)) goto Exeunt ;
+ if (TrySpin(Self)) goto Exeunt;
// Slow-path - the lock is contended.
// Either Enqueue Self on cxq or acquire the outer lock.
// LockWord encoding = (cxq,LOCKBYTE)
- ESelf->reset() ;
- OrderAccess::fence() ;
+ ESelf->reset();
+ OrderAccess::fence();
// Optional optimization ... try barging on the inner lock
if ((NativeMonitorFlags & 32) && CASPTR (&_OnDeck, NULL, UNS(Self)) == 0) {
- goto OnDeck_LOOP ;
+ goto OnDeck_LOOP;
}
- if (AcquireOrPush (ESelf)) goto Exeunt ;
+ if (AcquireOrPush(ESelf)) goto Exeunt;
// At any given time there is at most one ondeck thread.
// ondeck implies not resident on cxq and not resident on EntryList
@@ -478,26 +479,26 @@ void Monitor::ILock (Thread * Self) {
// CONSIDER: use Self->OnDeck instead of m->OnDeck.
// Deschedule Self so that others may run.
while (_OnDeck != ESelf) {
- ParkCommon (ESelf, 0) ;
+ ParkCommon(ESelf, 0);
}
// Self is now in the ONDECK position and will remain so until it
// manages to acquire the lock.
OnDeck_LOOP:
for (;;) {
- assert (_OnDeck == ESelf, "invariant") ;
- if (TrySpin (Self)) break ;
+ assert(_OnDeck == ESelf, "invariant");
+ if (TrySpin(Self)) break;
// CONSIDER: if ESelf->TryPark() && TryLock() break ...
// It's probably wise to spin only if we *actually* blocked
// CONSIDER: check the lockbyte, if it remains set then
// preemptively drain the cxq into the EntryList.
// The best place and time to perform queue operations -- lock metadata --
// is _before having acquired the outer lock, while waiting for the lock to drop.
- ParkCommon (ESelf, 0) ;
+ ParkCommon(ESelf, 0);
}
- assert (_OnDeck == ESelf, "invariant") ;
- _OnDeck = NULL ;
+ assert(_OnDeck == ESelf, "invariant");
+ _OnDeck = NULL;
// Note that we current drop the inner lock (clear OnDeck) in the slow-path
// epilogue immediately after having acquired the outer lock.
@@ -512,11 +513,11 @@ void Monitor::ILock (Thread * Self) {
// effective length of the critical section.
// Note that (A) and (B) are tantamount to succession by direct handoff for
// the inner lock.
- goto Exeunt ;
+ goto Exeunt;
}
void Monitor::IUnlock (bool RelaxAssert) {
- assert (ILocked(), "invariant") ;
+ assert(ILocked(), "invariant");
// Conceptually we need a MEMBAR #storestore|#loadstore barrier or fence immediately
// before the store that releases the lock. Crucially, all the stores and loads in the
// critical section must be globally visible before the store of 0 into the lock-word
@@ -532,9 +533,9 @@ void Monitor::IUnlock (bool RelaxAssert) {
// safety or lock release consistency.
OrderAccess::release_store(&_LockWord.Bytes[_LSBINDEX], 0); // drop outer lock
- OrderAccess::storeload ();
- ParkEvent * const w = _OnDeck ;
- assert (RelaxAssert || w != Thread::current()->_MutexEvent, "invariant") ;
+ OrderAccess::storeload();
+ ParkEvent * const w = _OnDeck;
+ assert(RelaxAssert || w != Thread::current()->_MutexEvent, "invariant");
if (w != NULL) {
// Either we have a valid ondeck thread or ondeck is transiently "locked"
// by some exiting thread as it arranges for succession. The LSBit of
@@ -549,19 +550,19 @@ void Monitor::IUnlock (bool RelaxAssert) {
// then progress is known to have occurred as that means the thread associated
// with "w" acquired the lock. In that case this thread need take no further
// action to guarantee progress.
- if ((UNS(w) & _LBIT) == 0) w->unpark() ;
- return ;
+ if ((UNS(w) & _LBIT) == 0) w->unpark();
+ return;
}
- intptr_t cxq = _LockWord.FullWord ;
+ intptr_t cxq = _LockWord.FullWord;
if (((cxq & ~_LBIT)|UNS(_EntryList)) == 0) {
- return ; // normal fast-path exit - cxq and EntryList both empty
+ return; // normal fast-path exit - cxq and EntryList both empty
}
if (cxq & _LBIT) {
// Optional optimization ...
// Some other thread acquired the lock in the window since this
// thread released it. Succession is now that thread's responsibility.
- return ;
+ return;
}
Succession:
@@ -575,22 +576,22 @@ void Monitor::IUnlock (bool RelaxAssert) {
// picks a successor and marks that thread as OnDeck. That successor
// thread will then clear OnDeck once it eventually acquires the outer lock.
if (CASPTR (&_OnDeck, NULL, _LBIT) != UNS(NULL)) {
- return ;
+ return;
}
- ParkEvent * List = _EntryList ;
+ ParkEvent * List = _EntryList;
if (List != NULL) {
// Transfer the head of the EntryList to the OnDeck position.
// Once OnDeck, a thread stays OnDeck until it acquires the lock.
// For a given lock there is at most OnDeck thread at any one instant.
WakeOne:
- assert (List == _EntryList, "invariant") ;
- ParkEvent * const w = List ;
- assert (RelaxAssert || w != Thread::current()->_MutexEvent, "invariant") ;
- _EntryList = w->ListNext ;
+ assert(List == _EntryList, "invariant");
+ ParkEvent * const w = List;
+ assert(RelaxAssert || w != Thread::current()->_MutexEvent, "invariant");
+ _EntryList = w->ListNext;
// as a diagnostic measure consider setting w->_ListNext = BAD
- assert (UNS(_OnDeck) == _LBIT, "invariant") ;
- _OnDeck = w ; // pass OnDeck to w.
+ assert(UNS(_OnDeck) == _LBIT, "invariant");
+ _OnDeck = w; // pass OnDeck to w.
// w will clear OnDeck once it acquires the outer lock
// Another optional optimization ...
@@ -599,25 +600,25 @@ void Monitor::IUnlock (bool RelaxAssert) {
// Try to defer the unpark() operation - Delegate the responsibility
// for unpark()ing the OnDeck thread to the current or subsequent owners
// That is, the new owner is responsible for unparking the OnDeck thread.
- OrderAccess::storeload() ;
- cxq = _LockWord.FullWord ;
- if (cxq & _LBIT) return ;
+ OrderAccess::storeload();
+ cxq = _LockWord.FullWord;
+ if (cxq & _LBIT) return;
- w->unpark() ;
- return ;
+ w->unpark();
+ return;
}
- cxq = _LockWord.FullWord ;
+ cxq = _LockWord.FullWord;
if ((cxq & ~_LBIT) != 0) {
// The EntryList is empty but the cxq is populated.
// drain RATs from cxq into EntryList
// Detach RATs segment with CAS and then merge into EntryList
for (;;) {
// optional optimization - if locked, the owner is responsible for succession
- if (cxq & _LBIT) goto Punt ;
- const intptr_t vfy = CASPTR (&_LockWord, cxq, cxq & _LBIT) ;
- if (vfy == cxq) break ;
- cxq = vfy ;
+ if (cxq & _LBIT) goto Punt;
+ const intptr_t vfy = CASPTR(&_LockWord, cxq, cxq & _LBIT);
+ if (vfy == cxq) break;
+ cxq = vfy;
// Interference - LockWord changed - Just retry
// We can see concurrent interference from contending threads
// pushing themselves onto the cxq or from lock-unlock operations.
@@ -639,10 +640,10 @@ void Monitor::IUnlock (bool RelaxAssert) {
// the EntryList, but it might make sense to reverse the order
// or perhaps sort by thread priority. See the comments in
// synchronizer.cpp objectMonitor::exit().
- assert (_EntryList == NULL, "invariant") ;
- _EntryList = List = (ParkEvent *)(cxq & ~_LBIT) ;
- assert (List != NULL, "invariant") ;
- goto WakeOne ;
+ assert(_EntryList == NULL, "invariant");
+ _EntryList = List = (ParkEvent *)(cxq & ~_LBIT);
+ assert(List != NULL, "invariant");
+ goto WakeOne;
}
// cxq|EntryList is empty.
@@ -651,8 +652,8 @@ void Monitor::IUnlock (bool RelaxAssert) {
// A thread could have added itself to cxq since this thread previously checked.
// Detect and recover by refetching cxq.
Punt:
- assert (UNS(_OnDeck) == _LBIT, "invariant") ;
- _OnDeck = NULL ; // Release inner lock.
+ assert(UNS(_OnDeck) == _LBIT, "invariant");
+ _OnDeck = NULL; // Release inner lock.
OrderAccess::storeload(); // Dekker duality - pivot point
// Resample LockWord/cxq to recover from possible race.
@@ -665,32 +666,32 @@ void Monitor::IUnlock (bool RelaxAssert) {
// Note that we don't need to recheck EntryList, just cxq.
// If threads moved onto EntryList since we dropped OnDeck
// that implies some other thread forced succession.
- cxq = _LockWord.FullWord ;
+ cxq = _LockWord.FullWord;
if ((cxq & ~_LBIT) != 0 && (cxq & _LBIT) == 0) {
- goto Succession ; // potential race -- re-run succession
+ goto Succession; // potential race -- re-run succession
}
- return ;
+ return;
}
bool Monitor::notify() {
- assert (_owner == Thread::current(), "invariant") ;
- assert (ILocked(), "invariant") ;
- if (_WaitSet == NULL) return true ;
- NotifyCount ++ ;
+ assert(_owner == Thread::current(), "invariant");
+ assert(ILocked(), "invariant");
+ if (_WaitSet == NULL) return true;
+ NotifyCount++;
// Transfer one thread from the WaitSet to the EntryList or cxq.
// Currently we just unlink the head of the WaitSet and prepend to the cxq.
// And of course we could just unlink it and unpark it, too, but
// in that case it'd likely impale itself on the reentry.
- Thread::muxAcquire (_WaitLock, "notify:WaitLock") ;
- ParkEvent * nfy = _WaitSet ;
+ Thread::muxAcquire(_WaitLock, "notify:WaitLock");
+ ParkEvent * nfy = _WaitSet;
if (nfy != NULL) { // DCL idiom
- _WaitSet = nfy->ListNext ;
- assert (nfy->Notified == 0, "invariant") ;
+ _WaitSet = nfy->ListNext;
+ assert(nfy->Notified == 0, "invariant");
// push nfy onto the cxq
for (;;) {
- const intptr_t v = _LockWord.FullWord ;
- assert ((v & 0xFF) == _LBIT, "invariant") ;
+ const intptr_t v = _LockWord.FullWord;
+ assert((v & 0xFF) == _LBIT, "invariant");
nfy->ListNext = (ParkEvent *)(v & ~_LBIT);
if (CASPTR (&_LockWord, v, UNS(nfy)|_LBIT) == v) break;
// interference - _LockWord changed -- just retry
@@ -698,17 +699,17 @@ bool Monitor::notify() {
// Note that setting Notified before pushing nfy onto the cxq is
// also legal and safe, but the safety properties are much more
// subtle, so for the sake of code stewardship ...
- OrderAccess::fence() ;
+ OrderAccess::fence();
nfy->Notified = 1;
}
- Thread::muxRelease (_WaitLock) ;
+ Thread::muxRelease(_WaitLock);
if (nfy != NULL && (NativeMonitorFlags & 16)) {
// Experimental code ... light up the wakee in the hope that this thread (the owner)
// will drop the lock just about the time the wakee comes ONPROC.
- nfy->unpark() ;
+ nfy->unpark();
}
- assert (ILocked(), "invariant") ;
- return true ;
+ assert(ILocked(), "invariant");
+ return true;
}
// Currently notifyAll() transfers the waiters one-at-a-time from the waitset
@@ -719,14 +720,14 @@ bool Monitor::notify() {
// will be empty and the cxq will be "DCBAXYZ". This is benign, of course.
bool Monitor::notify_all() {
- assert (_owner == Thread::current(), "invariant") ;
- assert (ILocked(), "invariant") ;
- while (_WaitSet != NULL) notify() ;
- return true ;
+ assert(_owner == Thread::current(), "invariant");
+ assert(ILocked(), "invariant");
+ while (_WaitSet != NULL) notify();
+ return true;
}
int Monitor::IWait (Thread * Self, jlong timo) {
- assert (ILocked(), "invariant") ;
+ assert(ILocked(), "invariant");
// Phases:
// 1. Enqueue Self on WaitSet - currently prepend
@@ -734,10 +735,10 @@ int Monitor::IWait (Thread * Self, jlong timo) {
// 3. wait for either notification or timeout
// 4. lock - reentry - reacquire the outer lock
- ParkEvent * const ESelf = Self->_MutexEvent ;
- ESelf->Notified = 0 ;
- ESelf->reset() ;
- OrderAccess::fence() ;
+ ParkEvent * const ESelf = Self->_MutexEvent;
+ ESelf->Notified = 0;
+ ESelf->reset();
+ OrderAccess::fence();
// Add Self to WaitSet
// Ideally only the holder of the outer lock would manipulate the WaitSet -
@@ -766,10 +767,10 @@ int Monitor::IWait (Thread * Self, jlong timo) {
// In that case we could have one ListElement on the WaitSet and another
// on the EntryList, with both referring to the same pure Event.
- Thread::muxAcquire (_WaitLock, "wait:WaitLock:Add") ;
- ESelf->ListNext = _WaitSet ;
- _WaitSet = ESelf ;
- Thread::muxRelease (_WaitLock) ;
+ Thread::muxAcquire(_WaitLock, "wait:WaitLock:Add");
+ ESelf->ListNext = _WaitSet;
+ _WaitSet = ESelf;
+ Thread::muxRelease(_WaitLock);
// Release the outer lock
// We call IUnlock (RelaxAssert=true) as a thread T1 might
@@ -781,16 +782,16 @@ int Monitor::IWait (Thread * Self, jlong timo) {
// IUnlock() call a thread should _never find itself on the EntryList
// or cxq, but in the case of wait() it's possible.
// See synchronizer.cpp objectMonitor::wait().
- IUnlock (true) ;
+ IUnlock(true);
// Wait for either notification or timeout
// Beware that in some circumstances we might propagate
// spurious wakeups back to the caller.
for (;;) {
- if (ESelf->Notified) break ;
- int err = ParkCommon (ESelf, timo) ;
- if (err == OS_TIMEOUT || (NativeMonitorFlags & 1)) break ;
+ if (ESelf->Notified) break;
+ int err = ParkCommon(ESelf, timo);
+ if (err == OS_TIMEOUT || (NativeMonitorFlags & 1)) break;
}
// Prepare for reentry - if necessary, remove ESelf from WaitSet
@@ -799,55 +800,55 @@ int Monitor::IWait (Thread * Self, jlong timo) {
// 2. On the cxq or EntryList
// 3. Not resident on cxq, EntryList or WaitSet, but in the OnDeck position.
- OrderAccess::fence() ;
- int WasOnWaitSet = 0 ;
+ OrderAccess::fence();
+ int WasOnWaitSet = 0;
if (ESelf->Notified == 0) {
- Thread::muxAcquire (_WaitLock, "wait:WaitLock:remove") ;
+ Thread::muxAcquire(_WaitLock, "wait:WaitLock:remove");
if (ESelf->Notified == 0) { // DCL idiom
- assert (_OnDeck != ESelf, "invariant") ; // can't be both OnDeck and on WaitSet
+ assert(_OnDeck != ESelf, "invariant"); // can't be both OnDeck and on WaitSet
// ESelf is resident on the WaitSet -- unlink it.
// A doubly-linked list would be better here so we can unlink in constant-time.
// We have to unlink before we potentially recontend as ESelf might otherwise
// end up on the cxq|EntryList -- it can't be on two lists at once.
- ParkEvent * p = _WaitSet ;
- ParkEvent * q = NULL ; // classic q chases p
+ ParkEvent * p = _WaitSet;
+ ParkEvent * q = NULL; // classic q chases p
while (p != NULL && p != ESelf) {
- q = p ;
- p = p->ListNext ;
+ q = p;
+ p = p->ListNext;
}
- assert (p == ESelf, "invariant") ;
+ assert(p == ESelf, "invariant");
if (p == _WaitSet) { // found at head
- assert (q == NULL, "invariant") ;
- _WaitSet = p->ListNext ;
+ assert(q == NULL, "invariant");
+ _WaitSet = p->ListNext;
} else { // found in interior
- assert (q->ListNext == p, "invariant") ;
- q->ListNext = p->ListNext ;
+ assert(q->ListNext == p, "invariant");
+ q->ListNext = p->ListNext;
}
- WasOnWaitSet = 1 ; // We were *not* notified but instead encountered timeout
+ WasOnWaitSet = 1; // We were *not* notified but instead encountered timeout
}
- Thread::muxRelease (_WaitLock) ;
+ Thread::muxRelease(_WaitLock);
}
// Reentry phase - reacquire the lock
if (WasOnWaitSet) {
// ESelf was previously on the WaitSet but we just unlinked it above
// because of a timeout. ESelf is not resident on any list and is not OnDeck
- assert (_OnDeck != ESelf, "invariant") ;
- ILock (Self) ;
+ assert(_OnDeck != ESelf, "invariant");
+ ILock(Self);
} else {
// A prior notify() operation moved ESelf from the WaitSet to the cxq.
// ESelf is now on the cxq, EntryList or at the OnDeck position.
// The following fragment is extracted from Monitor::ILock()
for (;;) {
- if (_OnDeck == ESelf && TrySpin(Self)) break ;
- ParkCommon (ESelf, 0) ;
+ if (_OnDeck == ESelf && TrySpin(Self)) break;
+ ParkCommon(ESelf, 0);
}
- assert (_OnDeck == ESelf, "invariant") ;
- _OnDeck = NULL ;
+ assert(_OnDeck == ESelf, "invariant");
+ _OnDeck = NULL;
}
- assert (ILocked(), "invariant") ;
- return WasOnWaitSet != 0 ; // return true IFF timeout
+ assert(ILocked(), "invariant");
+ return WasOnWaitSet != 0; // return true IFF timeout
}
@@ -896,15 +897,15 @@ void Monitor::lock (Thread * Self) {
#endif // CHECK_UNHANDLED_OOPS
debug_only(check_prelock_state(Self));
- assert (_owner != Self , "invariant") ;
- assert (_OnDeck != Self->_MutexEvent, "invariant") ;
+ assert(_owner != Self , "invariant");
+ assert(_OnDeck != Self->_MutexEvent, "invariant");
if (TryFast()) {
Exeunt:
- assert (ILocked(), "invariant") ;
- assert (owner() == NULL, "invariant");
- set_owner (Self);
- return ;
+ assert(ILocked(), "invariant");
+ assert(owner() == NULL, "invariant");
+ set_owner(Self);
+ return;
}
// The lock is contended ...
@@ -916,23 +917,23 @@ void Monitor::lock (Thread * Self) {
// and go on. we note this with _snuck so we can also
// pretend to unlock when the time comes.
_snuck = true;
- goto Exeunt ;
+ goto Exeunt;
}
// Try a brief spin to avoid passing thru thread state transition ...
- if (TrySpin (Self)) goto Exeunt ;
+ if (TrySpin(Self)) goto Exeunt;
check_block_state(Self);
if (Self->is_Java_thread()) {
// Horrible dictu - we suffer through a state transition
assert(rank() > Mutex::special, "Potential deadlock with special or lesser rank mutex");
- ThreadBlockInVM tbivm ((JavaThread *) Self) ;
- ILock (Self) ;
+ ThreadBlockInVM tbivm((JavaThread *) Self);
+ ILock(Self);
} else {
// Mirabile dictu
- ILock (Self) ;
+ ILock(Self);
}
- goto Exeunt ;
+ goto Exeunt;
}
void Monitor::lock() {
@@ -945,14 +946,14 @@ void Monitor::lock() {
// thread state set to be in VM, the safepoint synchronization code will deadlock!
void Monitor::lock_without_safepoint_check (Thread * Self) {
- assert (_owner != Self, "invariant") ;
- ILock (Self) ;
- assert (_owner == NULL, "invariant");
- set_owner (Self);
+ assert(_owner != Self, "invariant");
+ ILock(Self);
+ assert(_owner == NULL, "invariant");
+ set_owner(Self);
}
-void Monitor::lock_without_safepoint_check () {
- lock_without_safepoint_check (Thread::current()) ;
+void Monitor::lock_without_safepoint_check() {
+ lock_without_safepoint_check(Thread::current());
}
@@ -976,23 +977,23 @@ bool Monitor::try_lock() {
if (TryLock()) {
// We got the lock
- assert (_owner == NULL, "invariant");
- set_owner (Self);
+ assert(_owner == NULL, "invariant");
+ set_owner(Self);
return true;
}
return false;
}
void Monitor::unlock() {
- assert (_owner == Thread::current(), "invariant") ;
- assert (_OnDeck != Thread::current()->_MutexEvent , "invariant") ;
- set_owner (NULL) ;
+ assert(_owner == Thread::current(), "invariant");
+ assert(_OnDeck != Thread::current()->_MutexEvent , "invariant");
+ set_owner(NULL);
if (_snuck) {
assert(SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread(), "sneak");
_snuck = false;
- return ;
+ return;
}
- IUnlock (false) ;
+ IUnlock(false);
}
// Yet another degenerate version of Monitor::lock() or lock_without_safepoint_check()
@@ -1020,29 +1021,29 @@ void Monitor::jvm_raw_lock() {
if (TryLock()) {
Exeunt:
- assert (ILocked(), "invariant") ;
- assert (_owner == NULL, "invariant");
+ assert(ILocked(), "invariant");
+ assert(_owner == NULL, "invariant");
// This can potentially be called by non-java Threads. Thus, the ThreadLocalStorage
// might return NULL. Don't call set_owner since it will break on an NULL owner
// Consider installing a non-null "ANON" distinguished value instead of just NULL.
_owner = ThreadLocalStorage::thread();
- return ;
+ return;
}
- if (TrySpin(NULL)) goto Exeunt ;
+ if (TrySpin(NULL)) goto Exeunt;
// slow-path - apparent contention
// Allocate a ParkEvent for transient use.
// The ParkEvent remains associated with this thread until
// the time the thread manages to acquire the lock.
- ParkEvent * const ESelf = ParkEvent::Allocate(NULL) ;
- ESelf->reset() ;
- OrderAccess::storeload() ;
+ ParkEvent * const ESelf = ParkEvent::Allocate(NULL);
+ ESelf->reset();
+ OrderAccess::storeload();
// Either Enqueue Self on cxq or acquire the outer lock.
if (AcquireOrPush (ESelf)) {
- ParkEvent::Release (ESelf) ; // surrender the ParkEvent
- goto Exeunt ;
+ ParkEvent::Release(ESelf); // surrender the ParkEvent
+ goto Exeunt;
}
// At any given time there is at most one ondeck thread.
@@ -1050,37 +1051,37 @@ void Monitor::jvm_raw_lock() {
// Only the OnDeck thread can try to acquire -- contended for -- the lock.
// CONSIDER: use Self->OnDeck instead of m->OnDeck.
for (;;) {
- if (_OnDeck == ESelf && TrySpin(NULL)) break ;
- ParkCommon (ESelf, 0) ;
+ if (_OnDeck == ESelf && TrySpin(NULL)) break;
+ ParkCommon(ESelf, 0);
}
- assert (_OnDeck == ESelf, "invariant") ;
- _OnDeck = NULL ;
- ParkEvent::Release (ESelf) ; // surrender the ParkEvent
- goto Exeunt ;
+ assert(_OnDeck == ESelf, "invariant");
+ _OnDeck = NULL;
+ ParkEvent::Release(ESelf); // surrender the ParkEvent
+ goto Exeunt;
}
void Monitor::jvm_raw_unlock() {
// Nearly the same as Monitor::unlock() ...
// directly set _owner instead of using set_owner(null)
- _owner = NULL ;
+ _owner = NULL;
if (_snuck) { // ???
assert(SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread(), "sneak");
_snuck = false;
- return ;
+ return;
}
- IUnlock(false) ;
+ IUnlock(false);
}
bool Monitor::wait(bool no_safepoint_check, long timeout, bool as_suspend_equivalent) {
- Thread * const Self = Thread::current() ;
- assert (_owner == Self, "invariant") ;
- assert (ILocked(), "invariant") ;
+ Thread * const Self = Thread::current();
+ assert(_owner == Self, "invariant");
+ assert(ILocked(), "invariant");
// as_suspend_equivalent logically implies !no_safepoint_check
- guarantee (!as_suspend_equivalent || !no_safepoint_check, "invariant") ;
+ guarantee(!as_suspend_equivalent || !no_safepoint_check, "invariant");
// !no_safepoint_check logically implies java_thread
- guarantee (no_safepoint_check || Self->is_Java_thread(), "invariant") ;
+ guarantee(no_safepoint_check || Self->is_Java_thread(), "invariant");
#ifdef ASSERT
Monitor * least = get_least_ranked_lock_besides_this(Self->owned_locks());
@@ -1093,14 +1094,14 @@ bool Monitor::wait(bool no_safepoint_check, long timeout, bool as_suspend_equiva
}
#endif // ASSERT
- int wait_status ;
+ int wait_status;
// conceptually set the owner to NULL in anticipation of
// abdicating the lock in wait
set_owner(NULL);
if (no_safepoint_check) {
- wait_status = IWait (Self, timeout) ;
+ wait_status = IWait(Self, timeout);
} else {
- assert (Self->is_Java_thread(), "invariant") ;
+ assert(Self->is_Java_thread(), "invariant");
JavaThread *jt = (JavaThread *)Self;
// Enter safepoint region - ornate and Rococo ...
@@ -1113,7 +1114,7 @@ bool Monitor::wait(bool no_safepoint_check, long timeout, bool as_suspend_equiva
// java_suspend_self()
}
- wait_status = IWait (Self, timeout) ;
+ wait_status = IWait(Self, timeout);
// were we externally suspended while we were waiting?
if (as_suspend_equivalent && jt->handle_special_suspend_equivalent_condition()) {
@@ -1121,67 +1122,67 @@ bool Monitor::wait(bool no_safepoint_check, long timeout, bool as_suspend_equiva
// while we were waiting another thread suspended us. We don't
// want to hold the lock while suspended because that
// would surprise the thread that suspended us.
- assert (ILocked(), "invariant") ;
- IUnlock (true) ;
+ assert(ILocked(), "invariant");
+ IUnlock(true);
jt->java_suspend_self();
- ILock (Self) ;
- assert (ILocked(), "invariant") ;
+ ILock(Self);
+ assert(ILocked(), "invariant");
}
}
// Conceptually reestablish ownership of the lock.
// The "real" lock -- the LockByte -- was reacquired by IWait().
- assert (ILocked(), "invariant") ;
- assert (_owner == NULL, "invariant") ;
- set_owner (Self) ;
- return wait_status != 0 ; // return true IFF timeout
+ assert(ILocked(), "invariant");
+ assert(_owner == NULL, "invariant");
+ set_owner(Self);
+ return wait_status != 0; // return true IFF timeout
}
Monitor::~Monitor() {
- assert ((UNS(_owner)|UNS(_LockWord.FullWord)|UNS(_EntryList)|UNS(_WaitSet)|UNS(_OnDeck)) == 0, "") ;
+ assert((UNS(_owner)|UNS(_LockWord.FullWord)|UNS(_EntryList)|UNS(_WaitSet)|UNS(_OnDeck)) == 0, "");
}
void Monitor::ClearMonitor (Monitor * m, const char *name) {
- m->_owner = NULL ;
- m->_snuck = false ;
+ m->_owner = NULL;
+ m->_snuck = false;
if (name == NULL) {
- strcpy(m->_name, "UNKNOWN") ;
+ strcpy(m->_name, "UNKNOWN");
} else {
strncpy(m->_name, name, MONITOR_NAME_LEN - 1);
m->_name[MONITOR_NAME_LEN - 1] = '\0';
}
- m->_LockWord.FullWord = 0 ;
- m->_EntryList = NULL ;
- m->_OnDeck = NULL ;
- m->_WaitSet = NULL ;
- m->_WaitLock[0] = 0 ;
+ m->_LockWord.FullWord = 0;
+ m->_EntryList = NULL;
+ m->_OnDeck = NULL;
+ m->_WaitSet = NULL;
+ m->_WaitLock[0] = 0;
}
Monitor::Monitor() { ClearMonitor(this); }
Monitor::Monitor (int Rank, const char * name, bool allow_vm_block) {
- ClearMonitor (this, name) ;
+ ClearMonitor(this, name);
#ifdef ASSERT
_allow_vm_block = allow_vm_block;
- _rank = Rank ;
+ _rank = Rank;
#endif
}
Mutex::~Mutex() {
- assert ((UNS(_owner)|UNS(_LockWord.FullWord)|UNS(_EntryList)|UNS(_WaitSet)|UNS(_OnDeck)) == 0, "") ;
+ assert((UNS(_owner)|UNS(_LockWord.FullWord)|UNS(_EntryList)|UNS(_WaitSet)|UNS(_OnDeck)) == 0, "");
}
Mutex::Mutex (int Rank, const char * name, bool allow_vm_block) {
- ClearMonitor ((Monitor *) this, name) ;
+ ClearMonitor((Monitor *) this, name);
#ifdef ASSERT
_allow_vm_block = allow_vm_block;
- _rank = Rank ;
+ _rank = Rank;
#endif
}
bool Monitor::owned_by_self() const {
bool ret = _owner == Thread::current();
- assert (!ret || _LockWord.Bytes[_LSBINDEX] != 0, "invariant") ;
+ assert(!ret || _LockWord.Bytes[_LSBINDEX] != 0, "invariant");
return ret;
}
diff --git a/hotspot/src/share/vm/runtime/objectMonitor.cpp b/hotspot/src/share/vm/runtime/objectMonitor.cpp
index 6f2323c8668..c7a91f470c6 100644
--- a/hotspot/src/share/vm/runtime/objectMonitor.cpp
+++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp
@@ -27,6 +27,7 @@
#include "memory/resourceArea.hpp"
#include "oops/markOop.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/mutexLocker.hpp"
@@ -114,38 +115,38 @@
// The knob* variables are effectively final. Once set they should
// never be modified hence. Consider using __read_mostly with GCC.
-int ObjectMonitor::Knob_Verbose = 0 ;
-int ObjectMonitor::Knob_SpinLimit = 5000 ; // derived by an external tool -
-static int Knob_LogSpins = 0 ; // enable jvmstat tally for spins
-static int Knob_HandOff = 0 ;
-static int Knob_ReportSettings = 0 ;
+int ObjectMonitor::Knob_Verbose = 0;
+int ObjectMonitor::Knob_SpinLimit = 5000; // derived by an external tool -
+static int Knob_LogSpins = 0; // enable jvmstat tally for spins
+static int Knob_HandOff = 0;
+static int Knob_ReportSettings = 0;
-static int Knob_SpinBase = 0 ; // Floor AKA SpinMin
-static int Knob_SpinBackOff = 0 ; // spin-loop backoff
-static int Knob_CASPenalty = -1 ; // Penalty for failed CAS
-static int Knob_OXPenalty = -1 ; // Penalty for observed _owner change
-static int Knob_SpinSetSucc = 1 ; // spinners set the _succ field
-static int Knob_SpinEarly = 1 ;
-static int Knob_SuccEnabled = 1 ; // futile wake throttling
-static int Knob_SuccRestrict = 0 ; // Limit successors + spinners to at-most-one
-static int Knob_MaxSpinners = -1 ; // Should be a function of # CPUs
-static int Knob_Bonus = 100 ; // spin success bonus
-static int Knob_BonusB = 100 ; // spin success bonus
-static int Knob_Penalty = 200 ; // spin failure penalty
-static int Knob_Poverty = 1000 ;
-static int Knob_SpinAfterFutile = 1 ; // Spin after returning from park()
-static int Knob_FixedSpin = 0 ;
-static int Knob_OState = 3 ; // Spinner checks thread state of _owner
-static int Knob_UsePause = 1 ;
-static int Knob_ExitPolicy = 0 ;
-static int Knob_PreSpin = 10 ; // 20-100 likely better
-static int Knob_ResetEvent = 0 ;
-static int BackOffMask = 0 ;
+static int Knob_SpinBase = 0; // Floor AKA SpinMin
+static int Knob_SpinBackOff = 0; // spin-loop backoff
+static int Knob_CASPenalty = -1; // Penalty for failed CAS
+static int Knob_OXPenalty = -1; // Penalty for observed _owner change
+static int Knob_SpinSetSucc = 1; // spinners set the _succ field
+static int Knob_SpinEarly = 1;
+static int Knob_SuccEnabled = 1; // futile wake throttling
+static int Knob_SuccRestrict = 0; // Limit successors + spinners to at-most-one
+static int Knob_MaxSpinners = -1; // Should be a function of # CPUs
+static int Knob_Bonus = 100; // spin success bonus
+static int Knob_BonusB = 100; // spin success bonus
+static int Knob_Penalty = 200; // spin failure penalty
+static int Knob_Poverty = 1000;
+static int Knob_SpinAfterFutile = 1; // Spin after returning from park()
+static int Knob_FixedSpin = 0;
+static int Knob_OState = 3; // Spinner checks thread state of _owner
+static int Knob_UsePause = 1;
+static int Knob_ExitPolicy = 0;
+static int Knob_PreSpin = 10; // 20-100 likely better
+static int Knob_ResetEvent = 0;
+static int BackOffMask = 0;
-static int Knob_FastHSSEC = 0 ;
-static int Knob_MoveNotifyee = 2 ; // notify() - disposition of notifyee
-static int Knob_QMode = 0 ; // EntryList-cxq policy - queue discipline
-static volatile int InitDone = 0 ;
+static int Knob_FastHSSEC = 0;
+static int Knob_MoveNotifyee = 2; // notify() - disposition of notifyee
+static int Knob_QMode = 0; // EntryList-cxq policy - queue discipline
+static volatile int InitDone = 0;
#define TrySpin TrySpin_VaryDuration
@@ -265,9 +266,9 @@ bool ObjectMonitor::try_enter(Thread* THREAD) {
if (THREAD != _owner) {
if (THREAD->is_lock_owned ((address)_owner)) {
assert(_recursions == 0, "internal state error");
- _owner = THREAD ;
- _recursions = 1 ;
- OwnerIsThread = 1 ;
+ _owner = THREAD;
+ _recursions = 1;
+ OwnerIsThread = 1;
return true;
}
if (Atomic::cmpxchg_ptr (THREAD, &_owner, NULL) != NULL) {
@@ -283,37 +284,37 @@ bool ObjectMonitor::try_enter(Thread* THREAD) {
void ATTR ObjectMonitor::enter(TRAPS) {
// The following code is ordered to check the most common cases first
// and to reduce RTS->RTO cache line upgrades on SPARC and IA32 processors.
- Thread * const Self = THREAD ;
- void * cur ;
+ Thread * const Self = THREAD;
+ void * cur;
- cur = Atomic::cmpxchg_ptr (Self, &_owner, NULL) ;
+ cur = Atomic::cmpxchg_ptr(Self, &_owner, NULL);
if (cur == NULL) {
// Either ASSERT _recursions == 0 or explicitly set _recursions = 0.
- assert (_recursions == 0 , "invariant") ;
- assert (_owner == Self, "invariant") ;
+ assert(_recursions == 0 , "invariant");
+ assert(_owner == Self, "invariant");
// CONSIDER: set or assert OwnerIsThread == 1
- return ;
+ return;
}
if (cur == Self) {
// TODO-FIXME: check for integer overflow! BUGID 6557169.
- _recursions ++ ;
- return ;
+ _recursions++;
+ return;
}
if (Self->is_lock_owned ((address)cur)) {
- assert (_recursions == 0, "internal state error");
- _recursions = 1 ;
+ assert(_recursions == 0, "internal state error");
+ _recursions = 1;
// Commute owner from a thread-specific on-stack BasicLockObject address to
// a full-fledged "Thread *".
- _owner = Self ;
- OwnerIsThread = 1 ;
- return ;
+ _owner = Self;
+ OwnerIsThread = 1;
+ return;
}
// We've encountered genuine contention.
- assert (Self->_Stalled == 0, "invariant") ;
- Self->_Stalled = intptr_t(this) ;
+ assert(Self->_Stalled == 0, "invariant");
+ Self->_Stalled = intptr_t(this);
// Try one round of spinning *before* enqueueing Self
// and before going through the awkward and expensive state
@@ -321,21 +322,21 @@ void ATTR ObjectMonitor::enter(TRAPS) {
// Note that if we acquire the monitor from an initial spin
// we forgo posting JVMTI events and firing DTRACE probes.
if (Knob_SpinEarly && TrySpin (Self) > 0) {
- assert (_owner == Self , "invariant") ;
- assert (_recursions == 0 , "invariant") ;
- assert (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
- Self->_Stalled = 0 ;
- return ;
+ assert(_owner == Self , "invariant");
+ assert(_recursions == 0 , "invariant");
+ assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
+ Self->_Stalled = 0;
+ return;
}
- assert (_owner != Self , "invariant") ;
- assert (_succ != Self , "invariant") ;
- assert (Self->is_Java_thread() , "invariant") ;
- JavaThread * jt = (JavaThread *) Self ;
- assert (!SafepointSynchronize::is_at_safepoint(), "invariant") ;
- assert (jt->thread_state() != _thread_blocked , "invariant") ;
- assert (this->object() != NULL , "invariant") ;
- assert (_count >= 0, "invariant") ;
+ assert(_owner != Self , "invariant");
+ assert(_succ != Self , "invariant");
+ assert(Self->is_Java_thread() , "invariant");
+ JavaThread * jt = (JavaThread *) Self;
+ assert(!SafepointSynchronize::is_at_safepoint(), "invariant");
+ assert(jt->thread_state() != _thread_blocked , "invariant");
+ assert(this->object() != NULL , "invariant");
+ assert(_count >= 0, "invariant");
// Prevent deflation at STW-time. See deflate_idle_monitors() and is_busy().
// Ensure the object-monitor relationship remains stable while there's contention.
@@ -368,9 +369,9 @@ void ATTR ObjectMonitor::enter(TRAPS) {
// cleared by handle_special_suspend_equivalent_condition()
// or java_suspend_self()
- EnterI (THREAD) ;
+ EnterI(THREAD);
- if (!ExitSuspendEquivalent(jt)) break ;
+ if (!ExitSuspendEquivalent(jt)) break;
//
// We have acquired the contended monitor, but while we were
@@ -378,9 +379,9 @@ void ATTR ObjectMonitor::enter(TRAPS) {
// the monitor while suspended because that would surprise the
// thread that suspended us.
//
- _recursions = 0 ;
- _succ = NULL ;
- exit (false, Self) ;
+ _recursions = 0;
+ _succ = NULL;
+ exit(false, Self);
jt->java_suspend_self();
}
@@ -397,14 +398,14 @@ void ATTR ObjectMonitor::enter(TRAPS) {
}
Atomic::dec_ptr(&_count);
- assert (_count >= 0, "invariant") ;
- Self->_Stalled = 0 ;
+ assert(_count >= 0, "invariant");
+ Self->_Stalled = 0;
// Must either set _recursions = 0 or ASSERT _recursions == 0.
- assert (_recursions == 0 , "invariant") ;
- assert (_owner == Self , "invariant") ;
- assert (_succ != Self , "invariant") ;
- assert (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
+ assert(_recursions == 0 , "invariant");
+ assert(_owner == Self , "invariant");
+ assert(_succ != Self , "invariant");
+ assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
// The thread -- now the owner -- is back in vm mode.
// Report the glorious news via TI,DTrace and jvmstat.
@@ -437,7 +438,7 @@ void ATTR ObjectMonitor::enter(TRAPS) {
}
if (ObjectMonitor::_sync_ContendedLockAttempts != NULL) {
- ObjectMonitor::_sync_ContendedLockAttempts->inc() ;
+ ObjectMonitor::_sync_ContendedLockAttempts->inc();
}
}
@@ -447,37 +448,37 @@ void ATTR ObjectMonitor::enter(TRAPS) {
int ObjectMonitor::TryLock (Thread * Self) {
for (;;) {
- void * own = _owner ;
- if (own != NULL) return 0 ;
+ void * own = _owner;
+ if (own != NULL) return 0;
if (Atomic::cmpxchg_ptr (Self, &_owner, NULL) == NULL) {
// Either guarantee _recursions == 0 or set _recursions = 0.
- assert (_recursions == 0, "invariant") ;
- assert (_owner == Self, "invariant") ;
+ assert(_recursions == 0, "invariant");
+ assert(_owner == Self, "invariant");
// CONSIDER: set or assert that OwnerIsThread == 1
- return 1 ;
+ return 1;
}
// The lock had been free momentarily, but we lost the race to the lock.
// Interference -- the CAS failed.
// We can either return -1 or retry.
// Retry doesn't make as much sense because the lock was just acquired.
- if (true) return -1 ;
+ if (true) return -1;
}
}
void ATTR ObjectMonitor::EnterI (TRAPS) {
- Thread * Self = THREAD ;
- assert (Self->is_Java_thread(), "invariant") ;
- assert (((JavaThread *) Self)->thread_state() == _thread_blocked , "invariant") ;
+ Thread * Self = THREAD;
+ assert(Self->is_Java_thread(), "invariant");
+ assert(((JavaThread *) Self)->thread_state() == _thread_blocked , "invariant");
// Try the lock - TATAS
if (TryLock (Self) > 0) {
- assert (_succ != Self , "invariant") ;
- assert (_owner == Self , "invariant") ;
- assert (_Responsible != Self , "invariant") ;
- return ;
+ assert(_succ != Self , "invariant");
+ assert(_owner == Self , "invariant");
+ assert(_Responsible != Self , "invariant");
+ return;
}
- DeferredInitialize () ;
+ DeferredInitialize();
// We try one round of spinning *before* enqueueing Self.
//
@@ -487,16 +488,16 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// effects.
if (TrySpin (Self) > 0) {
- assert (_owner == Self , "invariant") ;
- assert (_succ != Self , "invariant") ;
- assert (_Responsible != Self , "invariant") ;
- return ;
+ assert(_owner == Self , "invariant");
+ assert(_succ != Self , "invariant");
+ assert(_Responsible != Self , "invariant");
+ return;
}
// The Spin failed -- Enqueue and park the thread ...
- assert (_succ != Self , "invariant") ;
- assert (_owner != Self , "invariant") ;
- assert (_Responsible != Self , "invariant") ;
+ assert(_succ != Self , "invariant");
+ assert(_owner != Self , "invariant");
+ assert(_Responsible != Self , "invariant");
// Enqueue "Self" on ObjectMonitor's _cxq.
//
@@ -508,27 +509,27 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// TODO: eliminate ObjectWaiter and enqueue either Threads or Events.
//
- ObjectWaiter node(Self) ;
- Self->_ParkEvent->reset() ;
- node._prev = (ObjectWaiter *) 0xBAD ;
- node.TState = ObjectWaiter::TS_CXQ ;
+ ObjectWaiter node(Self);
+ Self->_ParkEvent->reset();
+ node._prev = (ObjectWaiter *) 0xBAD;
+ node.TState = ObjectWaiter::TS_CXQ;
// Push "Self" onto the front of the _cxq.
// Once on cxq/EntryList, Self stays on-queue until it acquires the lock.
// Note that spinning tends to reduce the rate at which threads
// enqueue and dequeue on EntryList|cxq.
- ObjectWaiter * nxt ;
+ ObjectWaiter * nxt;
for (;;) {
- node._next = nxt = _cxq ;
- if (Atomic::cmpxchg_ptr (&node, &_cxq, nxt) == nxt) break ;
+ node._next = nxt = _cxq;
+ if (Atomic::cmpxchg_ptr(&node, &_cxq, nxt) == nxt) break;
// Interference - the CAS failed because _cxq changed. Just retry.
// As an optional optimization we retry the lock.
if (TryLock (Self) > 0) {
- assert (_succ != Self , "invariant") ;
- assert (_owner == Self , "invariant") ;
- assert (_Responsible != Self , "invariant") ;
- return ;
+ assert(_succ != Self , "invariant");
+ assert(_owner == Self , "invariant");
+ assert(_Responsible != Self , "invariant");
+ return;
}
}
@@ -558,7 +559,7 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
if ((SyncFlags & 16) == 0 && nxt == NULL && _EntryList == NULL) {
// Try to assume the role of responsible thread for the monitor.
// CONSIDER: ST vs CAS vs { if (Responsible==null) Responsible=Self }
- Atomic::cmpxchg_ptr (Self, &_Responsible, NULL) ;
+ Atomic::cmpxchg_ptr(Self, &_Responsible, NULL);
}
// The lock have been released while this thread was occupied queueing
@@ -572,49 +573,49 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// to defer the state transitions until absolutely necessary,
// and in doing so avoid some transitions ...
- TEVENT (Inflated enter - Contention) ;
- int nWakeups = 0 ;
- int RecheckInterval = 1 ;
+ TEVENT(Inflated enter - Contention);
+ int nWakeups = 0;
+ int RecheckInterval = 1;
for (;;) {
- if (TryLock (Self) > 0) break ;
- assert (_owner != Self, "invariant") ;
+ if (TryLock(Self) > 0) break;
+ assert(_owner != Self, "invariant");
if ((SyncFlags & 2) && _Responsible == NULL) {
- Atomic::cmpxchg_ptr (Self, &_Responsible, NULL) ;
+ Atomic::cmpxchg_ptr(Self, &_Responsible, NULL);
}
// park self
if (_Responsible == Self || (SyncFlags & 1)) {
- TEVENT (Inflated enter - park TIMED) ;
- Self->_ParkEvent->park ((jlong) RecheckInterval) ;
+ TEVENT(Inflated enter - park TIMED);
+ Self->_ParkEvent->park((jlong) RecheckInterval);
// Increase the RecheckInterval, but clamp the value.
- RecheckInterval *= 8 ;
- if (RecheckInterval > 1000) RecheckInterval = 1000 ;
+ RecheckInterval *= 8;
+ if (RecheckInterval > 1000) RecheckInterval = 1000;
} else {
- TEVENT (Inflated enter - park UNTIMED) ;
- Self->_ParkEvent->park() ;
+ TEVENT(Inflated enter - park UNTIMED);
+ Self->_ParkEvent->park();
}
- if (TryLock(Self) > 0) break ;
+ if (TryLock(Self) > 0) break;
// The lock is still contested.
// Keep a tally of the # of futile wakeups.
// Note that the counter is not protected by a lock or updated by atomics.
// That is by design - we trade "lossy" counters which are exposed to
// races during updates for a lower probe effect.
- TEVENT (Inflated enter - Futile wakeup) ;
+ TEVENT(Inflated enter - Futile wakeup);
if (ObjectMonitor::_sync_FutileWakeups != NULL) {
- ObjectMonitor::_sync_FutileWakeups->inc() ;
+ ObjectMonitor::_sync_FutileWakeups->inc();
}
- ++ nWakeups ;
+ ++nWakeups;
// Assuming this is not a spurious wakeup we'll normally find _succ == Self.
// We can defer clearing _succ until after the spin completes
// TrySpin() must tolerate being called with _succ == Self.
// Try yet another round of adaptive spinning.
- if ((Knob_SpinAfterFutile & 1) && TrySpin (Self) > 0) break ;
+ if ((Knob_SpinAfterFutile & 1) && TrySpin(Self) > 0) break;
// We can find that we were unpark()ed and redesignated _succ while
// we were spinning. That's harmless. If we iterate and call park(),
@@ -625,13 +626,13 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// in the next iteration.
if ((Knob_ResetEvent & 1) && Self->_ParkEvent->fired()) {
- Self->_ParkEvent->reset() ;
- OrderAccess::fence() ;
+ Self->_ParkEvent->reset();
+ OrderAccess::fence();
}
- if (_succ == Self) _succ = NULL ;
+ if (_succ == Self) _succ = NULL;
// Invariant: after clearing _succ a thread *must* retry _owner before parking.
- OrderAccess::fence() ;
+ OrderAccess::fence();
}
// Egress :
@@ -642,18 +643,18 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// The head of cxq is volatile but the interior is stable.
// In addition, Self.TState is stable.
- assert (_owner == Self , "invariant") ;
- assert (object() != NULL , "invariant") ;
+ assert(_owner == Self , "invariant");
+ assert(object() != NULL , "invariant");
// I'd like to write:
// guarantee (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
// but as we're at a safepoint that's not safe.
- UnlinkAfterAcquire (Self, &node) ;
- if (_succ == Self) _succ = NULL ;
+ UnlinkAfterAcquire(Self, &node);
+ if (_succ == Self) _succ = NULL;
- assert (_succ != Self, "invariant") ;
+ assert(_succ != Self, "invariant");
if (_Responsible == Self) {
- _Responsible = NULL ;
+ _Responsible = NULL;
OrderAccess::fence(); // Dekker pivot-point
// We may leave threads on cxq|EntryList without a designated
@@ -700,9 +701,9 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// execute a serializing instruction.
if (SyncFlags & 8) {
- OrderAccess::fence() ;
+ OrderAccess::fence();
}
- return ;
+ return;
}
// ReenterI() is a specialized inline form of the latter half of the
@@ -714,24 +715,24 @@ void ATTR ObjectMonitor::EnterI (TRAPS) {
// loop accordingly.
void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
- assert (Self != NULL , "invariant") ;
- assert (SelfNode != NULL , "invariant") ;
- assert (SelfNode->_thread == Self , "invariant") ;
- assert (_waiters > 0 , "invariant") ;
- assert (((oop)(object()))->mark() == markOopDesc::encode(this) , "invariant") ;
- assert (((JavaThread *)Self)->thread_state() != _thread_blocked, "invariant") ;
- JavaThread * jt = (JavaThread *) Self ;
+ assert(Self != NULL , "invariant");
+ assert(SelfNode != NULL , "invariant");
+ assert(SelfNode->_thread == Self , "invariant");
+ assert(_waiters > 0 , "invariant");
+ assert(((oop)(object()))->mark() == markOopDesc::encode(this) , "invariant");
+ assert(((JavaThread *)Self)->thread_state() != _thread_blocked, "invariant");
+ JavaThread * jt = (JavaThread *) Self;
- int nWakeups = 0 ;
+ int nWakeups = 0;
for (;;) {
- ObjectWaiter::TStates v = SelfNode->TState ;
- guarantee (v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant") ;
- assert (_owner != Self, "invariant") ;
+ ObjectWaiter::TStates v = SelfNode->TState;
+ guarantee(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant");
+ assert(_owner != Self, "invariant");
- if (TryLock (Self) > 0) break ;
- if (TrySpin (Self) > 0) break ;
+ if (TryLock(Self) > 0) break;
+ if (TrySpin(Self) > 0) break;
- TEVENT (Wait Reentry - parking) ;
+ TEVENT(Wait Reentry - parking);
// State transition wrappers around park() ...
// ReenterI() wisely defers state transitions until
@@ -744,14 +745,14 @@ void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
// or java_suspend_self()
jt->set_suspend_equivalent();
if (SyncFlags & 1) {
- Self->_ParkEvent->park ((jlong)1000) ;
+ Self->_ParkEvent->park((jlong)1000);
} else {
- Self->_ParkEvent->park () ;
+ Self->_ParkEvent->park();
}
// were we externally suspended while we were waiting?
for (;;) {
- if (!ExitSuspendEquivalent (jt)) break ;
+ if (!ExitSuspendEquivalent(jt)) break;
if (_succ == Self) { _succ = NULL; OrderAccess::fence(); }
jt->java_suspend_self();
jt->set_suspend_equivalent();
@@ -761,26 +762,26 @@ void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
// Try again, but just so we distinguish between futile wakeups and
// successful wakeups. The following test isn't algorithmically
// necessary, but it helps us maintain sensible statistics.
- if (TryLock(Self) > 0) break ;
+ if (TryLock(Self) > 0) break;
// The lock is still contested.
// Keep a tally of the # of futile wakeups.
// Note that the counter is not protected by a lock or updated by atomics.
// That is by design - we trade "lossy" counters which are exposed to
// races during updates for a lower probe effect.
- TEVENT (Wait Reentry - futile wakeup) ;
- ++ nWakeups ;
+ TEVENT(Wait Reentry - futile wakeup);
+ ++nWakeups;
// Assuming this is not a spurious wakeup we'll normally
// find that _succ == Self.
- if (_succ == Self) _succ = NULL ;
+ if (_succ == Self) _succ = NULL;
// Invariant: after clearing _succ a contending thread
// *must* retry _owner before parking.
- OrderAccess::fence() ;
+ OrderAccess::fence();
if (ObjectMonitor::_sync_FutileWakeups != NULL) {
- ObjectMonitor::_sync_FutileWakeups->inc() ;
+ ObjectMonitor::_sync_FutileWakeups->inc();
}
}
@@ -792,13 +793,13 @@ void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
// The head of cxq is volatile but the interior is stable.
// In addition, Self.TState is stable.
- assert (_owner == Self, "invariant") ;
- assert (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
- UnlinkAfterAcquire (Self, SelfNode) ;
- if (_succ == Self) _succ = NULL ;
- assert (_succ != Self, "invariant") ;
- SelfNode->TState = ObjectWaiter::TS_RUN ;
- OrderAccess::fence() ; // see comments at the end of EnterI()
+ assert(_owner == Self, "invariant");
+ assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
+ UnlinkAfterAcquire(Self, SelfNode);
+ if (_succ == Self) _succ = NULL;
+ assert(_succ != Self, "invariant");
+ SelfNode->TState = ObjectWaiter::TS_RUN;
+ OrderAccess::fence(); // see comments at the end of EnterI()
}
// after the thread acquires the lock in ::enter(). Equally, we could defer
@@ -806,22 +807,22 @@ void ATTR ObjectMonitor::ReenterI (Thread * Self, ObjectWaiter * SelfNode) {
void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
{
- assert (_owner == Self, "invariant") ;
- assert (SelfNode->_thread == Self, "invariant") ;
+ assert(_owner == Self, "invariant");
+ assert(SelfNode->_thread == Self, "invariant");
if (SelfNode->TState == ObjectWaiter::TS_ENTER) {
// Normal case: remove Self from the DLL EntryList .
// This is a constant-time operation.
- ObjectWaiter * nxt = SelfNode->_next ;
- ObjectWaiter * prv = SelfNode->_prev ;
- if (nxt != NULL) nxt->_prev = prv ;
- if (prv != NULL) prv->_next = nxt ;
- if (SelfNode == _EntryList ) _EntryList = nxt ;
- assert (nxt == NULL || nxt->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- assert (prv == NULL || prv->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- TEVENT (Unlink from EntryList) ;
+ ObjectWaiter * nxt = SelfNode->_next;
+ ObjectWaiter * prv = SelfNode->_prev;
+ if (nxt != NULL) nxt->_prev = prv;
+ if (prv != NULL) prv->_next = nxt;
+ if (SelfNode == _EntryList) _EntryList = nxt;
+ assert(nxt == NULL || nxt->TState == ObjectWaiter::TS_ENTER, "invariant");
+ assert(prv == NULL || prv->TState == ObjectWaiter::TS_ENTER, "invariant");
+ TEVENT(Unlink from EntryList);
} else {
- guarantee (SelfNode->TState == ObjectWaiter::TS_CXQ, "invariant") ;
+ guarantee(SelfNode->TState == ObjectWaiter::TS_CXQ, "invariant");
// Inopportune interleaving -- Self is still on the cxq.
// This usually means the enqueue of self raced an exiting thread.
// Normally we'll find Self near the front of the cxq, so
@@ -835,36 +836,36 @@ void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
// and then unlink Self from EntryList. We have to drain eventually,
// so it might as well be now.
- ObjectWaiter * v = _cxq ;
- assert (v != NULL, "invariant") ;
+ ObjectWaiter * v = _cxq;
+ assert(v != NULL, "invariant");
if (v != SelfNode || Atomic::cmpxchg_ptr (SelfNode->_next, &_cxq, v) != v) {
// The CAS above can fail from interference IFF a "RAT" arrived.
// In that case Self must be in the interior and can no longer be
// at the head of cxq.
if (v == SelfNode) {
- assert (_cxq != v, "invariant") ;
- v = _cxq ; // CAS above failed - start scan at head of list
+ assert(_cxq != v, "invariant");
+ v = _cxq; // CAS above failed - start scan at head of list
}
- ObjectWaiter * p ;
- ObjectWaiter * q = NULL ;
- for (p = v ; p != NULL && p != SelfNode; p = p->_next) {
- q = p ;
- assert (p->TState == ObjectWaiter::TS_CXQ, "invariant") ;
+ ObjectWaiter * p;
+ ObjectWaiter * q = NULL;
+ for (p = v; p != NULL && p != SelfNode; p = p->_next) {
+ q = p;
+ assert(p->TState == ObjectWaiter::TS_CXQ, "invariant");
}
- assert (v != SelfNode, "invariant") ;
- assert (p == SelfNode, "Node not found on cxq") ;
- assert (p != _cxq, "invariant") ;
- assert (q != NULL, "invariant") ;
- assert (q->_next == p, "invariant") ;
- q->_next = p->_next ;
+ assert(v != SelfNode, "invariant");
+ assert(p == SelfNode, "Node not found on cxq");
+ assert(p != _cxq, "invariant");
+ assert(q != NULL, "invariant");
+ assert(q->_next == p, "invariant");
+ q->_next = p->_next;
}
- TEVENT (Unlink from cxq) ;
+ TEVENT(Unlink from cxq);
}
// Diagnostic hygiene ...
- SelfNode->_prev = (ObjectWaiter *) 0xBAD ;
- SelfNode->_next = (ObjectWaiter *) 0xBAD ;
- SelfNode->TState = ObjectWaiter::TS_RUN ;
+ SelfNode->_prev = (ObjectWaiter *) 0xBAD;
+ SelfNode->_next = (ObjectWaiter *) 0xBAD;
+ SelfNode->TState = ObjectWaiter::TS_RUN;
}
// -----------------------------------------------------------------------------
@@ -919,22 +920,22 @@ void ObjectMonitor::UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode)
// a monitor will use a timer.
void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
- Thread * Self = THREAD ;
+ Thread * Self = THREAD;
if (THREAD != _owner) {
if (THREAD->is_lock_owned((address) _owner)) {
// Transmute _owner from a BasicLock pointer to a Thread address.
// We don't need to hold _mutex for this transition.
// Non-null to Non-null is safe as long as all readers can
// tolerate either flavor.
- assert (_recursions == 0, "invariant") ;
- _owner = THREAD ;
- _recursions = 0 ;
- OwnerIsThread = 1 ;
+ assert(_recursions == 0, "invariant");
+ _owner = THREAD;
+ _recursions = 0;
+ OwnerIsThread = 1;
} else {
// NOTE: we need to handle unbalanced monitor enter/exit
// in native code by throwing an exception.
// TODO: Throw an IllegalMonitorStateException ?
- TEVENT (Exit - Throw IMSX) ;
+ TEVENT(Exit - Throw IMSX);
assert(false, "Non-balanced monitor enter/exit!");
if (false) {
THROW(vmSymbols::java_lang_IllegalMonitorStateException());
@@ -945,14 +946,14 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
if (_recursions != 0) {
_recursions--; // this is simple recursive enter
- TEVENT (Inflated exit - recursive) ;
- return ;
+ TEVENT(Inflated exit - recursive);
+ return;
}
// Invariant: after setting Responsible=null an thread must execute
// a MEMBAR or other serializing instruction before fetching EntryList|cxq.
if ((SyncFlags & 4) == 0) {
- _Responsible = NULL ;
+ _Responsible = NULL;
}
#if INCLUDE_TRACE
@@ -964,7 +965,7 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
#endif
for (;;) {
- assert (THREAD == _owner, "invariant") ;
+ assert(THREAD == _owner, "invariant");
if (Knob_ExitPolicy == 0) {
@@ -980,13 +981,13 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// in massive wasteful coherency traffic on classic SMP systems.
// Instead, I use release_store(), which is implemented as just a simple
// ST on x64, x86 and SPARC.
- OrderAccess::release_store_ptr (&_owner, NULL) ; // drop the lock
- OrderAccess::storeload() ; // See if we need to wake a successor
+ OrderAccess::release_store_ptr(&_owner, NULL); // drop the lock
+ OrderAccess::storeload(); // See if we need to wake a successor
if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
- TEVENT (Inflated exit - simple egress) ;
- return ;
+ TEVENT(Inflated exit - simple egress);
+ return;
}
- TEVENT (Inflated exit - complex egress) ;
+ TEVENT(Inflated exit - complex egress);
// Normally the exiting thread is responsible for ensuring succession,
// but if other successors are ready or other entering threads are spinning
@@ -1026,17 +1027,17 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// falls to the new owner.
//
if (Atomic::cmpxchg_ptr (THREAD, &_owner, NULL) != NULL) {
- return ;
+ return;
}
- TEVENT (Exit - Reacquired) ;
+ TEVENT(Exit - Reacquired);
} else {
if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
- OrderAccess::release_store_ptr (&_owner, NULL) ; // drop the lock
- OrderAccess::storeload() ;
+ OrderAccess::release_store_ptr(&_owner, NULL); // drop the lock
+ OrderAccess::storeload();
// Ratify the previously observed values.
if (_cxq == NULL || _succ != NULL) {
- TEVENT (Inflated exit - simple egress) ;
- return ;
+ TEVENT(Inflated exit - simple egress);
+ return;
}
// inopportune interleaving -- the exiting thread (this thread)
@@ -1051,29 +1052,29 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// we could simply unpark() the lead thread and return
// without having set _succ.
if (Atomic::cmpxchg_ptr (THREAD, &_owner, NULL) != NULL) {
- TEVENT (Inflated exit - reacquired succeeded) ;
- return ;
+ TEVENT(Inflated exit - reacquired succeeded);
+ return;
}
- TEVENT (Inflated exit - reacquired failed) ;
+ TEVENT(Inflated exit - reacquired failed);
} else {
- TEVENT (Inflated exit - complex egress) ;
+ TEVENT(Inflated exit - complex egress);
}
}
- guarantee (_owner == THREAD, "invariant") ;
+ guarantee(_owner == THREAD, "invariant");
- ObjectWaiter * w = NULL ;
- int QMode = Knob_QMode ;
+ ObjectWaiter * w = NULL;
+ int QMode = Knob_QMode;
if (QMode == 2 && _cxq != NULL) {
// QMode == 2 : cxq has precedence over EntryList.
// Try to directly wake a successor from the cxq.
// If successful, the successor will need to unlink itself from cxq.
- w = _cxq ;
- assert (w != NULL, "invariant") ;
- assert (w->TState == ObjectWaiter::TS_CXQ, "Invariant") ;
- ExitEpilog (Self, w) ;
- return ;
+ w = _cxq;
+ assert(w != NULL, "invariant");
+ assert(w->TState == ObjectWaiter::TS_CXQ, "Invariant");
+ ExitEpilog(Self, w);
+ return;
}
if (QMode == 3 && _cxq != NULL) {
@@ -1082,33 +1083,33 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// Drain _cxq into EntryList - bulk transfer.
// First, detach _cxq.
// The following loop is tantamount to: w = swap (&cxq, NULL)
- w = _cxq ;
+ w = _cxq;
for (;;) {
- assert (w != NULL, "Invariant") ;
- ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr (NULL, &_cxq, w) ;
- if (u == w) break ;
- w = u ;
+ assert(w != NULL, "Invariant");
+ ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr(NULL, &_cxq, w);
+ if (u == w) break;
+ w = u;
}
- assert (w != NULL , "invariant") ;
+ assert(w != NULL , "invariant");
- ObjectWaiter * q = NULL ;
- ObjectWaiter * p ;
- for (p = w ; p != NULL ; p = p->_next) {
- guarantee (p->TState == ObjectWaiter::TS_CXQ, "Invariant") ;
- p->TState = ObjectWaiter::TS_ENTER ;
- p->_prev = q ;
- q = p ;
+ ObjectWaiter * q = NULL;
+ ObjectWaiter * p;
+ for (p = w; p != NULL; p = p->_next) {
+ guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
+ p->TState = ObjectWaiter::TS_ENTER;
+ p->_prev = q;
+ q = p;
}
// Append the RATs to the EntryList
// TODO: organize EntryList as a CDLL so we can locate the tail in constant-time.
- ObjectWaiter * Tail ;
- for (Tail = _EntryList ; Tail != NULL && Tail->_next != NULL ; Tail = Tail->_next) ;
+ ObjectWaiter * Tail;
+ for (Tail = _EntryList; Tail != NULL && Tail->_next != NULL; Tail = Tail->_next);
if (Tail == NULL) {
- _EntryList = w ;
+ _EntryList = w;
} else {
- Tail->_next = w ;
- w->_prev = Tail ;
+ Tail->_next = w;
+ w->_prev = Tail;
}
// Fall thru into code that tries to wake a successor from EntryList
@@ -1121,35 +1122,35 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// Drain _cxq into EntryList - bulk transfer.
// First, detach _cxq.
// The following loop is tantamount to: w = swap (&cxq, NULL)
- w = _cxq ;
+ w = _cxq;
for (;;) {
- assert (w != NULL, "Invariant") ;
- ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr (NULL, &_cxq, w) ;
- if (u == w) break ;
- w = u ;
+ assert(w != NULL, "Invariant");
+ ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr(NULL, &_cxq, w);
+ if (u == w) break;
+ w = u;
}
- assert (w != NULL , "invariant") ;
+ assert(w != NULL , "invariant");
- ObjectWaiter * q = NULL ;
- ObjectWaiter * p ;
- for (p = w ; p != NULL ; p = p->_next) {
- guarantee (p->TState == ObjectWaiter::TS_CXQ, "Invariant") ;
- p->TState = ObjectWaiter::TS_ENTER ;
- p->_prev = q ;
- q = p ;
+ ObjectWaiter * q = NULL;
+ ObjectWaiter * p;
+ for (p = w; p != NULL; p = p->_next) {
+ guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
+ p->TState = ObjectWaiter::TS_ENTER;
+ p->_prev = q;
+ q = p;
}
// Prepend the RATs to the EntryList
if (_EntryList != NULL) {
- q->_next = _EntryList ;
- _EntryList->_prev = q ;
+ q->_next = _EntryList;
+ _EntryList->_prev = q;
}
- _EntryList = w ;
+ _EntryList = w;
// Fall thru into code that tries to wake a successor from EntryList
}
- w = _EntryList ;
+ w = _EntryList;
if (w != NULL) {
// I'd like to write: guarantee (w->_thread != Self).
// But in practice an exiting thread may find itself on the EntryList.
@@ -1162,29 +1163,29 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// reacquires the lock and then finds itself on the EntryList.
// Given all that, we have to tolerate the circumstance where "w" is
// associated with Self.
- assert (w->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- ExitEpilog (Self, w) ;
- return ;
+ assert(w->TState == ObjectWaiter::TS_ENTER, "invariant");
+ ExitEpilog(Self, w);
+ return;
}
// If we find that both _cxq and EntryList are null then just
// re-run the exit protocol from the top.
- w = _cxq ;
- if (w == NULL) continue ;
+ w = _cxq;
+ if (w == NULL) continue;
// Drain _cxq into EntryList - bulk transfer.
// First, detach _cxq.
// The following loop is tantamount to: w = swap (&cxq, NULL)
for (;;) {
- assert (w != NULL, "Invariant") ;
- ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr (NULL, &_cxq, w) ;
- if (u == w) break ;
- w = u ;
+ assert(w != NULL, "Invariant");
+ ObjectWaiter * u = (ObjectWaiter *) Atomic::cmpxchg_ptr(NULL, &_cxq, w);
+ if (u == w) break;
+ w = u;
}
- TEVENT (Inflated exit - drain cxq into EntryList) ;
+ TEVENT(Inflated exit - drain cxq into EntryList);
- assert (w != NULL , "invariant") ;
- assert (_EntryList == NULL , "invariant") ;
+ assert(w != NULL , "invariant");
+ assert(_EntryList == NULL , "invariant");
// Convert the LIFO SLL anchored by _cxq into a DLL.
// The list reorganization step operates in O(LENGTH(w)) time.
@@ -1198,30 +1199,30 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
if (QMode == 1) {
// QMode == 1 : drain cxq to EntryList, reversing order
// We also reverse the order of the list.
- ObjectWaiter * s = NULL ;
- ObjectWaiter * t = w ;
- ObjectWaiter * u = NULL ;
+ ObjectWaiter * s = NULL;
+ ObjectWaiter * t = w;
+ ObjectWaiter * u = NULL;
while (t != NULL) {
- guarantee (t->TState == ObjectWaiter::TS_CXQ, "invariant") ;
- t->TState = ObjectWaiter::TS_ENTER ;
- u = t->_next ;
- t->_prev = u ;
- t->_next = s ;
+ guarantee(t->TState == ObjectWaiter::TS_CXQ, "invariant");
+ t->TState = ObjectWaiter::TS_ENTER;
+ u = t->_next;
+ t->_prev = u;
+ t->_next = s;
s = t;
- t = u ;
+ t = u;
}
- _EntryList = s ;
- assert (s != NULL, "invariant") ;
+ _EntryList = s;
+ assert(s != NULL, "invariant");
} else {
// QMode == 0 or QMode == 2
- _EntryList = w ;
- ObjectWaiter * q = NULL ;
- ObjectWaiter * p ;
- for (p = w ; p != NULL ; p = p->_next) {
- guarantee (p->TState == ObjectWaiter::TS_CXQ, "Invariant") ;
- p->TState = ObjectWaiter::TS_ENTER ;
- p->_prev = q ;
- q = p ;
+ _EntryList = w;
+ ObjectWaiter * q = NULL;
+ ObjectWaiter * p;
+ for (p = w; p != NULL; p = p->_next) {
+ guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
+ p->TState = ObjectWaiter::TS_ENTER;
+ p->_prev = q;
+ q = p;
}
}
@@ -1233,11 +1234,11 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
// context-switch rate.
if (_succ != NULL) continue;
- w = _EntryList ;
+ w = _EntryList;
if (w != NULL) {
- guarantee (w->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- ExitEpilog (Self, w) ;
- return ;
+ guarantee(w->TState == ObjectWaiter::TS_ENTER, "invariant");
+ ExitEpilog(Self, w);
+ return;
}
}
}
@@ -1275,22 +1276,22 @@ void ATTR ObjectMonitor::exit(bool not_suspended, TRAPS) {
bool ObjectMonitor::ExitSuspendEquivalent (JavaThread * jSelf) {
- int Mode = Knob_FastHSSEC ;
+ int Mode = Knob_FastHSSEC;
if (Mode && !jSelf->is_external_suspend()) {
- assert (jSelf->is_suspend_equivalent(), "invariant") ;
- jSelf->clear_suspend_equivalent() ;
- if (2 == Mode) OrderAccess::storeload() ;
- if (!jSelf->is_external_suspend()) return false ;
+ assert(jSelf->is_suspend_equivalent(), "invariant");
+ jSelf->clear_suspend_equivalent();
+ if (2 == Mode) OrderAccess::storeload();
+ if (!jSelf->is_external_suspend()) return false;
// We raced a suspension -- fall thru into the slow path
- TEVENT (ExitSuspendEquivalent - raced) ;
- jSelf->set_suspend_equivalent() ;
+ TEVENT(ExitSuspendEquivalent - raced);
+ jSelf->set_suspend_equivalent();
}
- return jSelf->handle_special_suspend_equivalent_condition() ;
+ return jSelf->handle_special_suspend_equivalent_condition();
}
void ObjectMonitor::ExitEpilog (Thread * Self, ObjectWaiter * Wakee) {
- assert (_owner == Self, "invariant") ;
+ assert(_owner == Self, "invariant");
// Exit protocol:
// 1. ST _succ = wakee
@@ -1298,28 +1299,28 @@ void ObjectMonitor::ExitEpilog (Thread * Self, ObjectWaiter * Wakee) {
// 2. ST _owner = NULL
// 3. unpark(wakee)
- _succ = Knob_SuccEnabled ? Wakee->_thread : NULL ;
- ParkEvent * Trigger = Wakee->_event ;
+ _succ = Knob_SuccEnabled ? Wakee->_thread : NULL;
+ ParkEvent * Trigger = Wakee->_event;
// Hygiene -- once we've set _owner = NULL we can't safely dereference Wakee again.
// The thread associated with Wakee may have grabbed the lock and "Wakee" may be
// out-of-scope (non-extant).
- Wakee = NULL ;
+ Wakee = NULL;
// Drop the lock
- OrderAccess::release_store_ptr (&_owner, NULL) ;
- OrderAccess::fence() ; // ST _owner vs LD in unpark()
+ OrderAccess::release_store_ptr(&_owner, NULL);
+ OrderAccess::fence(); // ST _owner vs LD in unpark()
if (SafepointSynchronize::do_call_back()) {
- TEVENT (unpark before SAFEPOINT) ;
+ TEVENT(unpark before SAFEPOINT);
}
DTRACE_MONITOR_PROBE(contended__exit, this, object(), Self);
- Trigger->unpark() ;
+ Trigger->unpark();
// Maintain stats and report events to JVMTI
if (ObjectMonitor::_sync_Parks != NULL) {
- ObjectMonitor::_sync_Parks->inc() ;
+ ObjectMonitor::_sync_Parks->inc();
}
}
@@ -1343,17 +1344,17 @@ intptr_t ObjectMonitor::complete_exit(TRAPS) {
if (THREAD != _owner) {
if (THREAD->is_lock_owned ((address)_owner)) {
assert(_recursions == 0, "internal state error");
- _owner = THREAD ; /* Convert from basiclock addr to Thread addr */
- _recursions = 0 ;
- OwnerIsThread = 1 ;
+ _owner = THREAD; /* Convert from basiclock addr to Thread addr */
+ _recursions = 0;
+ OwnerIsThread = 1;
}
}
guarantee(Self == _owner, "complete_exit not owner");
intptr_t save = _recursions; // record the old recursion count
_recursions = 0; // set the recursion level to be 0
- exit (true, Self) ; // exit the monitor
- guarantee (_owner != Self, "invariant");
+ exit(true, Self); // exit the monitor
+ guarantee(_owner != Self, "invariant");
return save;
}
@@ -1365,8 +1366,8 @@ void ObjectMonitor::reenter(intptr_t recursions, TRAPS) {
JavaThread *jt = (JavaThread *)THREAD;
guarantee(_owner != Self, "reenter already owner");
- enter (THREAD); // enter the monitor
- guarantee (_recursions == 0, "reenter recursion");
+ enter(THREAD); // enter the monitor
+ guarantee(_recursions == 0, "reenter recursion");
_recursions = recursions;
return;
}
@@ -1382,11 +1383,11 @@ void ObjectMonitor::reenter(intptr_t recursions, TRAPS) {
do { \
if (THREAD != _owner) { \
if (THREAD->is_lock_owned((address) _owner)) { \
- _owner = THREAD ; /* Convert from basiclock addr to Thread addr */ \
+ _owner = THREAD; /* Convert from basiclock addr to Thread addr */ \
_recursions = 0; \
- OwnerIsThread = 1 ; \
+ OwnerIsThread = 1; \
} else { \
- TEVENT (Throw IMSX) ; \
+ TEVENT(Throw IMSX); \
THROW(vmSymbols::java_lang_IllegalMonitorStateException()); \
} \
} \
@@ -1396,15 +1397,15 @@ void ObjectMonitor::reenter(intptr_t recursions, TRAPS) {
// TODO-FIXME: remove check_slow() -- it's likely dead.
void ObjectMonitor::check_slow(TRAPS) {
- TEVENT (check_slow - throw IMSX) ;
+ TEVENT(check_slow - throw IMSX);
assert(THREAD != _owner && !THREAD->is_lock_owned((address) _owner), "must not be owner");
THROW_MSG(vmSymbols::java_lang_IllegalMonitorStateException(), "current thread not owner");
}
static int Adjust (volatile int * adr, int dx) {
- int v ;
- for (v = *adr ; Atomic::cmpxchg (v + dx, adr, v) != v; v = *adr) ;
- return v ;
+ int v;
+ for (v = *adr; Atomic::cmpxchg(v + dx, adr, v) != v; v = *adr);
+ return v;
}
// helper method for posting a monitor wait event
@@ -1426,11 +1427,11 @@ void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
// Note: a subset of changes to ObjectMonitor::wait()
// will need to be replicated in complete_exit above
void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
- Thread * const Self = THREAD ;
+ Thread * const Self = THREAD;
assert(Self->is_Java_thread(), "Must be Java thread!");
JavaThread *jt = (JavaThread *)THREAD;
- DeferredInitialize () ;
+ DeferredInitialize();
// Throw IMSX or IEX.
CHECK_OWNER();
@@ -1456,23 +1457,23 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
if (event.should_commit()) {
post_monitor_wait_event(&event, 0, millis, false);
}
- TEVENT (Wait - Throw IEX) ;
+ TEVENT(Wait - Throw IEX);
THROW(vmSymbols::java_lang_InterruptedException());
- return ;
+ return;
}
- TEVENT (Wait) ;
+ TEVENT(Wait);
- assert (Self->_Stalled == 0, "invariant") ;
- Self->_Stalled = intptr_t(this) ;
+ assert(Self->_Stalled == 0, "invariant");
+ Self->_Stalled = intptr_t(this);
jt->set_current_waiting_monitor(this);
// create a node to be put into the queue
// Critically, after we reset() the event but prior to park(), we must check
// for a pending interrupt.
ObjectWaiter node(Self);
- node.TState = ObjectWaiter::TS_WAIT ;
- Self->_ParkEvent->reset() ;
+ node.TState = ObjectWaiter::TS_WAIT;
+ Self->_ParkEvent->reset();
OrderAccess::fence(); // ST into Event; membar ; LD interrupted-flag
// Enter the waiting queue, which is a circular doubly linked list in this case
@@ -1482,18 +1483,18 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
// returns because of a timeout of interrupt. Contention is exceptionally rare
// so we use a simple spin-lock instead of a heavier-weight blocking lock.
- Thread::SpinAcquire (&_WaitSetLock, "WaitSet - add") ;
- AddWaiter (&node) ;
- Thread::SpinRelease (&_WaitSetLock) ;
+ Thread::SpinAcquire(&_WaitSetLock, "WaitSet - add");
+ AddWaiter(&node);
+ Thread::SpinRelease(&_WaitSetLock);
if ((SyncFlags & 4) == 0) {
- _Responsible = NULL ;
+ _Responsible = NULL;
}
intptr_t save = _recursions; // record the old recursion count
_waiters++; // increment the number of waiters
_recursions = 0; // set the recursion level to be 1
- exit (true, Self) ; // exit the monitor
- guarantee (_owner != Self, "invariant") ;
+ exit(true, Self); // exit the monitor
+ guarantee(_owner != Self, "invariant");
// The thread is on the WaitSet list - now park() it.
// On MP systems it's conceivable that a brief spin before we park
@@ -1502,8 +1503,8 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
// TODO-FIXME: change the following logic to a loop of the form
// while (!timeout && !interrupted && _notified == 0) park()
- int ret = OS_OK ;
- int WasNotified = 0 ;
+ int ret = OS_OK;
+ int WasNotified = 0;
{ // State transition wrappers
OSThread* osthread = Self->osthread();
OSThreadWaitState osts(osthread, true);
@@ -1517,9 +1518,9 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
} else
if (node._notified == 0) {
if (millis <= 0) {
- Self->_ParkEvent->park () ;
+ Self->_ParkEvent->park();
} else {
- ret = Self->_ParkEvent->park (millis) ;
+ ret = Self->_ParkEvent->park(millis);
}
}
@@ -1548,23 +1549,23 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
// That is, we fail toward safety.
if (node.TState == ObjectWaiter::TS_WAIT) {
- Thread::SpinAcquire (&_WaitSetLock, "WaitSet - unlink") ;
+ Thread::SpinAcquire(&_WaitSetLock, "WaitSet - unlink");
if (node.TState == ObjectWaiter::TS_WAIT) {
- DequeueSpecificWaiter (&node) ; // unlink from WaitSet
+ DequeueSpecificWaiter(&node); // unlink from WaitSet
assert(node._notified == 0, "invariant");
- node.TState = ObjectWaiter::TS_RUN ;
+ node.TState = ObjectWaiter::TS_RUN;
}
- Thread::SpinRelease (&_WaitSetLock) ;
+ Thread::SpinRelease(&_WaitSetLock);
}
// The thread is now either on off-list (TS_RUN),
// on the EntryList (TS_ENTER), or on the cxq (TS_CXQ).
// The Node's TState variable is stable from the perspective of this thread.
// No other threads will asynchronously modify TState.
- guarantee (node.TState != ObjectWaiter::TS_WAIT, "invariant") ;
- OrderAccess::loadload() ;
- if (_succ == Self) _succ = NULL ;
- WasNotified = node._notified ;
+ guarantee(node.TState != ObjectWaiter::TS_WAIT, "invariant");
+ OrderAccess::loadload();
+ if (_succ == Self) _succ = NULL;
+ WasNotified = node._notified;
// Reentry phase -- reacquire the monitor.
// re-enter contended monitor after object.wait().
@@ -1601,18 +1602,18 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
post_monitor_wait_event(&event, node._notifier_tid, millis, ret == OS_TIMEOUT);
}
- OrderAccess::fence() ;
+ OrderAccess::fence();
- assert (Self->_Stalled != 0, "invariant") ;
- Self->_Stalled = 0 ;
+ assert(Self->_Stalled != 0, "invariant");
+ Self->_Stalled = 0;
- assert (_owner != Self, "invariant") ;
- ObjectWaiter::TStates v = node.TState ;
+ assert(_owner != Self, "invariant");
+ ObjectWaiter::TStates v = node.TState;
if (v == ObjectWaiter::TS_RUN) {
- enter (Self) ;
+ enter(Self);
} else {
- guarantee (v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant") ;
- ReenterI (Self, &node) ;
+ guarantee(v == ObjectWaiter::TS_ENTER || v == ObjectWaiter::TS_CXQ, "invariant");
+ ReenterI(Self, &node);
node.wait_reenter_end(this);
}
@@ -1620,24 +1621,24 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
// Lifecycle - the node representing Self must not appear on any queues.
// Node is about to go out-of-scope, but even if it were immortal we wouldn't
// want residual elements associated with this thread left on any lists.
- guarantee (node.TState == ObjectWaiter::TS_RUN, "invariant") ;
- assert (_owner == Self, "invariant") ;
- assert (_succ != Self , "invariant") ;
+ guarantee(node.TState == ObjectWaiter::TS_RUN, "invariant");
+ assert(_owner == Self, "invariant");
+ assert(_succ != Self , "invariant");
} // OSThreadWaitState()
jt->set_current_waiting_monitor(NULL);
- guarantee (_recursions == 0, "invariant") ;
+ guarantee(_recursions == 0, "invariant");
_recursions = save; // restore the old recursion count
_waiters--; // decrement the number of waiters
// Verify a few postconditions
- assert (_owner == Self , "invariant") ;
- assert (_succ != Self , "invariant") ;
- assert (((oop)(object()))->mark() == markOopDesc::encode(this), "invariant") ;
+ assert(_owner == Self , "invariant");
+ assert(_succ != Self , "invariant");
+ assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
if (SyncFlags & 32) {
- OrderAccess::fence() ;
+ OrderAccess::fence();
}
// check if the notification happened
@@ -1645,7 +1646,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
// no, it could be timeout or Thread.interrupt() or both
// check for interrupt event, otherwise it is timeout
if (interruptible && Thread::is_interrupted(Self, true) && !HAS_PENDING_EXCEPTION) {
- TEVENT (Wait - throw IEX from epilog) ;
+ TEVENT(Wait - throw IEX from epilog);
THROW(vmSymbols::java_lang_InterruptedException());
}
}
@@ -1663,99 +1664,99 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
void ObjectMonitor::notify(TRAPS) {
CHECK_OWNER();
if (_WaitSet == NULL) {
- TEVENT (Empty-Notify) ;
- return ;
+ TEVENT(Empty-Notify);
+ return;
}
DTRACE_MONITOR_PROBE(notify, this, object(), THREAD);
- int Policy = Knob_MoveNotifyee ;
+ int Policy = Knob_MoveNotifyee;
- Thread::SpinAcquire (&_WaitSetLock, "WaitSet - notify") ;
- ObjectWaiter * iterator = DequeueWaiter() ;
+ Thread::SpinAcquire(&_WaitSetLock, "WaitSet - notify");
+ ObjectWaiter * iterator = DequeueWaiter();
if (iterator != NULL) {
- TEVENT (Notify1 - Transfer) ;
- guarantee (iterator->TState == ObjectWaiter::TS_WAIT, "invariant") ;
- guarantee (iterator->_notified == 0, "invariant") ;
+ TEVENT(Notify1 - Transfer);
+ guarantee(iterator->TState == ObjectWaiter::TS_WAIT, "invariant");
+ guarantee(iterator->_notified == 0, "invariant");
if (Policy != 4) {
- iterator->TState = ObjectWaiter::TS_ENTER ;
+ iterator->TState = ObjectWaiter::TS_ENTER;
}
- iterator->_notified = 1 ;
+ iterator->_notified = 1;
Thread * Self = THREAD;
iterator->_notifier_tid = Self->osthread()->thread_id();
- ObjectWaiter * List = _EntryList ;
+ ObjectWaiter * List = _EntryList;
if (List != NULL) {
- assert (List->_prev == NULL, "invariant") ;
- assert (List->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- assert (List != iterator, "invariant") ;
+ assert(List->_prev == NULL, "invariant");
+ assert(List->TState == ObjectWaiter::TS_ENTER, "invariant");
+ assert(List != iterator, "invariant");
}
if (Policy == 0) { // prepend to EntryList
if (List == NULL) {
- iterator->_next = iterator->_prev = NULL ;
- _EntryList = iterator ;
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
} else {
- List->_prev = iterator ;
- iterator->_next = List ;
- iterator->_prev = NULL ;
- _EntryList = iterator ;
+ List->_prev = iterator;
+ iterator->_next = List;
+ iterator->_prev = NULL;
+ _EntryList = iterator;
}
} else
if (Policy == 1) { // append to EntryList
if (List == NULL) {
- iterator->_next = iterator->_prev = NULL ;
- _EntryList = iterator ;
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
} else {
// CONSIDER: finding the tail currently requires a linear-time walk of
// the EntryList. We can make tail access constant-time by converting to
// a CDLL instead of using our current DLL.
- ObjectWaiter * Tail ;
- for (Tail = List ; Tail->_next != NULL ; Tail = Tail->_next) ;
- assert (Tail != NULL && Tail->_next == NULL, "invariant") ;
- Tail->_next = iterator ;
- iterator->_prev = Tail ;
- iterator->_next = NULL ;
+ ObjectWaiter * Tail;
+ for (Tail = List; Tail->_next != NULL; Tail = Tail->_next);
+ assert(Tail != NULL && Tail->_next == NULL, "invariant");
+ Tail->_next = iterator;
+ iterator->_prev = Tail;
+ iterator->_next = NULL;
}
} else
if (Policy == 2) { // prepend to cxq
// prepend to cxq
if (List == NULL) {
- iterator->_next = iterator->_prev = NULL ;
- _EntryList = iterator ;
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
} else {
- iterator->TState = ObjectWaiter::TS_CXQ ;
+ iterator->TState = ObjectWaiter::TS_CXQ;
for (;;) {
- ObjectWaiter * Front = _cxq ;
- iterator->_next = Front ;
+ ObjectWaiter * Front = _cxq;
+ iterator->_next = Front;
if (Atomic::cmpxchg_ptr (iterator, &_cxq, Front) == Front) {
- break ;
+ break;
}
}
}
} else
if (Policy == 3) { // append to cxq
- iterator->TState = ObjectWaiter::TS_CXQ ;
+ iterator->TState = ObjectWaiter::TS_CXQ;
for (;;) {
- ObjectWaiter * Tail ;
- Tail = _cxq ;
+ ObjectWaiter * Tail;
+ Tail = _cxq;
if (Tail == NULL) {
- iterator->_next = NULL ;
+ iterator->_next = NULL;
if (Atomic::cmpxchg_ptr (iterator, &_cxq, NULL) == NULL) {
- break ;
+ break;
}
} else {
- while (Tail->_next != NULL) Tail = Tail->_next ;
- Tail->_next = iterator ;
- iterator->_prev = Tail ;
- iterator->_next = NULL ;
- break ;
+ while (Tail->_next != NULL) Tail = Tail->_next;
+ Tail->_next = iterator;
+ iterator->_prev = Tail;
+ iterator->_next = NULL;
+ break;
}
}
} else {
- ParkEvent * ev = iterator->_event ;
- iterator->TState = ObjectWaiter::TS_RUN ;
- OrderAccess::fence() ;
- ev->unpark() ;
+ ParkEvent * ev = iterator->_event;
+ iterator->TState = ObjectWaiter::TS_RUN;
+ OrderAccess::fence();
+ ev->unpark();
}
if (Policy < 4) {
@@ -1771,10 +1772,10 @@ void ObjectMonitor::notify(TRAPS) {
// critical section.
}
- Thread::SpinRelease (&_WaitSetLock) ;
+ Thread::SpinRelease(&_WaitSetLock);
if (iterator != NULL && ObjectMonitor::_sync_Notifications != NULL) {
- ObjectMonitor::_sync_Notifications->inc() ;
+ ObjectMonitor::_sync_Notifications->inc();
}
}
@@ -1783,103 +1784,103 @@ void ObjectMonitor::notifyAll(TRAPS) {
CHECK_OWNER();
ObjectWaiter* iterator;
if (_WaitSet == NULL) {
- TEVENT (Empty-NotifyAll) ;
- return ;
+ TEVENT(Empty-NotifyAll);
+ return;
}
DTRACE_MONITOR_PROBE(notifyAll, this, object(), THREAD);
- int Policy = Knob_MoveNotifyee ;
- int Tally = 0 ;
- Thread::SpinAcquire (&_WaitSetLock, "WaitSet - notifyall") ;
+ int Policy = Knob_MoveNotifyee;
+ int Tally = 0;
+ Thread::SpinAcquire(&_WaitSetLock, "WaitSet - notifyall");
for (;;) {
- iterator = DequeueWaiter () ;
- if (iterator == NULL) break ;
- TEVENT (NotifyAll - Transfer1) ;
- ++Tally ;
+ iterator = DequeueWaiter();
+ if (iterator == NULL) break;
+ TEVENT(NotifyAll - Transfer1);
+ ++Tally;
// Disposition - what might we do with iterator ?
// a. add it directly to the EntryList - either tail or head.
// b. push it onto the front of the _cxq.
// For now we use (a).
- guarantee (iterator->TState == ObjectWaiter::TS_WAIT, "invariant") ;
- guarantee (iterator->_notified == 0, "invariant") ;
- iterator->_notified = 1 ;
+ guarantee(iterator->TState == ObjectWaiter::TS_WAIT, "invariant");
+ guarantee(iterator->_notified == 0, "invariant");
+ iterator->_notified = 1;
Thread * Self = THREAD;
iterator->_notifier_tid = Self->osthread()->thread_id();
if (Policy != 4) {
- iterator->TState = ObjectWaiter::TS_ENTER ;
+ iterator->TState = ObjectWaiter::TS_ENTER;
}
- ObjectWaiter * List = _EntryList ;
+ ObjectWaiter * List = _EntryList;
if (List != NULL) {
- assert (List->_prev == NULL, "invariant") ;
- assert (List->TState == ObjectWaiter::TS_ENTER, "invariant") ;
- assert (List != iterator, "invariant") ;
+ assert(List->_prev == NULL, "invariant");
+ assert(List->TState == ObjectWaiter::TS_ENTER, "invariant");
+ assert(List != iterator, "invariant");
}
if (Policy == 0) { // prepend to EntryList
if (List == NULL) {
- iterator->_next = iterator->_prev = NULL ;
- _EntryList = iterator ;
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
} else {
- List->_prev = iterator ;
- iterator->_next = List ;
- iterator->_prev = NULL ;
- _EntryList = iterator ;
+ List->_prev = iterator;
+ iterator->_next = List;
+ iterator->_prev = NULL;
+ _EntryList = iterator;
}
} else
if (Policy == 1) { // append to EntryList
if (List == NULL) {
- iterator->_next = iterator->_prev = NULL ;
- _EntryList = iterator ;
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
} else {
// CONSIDER: finding the tail currently requires a linear-time walk of
// the EntryList. We can make tail access constant-time by converting to
// a CDLL instead of using our current DLL.
- ObjectWaiter * Tail ;
- for (Tail = List ; Tail->_next != NULL ; Tail = Tail->_next) ;
- assert (Tail != NULL && Tail->_next == NULL, "invariant") ;
- Tail->_next = iterator ;
- iterator->_prev = Tail ;
- iterator->_next = NULL ;
+ ObjectWaiter * Tail;
+ for (Tail = List; Tail->_next != NULL; Tail = Tail->_next);
+ assert(Tail != NULL && Tail->_next == NULL, "invariant");
+ Tail->_next = iterator;
+ iterator->_prev = Tail;
+ iterator->_next = NULL;
}
} else
if (Policy == 2) { // prepend to cxq
// prepend to cxq
- iterator->TState = ObjectWaiter::TS_CXQ ;
+ iterator->TState = ObjectWaiter::TS_CXQ;
for (;;) {
- ObjectWaiter * Front = _cxq ;
- iterator->_next = Front ;
+ ObjectWaiter * Front = _cxq;
+ iterator->_next = Front;
if (Atomic::cmpxchg_ptr (iterator, &_cxq, Front) == Front) {
- break ;
+ break;
}
}
} else
if (Policy == 3) { // append to cxq
- iterator->TState = ObjectWaiter::TS_CXQ ;
+ iterator->TState = ObjectWaiter::TS_CXQ;
for (;;) {
- ObjectWaiter * Tail ;
- Tail = _cxq ;
+ ObjectWaiter * Tail;
+ Tail = _cxq;
if (Tail == NULL) {
- iterator->_next = NULL ;
+ iterator->_next = NULL;
if (Atomic::cmpxchg_ptr (iterator, &_cxq, NULL) == NULL) {
- break ;
+ break;
}
} else {
- while (Tail->_next != NULL) Tail = Tail->_next ;
- Tail->_next = iterator ;
- iterator->_prev = Tail ;
- iterator->_next = NULL ;
- break ;
+ while (Tail->_next != NULL) Tail = Tail->_next;
+ Tail->_next = iterator;
+ iterator->_prev = Tail;
+ iterator->_next = NULL;
+ break;
}
}
} else {
- ParkEvent * ev = iterator->_event ;
- iterator->TState = ObjectWaiter::TS_RUN ;
- OrderAccess::fence() ;
- ev->unpark() ;
+ ParkEvent * ev = iterator->_event;
+ iterator->TState = ObjectWaiter::TS_RUN;
+ OrderAccess::fence();
+ ev->unpark();
}
if (Policy < 4) {
@@ -1895,10 +1896,10 @@ void ObjectMonitor::notifyAll(TRAPS) {
// critical section.
}
- Thread::SpinRelease (&_WaitSetLock) ;
+ Thread::SpinRelease(&_WaitSetLock);
if (Tally != 0 && ObjectMonitor::_sync_Notifications != NULL) {
- ObjectMonitor::_sync_Notifications->inc(Tally) ;
+ ObjectMonitor::_sync_Notifications->inc(Tally);
}
}
@@ -1968,8 +1969,8 @@ void ObjectMonitor::notifyAll(TRAPS) {
// not spinning.
//
-intptr_t ObjectMonitor::SpinCallbackArgument = 0 ;
-int (*ObjectMonitor::SpinCallbackFunction)(intptr_t, int) = NULL ;
+intptr_t ObjectMonitor::SpinCallbackArgument = 0;
+int (*ObjectMonitor::SpinCallbackFunction)(intptr_t, int) = NULL;
// Spinning: Fixed frequency (100%), vary duration
@@ -1977,28 +1978,28 @@ int (*ObjectMonitor::SpinCallbackFunction)(intptr_t, int) = NULL ;
int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// Dumb, brutal spin. Good for comparative measurements against adaptive spinning.
- int ctr = Knob_FixedSpin ;
+ int ctr = Knob_FixedSpin;
if (ctr != 0) {
while (--ctr >= 0) {
- if (TryLock (Self) > 0) return 1 ;
- SpinPause () ;
+ if (TryLock(Self) > 0) return 1;
+ SpinPause();
}
- return 0 ;
+ return 0;
}
- for (ctr = Knob_PreSpin + 1; --ctr >= 0 ; ) {
+ for (ctr = Knob_PreSpin + 1; --ctr >= 0;) {
if (TryLock(Self) > 0) {
// Increase _SpinDuration ...
// Note that we don't clamp SpinDuration precisely at SpinLimit.
// Raising _SpurDuration to the poverty line is key.
- int x = _SpinDuration ;
+ int x = _SpinDuration;
if (x < Knob_SpinLimit) {
- if (x < Knob_Poverty) x = Knob_Poverty ;
- _SpinDuration = x + Knob_BonusB ;
+ if (x < Knob_Poverty) x = Knob_Poverty;
+ _SpinDuration = x + Knob_BonusB;
}
- return 1 ;
+ return 1;
}
- SpinPause () ;
+ SpinPause();
}
// Admission control - verify preconditions for spinning
@@ -2015,37 +2016,37 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// This takes us into the realm of 1-out-of-N spinning, where we
// hold the duration constant but vary the frequency.
- ctr = _SpinDuration ;
- if (ctr < Knob_SpinBase) ctr = Knob_SpinBase ;
- if (ctr <= 0) return 0 ;
+ ctr = _SpinDuration;
+ if (ctr < Knob_SpinBase) ctr = Knob_SpinBase;
+ if (ctr <= 0) return 0;
- if (Knob_SuccRestrict && _succ != NULL) return 0 ;
+ if (Knob_SuccRestrict && _succ != NULL) return 0;
if (Knob_OState && NotRunnable (Self, (Thread *) _owner)) {
- TEVENT (Spin abort - notrunnable [TOP]);
- return 0 ;
+ TEVENT(Spin abort - notrunnable [TOP]);
+ return 0;
}
- int MaxSpin = Knob_MaxSpinners ;
+ int MaxSpin = Knob_MaxSpinners;
if (MaxSpin >= 0) {
if (_Spinner > MaxSpin) {
- TEVENT (Spin abort -- too many spinners) ;
- return 0 ;
+ TEVENT(Spin abort -- too many spinners);
+ return 0;
}
// Slightly racy, but benign ...
- Adjust (&_Spinner, 1) ;
+ Adjust(&_Spinner, 1);
}
// We're good to spin ... spin ingress.
// CONSIDER: use Prefetch::write() to avoid RTS->RTO upgrades
// when preparing to LD...CAS _owner, etc and the CAS is likely
// to succeed.
- int hits = 0 ;
- int msk = 0 ;
- int caspty = Knob_CASPenalty ;
- int oxpty = Knob_OXPenalty ;
- int sss = Knob_SpinSetSucc ;
- if (sss && _succ == NULL ) _succ = Self ;
- Thread * prv = NULL ;
+ int hits = 0;
+ int msk = 0;
+ int caspty = Knob_CASPenalty;
+ int oxpty = Knob_OXPenalty;
+ int sss = Knob_SpinSetSucc;
+ if (sss && _succ == NULL) _succ = Self;
+ Thread * prv = NULL;
// There are three ways to exit the following loop:
// 1. A successful spin where this thread has acquired the lock.
@@ -2065,18 +2066,18 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// We periodically check to see if there's a safepoint pending.
if ((ctr & 0xFF) == 0) {
if (SafepointSynchronize::do_call_back()) {
- TEVENT (Spin: safepoint) ;
- goto Abort ; // abrupt spin egress
+ TEVENT(Spin: safepoint);
+ goto Abort; // abrupt spin egress
}
- if (Knob_UsePause & 1) SpinPause () ;
+ if (Knob_UsePause & 1) SpinPause();
- int (*scb)(intptr_t,int) = SpinCallbackFunction ;
+ int (*scb)(intptr_t,int) = SpinCallbackFunction;
if (hits > 50 && scb != NULL) {
- int abend = (*scb)(SpinCallbackArgument, 0) ;
+ int abend = (*scb)(SpinCallbackArgument, 0);
}
}
- if (Knob_UsePause & 2) SpinPause() ;
+ if (Knob_UsePause & 2) SpinPause();
// Exponential back-off ... Stay off the bus to reduce coherency traffic.
// This is useful on classic SMP systems, but is of less utility on
@@ -2093,12 +2094,12 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// coherency bandwidth. Relatedly, if we _oversample _owner we
// can inadvertently interfere with the the ST m->owner=null.
// executed by the lock owner.
- if (ctr & msk) continue ;
- ++hits ;
+ if (ctr & msk) continue;
+ ++hits;
if ((hits & 0xF) == 0) {
// The 0xF, above, corresponds to the exponent.
// Consider: (msk+1)|msk
- msk = ((msk << 2)|3) & BackOffMask ;
+ msk = ((msk << 2)|3) & BackOffMask;
}
// Probe _owner with TATAS
@@ -2111,16 +2112,16 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// the spin without prejudice or apply a "penalty" to the
// spin count-down variable "ctr", reducing it by 100, say.
- Thread * ox = (Thread *) _owner ;
+ Thread * ox = (Thread *) _owner;
if (ox == NULL) {
- ox = (Thread *) Atomic::cmpxchg_ptr (Self, &_owner, NULL) ;
+ ox = (Thread *) Atomic::cmpxchg_ptr(Self, &_owner, NULL);
if (ox == NULL) {
// The CAS succeeded -- this thread acquired ownership
// Take care of some bookkeeping to exit spin state.
if (sss && _succ == Self) {
- _succ = NULL ;
+ _succ = NULL;
}
- if (MaxSpin > 0) Adjust (&_Spinner, -1) ;
+ if (MaxSpin > 0) Adjust(&_Spinner, -1);
// Increase _SpinDuration :
// The spin was successful (profitable) so we tend toward
@@ -2129,12 +2130,12 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// If we acquired the lock early in the spin cycle it
// makes sense to increase _SpinDuration proportionally.
// Note that we don't clamp SpinDuration precisely at SpinLimit.
- int x = _SpinDuration ;
+ int x = _SpinDuration;
if (x < Knob_SpinLimit) {
- if (x < Knob_Poverty) x = Knob_Poverty ;
- _SpinDuration = x + Knob_Bonus ;
+ if (x < Knob_Poverty) x = Knob_Poverty;
+ _SpinDuration = x + Knob_Bonus;
}
- return 1 ;
+ return 1;
}
// The CAS failed ... we can take any of the following actions:
@@ -2142,61 +2143,61 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
// * exit spin with prejudice -- goto Abort;
// * exit spin without prejudice.
// * Since CAS is high-latency, retry again immediately.
- prv = ox ;
- TEVENT (Spin: cas failed) ;
- if (caspty == -2) break ;
- if (caspty == -1) goto Abort ;
- ctr -= caspty ;
- continue ;
+ prv = ox;
+ TEVENT(Spin: cas failed);
+ if (caspty == -2) break;
+ if (caspty == -1) goto Abort;
+ ctr -= caspty;
+ continue;
}
// Did lock ownership change hands ?
- if (ox != prv && prv != NULL ) {
- TEVENT (spin: Owner changed)
- if (oxpty == -2) break ;
- if (oxpty == -1) goto Abort ;
- ctr -= oxpty ;
+ if (ox != prv && prv != NULL) {
+ TEVENT(spin: Owner changed)
+ if (oxpty == -2) break;
+ if (oxpty == -1) goto Abort;
+ ctr -= oxpty;
}
- prv = ox ;
+ prv = ox;
// Abort the spin if the owner is not executing.
// The owner must be executing in order to drop the lock.
// Spinning while the owner is OFFPROC is idiocy.
// Consider: ctr -= RunnablePenalty ;
if (Knob_OState && NotRunnable (Self, ox)) {
- TEVENT (Spin abort - notrunnable);
- goto Abort ;
+ TEVENT(Spin abort - notrunnable);
+ goto Abort;
}
- if (sss && _succ == NULL ) _succ = Self ;
+ if (sss && _succ == NULL) _succ = Self;
}
// Spin failed with prejudice -- reduce _SpinDuration.
// TODO: Use an AIMD-like policy to adjust _SpinDuration.
// AIMD is globally stable.
- TEVENT (Spin failure) ;
+ TEVENT(Spin failure);
{
- int x = _SpinDuration ;
+ int x = _SpinDuration;
if (x > 0) {
// Consider an AIMD scheme like: x -= (x >> 3) + 100
// This is globally sample and tends to damp the response.
- x -= Knob_Penalty ;
- if (x < 0) x = 0 ;
- _SpinDuration = x ;
+ x -= Knob_Penalty;
+ if (x < 0) x = 0;
+ _SpinDuration = x;
}
}
Abort:
- if (MaxSpin >= 0) Adjust (&_Spinner, -1) ;
+ if (MaxSpin >= 0) Adjust(&_Spinner, -1);
if (sss && _succ == Self) {
- _succ = NULL ;
+ _succ = NULL;
// Invariant: after setting succ=null a contending thread
// must recheck-retry _owner before parking. This usually happens
// in the normal usage of TrySpin(), but it's safest
// to make TrySpin() as foolproof as possible.
- OrderAccess::fence() ;
- if (TryLock(Self) > 0) return 1 ;
+ OrderAccess::fence();
+ if (TryLock(Self) > 0) return 1;
}
- return 0 ;
+ return 0;
}
// NotRunnable() -- informed spinning
@@ -2240,9 +2241,9 @@ int ObjectMonitor::TrySpin_VaryDuration (Thread * Self) {
int ObjectMonitor::NotRunnable (Thread * Self, Thread * ox) {
// Check either OwnerIsThread or ox->TypeTag == 2BAD.
- if (!OwnerIsThread) return 0 ;
+ if (!OwnerIsThread) return 0;
- if (ox == NULL) return 0 ;
+ if (ox == NULL) return 0;
// Avoid transitive spinning ...
// Say T1 spins or blocks trying to acquire L. T1._Stalled is set to L.
@@ -2251,17 +2252,17 @@ int ObjectMonitor::NotRunnable (Thread * Self, Thread * ox) {
// This occurs transiently after T1 acquired L but before
// T1 managed to clear T1.Stalled. T2 does not need to abort
// its spin in this circumstance.
- intptr_t BlockedOn = SafeFetchN ((intptr_t *) &ox->_Stalled, intptr_t(1)) ;
+ intptr_t BlockedOn = SafeFetchN((intptr_t *) &ox->_Stalled, intptr_t(1));
- if (BlockedOn == 1) return 1 ;
+ if (BlockedOn == 1) return 1;
if (BlockedOn != 0) {
- return BlockedOn != intptr_t(this) && _owner == ox ;
+ return BlockedOn != intptr_t(this) && _owner == ox;
}
- assert (sizeof(((JavaThread *)ox)->_thread_state == sizeof(int)), "invariant") ;
- int jst = SafeFetch32 ((int *) &((JavaThread *) ox)->_thread_state, -1) ; ;
+ assert(sizeof(((JavaThread *)ox)->_thread_state == sizeof(int)), "invariant");
+ int jst = SafeFetch32((int *) &((JavaThread *) ox)->_thread_state, -1);;
// consider also: jst != _thread_in_Java -- but that's overspecific.
- return jst == _thread_blocked || jst == _thread_in_native ;
+ return jst == _thread_blocked || jst == _thread_in_native;
}
@@ -2272,11 +2273,11 @@ ObjectWaiter::ObjectWaiter(Thread* thread) {
_next = NULL;
_prev = NULL;
_notified = 0;
- TState = TS_RUN ;
+ TState = TS_RUN;
_thread = thread;
- _event = thread->_ParkEvent ;
+ _event = thread->_ParkEvent;
_active = false;
- assert (_event != NULL, "invariant") ;
+ assert(_event != NULL, "invariant");
}
void ObjectWaiter::wait_reenter_begin(ObjectMonitor *mon) {
@@ -2299,7 +2300,7 @@ inline void ObjectMonitor::AddWaiter(ObjectWaiter* node) {
node->_prev = node;
node->_next = node;
} else {
- ObjectWaiter* head = _WaitSet ;
+ ObjectWaiter* head = _WaitSet;
ObjectWaiter* tail = head->_prev;
assert(tail->_next == head, "invariant check");
tail->_next = node;
@@ -2345,56 +2346,56 @@ inline void ObjectMonitor::DequeueSpecificWaiter(ObjectWaiter* node) {
// -----------------------------------------------------------------------------
// PerfData support
-PerfCounter * ObjectMonitor::_sync_ContendedLockAttempts = NULL ;
-PerfCounter * ObjectMonitor::_sync_FutileWakeups = NULL ;
-PerfCounter * ObjectMonitor::_sync_Parks = NULL ;
-PerfCounter * ObjectMonitor::_sync_EmptyNotifications = NULL ;
-PerfCounter * ObjectMonitor::_sync_Notifications = NULL ;
-PerfCounter * ObjectMonitor::_sync_PrivateA = NULL ;
-PerfCounter * ObjectMonitor::_sync_PrivateB = NULL ;
-PerfCounter * ObjectMonitor::_sync_SlowExit = NULL ;
-PerfCounter * ObjectMonitor::_sync_SlowEnter = NULL ;
-PerfCounter * ObjectMonitor::_sync_SlowNotify = NULL ;
-PerfCounter * ObjectMonitor::_sync_SlowNotifyAll = NULL ;
-PerfCounter * ObjectMonitor::_sync_FailedSpins = NULL ;
-PerfCounter * ObjectMonitor::_sync_SuccessfulSpins = NULL ;
-PerfCounter * ObjectMonitor::_sync_MonInCirculation = NULL ;
-PerfCounter * ObjectMonitor::_sync_MonScavenged = NULL ;
-PerfCounter * ObjectMonitor::_sync_Inflations = NULL ;
-PerfCounter * ObjectMonitor::_sync_Deflations = NULL ;
-PerfLongVariable * ObjectMonitor::_sync_MonExtant = NULL ;
+PerfCounter * ObjectMonitor::_sync_ContendedLockAttempts = NULL;
+PerfCounter * ObjectMonitor::_sync_FutileWakeups = NULL;
+PerfCounter * ObjectMonitor::_sync_Parks = NULL;
+PerfCounter * ObjectMonitor::_sync_EmptyNotifications = NULL;
+PerfCounter * ObjectMonitor::_sync_Notifications = NULL;
+PerfCounter * ObjectMonitor::_sync_PrivateA = NULL;
+PerfCounter * ObjectMonitor::_sync_PrivateB = NULL;
+PerfCounter * ObjectMonitor::_sync_SlowExit = NULL;
+PerfCounter * ObjectMonitor::_sync_SlowEnter = NULL;
+PerfCounter * ObjectMonitor::_sync_SlowNotify = NULL;
+PerfCounter * ObjectMonitor::_sync_SlowNotifyAll = NULL;
+PerfCounter * ObjectMonitor::_sync_FailedSpins = NULL;
+PerfCounter * ObjectMonitor::_sync_SuccessfulSpins = NULL;
+PerfCounter * ObjectMonitor::_sync_MonInCirculation = NULL;
+PerfCounter * ObjectMonitor::_sync_MonScavenged = NULL;
+PerfCounter * ObjectMonitor::_sync_Inflations = NULL;
+PerfCounter * ObjectMonitor::_sync_Deflations = NULL;
+PerfLongVariable * ObjectMonitor::_sync_MonExtant = NULL;
// One-shot global initialization for the sync subsystem.
// We could also defer initialization and initialize on-demand
// the first time we call inflate(). Initialization would
// be protected - like so many things - by the MonitorCache_lock.
-void ObjectMonitor::Initialize () {
- static int InitializationCompleted = 0 ;
- assert (InitializationCompleted == 0, "invariant") ;
- InitializationCompleted = 1 ;
+void ObjectMonitor::Initialize() {
+ static int InitializationCompleted = 0;
+ assert(InitializationCompleted == 0, "invariant");
+ InitializationCompleted = 1;
if (UsePerfData) {
- EXCEPTION_MARK ;
+ EXCEPTION_MARK;
#define NEWPERFCOUNTER(n) {n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events,CHECK); }
#define NEWPERFVARIABLE(n) {n = PerfDataManager::create_variable(SUN_RT, #n, PerfData::U_Events,CHECK); }
- NEWPERFCOUNTER(_sync_Inflations) ;
- NEWPERFCOUNTER(_sync_Deflations) ;
- NEWPERFCOUNTER(_sync_ContendedLockAttempts) ;
- NEWPERFCOUNTER(_sync_FutileWakeups) ;
- NEWPERFCOUNTER(_sync_Parks) ;
- NEWPERFCOUNTER(_sync_EmptyNotifications) ;
- NEWPERFCOUNTER(_sync_Notifications) ;
- NEWPERFCOUNTER(_sync_SlowEnter) ;
- NEWPERFCOUNTER(_sync_SlowExit) ;
- NEWPERFCOUNTER(_sync_SlowNotify) ;
- NEWPERFCOUNTER(_sync_SlowNotifyAll) ;
- NEWPERFCOUNTER(_sync_FailedSpins) ;
- NEWPERFCOUNTER(_sync_SuccessfulSpins) ;
- NEWPERFCOUNTER(_sync_PrivateA) ;
- NEWPERFCOUNTER(_sync_PrivateB) ;
- NEWPERFCOUNTER(_sync_MonInCirculation) ;
- NEWPERFCOUNTER(_sync_MonScavenged) ;
- NEWPERFVARIABLE(_sync_MonExtant) ;
+ NEWPERFCOUNTER(_sync_Inflations);
+ NEWPERFCOUNTER(_sync_Deflations);
+ NEWPERFCOUNTER(_sync_ContendedLockAttempts);
+ NEWPERFCOUNTER(_sync_FutileWakeups);
+ NEWPERFCOUNTER(_sync_Parks);
+ NEWPERFCOUNTER(_sync_EmptyNotifications);
+ NEWPERFCOUNTER(_sync_Notifications);
+ NEWPERFCOUNTER(_sync_SlowEnter);
+ NEWPERFCOUNTER(_sync_SlowExit);
+ NEWPERFCOUNTER(_sync_SlowNotify);
+ NEWPERFCOUNTER(_sync_SlowNotifyAll);
+ NEWPERFCOUNTER(_sync_FailedSpins);
+ NEWPERFCOUNTER(_sync_SuccessfulSpins);
+ NEWPERFCOUNTER(_sync_PrivateA);
+ NEWPERFCOUNTER(_sync_PrivateB);
+ NEWPERFCOUNTER(_sync_MonInCirculation);
+ NEWPERFCOUNTER(_sync_MonScavenged);
+ NEWPERFVARIABLE(_sync_MonExtant);
#undef NEWPERFCOUNTER
}
}
@@ -2414,33 +2415,33 @@ void ObjectMonitor::ctAsserts() {
static char * kvGet (char * kvList, const char * Key) {
- if (kvList == NULL) return NULL ;
- size_t n = strlen (Key) ;
- char * Search ;
- for (Search = kvList ; *Search ; Search += strlen(Search) + 1) {
+ if (kvList == NULL) return NULL;
+ size_t n = strlen(Key);
+ char * Search;
+ for (Search = kvList; *Search; Search += strlen(Search) + 1) {
if (strncmp (Search, Key, n) == 0) {
- if (Search[n] == '=') return Search + n + 1 ;
- if (Search[n] == 0) return (char *) "1" ;
+ if (Search[n] == '=') return Search + n + 1;
+ if (Search[n] == 0) return(char *) "1";
}
}
- return NULL ;
+ return NULL;
}
static int kvGetInt (char * kvList, const char * Key, int Default) {
- char * v = kvGet (kvList, Key) ;
- int rslt = v ? ::strtol (v, NULL, 0) : Default ;
+ char * v = kvGet(kvList, Key);
+ int rslt = v ? ::strtol(v, NULL, 0) : Default;
if (Knob_ReportSettings && v != NULL) {
::printf (" SyncKnob: %s %d(%d)\n", Key, rslt, Default) ;
- ::fflush (stdout) ;
+ ::fflush(stdout);
}
- return rslt ;
+ return rslt;
}
-void ObjectMonitor::DeferredInitialize () {
- if (InitDone > 0) return ;
+void ObjectMonitor::DeferredInitialize() {
+ if (InitDone > 0) return;
if (Atomic::cmpxchg (-1, &InitDone, 0) != 0) {
- while (InitDone != 1) ;
- return ;
+ while (InitDone != 1);
+ return;
}
// One-shot global initialization ...
@@ -2449,68 +2450,68 @@ void ObjectMonitor::DeferredInitialize () {
// SyncKnobs consist of = pairs in the style
// of environment variables. Start by converting ':' to NUL.
- if (SyncKnobs == NULL) SyncKnobs = "" ;
+ if (SyncKnobs == NULL) SyncKnobs = "";
- size_t sz = strlen (SyncKnobs) ;
- char * knobs = (char *) malloc (sz + 2) ;
+ size_t sz = strlen(SyncKnobs);
+ char * knobs = (char *) malloc(sz + 2);
if (knobs == NULL) {
- vm_exit_out_of_memory (sz + 2, OOM_MALLOC_ERROR, "Parse SyncKnobs") ;
- guarantee (0, "invariant") ;
+ vm_exit_out_of_memory(sz + 2, OOM_MALLOC_ERROR, "Parse SyncKnobs");
+ guarantee(0, "invariant");
}
- strcpy (knobs, SyncKnobs) ;
- knobs[sz+1] = 0 ;
- for (char * p = knobs ; *p ; p++) {
- if (*p == ':') *p = 0 ;
+ strcpy(knobs, SyncKnobs);
+ knobs[sz+1] = 0;
+ for (char * p = knobs; *p; p++) {
+ if (*p == ':') *p = 0;
}
#define SETKNOB(x) { Knob_##x = kvGetInt (knobs, #x, Knob_##x); }
- SETKNOB(ReportSettings) ;
- SETKNOB(Verbose) ;
- SETKNOB(FixedSpin) ;
- SETKNOB(SpinLimit) ;
- SETKNOB(SpinBase) ;
+ SETKNOB(ReportSettings);
+ SETKNOB(Verbose);
+ SETKNOB(FixedSpin);
+ SETKNOB(SpinLimit);
+ SETKNOB(SpinBase);
SETKNOB(SpinBackOff);
- SETKNOB(CASPenalty) ;
- SETKNOB(OXPenalty) ;
- SETKNOB(LogSpins) ;
- SETKNOB(SpinSetSucc) ;
- SETKNOB(SuccEnabled) ;
- SETKNOB(SuccRestrict) ;
- SETKNOB(Penalty) ;
- SETKNOB(Bonus) ;
- SETKNOB(BonusB) ;
- SETKNOB(Poverty) ;
- SETKNOB(SpinAfterFutile) ;
- SETKNOB(UsePause) ;
- SETKNOB(SpinEarly) ;
- SETKNOB(OState) ;
- SETKNOB(MaxSpinners) ;
- SETKNOB(PreSpin) ;
- SETKNOB(ExitPolicy) ;
+ SETKNOB(CASPenalty);
+ SETKNOB(OXPenalty);
+ SETKNOB(LogSpins);
+ SETKNOB(SpinSetSucc);
+ SETKNOB(SuccEnabled);
+ SETKNOB(SuccRestrict);
+ SETKNOB(Penalty);
+ SETKNOB(Bonus);
+ SETKNOB(BonusB);
+ SETKNOB(Poverty);
+ SETKNOB(SpinAfterFutile);
+ SETKNOB(UsePause);
+ SETKNOB(SpinEarly);
+ SETKNOB(OState);
+ SETKNOB(MaxSpinners);
+ SETKNOB(PreSpin);
+ SETKNOB(ExitPolicy);
SETKNOB(QMode);
- SETKNOB(ResetEvent) ;
- SETKNOB(MoveNotifyee) ;
- SETKNOB(FastHSSEC) ;
+ SETKNOB(ResetEvent);
+ SETKNOB(MoveNotifyee);
+ SETKNOB(FastHSSEC);
#undef SETKNOB
if (os::is_MP()) {
- BackOffMask = (1 << Knob_SpinBackOff) - 1 ;
- if (Knob_ReportSettings) ::printf ("BackOffMask=%X\n", BackOffMask) ;
+ BackOffMask = (1 << Knob_SpinBackOff) - 1;
+ if (Knob_ReportSettings) ::printf("BackOffMask=%X\n", BackOffMask);
// CONSIDER: BackOffMask = ROUNDUP_NEXT_POWER2 (ncpus-1)
} else {
- Knob_SpinLimit = 0 ;
- Knob_SpinBase = 0 ;
- Knob_PreSpin = 0 ;
- Knob_FixedSpin = -1 ;
+ Knob_SpinLimit = 0;
+ Knob_SpinBase = 0;
+ Knob_PreSpin = 0;
+ Knob_FixedSpin = -1;
}
if (Knob_LogSpins == 0) {
- ObjectMonitor::_sync_FailedSpins = NULL ;
+ ObjectMonitor::_sync_FailedSpins = NULL;
}
- free (knobs) ;
- OrderAccess::fence() ;
- InitDone = 1 ;
+ free(knobs);
+ OrderAccess::fence();
+ InitDone = 1;
}
#ifndef PRODUCT
diff --git a/hotspot/src/share/vm/runtime/objectMonitor.hpp b/hotspot/src/share/vm/runtime/objectMonitor.hpp
index 5a2756826cb..9feaf7b8a90 100644
--- a/hotspot/src/share/vm/runtime/objectMonitor.hpp
+++ b/hotspot/src/share/vm/runtime/objectMonitor.hpp
@@ -37,17 +37,17 @@
class ObjectWaiter : public StackObj {
public:
- enum TStates { TS_UNDEF, TS_READY, TS_RUN, TS_WAIT, TS_ENTER, TS_CXQ } ;
- enum Sorted { PREPEND, APPEND, SORTED } ;
+ enum TStates { TS_UNDEF, TS_READY, TS_RUN, TS_WAIT, TS_ENTER, TS_CXQ };
+ enum Sorted { PREPEND, APPEND, SORTED };
ObjectWaiter * volatile _next;
ObjectWaiter * volatile _prev;
Thread* _thread;
jlong _notifier_tid;
ParkEvent * _event;
- volatile int _notified ;
- volatile TStates TState ;
- Sorted _Sorted ; // List placement disposition
- bool _active ; // Contention monitoring is enabled
+ volatile int _notified;
+ volatile TStates TState;
+ Sorted _Sorted; // List placement disposition
+ bool _active; // Contention monitoring is enabled
public:
ObjectWaiter(Thread* thread);
@@ -92,19 +92,19 @@ class ObjectMonitor {
static int owner_offset_in_bytes() { return offset_of(ObjectMonitor, _owner); }
static int count_offset_in_bytes() { return offset_of(ObjectMonitor, _count); }
static int recursions_offset_in_bytes() { return offset_of(ObjectMonitor, _recursions); }
- static int cxq_offset_in_bytes() { return offset_of(ObjectMonitor, _cxq) ; }
- static int succ_offset_in_bytes() { return offset_of(ObjectMonitor, _succ) ; }
+ static int cxq_offset_in_bytes() { return offset_of(ObjectMonitor, _cxq); }
+ static int succ_offset_in_bytes() { return offset_of(ObjectMonitor, _succ); }
static int EntryList_offset_in_bytes() { return offset_of(ObjectMonitor, _EntryList); }
static int FreeNext_offset_in_bytes() { return offset_of(ObjectMonitor, FreeNext); }
- static int WaitSet_offset_in_bytes() { return offset_of(ObjectMonitor, _WaitSet) ; }
- static int Responsible_offset_in_bytes() { return offset_of(ObjectMonitor, _Responsible);}
+ static int WaitSet_offset_in_bytes() { return offset_of(ObjectMonitor, _WaitSet); }
+ static int Responsible_offset_in_bytes() { return offset_of(ObjectMonitor, _Responsible); }
static int Spinner_offset_in_bytes() { return offset_of(ObjectMonitor, _Spinner); }
public:
// Eventually we'll make provisions for multiple callbacks, but
// now one will suffice.
- static int (*SpinCallbackFunction)(intptr_t, int) ;
- static intptr_t SpinCallbackArgument ;
+ static int (*SpinCallbackFunction)(intptr_t, int);
+ static intptr_t SpinCallbackArgument;
public:
@@ -115,7 +115,7 @@ class ObjectMonitor {
// TODO-FIXME: merge _count and _waiters.
// TODO-FIXME: assert _owner == null implies _recursions = 0
// TODO-FIXME: assert _WaitSet != null implies _count > 0
- return _count|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList ) ;
+ return _count|_waiters|intptr_t(_owner)|intptr_t(_cxq)|intptr_t(_EntryList);
}
intptr_t is_entered(Thread* current) const;
@@ -127,7 +127,7 @@ class ObjectMonitor {
intptr_t count() const;
void set_count(intptr_t count);
- intptr_t contentions() const ;
+ intptr_t contentions() const;
intptr_t recursions() const { return _recursions; }
// JVM/DI GetMonitorInfo() needs this
@@ -145,15 +145,15 @@ class ObjectMonitor {
_object = NULL;
_owner = NULL;
_WaitSet = NULL;
- _WaitSetLock = 0 ;
- _Responsible = NULL ;
- _succ = NULL ;
- _cxq = NULL ;
- FreeNext = NULL ;
- _EntryList = NULL ;
- _SpinFreq = 0 ;
- _SpinClock = 0 ;
- OwnerIsThread = 0 ;
+ _WaitSetLock = 0;
+ _Responsible = NULL;
+ _succ = NULL;
+ _cxq = NULL;
+ FreeNext = NULL;
+ _EntryList = NULL;
+ _SpinFreq = 0;
+ _SpinClock = 0;
+ OwnerIsThread = 0;
_previous_owner_tid = 0;
}
@@ -164,20 +164,20 @@ class ObjectMonitor {
}
private:
- void Recycle () {
+ void Recycle() {
// TODO: add stronger asserts ...
// _cxq == 0 _succ == NULL _owner == NULL _waiters == 0
// _count == 0 EntryList == NULL
// _recursions == 0 _WaitSet == NULL
// TODO: assert (is_busy()|_recursions) == 0
- _succ = NULL ;
- _EntryList = NULL ;
- _cxq = NULL ;
- _WaitSet = NULL ;
- _recursions = 0 ;
- _SpinFreq = 0 ;
- _SpinClock = 0 ;
- OwnerIsThread = 0 ;
+ _succ = NULL;
+ _EntryList = NULL;
+ _cxq = NULL;
+ _WaitSet = NULL;
+ _recursions = 0;
+ _SpinFreq = 0;
+ _SpinClock = 0;
+ OwnerIsThread = 0;
}
public:
@@ -194,7 +194,7 @@ public:
void print();
#endif
- bool try_enter (TRAPS) ;
+ bool try_enter(TRAPS);
void enter(TRAPS);
void exit(bool not_suspended, TRAPS);
void wait(jlong millis, bool interruptable, TRAPS);
@@ -206,22 +206,22 @@ public:
void reenter(intptr_t recursions, TRAPS);
private:
- void AddWaiter (ObjectWaiter * waiter) ;
+ void AddWaiter(ObjectWaiter * waiter);
static void DeferredInitialize();
- ObjectWaiter * DequeueWaiter () ;
- void DequeueSpecificWaiter (ObjectWaiter * waiter) ;
- void EnterI (TRAPS) ;
- void ReenterI (Thread * Self, ObjectWaiter * SelfNode) ;
- void UnlinkAfterAcquire (Thread * Self, ObjectWaiter * SelfNode) ;
- int TryLock (Thread * Self) ;
- int NotRunnable (Thread * Self, Thread * Owner) ;
- int TrySpin_Fixed (Thread * Self) ;
- int TrySpin_VaryFrequency (Thread * Self) ;
- int TrySpin_VaryDuration (Thread * Self) ;
- void ctAsserts () ;
- void ExitEpilog (Thread * Self, ObjectWaiter * Wakee) ;
- bool ExitSuspendEquivalent (JavaThread * Self) ;
+ ObjectWaiter * DequeueWaiter();
+ void DequeueSpecificWaiter(ObjectWaiter * waiter);
+ void EnterI(TRAPS);
+ void ReenterI(Thread * Self, ObjectWaiter * SelfNode);
+ void UnlinkAfterAcquire(Thread * Self, ObjectWaiter * SelfNode);
+ int TryLock(Thread * Self);
+ int NotRunnable(Thread * Self, Thread * Owner);
+ int TrySpin_Fixed(Thread * Self);
+ int TrySpin_VaryFrequency(Thread * Self);
+ int TrySpin_VaryDuration(Thread * Self);
+ void ctAsserts();
+ void ExitEpilog(Thread * Self, ObjectWaiter * Wakee);
+ bool ExitSuspendEquivalent(JavaThread * Self);
void post_monitor_wait_event(EventJavaMonitorWait * event,
jlong notifier_tid,
jlong timeout,
@@ -240,7 +240,7 @@ public:
volatile markOop _header; // displaced object header word - mark
void* volatile _object; // backward object pointer - strong root
- double SharingPad [1] ; // temp to reduce false sharing
+ double SharingPad[1]; // temp to reduce false sharing
// All the following fields must be machine word aligned
// The VM assumes write ordering wrt these fields, which can be
@@ -251,22 +251,22 @@ public:
volatile jlong _previous_owner_tid; // thread id of the previous owner of the monitor
volatile intptr_t _recursions; // recursion count, 0 for first entry
private:
- int OwnerIsThread ; // _owner is (Thread *) vs SP/BasicLock
- ObjectWaiter * volatile _cxq ; // LL of recently-arrived threads blocked on entry.
+ int OwnerIsThread; // _owner is (Thread *) vs SP/BasicLock
+ ObjectWaiter * volatile _cxq; // LL of recently-arrived threads blocked on entry.
// The list is actually composed of WaitNodes, acting
// as proxies for Threads.
protected:
- ObjectWaiter * volatile _EntryList ; // Threads blocked on entry or reentry.
+ ObjectWaiter * volatile _EntryList; // Threads blocked on entry or reentry.
private:
- Thread * volatile _succ ; // Heir presumptive thread - used for futile wakeup throttling
- Thread * volatile _Responsible ;
- int _PromptDrain ; // rqst to drain cxq into EntryList ASAP
+ Thread * volatile _succ; // Heir presumptive thread - used for futile wakeup throttling
+ Thread * volatile _Responsible;
+ int _PromptDrain; // rqst to drain cxq into EntryList ASAP
- volatile int _Spinner ; // for exit->spinner handoff optimization
- volatile int _SpinFreq ; // Spin 1-out-of-N attempts: success rate
- volatile int _SpinClock ;
- volatile int _SpinDuration ;
- volatile intptr_t _SpinState ; // MCS/CLH list of spinners
+ volatile int _Spinner; // for exit->spinner handoff optimization
+ volatile int _SpinFreq; // Spin 1-out-of-N attempts: success rate
+ volatile int _SpinClock;
+ volatile int _SpinDuration;
+ volatile intptr_t _SpinState; // MCS/CLH list of spinners
// TODO-FIXME: _count, _waiters and _recursions should be of
// type int, or int32_t but not intptr_t. There's no reason
@@ -284,30 +284,30 @@ public:
volatile int _WaitSetLock; // protects Wait Queue - simple spinlock
public:
- int _QMix ; // Mixed prepend queue discipline
- ObjectMonitor * FreeNext ; // Free list linkage
- intptr_t StatA, StatsB ;
+ int _QMix; // Mixed prepend queue discipline
+ ObjectMonitor * FreeNext; // Free list linkage
+ intptr_t StatA, StatsB;
public:
- static void Initialize () ;
- static PerfCounter * _sync_ContendedLockAttempts ;
- static PerfCounter * _sync_FutileWakeups ;
- static PerfCounter * _sync_Parks ;
- static PerfCounter * _sync_EmptyNotifications ;
- static PerfCounter * _sync_Notifications ;
- static PerfCounter * _sync_SlowEnter ;
- static PerfCounter * _sync_SlowExit ;
- static PerfCounter * _sync_SlowNotify ;
- static PerfCounter * _sync_SlowNotifyAll ;
- static PerfCounter * _sync_FailedSpins ;
- static PerfCounter * _sync_SuccessfulSpins ;
- static PerfCounter * _sync_PrivateA ;
- static PerfCounter * _sync_PrivateB ;
- static PerfCounter * _sync_MonInCirculation ;
- static PerfCounter * _sync_MonScavenged ;
- static PerfCounter * _sync_Inflations ;
- static PerfCounter * _sync_Deflations ;
- static PerfLongVariable * _sync_MonExtant ;
+ static void Initialize();
+ static PerfCounter * _sync_ContendedLockAttempts;
+ static PerfCounter * _sync_FutileWakeups;
+ static PerfCounter * _sync_Parks;
+ static PerfCounter * _sync_EmptyNotifications;
+ static PerfCounter * _sync_Notifications;
+ static PerfCounter * _sync_SlowEnter;
+ static PerfCounter * _sync_SlowExit;
+ static PerfCounter * _sync_SlowNotify;
+ static PerfCounter * _sync_SlowNotifyAll;
+ static PerfCounter * _sync_FailedSpins;
+ static PerfCounter * _sync_SuccessfulSpins;
+ static PerfCounter * _sync_PrivateA;
+ static PerfCounter * _sync_PrivateB;
+ static PerfCounter * _sync_MonInCirculation;
+ static PerfCounter * _sync_MonScavenged;
+ static PerfCounter * _sync_Inflations;
+ static PerfCounter * _sync_Deflations;
+ static PerfLongVariable * _sync_MonExtant;
public:
static int Knob_Verbose;
@@ -329,7 +329,7 @@ public:
#undef TEVENT
#define TEVENT(nom) {if (SyncVerbose) FEVENT(nom); }
-#define FEVENT(nom) { static volatile int ctr = 0 ; int v = ++ctr ; if ((v & (v-1)) == 0) { ::printf (#nom " : %d \n", v); ::fflush(stdout); }}
+#define FEVENT(nom) { static volatile int ctr = 0; int v = ++ctr; if ((v & (v-1)) == 0) { ::printf (#nom " : %d \n", v); ::fflush(stdout); }}
#undef TEVENT
#define TEVENT(nom) {;}
diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp
index 04c008431c7..5666aa0d45f 100644
--- a/hotspot/src/share/vm/runtime/os.cpp
+++ b/hotspot/src/share/vm/runtime/os.cpp
@@ -32,11 +32,15 @@
#include "gc_implementation/shared/vmGCOperations.hpp"
#include "interpreter/interpreter.hpp"
#include "memory/allocation.inline.hpp"
+#ifdef ASSERT
+#include "memory/guardedMemory.hpp"
+#endif
#include "oops/oop.inline.hpp"
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
#include "prims/privilegedStack.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/frame.inline.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/java.hpp"
@@ -523,121 +527,20 @@ char *os::strdup(const char *str, MEMFLAGS flags) {
}
-
-#ifdef ASSERT
-#define space_before (MallocCushion + sizeof(double))
-#define space_after MallocCushion
-#define size_addr_from_base(p) (size_t*)(p + space_before - sizeof(size_t))
-#define size_addr_from_obj(p) ((size_t*)p - 1)
-// MallocCushion: size of extra cushion allocated around objects with +UseMallocOnly
-// NB: cannot be debug variable, because these aren't set from the command line until
-// *after* the first few allocs already happened
-#define MallocCushion 16
-#else
-#define space_before 0
-#define space_after 0
-#define size_addr_from_base(p) should not use w/o ASSERT
-#define size_addr_from_obj(p) should not use w/o ASSERT
-#define MallocCushion 0
-#endif
#define paranoid 0 /* only set to 1 if you suspect checking code has bug */
#ifdef ASSERT
-inline size_t get_size(void* obj) {
- size_t size = *size_addr_from_obj(obj);
- if (size < 0) {
- fatal(err_msg("free: size field of object #" PTR_FORMAT " was overwritten ("
- SIZE_FORMAT ")", obj, size));
- }
- return size;
-}
-u_char* find_cushion_backwards(u_char* start) {
- u_char* p = start;
- while (p[ 0] != badResourceValue || p[-1] != badResourceValue ||
- p[-2] != badResourceValue || p[-3] != badResourceValue) p--;
- // ok, we have four consecutive marker bytes; find start
- u_char* q = p - 4;
- while (*q == badResourceValue) q--;
- return q + 1;
-}
-
-u_char* find_cushion_forwards(u_char* start) {
- u_char* p = start;
- while (p[0] != badResourceValue || p[1] != badResourceValue ||
- p[2] != badResourceValue || p[3] != badResourceValue) p++;
- // ok, we have four consecutive marker bytes; find end of cushion
- u_char* q = p + 4;
- while (*q == badResourceValue) q++;
- return q - MallocCushion;
-}
-
-void print_neighbor_blocks(void* ptr) {
- // find block allocated before ptr (not entirely crash-proof)
- if (MallocCushion < 4) {
- tty->print_cr("### cannot find previous block (MallocCushion < 4)");
- return;
- }
- u_char* start_of_this_block = (u_char*)ptr - space_before;
- u_char* end_of_prev_block_data = start_of_this_block - space_after -1;
- // look for cushion in front of prev. block
- u_char* start_of_prev_block = find_cushion_backwards(end_of_prev_block_data);
- ptrdiff_t size = *size_addr_from_base(start_of_prev_block);
- u_char* obj = start_of_prev_block + space_before;
- if (size <= 0 ) {
- // start is bad; may have been confused by OS data in between objects
- // search one more backwards
- start_of_prev_block = find_cushion_backwards(start_of_prev_block);
- size = *size_addr_from_base(start_of_prev_block);
- obj = start_of_prev_block + space_before;
- }
-
- if (start_of_prev_block + space_before + size + space_after == start_of_this_block) {
- tty->print_cr("### previous object: " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", obj, size);
- } else {
- tty->print_cr("### previous object (not sure if correct): " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", obj, size);
- }
-
- // now find successor block
- u_char* start_of_next_block = (u_char*)ptr + *size_addr_from_obj(ptr) + space_after;
- start_of_next_block = find_cushion_forwards(start_of_next_block);
- u_char* next_obj = start_of_next_block + space_before;
- ptrdiff_t next_size = *size_addr_from_base(start_of_next_block);
- if (start_of_next_block[0] == badResourceValue &&
- start_of_next_block[1] == badResourceValue &&
- start_of_next_block[2] == badResourceValue &&
- start_of_next_block[3] == badResourceValue) {
- tty->print_cr("### next object: " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", next_obj, next_size);
- } else {
- tty->print_cr("### next object (not sure if correct): " PTR_FORMAT " (" SSIZE_FORMAT " bytes)", next_obj, next_size);
+static void verify_memory(void* ptr) {
+ GuardedMemory guarded(ptr);
+ if (!guarded.verify_guards()) {
+ tty->print_cr("## nof_mallocs = " UINT64_FORMAT ", nof_frees = " UINT64_FORMAT, os::num_mallocs, os::num_frees);
+ tty->print_cr("## memory stomp:");
+ guarded.print_on(tty);
+ fatal("memory stomping error");
}
}
-
-void report_heap_error(void* memblock, void* bad, const char* where) {
- tty->print_cr("## nof_mallocs = " UINT64_FORMAT ", nof_frees = " UINT64_FORMAT, os::num_mallocs, os::num_frees);
- tty->print_cr("## memory stomp: byte at " PTR_FORMAT " %s object " PTR_FORMAT, bad, where, memblock);
- print_neighbor_blocks(memblock);
- fatal("memory stomping error");
-}
-
-void verify_block(void* memblock) {
- size_t size = get_size(memblock);
- if (MallocCushion) {
- u_char* ptr = (u_char*)memblock - space_before;
- for (int i = 0; i < MallocCushion; i++) {
- if (ptr[i] != badResourceValue) {
- report_heap_error(memblock, ptr+i, "in front of");
- }
- }
- u_char* end = (u_char*)memblock + size + space_after;
- for (int j = -MallocCushion; j < 0; j++) {
- if (end[j] != badResourceValue) {
- report_heap_error(memblock, end+j, "after");
- }
- }
- }
-}
#endif
//
@@ -686,16 +589,18 @@ void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
size = 1;
}
- const size_t alloc_size = size + space_before + space_after;
-
+#ifndef ASSERT
+ const size_t alloc_size = size;
+#else
+ const size_t alloc_size = GuardedMemory::get_total_size(size);
if (size > alloc_size) { // Check for rollover.
return NULL;
}
+#endif
NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
u_char* ptr;
-
if (MallocMaxTestWords > 0) {
ptr = testMalloc(alloc_size);
} else {
@@ -703,28 +608,26 @@ void* os::malloc(size_t size, MEMFLAGS memflags, address caller) {
}
#ifdef ASSERT
- if (ptr == NULL) return NULL;
- if (MallocCushion) {
- for (u_char* p = ptr; p < ptr + MallocCushion; p++) *p = (u_char)badResourceValue;
- u_char* end = ptr + space_before + size;
- for (u_char* pq = ptr+MallocCushion; pq < end; pq++) *pq = (u_char)uninitBlockPad;
- for (u_char* q = end; q < end + MallocCushion; q++) *q = (u_char)badResourceValue;
+ if (ptr == NULL) {
+ return NULL;
}
- // put size just before data
- *size_addr_from_base(ptr) = size;
+ // Wrap memory with guard
+ GuardedMemory guarded(ptr, size);
+ ptr = guarded.get_user_ptr();
#endif
- u_char* memblock = ptr + space_before;
- if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
- tty->print_cr("os::malloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock);
+ if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
+ tty->print_cr("os::malloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
breakpoint();
}
- debug_only(if (paranoid) verify_block(memblock));
- if (PrintMalloc && tty != NULL) tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, memblock);
+ debug_only(if (paranoid) verify_memory(ptr));
+ if (PrintMalloc && tty != NULL) {
+ tty->print_cr("os::malloc " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
+ }
- // we do not track MallocCushion memory
- MemTracker::record_malloc((address)memblock, size, memflags, caller == 0 ? CALLER_PC : caller);
+ // we do not track guard memory
+ MemTracker::record_malloc((address)ptr, size, memflags, caller == 0 ? CALLER_PC : caller);
- return memblock;
+ return ptr;
}
@@ -743,27 +646,32 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller
return ptr;
#else
if (memblock == NULL) {
- return malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
+ return os::malloc(size, memflags, (caller == 0 ? CALLER_PC : caller));
}
if ((intptr_t)memblock == (intptr_t)MallocCatchPtr) {
tty->print_cr("os::realloc caught " PTR_FORMAT, memblock);
breakpoint();
}
- verify_block(memblock);
+ verify_memory(memblock);
NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
- if (size == 0) return NULL;
+ if (size == 0) {
+ return NULL;
+ }
// always move the block
- void* ptr = malloc(size, memflags, caller == 0 ? CALLER_PC : caller);
- if (PrintMalloc) tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
+ void* ptr = os::malloc(size, memflags, caller == 0 ? CALLER_PC : caller);
+ if (PrintMalloc) {
+ tty->print_cr("os::remalloc " SIZE_FORMAT " bytes, " PTR_FORMAT " --> " PTR_FORMAT, size, memblock, ptr);
+ }
// Copy to new memory if malloc didn't fail
if ( ptr != NULL ) {
- memcpy(ptr, memblock, MIN2(size, get_size(memblock)));
- if (paranoid) verify_block(ptr);
+ GuardedMemory guarded(memblock);
+ memcpy(ptr, memblock, MIN2(size, guarded.get_user_size()));
+ if (paranoid) verify_memory(ptr);
if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
tty->print_cr("os::realloc caught, " SIZE_FORMAT " bytes --> " PTR_FORMAT, size, ptr);
breakpoint();
}
- free(memblock);
+ os::free(memblock);
}
return ptr;
#endif
@@ -771,6 +679,7 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, address caller
void os::free(void *memblock, MEMFLAGS memflags) {
+ address trackp = (address) memblock;
NOT_PRODUCT(inc_stat_counter(&num_frees, 1));
#ifdef ASSERT
if (memblock == NULL) return;
@@ -778,34 +687,20 @@ void os::free(void *memblock, MEMFLAGS memflags) {
if (tty != NULL) tty->print_cr("os::free caught " PTR_FORMAT, memblock);
breakpoint();
}
- verify_block(memblock);
+ verify_memory(memblock);
NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap());
- // Added by detlefs.
- if (MallocCushion) {
- u_char* ptr = (u_char*)memblock - space_before;
- for (u_char* p = ptr; p < ptr + MallocCushion; p++) {
- guarantee(*p == badResourceValue,
- "Thing freed should be malloc result.");
- *p = (u_char)freeBlockPad;
- }
- size_t size = get_size(memblock);
- inc_stat_counter(&free_bytes, size);
- u_char* end = ptr + space_before + size;
- for (u_char* q = end; q < end + MallocCushion; q++) {
- guarantee(*q == badResourceValue,
- "Thing freed should be malloc result.");
- *q = (u_char)freeBlockPad;
- }
- if (PrintMalloc && tty != NULL)
+
+ GuardedMemory guarded(memblock);
+ size_t size = guarded.get_user_size();
+ inc_stat_counter(&free_bytes, size);
+ memblock = guarded.release_for_freeing();
+ if (PrintMalloc && tty != NULL) {
fprintf(stderr, "os::free " SIZE_FORMAT " bytes --> " PTR_FORMAT "\n", size, (uintptr_t)memblock);
- } else if (PrintMalloc && tty != NULL) {
- // tty->print_cr("os::free %p", memblock);
- fprintf(stderr, "os::free " PTR_FORMAT "\n", (uintptr_t)memblock);
}
#endif
- MemTracker::record_free((address)memblock, memflags);
+ MemTracker::record_free(trackp, memflags);
- ::free((char*)memblock - space_before);
+ ::free(memblock);
}
void os::init_random(long initval) {
diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp
index c0c81a1f2ad..d4bd89d756c 100644
--- a/hotspot/src/share/vm/runtime/os.hpp
+++ b/hotspot/src/share/vm/runtime/os.hpp
@@ -26,7 +26,6 @@
#define SHARE_VM_RUNTIME_OS_HPP
#include "jvmtifiles/jvmti.h"
-#include "runtime/atomic.hpp"
#include "runtime/extendedPC.hpp"
#include "runtime/handles.hpp"
#include "utilities/top.hpp"
@@ -453,8 +452,6 @@ class os: AllStatic {
// yield that can be used in lieu of blocking.
} ;
static YieldResult NakedYield () ;
- static void yield_all(); // Yields to all other threads including lower priority
- // (for the default scheduling policy)
static OSReturn set_priority(Thread* thread, ThreadPriority priority);
static OSReturn get_priority(const Thread* const thread, ThreadPriority& priority);
diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp
index 872d73c72e8..cc35fea494b 100644
--- a/hotspot/src/share/vm/runtime/reflection.cpp
+++ b/hotspot/src/share/vm/runtime/reflection.cpp
@@ -410,49 +410,6 @@ oop Reflection::array_component_type(oop mirror, TRAPS) {
}
-bool Reflection::reflect_check_access(Klass* field_class, AccessFlags acc, Klass* target_class, bool is_method_invoke, TRAPS) {
- // field_class : declaring class
- // acc : declared field access
- // target_class : for protected
-
- // Check if field or method is accessible to client. Throw an
- // IllegalAccessException and return false if not.
-
- // The "client" is the class associated with the nearest real frame
- // getCallerClass already skips Method.invoke frames, so pass 0 in
- // that case (same as classic).
- ResourceMark rm(THREAD);
- assert(THREAD->is_Java_thread(), "sanity check");
- Klass* client_class = ((JavaThread *)THREAD)->security_get_caller_class(is_method_invoke ? 0 : 1);
-
- if (client_class != field_class) {
- if (!verify_class_access(client_class, field_class, false)
- || !verify_field_access(client_class,
- field_class,
- field_class,
- acc,
- false)) {
- THROW_(vmSymbols::java_lang_IllegalAccessException(), false);
- }
- }
-
- // Additional test for protected members: JLS 6.6.2
-
- if (acc.is_protected()) {
- if (target_class != client_class) {
- if (!is_same_class_package(client_class, field_class)) {
- if (!target_class->is_subclass_of(client_class)) {
- THROW_(vmSymbols::java_lang_IllegalAccessException(), false);
- }
- }
- }
- }
-
- // Passed all tests
- return true;
-}
-
-
bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, bool classloader_only) {
// Verify that current_class can access new_class. If the classloader_only
// flag is set, we automatically allow any accesses in which current_class
@@ -463,10 +420,9 @@ bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, boo
is_same_class_package(current_class, new_class)) {
return true;
}
- // New (1.4) reflection implementation. Allow all accesses from
- // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
- if ( JDK_Version::is_gte_jdk14x_version()
- && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
+ // Allow all accesses from sun/reflect/MagicAccessorImpl subclasses to
+ // succeed trivially.
+ if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
return true;
}
@@ -567,10 +523,9 @@ bool Reflection::verify_field_access(Klass* current_class,
return true;
}
- // New (1.4) reflection implementation. Allow all accesses from
- // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
- if ( JDK_Version::is_gte_jdk14x_version()
- && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
+ // Allow all accesses from sun/reflect/MagicAccessorImpl subclasses to
+ // succeed trivially.
+ if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
return true;
}
@@ -707,12 +662,10 @@ Handle Reflection::new_type(Symbol* signature, KlassHandle k, TRAPS) {
oop Reflection::new_method(methodHandle method, bool for_constant_pool_access, TRAPS) {
- // In jdk1.2.x, getMethods on an interface erroneously includes , thus the complicated assert.
- // Also allow sun.reflect.ConstantPool to refer to methods as java.lang.reflect.Methods.
+ // Allow sun.reflect.ConstantPool to refer to methods as java.lang.reflect.Methods.
assert(!method()->is_initializer() ||
- (for_constant_pool_access && method()->is_static()) ||
- (method()->name() == vmSymbols::class_initializer_name()
- && method()->method_holder()->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead");
+ (for_constant_pool_access && method()->is_static()),
+ "should call new_constructor instead");
instanceKlassHandle holder (THREAD, method->method_holder());
int slot = method->method_idnum();
@@ -978,22 +931,6 @@ oop Reflection::invoke(instanceKlassHandle klass, methodHandle reflected_method,
reflected_method->signature()));
}
- // In the JDK 1.4 reflection implementation, the security check is
- // done at the Java level
- if (!JDK_Version::is_gte_jdk14x_version()) {
-
- // Access checking (unless overridden by Method)
- if (!override) {
- if (!(klass->is_public() && reflected_method->is_public())) {
- bool access = Reflection::reflect_check_access(klass(), reflected_method->access_flags(), target_klass(), is_method_invoke, CHECK_NULL);
- if (!access) {
- return NULL; // exception
- }
- }
- }
-
- } // !Universe::is_gte_jdk14x_version()
-
assert(ptypes->is_objArray(), "just checking");
int args_len = args.is_null() ? 0 : args->length();
// Check number of arguments
diff --git a/hotspot/src/share/vm/runtime/reflection.hpp b/hotspot/src/share/vm/runtime/reflection.hpp
index 5757cfc39f5..593ff7ecc49 100644
--- a/hotspot/src/share/vm/runtime/reflection.hpp
+++ b/hotspot/src/share/vm/runtime/reflection.hpp
@@ -44,9 +44,6 @@ class FieldStream;
class Reflection: public AllStatic {
private:
- // Access checking
- static bool reflect_check_access(Klass* field_class, AccessFlags acc, Klass* target_class, bool is_method_invoke, TRAPS);
-
// Conversion
static Klass* basic_type_mirror_to_arrayklass(oop basic_type_mirror, TRAPS);
static oop basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS);
diff --git a/hotspot/src/share/vm/runtime/reflectionUtils.cpp b/hotspot/src/share/vm/runtime/reflectionUtils.cpp
index 2ec82abc91a..331d5a750a0 100644
--- a/hotspot/src/share/vm/runtime/reflectionUtils.cpp
+++ b/hotspot/src/share/vm/runtime/reflectionUtils.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, 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
@@ -76,15 +76,10 @@ void FilteredFieldsMap::initialize() {
int offset;
offset = java_lang_Throwable::get_backtrace_offset();
_filtered_fields->append(new FilteredField(SystemDictionary::Throwable_klass(), offset));
- // The latest version of vm may be used with old jdk.
- if (JDK_Version::is_gte_jdk16x_version()) {
- // The following class fields do not exist in
- // previous version of jdk.
- offset = sun_reflect_ConstantPool::oop_offset();
- _filtered_fields->append(new FilteredField(SystemDictionary::reflect_ConstantPool_klass(), offset));
- offset = sun_reflect_UnsafeStaticFieldAccessorImpl::base_offset();
- _filtered_fields->append(new FilteredField(SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass(), offset));
- }
+ offset = sun_reflect_ConstantPool::oop_offset();
+ _filtered_fields->append(new FilteredField(SystemDictionary::reflect_ConstantPool_klass(), offset));
+ offset = sun_reflect_UnsafeStaticFieldAccessorImpl::base_offset();
+ _filtered_fields->append(new FilteredField(SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass(), offset));
}
int FilteredFieldStream::field_count() {
diff --git a/hotspot/src/share/vm/runtime/safepoint.cpp b/hotspot/src/share/vm/runtime/safepoint.cpp
index e71185d431d..b0dc8863e83 100644
--- a/hotspot/src/share/vm/runtime/safepoint.cpp
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp
@@ -32,10 +32,12 @@
#include "code/scopeDesc.hpp"
#include "gc_interface/collectedHeap.hpp"
#include "interpreter/interpreter.hpp"
+#include "memory/gcLocker.inline.hpp"
#include "memory/resourceArea.hpp"
#include "memory/universe.inline.hpp"
#include "oops/oop.inline.hpp"
#include "oops/symbol.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/frame.inline.hpp"
@@ -264,8 +266,8 @@ void SafepointSynchronize::begin() {
//
// Further complicating matters is that yield() does not work as naively expected
// on many platforms -- yield() does not guarantee that any other ready threads
- // will run. As such we revert yield_all() after some number of iterations.
- // Yield_all() is implemented as a short unconditional sleep on some platforms.
+ // will run. As such we revert to naked_short_sleep() after some number of iterations.
+ // nakes_short_sleep() is implemented as a short unconditional sleep.
// Typical operating systems round a "short" sleep period up to 10 msecs, so sleeping
// can actually increase the time it takes the VM thread to detect that a system-wide
// stop-the-world safepoint has been reached. In a pathological scenario such as that
@@ -322,9 +324,7 @@ void SafepointSynchronize::begin() {
if (steps < DeferThrSuspendLoopCount) {
os::NakedYield() ;
} else {
- os::yield_all() ;
- // Alternately, the VM thread could transiently depress its scheduling priority or
- // transiently increase the priority of the tardy mutator(s).
+ os::naked_short_sleep(1);
}
iterations ++ ;
@@ -744,80 +744,12 @@ void SafepointSynchronize::block(JavaThread *thread) {
// ------------------------------------------------------------------------------------------------------
// Exception handlers
-#ifndef PRODUCT
-
-#ifdef SPARC
-
-#ifdef _LP64
-#define PTR_PAD ""
-#else
-#define PTR_PAD " "
-#endif
-
-static void print_ptrs(intptr_t oldptr, intptr_t newptr, bool wasoop) {
- bool is_oop = newptr ? (cast_to_oop(newptr))->is_oop() : false;
- tty->print_cr(PTR_FORMAT PTR_PAD " %s %c " PTR_FORMAT PTR_PAD " %s %s",
- oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
- newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
-}
-
-static void print_longs(jlong oldptr, jlong newptr, bool wasoop) {
- bool is_oop = newptr ? (cast_to_oop(newptr))->is_oop() : false;
- tty->print_cr(PTR64_FORMAT " %s %c " PTR64_FORMAT " %s %s",
- oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
- newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
-}
-
-static void print_me(intptr_t *new_sp, intptr_t *old_sp, bool *was_oops) {
-#ifdef _LP64
- tty->print_cr("--------+------address-----+------before-----------+-------after----------+");
- const int incr = 1; // Increment to skip a long, in units of intptr_t
-#else
- tty->print_cr("--------+--address-+------before-----------+-------after----------+");
- const int incr = 2; // Increment to skip a long, in units of intptr_t
-#endif
- tty->print_cr("---SP---|");
- for( int i=0; i<16; i++ ) {
- tty->print("blob %c%d |"PTR_FORMAT" ","LO"[i>>3],i&7,new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
- tty->print_cr("--------|");
- for( int i1=0; i1print("argv pad|"PTR_FORMAT" ",new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
- tty->print(" pad|"PTR_FORMAT" ",new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++);
- tty->print_cr("--------|");
- tty->print(" G1 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
- tty->print(" G3 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
- tty->print(" G4 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
- tty->print(" G5 |"PTR_FORMAT" ",new_sp); print_longs(*(jlong*)old_sp,*(jlong*)new_sp,was_oops[incr-1]); old_sp += incr; new_sp += incr; was_oops += incr;
- tty->print_cr(" FSR |"PTR_FORMAT" "PTR64_FORMAT" "PTR64_FORMAT,new_sp,*(jlong*)old_sp,*(jlong*)new_sp);
- old_sp += incr; new_sp += incr; was_oops += incr;
- // Skip the floats
- tty->print_cr("--Float-|"PTR_FORMAT,new_sp);
- tty->print_cr("---FP---|");
- old_sp += incr*32; new_sp += incr*32; was_oops += incr*32;
- for( int i2=0; i2<16; i2++ ) {
- tty->print("call %c%d |"PTR_FORMAT" ","LI"[i2>>3],i2&7,new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); }
- tty->cr();
-}
-#endif // SPARC
-#endif // PRODUCT
-
void SafepointSynchronize::handle_polling_page_exception(JavaThread *thread) {
assert(thread->is_Java_thread(), "polling reference encountered by VM thread");
assert(thread->thread_state() == _thread_in_Java, "should come from Java code");
assert(SafepointSynchronize::is_synchronizing(), "polling encountered outside safepoint synchronization");
- // Uncomment this to get some serious before/after printing of the
- // Sparc safepoint-blob frame structure.
- /*
- intptr_t* sp = thread->last_Java_sp();
- intptr_t stack_copy[150];
- for( int i=0; i<150; i++ ) stack_copy[i] = sp[i];
- bool was_oops[150];
- for( int i=0; i<150; i++ )
- was_oops[i] = stack_copy[i] ? ((oop)stack_copy[i])->is_oop() : false;
- */
-
if (ShowSafepointMsgs) {
tty->print("handle_polling_page_exception: ");
}
@@ -829,7 +761,6 @@ void SafepointSynchronize::handle_polling_page_exception(JavaThread *thread) {
ThreadSafepointState* state = thread->safepoint_state();
state->handle_polling_page_exception();
- // print_me(sp,stack_copy,was_oops);
}
diff --git a/hotspot/src/share/vm/runtime/serviceThread.cpp b/hotspot/src/share/vm/runtime/serviceThread.cpp
index 3c1224abb2c..eb7cb4a439c 100644
--- a/hotspot/src/share/vm/runtime/serviceThread.cpp
+++ b/hotspot/src/share/vm/runtime/serviceThread.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, 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
@@ -41,8 +41,7 @@ void ServiceThread::initialize() {
instanceKlassHandle klass (THREAD, SystemDictionary::Thread_klass());
instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
- const char* name = JDK_Version::is_gte_jdk17x_version() ?
- "Service Thread" : "Low Memory Detector";
+ const char* name = "Service Thread";
Handle string = java_lang_String::create_from_str(name, CHECK);
diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp
index fad31fd02f1..c717e61c8c6 100644
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp
@@ -42,6 +42,7 @@
#include "prims/jvmtiRedefineClassesTrace.hpp"
#include "prims/methodHandles.hpp"
#include "prims/nativeLookup.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/arguments.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/handles.inline.hpp"
@@ -198,13 +199,13 @@ void SharedRuntime::trace_ic_miss(address at) {
void SharedRuntime::print_ic_miss_histogram() {
if (ICMissHistogram) {
- tty->print_cr ("IC Miss Histogram:");
+ tty->print_cr("IC Miss Histogram:");
int tot_misses = 0;
for (int i = 0; i < _ICmiss_index; i++) {
tty->print_cr(" at: " INTPTR_FORMAT " nof: %d", _ICmiss_at[i], _ICmiss_count[i]);
tot_misses += _ICmiss_count[i];
}
- tty->print_cr ("Total IC misses: %7d", tot_misses);
+ tty->print_cr("Total IC misses: %7d", tot_misses);
}
}
#endif // PRODUCT
@@ -266,7 +267,7 @@ JRT_LEAF(jfloat, SharedRuntime::frem(jfloat x, jfloat y))
xbits.f = x;
ybits.f = y;
// x Mod Infinity == x unless x is infinity
- if ( ((xbits.i & float_sign_mask) != float_infinity) &&
+ if (((xbits.i & float_sign_mask) != float_infinity) &&
((ybits.i & float_sign_mask) == float_infinity) ) {
return x;
}
@@ -281,7 +282,7 @@ JRT_LEAF(jdouble, SharedRuntime::drem(jdouble x, jdouble y))
xbits.d = x;
ybits.d = y;
// x Mod Infinity == x unless x is infinity
- if ( ((xbits.l & double_sign_mask) != double_infinity) &&
+ if (((xbits.l & double_sign_mask) != double_infinity) &&
((ybits.l & double_sign_mask) == double_infinity) ) {
return x;
}
@@ -537,13 +538,13 @@ address SharedRuntime::get_poll_stub(address pc) {
CodeBlob *cb = CodeCache::find_blob(pc);
// Should be an nmethod
- assert( cb && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod" );
+ assert(cb && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod");
// Look up the relocation information
- assert( ((nmethod*)cb)->is_at_poll_or_poll_return(pc),
- "safepoint polling: type must be poll" );
+ assert(((nmethod*)cb)->is_at_poll_or_poll_return(pc),
+ "safepoint polling: type must be poll");
- assert( ((NativeInstruction*)pc)->is_safepoint_poll(),
+ assert(((NativeInstruction*)pc)->is_safepoint_poll(),
"Only polling locations are used for safepoint");
bool at_poll_return = ((nmethod*)cb)->is_at_poll_return(pc);
@@ -562,7 +563,7 @@ address SharedRuntime::get_poll_stub(address pc) {
stub = SharedRuntime::polling_page_safepoint_handler_blob()->entry_point();
}
#ifndef PRODUCT
- if( TraceSafepoint ) {
+ if (TraceSafepoint) {
char buf[256];
jio_snprintf(buf, sizeof(buf),
"... found polling page %s exception at pc = "
@@ -1176,10 +1177,7 @@ methodHandle SharedRuntime::resolve_sub_helper(JavaThread *thread,
(!is_virtual && invoke_code == Bytecodes::_invokedynamic) ||
( is_virtual && invoke_code != Bytecodes::_invokestatic ), "inconsistent bytecode");
- // We do not patch the call site if the caller nmethod has been made non-entrant.
- if (!caller_nm->is_in_use()) {
- return callee_method;
- }
+ assert(caller_nm->is_alive(), "It should be alive");
#ifndef PRODUCT
// tracing/debugging/statistics
@@ -1249,13 +1247,11 @@ methodHandle SharedRuntime::resolve_sub_helper(JavaThread *thread,
// Now that we are ready to patch if the Method* was redefined then
// don't update call site and let the caller retry.
- // Don't update call site if caller nmethod has been made non-entrant
- // as it is a waste of time.
// Don't update call site if callee nmethod was unloaded or deoptimized.
// Don't update call site if callee nmethod was replaced by an other nmethod
// which may happen when multiply alive nmethod (tiered compilation)
// will be supported.
- if (!callee_method->is_old() && caller_nm->is_in_use() &&
+ if (!callee_method->is_old() &&
(callee_nm == NULL || callee_nm->is_in_use() && (callee_method->code() == callee_nm))) {
#ifdef ASSERT
// We must not try to patch to jump to an already unloaded method.
@@ -1454,14 +1450,12 @@ methodHandle SharedRuntime::handle_ic_miss_helper(JavaThread *thread, TRAPS) {
// out of scope.
JvmtiDynamicCodeEventCollector event_collector;
- // Update inline cache to megamorphic. Skip update if caller has been
- // made non-entrant or we are called from interpreted.
+ // Update inline cache to megamorphic. Skip update if we are called from interpreted.
{ MutexLocker ml_patch (CompiledIC_lock);
RegisterMap reg_map(thread, false);
frame caller_frame = thread->last_frame().sender(®_map);
CodeBlob* cb = caller_frame.cb();
- if (cb->is_nmethod() && ((nmethod*)cb)->is_in_use()) {
- // Not a non-entrant nmethod, so find inline_cache
+ if (cb->is_nmethod()) {
CompiledIC* inline_cache = CompiledIC_before(((nmethod*)cb), caller_frame.pc());
bool should_be_mono = false;
if (inline_cache->is_optimized()) {
@@ -1474,7 +1468,7 @@ methodHandle SharedRuntime::handle_ic_miss_helper(JavaThread *thread, TRAPS) {
should_be_mono = true;
} else if (inline_cache->is_icholder_call()) {
CompiledICHolder* ic_oop = inline_cache->cached_icholder();
- if ( ic_oop != NULL) {
+ if (ic_oop != NULL) {
if (receiver()->klass() == ic_oop->holder_klass()) {
// This isn't a real miss. We must have seen that compiled code
@@ -1604,19 +1598,13 @@ methodHandle SharedRuntime::reresolve_call_site(JavaThread *thread, TRAPS) {
// resolve is only done once.
MutexLocker ml(CompiledIC_lock);
- //
- // We do not patch the call site if the nmethod has been made non-entrant
- // as it is a waste of time
- //
- if (caller_nm->is_in_use()) {
- if (is_static_call) {
- CompiledStaticCall* ssc= compiledStaticCall_at(call_addr);
- ssc->set_to_clean();
- } else {
- // compiled, dispatched call (which used to call an interpreted method)
- CompiledIC* inline_cache = CompiledIC_at(caller_nm, call_addr);
- inline_cache->set_to_clean();
- }
+ if (is_static_call) {
+ CompiledStaticCall* ssc= compiledStaticCall_at(call_addr);
+ ssc->set_to_clean();
+ } else {
+ // compiled, dispatched call (which used to call an interpreted method)
+ CompiledIC* inline_cache = CompiledIC_at(caller_nm, call_addr);
+ inline_cache->set_to_clean();
}
}
@@ -1728,7 +1716,7 @@ IRT_LEAF(void, SharedRuntime::fixup_callers_callsite(Method* method, address cal
iter.next();
assert(iter.has_current(), "must have a reloc at java call site");
relocInfo::relocType typ = iter.reloc()->type();
- if ( typ != relocInfo::static_call_type &&
+ if (typ != relocInfo::static_call_type &&
typ != relocInfo::opt_virtual_call_type &&
typ != relocInfo::static_stub_type) {
return;
@@ -1784,7 +1772,7 @@ JRT_ENTRY(void, SharedRuntime::slow_arraycopy_C(oopDesc* src, jint src_pos,
// The copy_array mechanism is awkward and could be removed, but
// the compilers don't call this function except as a last resort,
// so it probably doesn't matter.
- src->klass()->copy_array((arrayOopDesc*)src, src_pos,
+ src->klass()->copy_array((arrayOopDesc*)src, src_pos,
(arrayOopDesc*)dest, dest_pos,
length, thread);
}
@@ -1891,8 +1879,8 @@ void SharedRuntime::print_statistics() {
ttyLocker ttyl;
if (xtty != NULL) xtty->head("statistics type='SharedRuntime'");
- if (_monitor_enter_ctr ) tty->print_cr("%5d monitor enter slow", _monitor_enter_ctr);
- if (_monitor_exit_ctr ) tty->print_cr("%5d monitor exit slow", _monitor_exit_ctr);
+ if (_monitor_enter_ctr) tty->print_cr("%5d monitor enter slow", _monitor_enter_ctr);
+ if (_monitor_exit_ctr) tty->print_cr("%5d monitor exit slow", _monitor_exit_ctr);
if (_throw_null_ctr) tty->print_cr("%5d implicit null throw", _throw_null_ctr);
SharedRuntime::print_ic_miss_histogram();
@@ -1905,36 +1893,36 @@ void SharedRuntime::print_statistics() {
}
// Dump the JRT_ENTRY counters
- if( _new_instance_ctr ) tty->print_cr("%5d new instance requires GC", _new_instance_ctr);
- if( _new_array_ctr ) tty->print_cr("%5d new array requires GC", _new_array_ctr);
- if( _multi1_ctr ) tty->print_cr("%5d multianewarray 1 dim", _multi1_ctr);
- if( _multi2_ctr ) tty->print_cr("%5d multianewarray 2 dim", _multi2_ctr);
- if( _multi3_ctr ) tty->print_cr("%5d multianewarray 3 dim", _multi3_ctr);
- if( _multi4_ctr ) tty->print_cr("%5d multianewarray 4 dim", _multi4_ctr);
- if( _multi5_ctr ) tty->print_cr("%5d multianewarray 5 dim", _multi5_ctr);
+ if (_new_instance_ctr) tty->print_cr("%5d new instance requires GC", _new_instance_ctr);
+ if (_new_array_ctr) tty->print_cr("%5d new array requires GC", _new_array_ctr);
+ if (_multi1_ctr) tty->print_cr("%5d multianewarray 1 dim", _multi1_ctr);
+ if (_multi2_ctr) tty->print_cr("%5d multianewarray 2 dim", _multi2_ctr);
+ if (_multi3_ctr) tty->print_cr("%5d multianewarray 3 dim", _multi3_ctr);
+ if (_multi4_ctr) tty->print_cr("%5d multianewarray 4 dim", _multi4_ctr);
+ if (_multi5_ctr) tty->print_cr("%5d multianewarray 5 dim", _multi5_ctr);
- tty->print_cr("%5d inline cache miss in compiled", _ic_miss_ctr );
- tty->print_cr("%5d wrong method", _wrong_method_ctr );
- tty->print_cr("%5d unresolved static call site", _resolve_static_ctr );
- tty->print_cr("%5d unresolved virtual call site", _resolve_virtual_ctr );
- tty->print_cr("%5d unresolved opt virtual call site", _resolve_opt_virtual_ctr );
+ tty->print_cr("%5d inline cache miss in compiled", _ic_miss_ctr);
+ tty->print_cr("%5d wrong method", _wrong_method_ctr);
+ tty->print_cr("%5d unresolved static call site", _resolve_static_ctr);
+ tty->print_cr("%5d unresolved virtual call site", _resolve_virtual_ctr);
+ tty->print_cr("%5d unresolved opt virtual call site", _resolve_opt_virtual_ctr);
- if( _mon_enter_stub_ctr ) tty->print_cr("%5d monitor enter stub", _mon_enter_stub_ctr );
- if( _mon_exit_stub_ctr ) tty->print_cr("%5d monitor exit stub", _mon_exit_stub_ctr );
- if( _mon_enter_ctr ) tty->print_cr("%5d monitor enter slow", _mon_enter_ctr );
- if( _mon_exit_ctr ) tty->print_cr("%5d monitor exit slow", _mon_exit_ctr );
- if( _partial_subtype_ctr) tty->print_cr("%5d slow partial subtype", _partial_subtype_ctr );
- if( _jbyte_array_copy_ctr ) tty->print_cr("%5d byte array copies", _jbyte_array_copy_ctr );
- if( _jshort_array_copy_ctr ) tty->print_cr("%5d short array copies", _jshort_array_copy_ctr );
- if( _jint_array_copy_ctr ) tty->print_cr("%5d int array copies", _jint_array_copy_ctr );
- if( _jlong_array_copy_ctr ) tty->print_cr("%5d long array copies", _jlong_array_copy_ctr );
- if( _oop_array_copy_ctr ) tty->print_cr("%5d oop array copies", _oop_array_copy_ctr );
- if( _checkcast_array_copy_ctr ) tty->print_cr("%5d checkcast array copies", _checkcast_array_copy_ctr );
- if( _unsafe_array_copy_ctr ) tty->print_cr("%5d unsafe array copies", _unsafe_array_copy_ctr );
- if( _generic_array_copy_ctr ) tty->print_cr("%5d generic array copies", _generic_array_copy_ctr );
- if( _slow_array_copy_ctr ) tty->print_cr("%5d slow array copies", _slow_array_copy_ctr );
- if( _find_handler_ctr ) tty->print_cr("%5d find exception handler", _find_handler_ctr );
- if( _rethrow_ctr ) tty->print_cr("%5d rethrow handler", _rethrow_ctr );
+ if (_mon_enter_stub_ctr) tty->print_cr("%5d monitor enter stub", _mon_enter_stub_ctr);
+ if (_mon_exit_stub_ctr) tty->print_cr("%5d monitor exit stub", _mon_exit_stub_ctr);
+ if (_mon_enter_ctr) tty->print_cr("%5d monitor enter slow", _mon_enter_ctr);
+ if (_mon_exit_ctr) tty->print_cr("%5d monitor exit slow", _mon_exit_ctr);
+ if (_partial_subtype_ctr) tty->print_cr("%5d slow partial subtype", _partial_subtype_ctr);
+ if (_jbyte_array_copy_ctr) tty->print_cr("%5d byte array copies", _jbyte_array_copy_ctr);
+ if (_jshort_array_copy_ctr) tty->print_cr("%5d short array copies", _jshort_array_copy_ctr);
+ if (_jint_array_copy_ctr) tty->print_cr("%5d int array copies", _jint_array_copy_ctr);
+ if (_jlong_array_copy_ctr) tty->print_cr("%5d long array copies", _jlong_array_copy_ctr);
+ if (_oop_array_copy_ctr) tty->print_cr("%5d oop array copies", _oop_array_copy_ctr);
+ if (_checkcast_array_copy_ctr) tty->print_cr("%5d checkcast array copies", _checkcast_array_copy_ctr);
+ if (_unsafe_array_copy_ctr) tty->print_cr("%5d unsafe array copies", _unsafe_array_copy_ctr);
+ if (_generic_array_copy_ctr) tty->print_cr("%5d generic array copies", _generic_array_copy_ctr);
+ if (_slow_array_copy_ctr) tty->print_cr("%5d slow array copies", _slow_array_copy_ctr);
+ if (_find_handler_ctr) tty->print_cr("%5d find exception handler", _find_handler_ctr);
+ if (_rethrow_ctr) tty->print_cr("%5d rethrow handler", _rethrow_ctr);
AdapterHandlerLibrary::print_statistics();
@@ -1997,7 +1985,7 @@ class MethodArityHistogram {
MethodArityHistogram() {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
_max_arity = _max_size = 0;
- for (int i = 0; i < MAX_ARITY; i++) _arity_histogram[i] = _size_histogram [i] = 0;
+ for (int i = 0; i < MAX_ARITY; i++) _arity_histogram[i] = _size_histogram[i] = 0;
CodeCache::nmethods_do(add_method_to_histogram);
print_histogram();
}
@@ -2062,7 +2050,7 @@ class AdapterFingerPrint : public CHeapObj {
// These are correct for the current system but someday it might be
// necessary to make this mapping platform dependent.
static int adapter_encoding(BasicType in) {
- switch(in) {
+ switch (in) {
case T_BOOLEAN:
case T_BYTE:
case T_SHORT:
@@ -2479,7 +2467,7 @@ AdapterHandlerEntry* AdapterHandlerLibrary::get_adapter(methodHandle method) {
tty->print_cr("i2c argument handler #%d for: %s %s (%d bytes generated)",
_adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"),
method->signature()->as_C_string(), insts_size);
- tty->print_cr("c2i argument handler starts at %p",entry->get_c2i_entry());
+ tty->print_cr("c2i argument handler starts at %p", entry->get_c2i_entry());
if (Verbose || PrintStubCode) {
address first_pc = entry->base_address();
if (first_pc != NULL) {
@@ -2504,7 +2492,7 @@ AdapterHandlerEntry* AdapterHandlerLibrary::get_adapter(methodHandle method) {
new_adapter->name(),
fingerprint->as_string(),
new_adapter->content_begin());
- Forte::register_stub(blob_id, new_adapter->content_begin(),new_adapter->content_end());
+ Forte::register_stub(blob_id, new_adapter->content_begin(), new_adapter->content_end());
if (JvmtiExport::should_post_dynamic_code_generated()) {
JvmtiExport::post_dynamic_code_generated(blob_id, new_adapter->content_begin(), new_adapter->content_end());
@@ -2605,12 +2593,12 @@ void AdapterHandlerLibrary::create_native_wrapper(methodHandle method) {
BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed);
VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed);
int i=0;
- if( !method->is_static() ) // Pass in receiver first
+ if (!method->is_static()) // Pass in receiver first
sig_bt[i++] = T_OBJECT;
SignatureStream ss(method->signature());
- for( ; !ss.at_return_type(); ss.next()) {
+ for (; !ss.at_return_type(); ss.next()) {
sig_bt[i++] = ss.type(); // Collect remaining bits of signature
- if( ss.type() == T_LONG || ss.type() == T_DOUBLE )
+ if (ss.type() == T_LONG || ss.type() == T_DOUBLE)
sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
}
assert(i == total_args_passed, "");
@@ -2762,10 +2750,10 @@ void SharedRuntime::convert_ints_to_longints(int i2l_argcnt, int& in_args_count,
case T_SHORT:
case T_INT:
// Convert (bt) to (T_LONG,bt).
- new_in_sig_bt[argcnt ] = T_LONG;
+ new_in_sig_bt[argcnt] = T_LONG;
new_in_sig_bt[argcnt+1] = bt;
assert(reg.first()->is_valid() && !reg.second()->is_valid(), "");
- new_in_regs[argcnt ].set2(reg.first());
+ new_in_regs[argcnt].set2(reg.first());
new_in_regs[argcnt+1].set_bad();
argcnt++;
break;
@@ -2808,17 +2796,17 @@ VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver,
int len = (int)strlen(s);
s++; len--; // Skip opening paren
char *t = s+len;
- while( *(--t) != ')' ) ; // Find close paren
+ while (*(--t) != ')'); // Find close paren
- BasicType *sig_bt = NEW_RESOURCE_ARRAY( BasicType, 256 );
- VMRegPair *regs = NEW_RESOURCE_ARRAY( VMRegPair, 256 );
+ BasicType *sig_bt = NEW_RESOURCE_ARRAY(BasicType, 256);
+ VMRegPair *regs = NEW_RESOURCE_ARRAY(VMRegPair, 256);
int cnt = 0;
if (has_receiver) {
sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature
}
- while( s < t ) {
- switch( *s++ ) { // Switch on signature character
+ while (s < t) {
+ switch (*s++) { // Switch on signature character
case 'B': sig_bt[cnt++] = T_BYTE; break;
case 'C': sig_bt[cnt++] = T_CHAR; break;
case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break;
@@ -2829,16 +2817,16 @@ VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver,
case 'Z': sig_bt[cnt++] = T_BOOLEAN; break;
case 'V': sig_bt[cnt++] = T_VOID; break;
case 'L': // Oop
- while( *s++ != ';' ) ; // Skip signature
+ while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_OBJECT;
break;
case '[': { // Array
do { // Skip optional size
- while( *s >= '0' && *s <= '9' ) s++;
- } while( *s++ == '[' ); // Nested arrays?
+ while (*s >= '0' && *s <= '9') s++;
+ } while (*s++ == '['); // Nested arrays?
// Skip element type
- if( s[-1] == 'L' )
- while( *s++ != ';' ) ; // Skip signature
+ if (s[-1] == 'L')
+ while (*s++ != ';'); // Skip signature
sig_bt[cnt++] = T_ARRAY;
break;
}
@@ -2850,7 +2838,7 @@ VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver,
sig_bt[cnt++] = T_OBJECT;
}
- assert( cnt < 256, "grow table size" );
+ assert(cnt < 256, "grow table size");
int comp_args_on_stack;
comp_args_on_stack = java_calling_convention(sig_bt, regs, cnt, true);
@@ -2861,12 +2849,12 @@ VMRegPair *SharedRuntime::find_callee_arguments(Symbol* sig, bool has_receiver,
if (comp_args_on_stack) {
for (int i = 0; i < cnt; i++) {
VMReg reg1 = regs[i].first();
- if( reg1->is_stack()) {
+ if (reg1->is_stack()) {
// Yuck
reg1 = reg1->bias(out_preserve_stack_slots());
}
VMReg reg2 = regs[i].second();
- if( reg2->is_stack()) {
+ if (reg2->is_stack()) {
// Yuck
reg2 = reg2->bias(out_preserve_stack_slots());
}
@@ -2904,15 +2892,15 @@ JRT_LEAF(intptr_t*, SharedRuntime::OSR_migration_begin( JavaThread *thread) )
// frame accessor methods and be platform independent.
frame fr = thread->last_frame();
- assert( fr.is_interpreted_frame(), "" );
- assert( fr.interpreter_frame_expression_stack_size()==0, "only handle empty stacks" );
+ assert(fr.is_interpreted_frame(), "");
+ assert(fr.interpreter_frame_expression_stack_size()==0, "only handle empty stacks");
// Figure out how many monitors are active.
int active_monitor_count = 0;
- for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
+ for (BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
kptr < fr.interpreter_frame_monitor_begin();
kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
- if( kptr->obj() != NULL ) active_monitor_count++;
+ if (kptr->obj() != NULL) active_monitor_count++;
}
// QQQ we could place number of active monitors in the array so that compiled code
@@ -2926,17 +2914,17 @@ JRT_LEAF(intptr_t*, SharedRuntime::OSR_migration_begin( JavaThread *thread) )
// Copy the locals. Order is preserved so that loading of longs works.
// Since there's no GC I can copy the oops blindly.
- assert( sizeof(HeapWord)==sizeof(intptr_t), "fix this code");
+ assert(sizeof(HeapWord)==sizeof(intptr_t), "fix this code");
Copy::disjoint_words((HeapWord*)fr.interpreter_frame_local_at(max_locals-1),
(HeapWord*)&buf[0],
max_locals);
// Inflate locks. Copy the displaced headers. Be careful, there can be holes.
int i = max_locals;
- for( BasicObjectLock *kptr2 = fr.interpreter_frame_monitor_end();
+ for (BasicObjectLock *kptr2 = fr.interpreter_frame_monitor_end();
kptr2 < fr.interpreter_frame_monitor_begin();
kptr2 = fr.next_monitor_in_interpreter_frame(kptr2) ) {
- if( kptr2->obj() != NULL) { // Avoid 'holes' in the monitor array
+ if (kptr2->obj() != NULL) { // Avoid 'holes' in the monitor array
BasicLock *lock = kptr2->lock();
// Inflate so the displaced header becomes position-independent
if (lock->displaced_header()->is_unlocked())
@@ -2946,20 +2934,20 @@ JRT_LEAF(intptr_t*, SharedRuntime::OSR_migration_begin( JavaThread *thread) )
buf[i++] = cast_from_oop(kptr2->obj());
}
}
- assert( i - max_locals == active_monitor_count*2, "found the expected number of monitors" );
+ assert(i - max_locals == active_monitor_count*2, "found the expected number of monitors");
return buf;
JRT_END
JRT_LEAF(void, SharedRuntime::OSR_migration_end( intptr_t* buf) )
- FREE_C_HEAP_ARRAY(intptr_t,buf, mtCode);
+ FREE_C_HEAP_ARRAY(intptr_t, buf, mtCode);
JRT_END
bool AdapterHandlerLibrary::contains(CodeBlob* b) {
AdapterHandlerTableIterator iter(_adapters);
while (iter.has_next()) {
AdapterHandlerEntry* a = iter.next();
- if ( b == CodeCache::find_blob(a->get_i2c_entry()) ) return true;
+ if (b == CodeCache::find_blob(a->get_i2c_entry())) return true;
}
return false;
}
diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.hpp b/hotspot/src/share/vm/runtime/sharedRuntime.hpp
index c28c469d0e8..a6d4dfd704d 100644
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp
@@ -217,7 +217,7 @@ class SharedRuntime: AllStatic {
static UncommonTrapBlob* uncommon_trap_blob() { return _uncommon_trap_blob; }
#endif // COMPILER2
- static address get_resolve_opt_virtual_call_stub(){
+ static address get_resolve_opt_virtual_call_stub() {
assert(_resolve_opt_virtual_call_blob != NULL, "oops");
return _resolve_opt_virtual_call_blob->entry_point();
}
@@ -253,7 +253,7 @@ class SharedRuntime: AllStatic {
// bytecode tracing is only used by the TraceBytecodes
static intptr_t trace_bytecode(JavaThread* thread, intptr_t preserve_this_value, intptr_t tos, intptr_t tos2) PRODUCT_RETURN0;
- static oop retrieve_receiver( Symbol* sig, frame caller );
+ static oop retrieve_receiver(Symbol* sig, frame caller);
static void register_finalizer(JavaThread* thread, oopDesc* obj);
@@ -446,8 +446,8 @@ class SharedRuntime: AllStatic {
static bool is_wide_vector(int size);
// Save and restore a native result
- static void save_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots );
- static void restore_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots );
+ static void save_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots);
+ static void restore_native_result(MacroAssembler *_masm, BasicType ret_type, int frame_slots);
// Generate a native wrapper for a given method. The method takes arguments
// in the Java compiled code convention, marshals them to the native
@@ -463,7 +463,7 @@ class SharedRuntime: AllStatic {
int compile_id,
BasicType* sig_bt,
VMRegPair* regs,
- BasicType ret_type );
+ BasicType ret_type);
// Block before entering a JNI critical method
static void block_for_jni_critical(JavaThread* thread);
diff --git a/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp b/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp
index 1691bdf7690..84f35aa9317 100644
--- a/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp
+++ b/hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp
@@ -26,6 +26,7 @@
#include "prims/jni.h"
#include "runtime/interfaceSupport.hpp"
#include "runtime/sharedRuntime.hpp"
+#include "runtime/sharedRuntimeMath.hpp"
// This file contains copies of the fdlibm routines used by
// StrictMath. It turns out that it is almost always required to use
@@ -36,35 +37,6 @@
// pointer out to libjava.so in SharedRuntime speeds these routines up
// by roughly 15% on both Win32/x86 and Solaris/SPARC.
-// Enabling optimizations in this file causes incorrect code to be
-// generated; can not figure out how to turn down optimization for one
-// file in the IDE on Windows
-#ifdef WIN32
-# pragma optimize ( "", off )
-#endif
-
-/* The above workaround now causes more problems with the latest MS compiler.
- * Visual Studio 2010's /GS option tries to guard against buffer overruns.
- * /GS is on by default if you specify optimizations, which we do globally
- * via /W3 /O2. However the above selective turning off of optimizations means
- * that /GS issues a warning "4748". And since we treat warnings as errors (/WX)
- * then the compilation fails. There are several possible solutions
- * (1) Remove that pragma above as obsolete with VS2010 - requires testing.
- * (2) Stop treating warnings as errors - would be a backward step
- * (3) Disable /GS - may help performance but you lose the security checks
- * (4) Disable the warning with "#pragma warning( disable : 4748 )"
- * (5) Disable planting the code with __declspec(safebuffers)
- * I've opted for (5) although we should investigate the local performance
- * benefits of (1) and global performance benefit of (3).
- */
-#if defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1600))
-#define SAFEBUF __declspec(safebuffers)
-#else
-#define SAFEBUF
-#endif
-
-#include "runtime/sharedRuntimeMath.hpp"
-
/*
* __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
* double x[],y[]; int e0,nx,prec; int ipio2[];
@@ -201,7 +173,7 @@ one = 1.0,
two24B = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
-static SAFEBUF int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2) {
+static int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2) {
int jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
double z,fw,f[20],fq[20],q[20];
@@ -417,7 +389,7 @@ pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
-static SAFEBUF int __ieee754_rem_pio2(double x, double *y) {
+static int __ieee754_rem_pio2(double x, double *y) {
double z,w,t,r,fn;
double tx[3];
int e0,i,j,nx,n,ix,hx,i0;
@@ -916,8 +888,3 @@ JRT_LEAF(jdouble, SharedRuntime::dtan(jdouble x))
-1 -- n odd */
}
JRT_END
-
-
-#ifdef WIN32
-# pragma optimize ( "", on )
-#endif
diff --git a/hotspot/src/share/vm/runtime/sweeper.cpp b/hotspot/src/share/vm/runtime/sweeper.cpp
index 5ec575aa356..0a964ac8728 100644
--- a/hotspot/src/share/vm/runtime/sweeper.cpp
+++ b/hotspot/src/share/vm/runtime/sweeper.cpp
@@ -30,7 +30,7 @@
#include "compiler/compileBroker.hpp"
#include "memory/resourceArea.hpp"
#include "oops/method.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/orderAccess.inline.hpp"
diff --git a/hotspot/src/share/vm/runtime/synchronizer.cpp b/hotspot/src/share/vm/runtime/synchronizer.cpp
index 62bd1ab9139..a7de4bda77a 100644
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp
@@ -27,6 +27,7 @@
#include "memory/resourceArea.hpp"
#include "oops/markOop.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/interfaceSupport.hpp"
@@ -120,15 +121,15 @@ int dtrace_waited_probe(ObjectMonitor* monitor, Handle obj, Thread* thr) {
}
#define NINFLATIONLOCKS 256
-static volatile intptr_t InflationLocks [NINFLATIONLOCKS] ;
+static volatile intptr_t InflationLocks[NINFLATIONLOCKS];
-ObjectMonitor * ObjectSynchronizer::gBlockList = NULL ;
-ObjectMonitor * volatile ObjectSynchronizer::gFreeList = NULL ;
-ObjectMonitor * volatile ObjectSynchronizer::gOmInUseList = NULL ;
+ObjectMonitor * ObjectSynchronizer::gBlockList = NULL;
+ObjectMonitor * volatile ObjectSynchronizer::gFreeList = NULL;
+ObjectMonitor * volatile ObjectSynchronizer::gOmInUseList = NULL;
int ObjectSynchronizer::gOmInUseCount = 0;
-static volatile intptr_t ListLock = 0 ; // protects global monitor free-list cache
-static volatile int MonitorFreeCount = 0 ; // # on gFreeList
-static volatile int MonitorPopulation = 0 ; // # Extant -- in circulation
+static volatile intptr_t ListLock = 0; // protects global monitor free-list cache
+static volatile int MonitorFreeCount = 0; // # on gFreeList
+static volatile int MonitorPopulation = 0; // # Extant -- in circulation
#define CHAINMARKER (cast_to_oop(-1))
// -----------------------------------------------------------------------------
@@ -152,43 +153,43 @@ void ObjectSynchronizer::fast_enter(Handle obj, BasicLock* lock, bool attempt_re
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
- slow_enter (obj, lock, THREAD) ;
+ slow_enter(obj, lock, THREAD);
}
void ObjectSynchronizer::fast_exit(oop object, BasicLock* lock, TRAPS) {
assert(!object->mark()->has_bias_pattern(), "should not see bias pattern here");
// if displaced header is null, the previous enter is recursive enter, no-op
markOop dhw = lock->displaced_header();
- markOop mark ;
+ markOop mark;
if (dhw == NULL) {
// Recursive stack-lock.
// Diagnostics -- Could be: stack-locked, inflating, inflated.
- mark = object->mark() ;
- assert (!mark->is_neutral(), "invariant") ;
+ mark = object->mark();
+ assert(!mark->is_neutral(), "invariant");
if (mark->has_locker() && mark != markOopDesc::INFLATING()) {
- assert(THREAD->is_lock_owned((address)mark->locker()), "invariant") ;
+ assert(THREAD->is_lock_owned((address)mark->locker()), "invariant");
}
if (mark->has_monitor()) {
- ObjectMonitor * m = mark->monitor() ;
- assert(((oop)(m->object()))->mark() == mark, "invariant") ;
- assert(m->is_entered(THREAD), "invariant") ;
+ ObjectMonitor * m = mark->monitor();
+ assert(((oop)(m->object()))->mark() == mark, "invariant");
+ assert(m->is_entered(THREAD), "invariant");
}
- return ;
+ return;
}
- mark = object->mark() ;
+ mark = object->mark();
// If the object is stack-locked by the current thread, try to
// swing the displaced header from the box back to the mark.
if (mark == (markOop) lock) {
- assert (dhw->is_neutral(), "invariant") ;
+ assert(dhw->is_neutral(), "invariant");
if ((markOop) Atomic::cmpxchg_ptr (dhw, object->mark_addr(), mark) == mark) {
- TEVENT (fast_exit: release stacklock) ;
+ TEVENT(fast_exit: release stacklock);
return;
}
}
- ObjectSynchronizer::inflate(THREAD, object)->exit (true, THREAD) ;
+ ObjectSynchronizer::inflate(THREAD, object)->exit(true, THREAD);
}
// -----------------------------------------------------------------------------
@@ -205,8 +206,8 @@ void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
// be visible <= the ST performed by the CAS.
lock->set_displaced_header(mark);
if (mark == (markOop) Atomic::cmpxchg_ptr(lock, obj()->mark_addr(), mark)) {
- TEVENT (slow_enter: release stacklock) ;
- return ;
+ TEVENT(slow_enter: release stacklock);
+ return;
}
// Fall through to inflate() ...
} else
@@ -220,8 +221,8 @@ void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
#if 0
// The following optimization isn't particularly useful.
if (mark->has_monitor() && mark->monitor()->is_entered(THREAD)) {
- lock->set_displaced_header (NULL) ;
- return ;
+ lock->set_displaced_header(NULL);
+ return;
}
#endif
@@ -238,7 +239,7 @@ void ObjectSynchronizer::slow_enter(Handle obj, BasicLock* lock, TRAPS) {
// failed in the interpreter/compiler code. Simply use the heavy
// weight monitor should be ok, unless someone find otherwise.
void ObjectSynchronizer::slow_exit(oop object, BasicLock* lock, TRAPS) {
- fast_exit (object, lock, THREAD) ;
+ fast_exit(object, lock, THREAD);
}
// -----------------------------------------------------------------------------
@@ -254,7 +255,7 @@ void ObjectSynchronizer::slow_exit(oop object, BasicLock* lock, TRAPS) {
// 5) lock lock2
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
intptr_t ObjectSynchronizer::complete_exit(Handle obj, TRAPS) {
- TEVENT (complete_exit) ;
+ TEVENT(complete_exit);
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
@@ -267,7 +268,7 @@ intptr_t ObjectSynchronizer::complete_exit(Handle obj, TRAPS) {
// NOTE: must use heavy weight monitor to handle complete_exit/reenter()
void ObjectSynchronizer::reenter(Handle obj, intptr_t recursion, TRAPS) {
- TEVENT (reenter) ;
+ TEVENT(reenter);
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
@@ -282,7 +283,7 @@ void ObjectSynchronizer::reenter(Handle obj, intptr_t recursion, TRAPS) {
// NOTE: must use heavy weight monitor to handle jni monitor enter
void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) { // possible entry from jni enter
// the current locking is from JNI instead of Java code
- TEVENT (jni_enter) ;
+ TEVENT(jni_enter);
if (UseBiasedLocking) {
BiasedLocking::revoke_and_rebias(obj, false, THREAD);
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
@@ -306,7 +307,7 @@ bool ObjectSynchronizer::jni_try_enter(Handle obj, Thread* THREAD) {
// NOTE: must use heavy weight monitor to handle jni monitor exit
void ObjectSynchronizer::jni_exit(oop obj, Thread* THREAD) {
- TEVENT (jni_exit) ;
+ TEVENT(jni_exit);
if (UseBiasedLocking) {
Handle h_obj(THREAD, obj);
BiasedLocking::revoke_and_rebias(h_obj, false, THREAD);
@@ -332,7 +333,7 @@ ObjectLocker::ObjectLocker(Handle obj, Thread* thread, bool doLock) {
_obj = obj;
if (_dolock) {
- TEVENT (ObjectLocker) ;
+ TEVENT(ObjectLocker);
ObjectSynchronizer::fast_enter(_obj, &_lock, false, _thread);
}
@@ -354,7 +355,7 @@ int ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) {
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
if (millis < 0) {
- TEVENT (wait - throw IAX) ;
+ TEVENT(wait - throw IAX);
THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
}
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());
@@ -374,10 +375,10 @@ void ObjectSynchronizer::waitUninterruptibly (Handle obj, jlong millis, TRAPS) {
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
if (millis < 0) {
- TEVENT (wait - throw IAX) ;
+ TEVENT(wait - throw IAX);
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
}
- ObjectSynchronizer::inflate(THREAD, obj()) -> wait(millis, false, THREAD) ;
+ ObjectSynchronizer::inflate(THREAD, obj()) -> wait(millis, false, THREAD);
}
void ObjectSynchronizer::notify(Handle obj, TRAPS) {
@@ -428,31 +429,31 @@ void ObjectSynchronizer::notifyall(Handle obj, TRAPS) {
struct SharedGlobals {
// These are highly shared mostly-read variables.
// To avoid false-sharing they need to be the sole occupants of a $ line.
- double padPrefix [8];
- volatile int stwRandom ;
- volatile int stwCycle ;
+ double padPrefix[8];
+ volatile int stwRandom;
+ volatile int stwCycle;
// Hot RW variables -- Sequester to avoid false-sharing
- double padSuffix [16];
- volatile int hcSequence ;
- double padFinal [8] ;
-} ;
+ double padSuffix[16];
+ volatile int hcSequence;
+ double padFinal[8];
+};
-static SharedGlobals GVars ;
-static int MonitorScavengeThreshold = 1000000 ;
-static volatile int ForceMonitorScavenge = 0 ; // Scavenge required and pending
+static SharedGlobals GVars;
+static int MonitorScavengeThreshold = 1000000;
+static volatile int ForceMonitorScavenge = 0; // Scavenge required and pending
static markOop ReadStableMark (oop obj) {
- markOop mark = obj->mark() ;
+ markOop mark = obj->mark();
if (!mark->is_being_inflated()) {
- return mark ; // normal fast-path return
+ return mark; // normal fast-path return
}
- int its = 0 ;
+ int its = 0;
for (;;) {
- markOop mark = obj->mark() ;
+ markOop mark = obj->mark();
if (!mark->is_being_inflated()) {
- return mark ; // normal fast-path return
+ return mark; // normal fast-path return
}
// The object is being inflated by some other thread.
@@ -465,11 +466,11 @@ static markOop ReadStableMark (oop obj) {
// TODO: add inflation contention performance counters.
// TODO: restrict the aggregate number of spinners.
- ++its ;
+ ++its;
if (its > 10000 || !os::is_MP()) {
if (its & 1) {
- os::NakedYield() ;
- TEVENT (Inflate: INFLATING - yield) ;
+ os::NakedYield();
+ TEVENT(Inflate: INFLATING - yield);
} else {
// Note that the following code attenuates the livelock problem but is not
// a complete remedy. A more complete solution would require that the inflating
@@ -486,26 +487,26 @@ static markOop ReadStableMark (oop obj) {
// then for each thread on the list, set the flag and unpark() the thread.
// This is conceptually similar to muxAcquire-muxRelease, except that muxRelease
// wakes at most one thread whereas we need to wake the entire list.
- int ix = (cast_from_oop(obj) >> 5) & (NINFLATIONLOCKS-1) ;
- int YieldThenBlock = 0 ;
- assert (ix >= 0 && ix < NINFLATIONLOCKS, "invariant") ;
- assert ((NINFLATIONLOCKS & (NINFLATIONLOCKS-1)) == 0, "invariant") ;
- Thread::muxAcquire (InflationLocks + ix, "InflationLock") ;
+ int ix = (cast_from_oop(obj) >> 5) & (NINFLATIONLOCKS-1);
+ int YieldThenBlock = 0;
+ assert(ix >= 0 && ix < NINFLATIONLOCKS, "invariant");
+ assert((NINFLATIONLOCKS & (NINFLATIONLOCKS-1)) == 0, "invariant");
+ Thread::muxAcquire(InflationLocks + ix, "InflationLock");
while (obj->mark() == markOopDesc::INFLATING()) {
// Beware: NakedYield() is advisory and has almost no effect on some platforms
// so we periodically call Self->_ParkEvent->park(1).
// We use a mixed spin/yield/block mechanism.
if ((YieldThenBlock++) >= 16) {
- Thread::current()->_ParkEvent->park(1) ;
+ Thread::current()->_ParkEvent->park(1);
} else {
- os::NakedYield() ;
+ os::NakedYield();
}
}
- Thread::muxRelease (InflationLocks + ix ) ;
- TEVENT (Inflate: INFLATING - yield/park) ;
+ Thread::muxRelease(InflationLocks + ix);
+ TEVENT(Inflate: INFLATING - yield/park);
}
} else {
- SpinPause() ; // SMP-polite spinning
+ SpinPause(); // SMP-polite spinning
}
}
}
@@ -529,48 +530,48 @@ static markOop ReadStableMark (oop obj) {
//
static inline intptr_t get_next_hash(Thread * Self, oop obj) {
- intptr_t value = 0 ;
+ intptr_t value = 0;
if (hashCode == 0) {
// This form uses an unguarded global Park-Miller RNG,
// so it's possible for two threads to race and generate the same RNG.
// On MP system we'll have lots of RW access to a global, so the
// mechanism induces lots of coherency traffic.
- value = os::random() ;
+ value = os::random();
} else
if (hashCode == 1) {
// This variation has the property of being stable (idempotent)
// between STW operations. This can be useful in some of the 1-0
// synchronization schemes.
- intptr_t addrBits = cast_from_oop(obj) >> 3 ;
- value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
+ intptr_t addrBits = cast_from_oop(obj) >> 3;
+ value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom;
} else
if (hashCode == 2) {
- value = 1 ; // for sensitivity testing
+ value = 1; // for sensitivity testing
} else
if (hashCode == 3) {
- value = ++GVars.hcSequence ;
+ value = ++GVars.hcSequence;
} else
if (hashCode == 4) {
- value = cast_from_oop(obj) ;
+ value = cast_from_oop(obj);
} else {
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
// likely make this the default in future releases.
- unsigned t = Self->_hashStateX ;
- t ^= (t << 11) ;
- Self->_hashStateX = Self->_hashStateY ;
- Self->_hashStateY = Self->_hashStateZ ;
- Self->_hashStateZ = Self->_hashStateW ;
- unsigned v = Self->_hashStateW ;
- v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
- Self->_hashStateW = v ;
- value = v ;
+ unsigned t = Self->_hashStateX;
+ t ^= (t << 11);
+ Self->_hashStateX = Self->_hashStateY;
+ Self->_hashStateY = Self->_hashStateZ;
+ Self->_hashStateZ = Self->_hashStateW;
+ unsigned v = Self->_hashStateW;
+ v = (v ^ (v >> 19)) ^ (t ^ (t >> 8));
+ Self->_hashStateW = v;
+ value = v;
}
value &= markOopDesc::hash_mask;
- if (value == 0) value = 0xBAD ;
- assert (value != markOopDesc::no_hash, "invariant") ;
- TEVENT (hashCode: GENERATE) ;
+ if (value == 0) value = 0xBAD;
+ assert(value != markOopDesc::no_hash, "invariant");
+ TEVENT(hashCode: GENERATE);
return value;
}
//
@@ -585,25 +586,25 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
// thread-local storage.
if (obj->mark()->has_bias_pattern()) {
// Box and unbox the raw reference just in case we cause a STW safepoint.
- Handle hobj (Self, obj) ;
+ Handle hobj(Self, obj);
// Relaxing assertion for bug 6320749.
- assert (Universe::verify_in_progress() ||
+ assert(Universe::verify_in_progress() ||
!SafepointSynchronize::is_at_safepoint(),
"biases should not be seen by VM thread here");
BiasedLocking::revoke_and_rebias(hobj, false, JavaThread::current());
- obj = hobj() ;
+ obj = hobj();
assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
}
}
// hashCode() is a heap mutator ...
// Relaxing assertion for bug 6320749.
- assert (Universe::verify_in_progress() ||
- !SafepointSynchronize::is_at_safepoint(), "invariant") ;
- assert (Universe::verify_in_progress() ||
- Self->is_Java_thread() , "invariant") ;
- assert (Universe::verify_in_progress() ||
- ((JavaThread *)Self)->thread_state() != _thread_blocked, "invariant") ;
+ assert(Universe::verify_in_progress() ||
+ !SafepointSynchronize::is_at_safepoint(), "invariant");
+ assert(Universe::verify_in_progress() ||
+ Self->is_Java_thread() , "invariant");
+ assert(Universe::verify_in_progress() ||
+ ((JavaThread *)Self)->thread_state() != _thread_blocked, "invariant");
ObjectMonitor* monitor = NULL;
markOop temp, test;
@@ -611,7 +612,7 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
markOop mark = ReadStableMark (obj);
// object should remain ineligible for biased locking
- assert (!mark->has_bias_pattern(), "invariant") ;
+ assert(!mark->has_bias_pattern(), "invariant");
if (mark->is_neutral()) {
hash = mark->hash(); // this is a normal header
@@ -631,7 +632,7 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
} else if (mark->has_monitor()) {
monitor = mark->monitor();
temp = monitor->header();
- assert (temp->is_neutral(), "invariant") ;
+ assert(temp->is_neutral(), "invariant");
hash = temp->hash();
if (hash) {
return hash;
@@ -639,7 +640,7 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
// Skip to the following code to reduce code size
} else if (Self->is_lock_owned((address)mark->locker())) {
temp = mark->displaced_mark_helper(); // this is a lightweight monitor owned
- assert (temp->is_neutral(), "invariant") ;
+ assert(temp->is_neutral(), "invariant");
hash = temp->hash(); // by current thread, check if the displaced
if (hash) { // header contains hash code
return hash;
@@ -659,20 +660,20 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
monitor = ObjectSynchronizer::inflate(Self, obj);
// Load displaced header and check it has hash code
mark = monitor->header();
- assert (mark->is_neutral(), "invariant") ;
+ assert(mark->is_neutral(), "invariant");
hash = mark->hash();
if (hash == 0) {
hash = get_next_hash(Self, obj);
temp = mark->copy_set_hash(hash); // merge hash code into header
- assert (temp->is_neutral(), "invariant") ;
+ assert(temp->is_neutral(), "invariant");
test = (markOop) Atomic::cmpxchg_ptr(temp, monitor, mark);
if (test != mark) {
// The only update to the header in the monitor (outside GC)
// is install the hash code. If someone add new usage of
// displaced header, please update this code
hash = test->hash();
- assert (test->is_neutral(), "invariant") ;
- assert (hash != 0, "Trivial unexpected object/monitor header usage.");
+ assert(test->is_neutral(), "invariant");
+ assert(hash != 0, "Trivial unexpected object/monitor header usage.");
}
}
// We finally get the hash
@@ -682,7 +683,7 @@ intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {
// Deprecated -- use FastHashCode() instead.
intptr_t ObjectSynchronizer::identity_hash_value_for(Handle obj) {
- return FastHashCode (Thread::current(), obj()) ;
+ return FastHashCode(Thread::current(), obj());
}
@@ -696,7 +697,7 @@ bool ObjectSynchronizer::current_thread_holds_lock(JavaThread* thread,
assert(thread == JavaThread::current(), "Can only be called on current thread");
oop obj = h_obj();
- markOop mark = ReadStableMark (obj) ;
+ markOop mark = ReadStableMark(obj);
// Uncontended case, header points to stack
if (mark->has_locker()) {
@@ -705,7 +706,7 @@ bool ObjectSynchronizer::current_thread_holds_lock(JavaThread* thread,
// Contended case, header points to ObjectMonitor (tagged pointer)
if (mark->has_monitor()) {
ObjectMonitor* monitor = mark->monitor();
- return monitor->is_entered(thread) != 0 ;
+ return monitor->is_entered(thread) != 0;
}
// Unlocked case, header in place
assert(mark->is_neutral(), "sanity check");
@@ -721,8 +722,8 @@ ObjectSynchronizer::LockOwnership ObjectSynchronizer::query_lock_ownership
(JavaThread *self, Handle h_obj) {
// The caller must beware this method can revoke bias, and
// revocation can result in a safepoint.
- assert (!SafepointSynchronize::is_at_safepoint(), "invariant") ;
- assert (self->thread_state() != _thread_blocked , "invariant") ;
+ assert(!SafepointSynchronize::is_at_safepoint(), "invariant");
+ assert(self->thread_state() != _thread_blocked , "invariant");
// Possible mark states: neutral, biased, stack-locked, inflated
@@ -735,7 +736,7 @@ ObjectSynchronizer::LockOwnership ObjectSynchronizer::query_lock_ownership
assert(self == JavaThread::current(), "Can only be called on current thread");
oop obj = h_obj();
- markOop mark = ReadStableMark (obj) ;
+ markOop mark = ReadStableMark(obj);
// CASE: stack-locked. Mark points to a BasicLock on the owner's stack.
if (mark->has_locker()) {
@@ -747,15 +748,15 @@ ObjectSynchronizer::LockOwnership ObjectSynchronizer::query_lock_ownership
// The Object:ObjectMonitor relationship is stable as long as we're
// not at a safepoint.
if (mark->has_monitor()) {
- void * owner = mark->monitor()->_owner ;
- if (owner == NULL) return owner_none ;
+ void * owner = mark->monitor()->_owner;
+ if (owner == NULL) return owner_none;
return (owner == self ||
self->is_lock_owned((address)owner)) ? owner_self : owner_other;
}
// CASE: neutral
assert(mark->is_neutral(), "sanity check");
- return owner_none ; // it's unlocked
+ return owner_none; // it's unlocked
}
// FIXME: jvmti should call this
@@ -772,7 +773,7 @@ JavaThread* ObjectSynchronizer::get_lock_owner(Handle h_obj, bool doLock) {
oop obj = h_obj();
address owner = NULL;
- markOop mark = ReadStableMark (obj) ;
+ markOop mark = ReadStableMark(obj);
// Uncontended case, header points to stack
if (mark->has_locker()) {
@@ -819,7 +820,7 @@ void ObjectSynchronizer::monitors_iterate(MonitorClosure* closure) {
// Get the next block in the block list.
static inline ObjectMonitor* next(ObjectMonitor* block) {
assert(block->object() == CHAINMARKER, "must be a block header");
- block = block->FreeNext ;
+ block = block->FreeNext;
assert(block == NULL || block->object() == CHAINMARKER, "must be a block header");
return block;
}
@@ -887,17 +888,17 @@ static void InduceScavenge (Thread * Self, const char * Whence) {
if (ForceMonitorScavenge == 0 && Atomic::xchg (1, &ForceMonitorScavenge) == 0) {
if (ObjectMonitor::Knob_Verbose) {
::printf ("Monitor scavenge - Induced STW @%s (%d)\n", Whence, ForceMonitorScavenge) ;
- ::fflush(stdout) ;
+ ::fflush(stdout);
}
// Induce a 'null' safepoint to scavenge monitors
// Must VM_Operation instance be heap allocated as the op will be enqueue and posted
// to the VMthread and have a lifespan longer than that of this activation record.
// The VMThread will delete the op when completed.
- VMThread::execute (new VM_ForceAsyncSafepoint()) ;
+ VMThread::execute(new VM_ForceAsyncSafepoint());
if (ObjectMonitor::Knob_Verbose) {
::printf ("Monitor scavenge - STW posted @%s (%d)\n", Whence, ForceMonitorScavenge) ;
- ::fflush(stdout) ;
+ ::fflush(stdout);
}
}
}
@@ -923,9 +924,9 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// number of objectMonitors in circulation as well as the STW
// scavenge costs. As usual, we lean toward time in space-time
// tradeoffs.
- const int MAXPRIVATE = 1024 ;
+ const int MAXPRIVATE = 1024;
for (;;) {
- ObjectMonitor * m ;
+ ObjectMonitor * m;
// 1: try to allocate from the thread's local omFreeList.
// Threads will attempt to allocate first from their local list, then
@@ -933,21 +934,21 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// attempt to instantiate new monitors. Thread-local free lists take
// heat off the ListLock and improve allocation latency, as well as reducing
// coherency traffic on the shared global list.
- m = Self->omFreeList ;
+ m = Self->omFreeList;
if (m != NULL) {
- Self->omFreeList = m->FreeNext ;
- Self->omFreeCount -- ;
+ Self->omFreeList = m->FreeNext;
+ Self->omFreeCount--;
// CONSIDER: set m->FreeNext = BAD -- diagnostic hygiene
- guarantee (m->object() == NULL, "invariant") ;
+ guarantee(m->object() == NULL, "invariant");
if (MonitorInUseLists) {
m->FreeNext = Self->omInUseList;
Self->omInUseList = m;
- Self->omInUseCount ++;
+ Self->omInUseCount++;
// verifyInUse(Self);
} else {
m->FreeNext = NULL;
}
- return m ;
+ return m;
}
// 2: try to allocate from the global gFreeList
@@ -959,27 +960,27 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// Reprovision the thread's omFreeList.
// Use bulk transfers to reduce the allocation rate and heat
// on various locks.
- Thread::muxAcquire (&ListLock, "omAlloc") ;
- for (int i = Self->omFreeProvision; --i >= 0 && gFreeList != NULL; ) {
- MonitorFreeCount --;
- ObjectMonitor * take = gFreeList ;
- gFreeList = take->FreeNext ;
- guarantee (take->object() == NULL, "invariant") ;
- guarantee (!take->is_busy(), "invariant") ;
- take->Recycle() ;
- omRelease (Self, take, false) ;
+ Thread::muxAcquire(&ListLock, "omAlloc");
+ for (int i = Self->omFreeProvision; --i >= 0 && gFreeList != NULL;) {
+ MonitorFreeCount--;
+ ObjectMonitor * take = gFreeList;
+ gFreeList = take->FreeNext;
+ guarantee(take->object() == NULL, "invariant");
+ guarantee(!take->is_busy(), "invariant");
+ take->Recycle();
+ omRelease(Self, take, false);
}
- Thread::muxRelease (&ListLock) ;
- Self->omFreeProvision += 1 + (Self->omFreeProvision/2) ;
- if (Self->omFreeProvision > MAXPRIVATE ) Self->omFreeProvision = MAXPRIVATE ;
- TEVENT (omFirst - reprovision) ;
+ Thread::muxRelease(&ListLock);
+ Self->omFreeProvision += 1 + (Self->omFreeProvision/2);
+ if (Self->omFreeProvision > MAXPRIVATE) Self->omFreeProvision = MAXPRIVATE;
+ TEVENT(omFirst - reprovision);
- const int mx = MonitorBound ;
+ const int mx = MonitorBound;
if (mx > 0 && (MonitorPopulation-MonitorFreeCount) > mx) {
// We can't safely induce a STW safepoint from omAlloc() as our thread
// state may not be appropriate for such activities and callers may hold
// naked oops, so instead we defer the action.
- InduceScavenge (Self, "omAlloc") ;
+ InduceScavenge(Self, "omAlloc");
}
continue;
}
@@ -987,14 +988,14 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// 3: allocate a block of new ObjectMonitors
// Both the local and global free lists are empty -- resort to malloc().
// In the current implementation objectMonitors are TSM - immortal.
- assert (_BLOCKSIZE > 1, "invariant") ;
+ assert(_BLOCKSIZE > 1, "invariant");
ObjectMonitor * temp = new ObjectMonitor[_BLOCKSIZE];
// NOTE: (almost) no way to recover if allocation failed.
// We might be able to induce a STW safepoint and scavenge enough
// objectMonitors to permit progress.
if (temp == NULL) {
- vm_exit_out_of_memory (sizeof (ObjectMonitor[_BLOCKSIZE]), OOM_MALLOC_ERROR,
+ vm_exit_out_of_memory(sizeof (ObjectMonitor[_BLOCKSIZE]), OOM_MALLOC_ERROR,
"Allocate ObjectMonitors");
}
@@ -1006,12 +1007,12 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// linkage should be reconsidered. A better implementation would
// look like: class Block { Block * next; int N; ObjectMonitor Body [N] ; }
- for (int i = 1; i < _BLOCKSIZE ; i++) {
+ for (int i = 1; i < _BLOCKSIZE; i++) {
temp[i].FreeNext = &temp[i+1];
}
// terminate the last monitor as the end of list
- temp[_BLOCKSIZE - 1].FreeNext = NULL ;
+ temp[_BLOCKSIZE - 1].FreeNext = NULL;
// Element [0] is reserved for global list linkage
temp[0].set_object(CHAINMARKER);
@@ -1022,7 +1023,7 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
// Acquire the ListLock to manipulate BlockList and FreeList.
// An Oyama-Taura-Yonezawa scheme might be more efficient.
- Thread::muxAcquire (&ListLock, "omAlloc [2]") ;
+ Thread::muxAcquire(&ListLock, "omAlloc [2]");
MonitorPopulation += _BLOCKSIZE-1;
MonitorFreeCount += _BLOCKSIZE-1;
@@ -1033,10 +1034,10 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
gBlockList = temp;
// Add the new string of objectMonitors to the global free list
- temp[_BLOCKSIZE - 1].FreeNext = gFreeList ;
+ temp[_BLOCKSIZE - 1].FreeNext = gFreeList;
gFreeList = temp + 1;
- Thread::muxRelease (&ListLock) ;
- TEVENT (Allocate block of monitors) ;
+ Thread::muxRelease(&ListLock);
+ TEVENT(Allocate block of monitors);
}
}
@@ -1049,12 +1050,12 @@ ObjectMonitor * ATTR ObjectSynchronizer::omAlloc (Thread * Self) {
//
void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromPerThreadAlloc) {
- guarantee (m->object() == NULL, "invariant") ;
+ guarantee(m->object() == NULL, "invariant");
// Remove from omInUseList
if (MonitorInUseLists && fromPerThreadAlloc) {
ObjectMonitor* curmidinuse = NULL;
- for (ObjectMonitor* mid = Self->omInUseList; mid != NULL; ) {
+ for (ObjectMonitor* mid = Self->omInUseList; mid != NULL;) {
if (m == mid) {
// extract from per-thread in-use-list
if (mid == Self->omInUseList) {
@@ -1062,7 +1063,7 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
} else if (curmidinuse != NULL) {
curmidinuse->FreeNext = mid->FreeNext; // maintain the current thread inuselist
}
- Self->omInUseCount --;
+ Self->omInUseCount--;
// verifyInUse(Self);
break;
} else {
@@ -1073,9 +1074,9 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
}
// FreeNext is used for both onInUseList and omFreeList, so clear old before setting new
- m->FreeNext = Self->omFreeList ;
- Self->omFreeList = m ;
- Self->omFreeCount ++ ;
+ m->FreeNext = Self->omFreeList;
+ Self->omFreeList = m;
+ Self->omFreeCount++;
}
// Return the monitors of a moribund thread's local free list to
@@ -1099,25 +1100,25 @@ void ObjectSynchronizer::omRelease (Thread * Self, ObjectMonitor * m, bool fromP
// operator.
void ObjectSynchronizer::omFlush (Thread * Self) {
- ObjectMonitor * List = Self->omFreeList ; // Null-terminated SLL
- Self->omFreeList = NULL ;
- ObjectMonitor * Tail = NULL ;
+ ObjectMonitor * List = Self->omFreeList; // Null-terminated SLL
+ Self->omFreeList = NULL;
+ ObjectMonitor * Tail = NULL;
int Tally = 0;
if (List != NULL) {
- ObjectMonitor * s ;
- for (s = List ; s != NULL ; s = s->FreeNext) {
- Tally ++ ;
- Tail = s ;
- guarantee (s->object() == NULL, "invariant") ;
- guarantee (!s->is_busy(), "invariant") ;
- s->set_owner (NULL) ; // redundant but good hygiene
- TEVENT (omFlush - Move one) ;
+ ObjectMonitor * s;
+ for (s = List; s != NULL; s = s->FreeNext) {
+ Tally++;
+ Tail = s;
+ guarantee(s->object() == NULL, "invariant");
+ guarantee(!s->is_busy(), "invariant");
+ s->set_owner(NULL); // redundant but good hygiene
+ TEVENT(omFlush - Move one);
}
- guarantee (Tail != NULL && List != NULL, "invariant") ;
+ guarantee(Tail != NULL && List != NULL, "invariant");
}
ObjectMonitor * InUseList = Self->omInUseList;
- ObjectMonitor * InUseTail = NULL ;
+ ObjectMonitor * InUseTail = NULL;
int InUseTally = 0;
if (InUseList != NULL) {
Self->omInUseList = NULL;
@@ -1129,13 +1130,13 @@ void ObjectSynchronizer::omFlush (Thread * Self) {
// TODO debug
assert(Self->omInUseCount == InUseTally, "inuse count off");
Self->omInUseCount = 0;
- guarantee (InUseTail != NULL && InUseList != NULL, "invariant");
+ guarantee(InUseTail != NULL && InUseList != NULL, "invariant");
}
- Thread::muxAcquire (&ListLock, "omFlush") ;
+ Thread::muxAcquire(&ListLock, "omFlush");
if (Tail != NULL) {
- Tail->FreeNext = gFreeList ;
- gFreeList = List ;
+ Tail->FreeNext = gFreeList;
+ gFreeList = List;
MonitorFreeCount += Tally;
}
@@ -1145,8 +1146,8 @@ void ObjectSynchronizer::omFlush (Thread * Self) {
gOmInUseCount += InUseTally;
}
- Thread::muxRelease (&ListLock) ;
- TEVENT (omFlush) ;
+ Thread::muxRelease(&ListLock);
+ TEVENT(omFlush);
}
// Fast path code shared by multiple functions
@@ -1168,12 +1169,12 @@ ObjectMonitor* ObjectSynchronizer::inflate_helper(oop obj) {
ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// Inflate mutates the heap ...
// Relaxing assertion for bug 6320749.
- assert (Universe::verify_in_progress() ||
- !SafepointSynchronize::is_at_safepoint(), "invariant") ;
+ assert(Universe::verify_in_progress() ||
+ !SafepointSynchronize::is_at_safepoint(), "invariant");
for (;;) {
- const markOop mark = object->mark() ;
- assert (!mark->has_bias_pattern(), "invariant") ;
+ const markOop mark = object->mark();
+ assert(!mark->has_bias_pattern(), "invariant");
// The mark can be in one of the following states:
// * Inflated - just return
@@ -1184,11 +1185,11 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// CASE: inflated
if (mark->has_monitor()) {
- ObjectMonitor * inf = mark->monitor() ;
- assert (inf->header()->is_neutral(), "invariant");
- assert (inf->object() == object, "invariant") ;
- assert (ObjectSynchronizer::verify_objmon_isinpool(inf), "monitor is invalid");
- return inf ;
+ ObjectMonitor * inf = mark->monitor();
+ assert(inf->header()->is_neutral(), "invariant");
+ assert(inf->object() == object, "invariant");
+ assert(ObjectSynchronizer::verify_objmon_isinpool(inf), "monitor is invalid");
+ return inf;
}
// CASE: inflation in progress - inflating over a stack-lock.
@@ -1198,9 +1199,9 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// Currently, we spin/yield/park and poll the markword, waiting for inflation to finish.
// We could always eliminate polling by parking the thread on some auxiliary list.
if (mark == markOopDesc::INFLATING()) {
- TEVENT (Inflate: spin while INFLATING) ;
- ReadStableMark(object) ;
- continue ;
+ TEVENT(Inflate: spin while INFLATING);
+ ReadStableMark(object);
+ continue;
}
// CASE: stack-locked
@@ -1223,20 +1224,20 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// See the comments in omAlloc().
if (mark->has_locker()) {
- ObjectMonitor * m = omAlloc (Self) ;
+ ObjectMonitor * m = omAlloc(Self);
// Optimistically prepare the objectmonitor - anticipate successful CAS
// We do this before the CAS in order to minimize the length of time
// in which INFLATING appears in the mark.
m->Recycle();
- m->_Responsible = NULL ;
- m->OwnerIsThread = 0 ;
- m->_recursions = 0 ;
- m->_SpinDuration = ObjectMonitor::Knob_SpinLimit ; // Consider: maintain by type/class
+ m->_Responsible = NULL;
+ m->OwnerIsThread = 0;
+ m->_recursions = 0;
+ m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // Consider: maintain by type/class
- markOop cmp = (markOop) Atomic::cmpxchg_ptr (markOopDesc::INFLATING(), object->mark_addr(), mark) ;
+ markOop cmp = (markOop) Atomic::cmpxchg_ptr(markOopDesc::INFLATING(), object->mark_addr(), mark);
if (cmp != mark) {
- omRelease (Self, m, true) ;
- continue ; // Interference -- just retry
+ omRelease(Self, m, true);
+ continue; // Interference -- just retry
}
// We've successfully installed INFLATING (0) into the mark-word.
@@ -1269,11 +1270,11 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// The owner can't die or unwind past the lock while our INFLATING
// object is in the mark. Furthermore the owner can't complete
// an unlock on the object, either.
- markOop dmw = mark->displaced_mark_helper() ;
- assert (dmw->is_neutral(), "invariant") ;
+ markOop dmw = mark->displaced_mark_helper();
+ assert(dmw->is_neutral(), "invariant");
// Setup monitor fields to proper values -- prepare the monitor
- m->set_header(dmw) ;
+ m->set_header(dmw);
// Optimization: if the mark->locker stack address is associated
// with this thread we could simply set m->_owner = Self and
@@ -1286,13 +1287,13 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// Must preserve store ordering. The monitor state must
// be stable at the time of publishing the monitor address.
- guarantee (object->mark() == markOopDesc::INFLATING(), "invariant") ;
+ guarantee(object->mark() == markOopDesc::INFLATING(), "invariant");
object->release_set_mark(markOopDesc::encode(m));
// Hopefully the performance counters are allocated on distinct cache lines
// to avoid false sharing on MP systems ...
- if (ObjectMonitor::_sync_Inflations != NULL) ObjectMonitor::_sync_Inflations->inc() ;
- TEVENT(Inflate: overwrite stacklock) ;
+ if (ObjectMonitor::_sync_Inflations != NULL) ObjectMonitor::_sync_Inflations->inc();
+ TEVENT(Inflate: overwrite stacklock);
if (TraceMonitorInflation) {
if (object->is_instance()) {
ResourceMark rm;
@@ -1301,7 +1302,7 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
object->klass()->external_name());
}
}
- return m ;
+ return m;
}
// CASE: neutral
@@ -1314,26 +1315,26 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// An inflateTry() method that we could call from fast_enter() and slow_enter()
// would be useful.
- assert (mark->is_neutral(), "invariant");
- ObjectMonitor * m = omAlloc (Self) ;
+ assert(mark->is_neutral(), "invariant");
+ ObjectMonitor * m = omAlloc(Self);
// prepare m for installation - set monitor to initial state
m->Recycle();
m->set_header(mark);
m->set_owner(NULL);
m->set_object(object);
- m->OwnerIsThread = 1 ;
- m->_recursions = 0 ;
- m->_Responsible = NULL ;
- m->_SpinDuration = ObjectMonitor::Knob_SpinLimit ; // consider: keep metastats by type/class
+ m->OwnerIsThread = 1;
+ m->_recursions = 0;
+ m->_Responsible = NULL;
+ m->_SpinDuration = ObjectMonitor::Knob_SpinLimit; // consider: keep metastats by type/class
if (Atomic::cmpxchg_ptr (markOopDesc::encode(m), object->mark_addr(), mark) != mark) {
- m->set_object (NULL) ;
- m->set_owner (NULL) ;
- m->OwnerIsThread = 0 ;
- m->Recycle() ;
- omRelease (Self, m, true) ;
- m = NULL ;
- continue ;
+ m->set_object(NULL);
+ m->set_owner(NULL);
+ m->OwnerIsThread = 0;
+ m->Recycle();
+ omRelease(Self, m, true);
+ m = NULL;
+ continue;
// interference - the markword changed - just retry.
// The state-transitions are one-way, so there's no chance of
// live-lock -- "Inflated" is an absorbing state.
@@ -1341,8 +1342,8 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
// Hopefully the performance counters are allocated on distinct
// cache lines to avoid false sharing on MP systems ...
- if (ObjectMonitor::_sync_Inflations != NULL) ObjectMonitor::_sync_Inflations->inc() ;
- TEVENT(Inflate: overwrite neutral) ;
+ if (ObjectMonitor::_sync_Inflations != NULL) ObjectMonitor::_sync_Inflations->inc();
+ TEVENT(Inflate: overwrite neutral);
if (TraceMonitorInflation) {
if (object->is_instance()) {
ResourceMark rm;
@@ -1351,7 +1352,7 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
object->klass()->external_name());
}
}
- return m ;
+ return m;
}
}
@@ -1391,7 +1392,7 @@ ObjectMonitor * ATTR ObjectSynchronizer::inflate (Thread * Self, oop object) {
enum ManifestConstants {
ClearResponsibleAtSTW = 0,
MaximumRecheckInterval = 1000
-} ;
+};
// Deflate a single monitor if not in use
// Return true if deflated, false if in use
@@ -1399,18 +1400,18 @@ bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
ObjectMonitor** FreeHeadp, ObjectMonitor** FreeTailp) {
bool deflated;
// Normal case ... The monitor is associated with obj.
- guarantee (obj->mark() == markOopDesc::encode(mid), "invariant") ;
- guarantee (mid == obj->mark()->monitor(), "invariant");
- guarantee (mid->header()->is_neutral(), "invariant");
+ guarantee(obj->mark() == markOopDesc::encode(mid), "invariant");
+ guarantee(mid == obj->mark()->monitor(), "invariant");
+ guarantee(mid->header()->is_neutral(), "invariant");
if (mid->is_busy()) {
- if (ClearResponsibleAtSTW) mid->_Responsible = NULL ;
+ if (ClearResponsibleAtSTW) mid->_Responsible = NULL;
deflated = false;
} else {
// Deflate the monitor if it is no longer being used
// It's idle - scavenge and return to the global free list
// plain old deflation ...
- TEVENT (deflate_idle_monitors - scavenge1) ;
+ TEVENT(deflate_idle_monitors - scavenge1);
if (TraceMonitorInflation) {
if (obj->is_instance()) {
ResourceMark rm;
@@ -1423,7 +1424,7 @@ bool ObjectSynchronizer::deflate_monitor(ObjectMonitor* mid, oop obj,
obj->release_set_mark(mid->header());
mid->clear();
- assert (mid->object() == NULL, "invariant") ;
+ assert(mid->object() == NULL, "invariant");
// Move the object to the working free list defined by FreeHead,FreeTail.
if (*FreeHeadp == NULL) *FreeHeadp = mid;
@@ -1446,7 +1447,7 @@ int ObjectSynchronizer::walk_monitor_list(ObjectMonitor** listheadp,
ObjectMonitor* curmidinuse = NULL;
int deflatedcount = 0;
- for (mid = *listheadp; mid != NULL; ) {
+ for (mid = *listheadp; mid != NULL;) {
oop obj = (oop) mid->object();
bool deflated = false;
if (obj != NULL) {
@@ -1473,19 +1474,19 @@ int ObjectSynchronizer::walk_monitor_list(ObjectMonitor** listheadp,
void ObjectSynchronizer::deflate_idle_monitors() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
- int nInuse = 0 ; // currently associated with objects
- int nInCirculation = 0 ; // extant
- int nScavenged = 0 ; // reclaimed
+ int nInuse = 0; // currently associated with objects
+ int nInCirculation = 0; // extant
+ int nScavenged = 0; // reclaimed
bool deflated = false;
- ObjectMonitor * FreeHead = NULL ; // Local SLL of scavenged monitors
- ObjectMonitor * FreeTail = NULL ;
+ ObjectMonitor * FreeHead = NULL; // Local SLL of scavenged monitors
+ ObjectMonitor * FreeTail = NULL;
- TEVENT (deflate_idle_monitors) ;
+ TEVENT(deflate_idle_monitors);
// Prevent omFlush from changing mids in Thread dtor's during deflation
// And in case the vm thread is acquiring a lock during a safepoint
// See e.g. 6320749
- Thread::muxAcquire (&ListLock, "scavenge - return") ;
+ Thread::muxAcquire(&ListLock, "scavenge - return");
if (MonitorInUseLists) {
int inUse = 0;
@@ -1510,8 +1511,8 @@ void ObjectSynchronizer::deflate_idle_monitors() {
} else for (ObjectMonitor* block = gBlockList; block != NULL; block = next(block)) {
// Iterate over all extant monitors - Scavenge all idle monitors.
assert(block->object() == CHAINMARKER, "must be a block header");
- nInCirculation += _BLOCKSIZE ;
- for (int i = 1 ; i < _BLOCKSIZE; i++) {
+ nInCirculation += _BLOCKSIZE;
+ for (int i = 1; i < _BLOCKSIZE; i++) {
ObjectMonitor* mid = &block[i];
oop obj = (oop) mid->object();
@@ -1520,16 +1521,16 @@ void ObjectSynchronizer::deflate_idle_monitors() {
// The monitor should either be a thread-specific private
// free list or the global free list.
// obj == NULL IMPLIES mid->is_busy() == 0
- guarantee (!mid->is_busy(), "invariant") ;
- continue ;
+ guarantee(!mid->is_busy(), "invariant");
+ continue;
}
deflated = deflate_monitor(mid, obj, &FreeHead, &FreeTail);
if (deflated) {
- mid->FreeNext = NULL ;
- nScavenged ++ ;
+ mid->FreeNext = NULL;
+ nScavenged++;
} else {
- nInuse ++;
+ nInuse++;
}
}
}
@@ -1539,31 +1540,31 @@ void ObjectSynchronizer::deflate_idle_monitors() {
// Consider: audit gFreeList to ensure that MonitorFreeCount and list agree.
if (ObjectMonitor::Knob_Verbose) {
- ::printf ("Deflate: InCirc=%d InUse=%d Scavenged=%d ForceMonitorScavenge=%d : pop=%d free=%d\n",
+ ::printf("Deflate: InCirc=%d InUse=%d Scavenged=%d ForceMonitorScavenge=%d : pop=%d free=%d\n",
nInCirculation, nInuse, nScavenged, ForceMonitorScavenge,
- MonitorPopulation, MonitorFreeCount) ;
- ::fflush(stdout) ;
+ MonitorPopulation, MonitorFreeCount);
+ ::fflush(stdout);
}
ForceMonitorScavenge = 0; // Reset
// Move the scavenged monitors back to the global free list.
if (FreeHead != NULL) {
- guarantee (FreeTail != NULL && nScavenged > 0, "invariant") ;
- assert (FreeTail->FreeNext == NULL, "invariant") ;
+ guarantee(FreeTail != NULL && nScavenged > 0, "invariant");
+ assert(FreeTail->FreeNext == NULL, "invariant");
// constant-time list splice - prepend scavenged segment to gFreeList
- FreeTail->FreeNext = gFreeList ;
- gFreeList = FreeHead ;
+ FreeTail->FreeNext = gFreeList;
+ gFreeList = FreeHead;
}
- Thread::muxRelease (&ListLock) ;
+ Thread::muxRelease(&ListLock);
- if (ObjectMonitor::_sync_Deflations != NULL) ObjectMonitor::_sync_Deflations->inc(nScavenged) ;
+ if (ObjectMonitor::_sync_Deflations != NULL) ObjectMonitor::_sync_Deflations->inc(nScavenged);
if (ObjectMonitor::_sync_MonExtant != NULL) ObjectMonitor::_sync_MonExtant ->set_value(nInCirculation);
// TODO: Add objectMonitor leak detection.
// Audit/inventory the objectMonitors -- make sure they're all accounted for.
- GVars.stwRandom = os::random() ;
- GVars.stwCycle ++ ;
+ GVars.stwRandom = os::random();
+ GVars.stwCycle++;
}
// Monitor cleanup on JavaThread::exit
@@ -1601,7 +1602,7 @@ public:
void ObjectSynchronizer::release_monitors_owned_by_thread(TRAPS) {
assert(THREAD == JavaThread::current(), "must be current Java thread");
- No_Safepoint_Verifier nsv ;
+ No_Safepoint_Verifier nsv;
ReleaseJavaMonitorsClosure rjmc(THREAD);
Thread::muxAcquire(&ListLock, "release_monitors_owned_by_thread");
ObjectSynchronizer::monitors_iterate(&rjmc);
diff --git a/hotspot/src/share/vm/runtime/synchronizer.hpp b/hotspot/src/share/vm/runtime/synchronizer.hpp
index 4f95b31350d..bf3959be688 100644
--- a/hotspot/src/share/vm/runtime/synchronizer.hpp
+++ b/hotspot/src/share/vm/runtime/synchronizer.hpp
@@ -75,7 +75,7 @@ class ObjectSynchronizer : AllStatic {
// Special internal-use-only method for use by JVM infrastructure
// that needs to wait() on a java-level object but that can't risk
// throwing unexpected InterruptedExecutionExceptions.
- static void waitUninterruptibly (Handle obj, jlong Millis, Thread * THREAD) ;
+ static void waitUninterruptibly(Handle obj, jlong Millis, Thread * THREAD);
// used by classloading to free classloader object lock,
// wait on an internal lock, and reclaim original lock
@@ -85,9 +85,9 @@ class ObjectSynchronizer : AllStatic {
// thread-specific and global objectMonitor free list accessors
// static void verifyInUse (Thread * Self) ; too slow for general assert/debug
- static ObjectMonitor * omAlloc (Thread * Self) ;
- static void omRelease (Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc) ;
- static void omFlush (Thread * Self) ;
+ static ObjectMonitor * omAlloc(Thread * Self);
+ static void omRelease(Thread * Self, ObjectMonitor * m, bool FromPerThreadAlloc);
+ static void omFlush(Thread * Self);
// Inflate light weight monitor to heavy weight monitor
static ObjectMonitor* inflate(Thread * Self, oop obj);
@@ -97,7 +97,7 @@ class ObjectSynchronizer : AllStatic {
// Returns the identity hash value for an oop
// NOTE: It may cause monitor inflation
static intptr_t identity_hash_value_for(Handle obj);
- static intptr_t FastHashCode (Thread * Self, oop obj) ;
+ static intptr_t FastHashCode(Thread * Self, oop obj);
// java.lang.Thread support
static bool current_thread_holds_lock(JavaThread* thread, Handle h_obj);
@@ -124,7 +124,7 @@ class ObjectSynchronizer : AllStatic {
static void verify() PRODUCT_RETURN;
static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
- static void RegisterSpinCallback (int (*)(intptr_t, int), intptr_t) ;
+ static void RegisterSpinCallback(int(*)(intptr_t, int), intptr_t);
private:
enum { _BLOCKSIZE = 128 };
@@ -155,7 +155,7 @@ class ObjectLocker : public StackObj {
// Monitor behavior
void wait (TRAPS) { ObjectSynchronizer::wait (_obj, 0, CHECK); } // wait forever
void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); }
- void waitUninterruptibly (TRAPS) { ObjectSynchronizer::waitUninterruptibly (_obj, 0, CHECK);}
+ void waitUninterruptibly (TRAPS) { ObjectSynchronizer::waitUninterruptibly (_obj, 0, CHECK); }
// complete_exit gives up lock completely, returning recursion count
// reenter reclaims lock with original recursion count
intptr_t complete_exit(TRAPS) { return ObjectSynchronizer::complete_exit(_obj, CHECK_0); }
diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp
index e9e9d22f197..05cb340ae85 100644
--- a/hotspot/src/share/vm/runtime/thread.cpp
+++ b/hotspot/src/share/vm/runtime/thread.cpp
@@ -46,6 +46,7 @@
#include "prims/jvmtiThreadState.hpp"
#include "prims/privilegedStack.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/fprofiler.hpp"
@@ -225,11 +226,11 @@ Thread::Thread() {
_current_pending_monitor_is_from_java = true;
_current_waiting_monitor = NULL;
_num_nested_signal = 0;
- omFreeList = NULL ;
- omFreeCount = 0 ;
- omFreeProvision = 32 ;
- omInUseList = NULL ;
- omInUseCount = 0 ;
+ omFreeList = NULL;
+ omFreeCount = 0;
+ omFreeProvision = 32;
+ omInUseList = NULL;
+ omInUseCount = 0;
#ifdef ASSERT
_visited_for_critical_count = false;
@@ -239,15 +240,15 @@ Thread::Thread() {
_suspend_flags = 0;
// thread-specific hashCode stream generator state - Marsaglia shift-xor form
- _hashStateX = os::random() ;
- _hashStateY = 842502087 ;
- _hashStateZ = 0x8767 ; // (int)(3579807591LL & 0xffff) ;
- _hashStateW = 273326509 ;
+ _hashStateX = os::random();
+ _hashStateY = 842502087;
+ _hashStateZ = 0x8767; // (int)(3579807591LL & 0xffff) ;
+ _hashStateW = 273326509;
- _OnTrap = 0 ;
- _schedctl = NULL ;
- _Stalled = 0 ;
- _TypeTag = 0x2BAD ;
+ _OnTrap = 0;
+ _schedctl = NULL;
+ _Stalled = 0;
+ _TypeTag = 0x2BAD;
// Many of the following fields are effectively final - immutable
// Note that nascent threads can't use the Native Monitor-Mutex
@@ -256,10 +257,10 @@ Thread::Thread() {
// we might instead use a stack of ParkEvents that we could provision on-demand.
// The stack would act as a cache to avoid calls to ParkEvent::Allocate()
// and ::Release()
- _ParkEvent = ParkEvent::Allocate (this) ;
- _SleepEvent = ParkEvent::Allocate (this) ;
- _MutexEvent = ParkEvent::Allocate (this) ;
- _MuxEvent = ParkEvent::Allocate (this) ;
+ _ParkEvent = ParkEvent::Allocate(this);
+ _SleepEvent = ParkEvent::Allocate(this);
+ _MutexEvent = ParkEvent::Allocate(this);
+ _MuxEvent = ParkEvent::Allocate(this);
#ifdef CHECK_UNHANDLED_OOPS
if (CheckUnhandledOops) {
@@ -314,7 +315,7 @@ void Thread::record_stack_base_and_size() {
Thread::~Thread() {
// Reclaim the objectmonitors from the omFreeList of the moribund thread.
- ObjectSynchronizer::omFlush (this) ;
+ ObjectSynchronizer::omFlush(this);
EVENT_THREAD_DESTRUCT(this);
@@ -342,10 +343,10 @@ Thread::~Thread() {
// It's possible we can encounter a null _ParkEvent, etc., in stillborn threads.
// We NULL out the fields for good hygiene.
- ParkEvent::Release (_ParkEvent) ; _ParkEvent = NULL ;
- ParkEvent::Release (_SleepEvent) ; _SleepEvent = NULL ;
- ParkEvent::Release (_MutexEvent) ; _MutexEvent = NULL ;
- ParkEvent::Release (_MuxEvent) ; _MuxEvent = NULL ;
+ ParkEvent::Release(_ParkEvent); _ParkEvent = NULL;
+ ParkEvent::Release(_SleepEvent); _SleepEvent = NULL;
+ ParkEvent::Release(_MutexEvent); _MutexEvent = NULL;
+ ParkEvent::Release(_MuxEvent); _MuxEvent = NULL;
delete handle_area();
delete metadata_handles();
@@ -844,7 +845,7 @@ void Thread::print_on(outputStream* st) const {
// Thread::print_on_error() is called by fatal error handler. Don't use
// any lock or allocate memory.
void Thread::print_on_error(outputStream* st, char* buf, int buflen) const {
- if (is_VM_thread()) st->print("VMThread");
+ if (is_VM_thread()) st->print("VMThread");
else if (is_Compiler_thread()) st->print("CompilerThread");
else if (is_Java_thread()) st->print("JavaThread");
else if (is_GC_task_thread()) st->print("GCTaskThread");
@@ -867,7 +868,7 @@ void Thread::print_owned_locks_on(outputStream* st) const {
st->print(" (no locks) ");
} else {
st->print_cr(" Locks owned:");
- while(cur) {
+ while (cur) {
cur->print_on(st);
cur = cur->next();
}
@@ -877,7 +878,7 @@ void Thread::print_owned_locks_on(outputStream* st) const {
static int ref_use_count = 0;
bool Thread::owns_locks_but_compiled_lock() const {
- for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
+ for (Monitor *cur = _owned_locks; cur; cur = cur->next()) {
if (cur != Compile_lock) return true;
}
return false;
@@ -904,12 +905,12 @@ void Thread::check_for_valid_safepoint_state(bool potential_vm_operation) {
&& !Universe::is_bootstrapping()) {
// Make sure we do not hold any locks that the VM thread also uses.
// This could potentially lead to deadlocks
- for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
+ for (Monitor *cur = _owned_locks; cur; cur = cur->next()) {
// Threads_lock is special, since the safepoint synchronization will not start before this is
// acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
// since it is used to transfer control between JavaThreads and the VMThread
// Do not *exclude* any locks unless you are absolutely sure it is correct. Ask someone else first!
- if ( (cur->allow_vm_block() &&
+ if ((cur->allow_vm_block() &&
cur != Threads_lock &&
cur != Compile_lock && // Temporary: should not be necessary when we get separate compilation
cur != VMOperationRequest_lock &&
@@ -1291,9 +1292,9 @@ void WatcherThread::run() {
this->record_stack_base_and_size();
this->initialize_thread_local_storage();
this->set_active_handles(JNIHandleBlock::allocate_block());
- while(!_should_terminate) {
- assert(watcher_thread() == Thread::current(), "thread consistency check");
- assert(watcher_thread() == this, "thread consistency check");
+ while (!_should_terminate) {
+ assert(watcher_thread() == Thread::current(), "thread consistency check");
+ assert(watcher_thread() == this, "thread consistency check");
// Calculate how long it'll be until the next PeriodicTask work
// should be done, and sleep that amount of time.
@@ -1357,20 +1358,30 @@ void WatcherThread::make_startable() {
}
void WatcherThread::stop() {
- {
- MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag);
- _should_terminate = true;
- OrderAccess::fence(); // ensure WatcherThread sees update in main loop
+ // Get the PeriodicTask_lock if we can. If we cannot, then the
+ // WatcherThread is using it and we don't want to block on that lock
+ // here because that might cause a safepoint deadlock depending on
+ // what the current WatcherThread tasks are doing.
+ bool have_lock = PeriodicTask_lock->try_lock();
+ _should_terminate = true;
+ OrderAccess::fence(); // ensure WatcherThread sees update in main loop
+
+ if (have_lock) {
WatcherThread* watcher = watcher_thread();
- if (watcher != NULL)
+ if (watcher != NULL) {
+ // If we managed to get the lock, then we should unpark the
+ // WatcherThread so that it can see we want it to stop.
watcher->unpark();
+ }
+
+ PeriodicTask_lock->unlock();
}
// it is ok to take late safepoints here, if needed
MutexLocker mu(Terminator_lock);
- while(watcher_thread() != NULL) {
+ while (watcher_thread() != NULL) {
// This wait should make safepoint checks, wait without a timeout,
// and wait as a suspend-equivalent condition.
//
@@ -1448,13 +1459,14 @@ void JavaThread::initialize() {
_thread_stat = new ThreadStatistics();
_blocked_on_compilation = false;
_jni_active_critical = 0;
+ _pending_jni_exception_check_fn = NULL;
_do_not_unlock_if_synchronized = false;
_cached_monitor_info = NULL;
- _parker = Parker::Allocate(this) ;
+ _parker = Parker::Allocate(this);
#ifndef PRODUCT
_jmp_ring_index = 0;
- for (int ji = 0 ; ji < jump_ring_buffer_size ; ji++ ) {
+ for (int ji = 0; ji < jump_ring_buffer_size; ji++) {
record_jump(NULL, NULL, NULL, 0);
}
#endif /* PRODUCT */
@@ -1591,7 +1603,7 @@ JavaThread::~JavaThread() {
// JSR166 -- return the parker to the free list
Parker::Release(_parker);
- _parker = NULL ;
+ _parker = NULL;
// Free any remaining previous UnrollBlock
vframeArray* old_array = vframe_array_last();
@@ -1717,7 +1729,7 @@ static void ensure_join(JavaThread* thread) {
// For any new cleanup additions, please check to see if they need to be applied to
// cleanup_failed_attach_current_thread as well.
void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
- assert(this == JavaThread::current(), "thread consistency check");
+ assert(this == JavaThread::current(), "thread consistency check");
HandleMark hm(this);
Handle uncaught_exception(this, this->pending_exception());
@@ -1738,55 +1750,26 @@ void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
CLEAR_PENDING_EXCEPTION;
}
- // FIXIT: The is_null check is only so it works better on JDK1.2 VM's. This
- // has to be fixed by a runtime query method
- if (!destroy_vm || JDK_Version::is_jdk12x_version()) {
- // JSR-166: change call from from ThreadGroup.uncaughtException to
- // java.lang.Thread.dispatchUncaughtException
+ if (!destroy_vm) {
if (uncaught_exception.not_null()) {
- Handle group(this, java_lang_Thread::threadGroup(threadObj()));
- {
- EXCEPTION_MARK;
- // Check if the method Thread.dispatchUncaughtException() exists. If so
- // call it. Otherwise we have an older library without the JSR-166 changes,
- // so call ThreadGroup.uncaughtException()
- KlassHandle recvrKlass(THREAD, threadObj->klass());
- CallInfo callinfo;
- KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
- LinkResolver::resolve_virtual_call(callinfo, threadObj, recvrKlass, thread_klass,
- vmSymbols::dispatchUncaughtException_name(),
- vmSymbols::throwable_void_signature(),
- KlassHandle(), false, false, THREAD);
+ EXCEPTION_MARK;
+ // Call method Thread.dispatchUncaughtException().
+ KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
+ JavaValue result(T_VOID);
+ JavaCalls::call_virtual(&result,
+ threadObj, thread_klass,
+ vmSymbols::dispatchUncaughtException_name(),
+ vmSymbols::throwable_void_signature(),
+ uncaught_exception,
+ THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ ResourceMark rm(this);
+ jio_fprintf(defaultStream::error_stream(),
+ "\nException: %s thrown from the UncaughtExceptionHandler"
+ " in thread \"%s\"\n",
+ pending_exception()->klass()->external_name(),
+ get_thread_name());
CLEAR_PENDING_EXCEPTION;
- methodHandle method = callinfo.selected_method();
- if (method.not_null()) {
- JavaValue result(T_VOID);
- JavaCalls::call_virtual(&result,
- threadObj, thread_klass,
- vmSymbols::dispatchUncaughtException_name(),
- vmSymbols::throwable_void_signature(),
- uncaught_exception,
- THREAD);
- } else {
- KlassHandle thread_group(THREAD, SystemDictionary::ThreadGroup_klass());
- JavaValue result(T_VOID);
- JavaCalls::call_virtual(&result,
- group, thread_group,
- vmSymbols::uncaughtException_name(),
- vmSymbols::thread_throwable_void_signature(),
- threadObj, // Arg 1
- uncaught_exception, // Arg 2
- THREAD);
- }
- if (HAS_PENDING_EXCEPTION) {
- ResourceMark rm(this);
- jio_fprintf(defaultStream::error_stream(),
- "\nException: %s thrown from the UncaughtExceptionHandler"
- " in thread \"%s\"\n",
- pending_exception()->klass()->external_name(),
- get_thread_name());
- CLEAR_PENDING_EXCEPTION;
- }
}
}
@@ -2086,7 +2069,7 @@ void JavaThread::check_and_handle_async_exceptions(bool check_unsafe_error) {
if (TraceExceptions) {
ResourceMark rm;
tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this);
- if (has_last_Java_frame() ) {
+ if (has_last_Java_frame()) {
frame f = last_frame();
tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp());
}
@@ -2330,11 +2313,11 @@ int JavaThread::java_suspend_self() {
void JavaThread::verify_not_published() {
if (!Threads_lock->owned_by_self()) {
MutexLockerEx ml(Threads_lock, Mutex::_no_safepoint_check_flag);
- assert( !Threads::includes(this),
+ assert(!Threads::includes(this),
"java thread shouldn't have been published yet!");
}
else {
- assert( !Threads::includes(this),
+ assert(!Threads::includes(this),
"java thread shouldn't have been published yet!");
}
}
@@ -2403,7 +2386,7 @@ void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread
thread->clear_deopt_suspend();
RegisterMap map(thread, false);
frame f = thread->last_frame();
- while ( f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
+ while (f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
f = f.sender(&map);
}
if (f.id() == thread->must_deopt_id()) {
@@ -2527,8 +2510,8 @@ void JavaThread::enable_stack_yellow_zone() {
// We need to adjust it to work correctly with guard_memory()
address base = stack_yellow_zone_base() - stack_yellow_zone_size();
- guarantee(base < stack_base(),"Error calculating stack yellow zone");
- guarantee(base < os::current_stack_pointer(),"Error calculating stack yellow zone");
+ guarantee(base < stack_base(), "Error calculating stack yellow zone");
+ guarantee(base < os::current_stack_pointer(), "Error calculating stack yellow zone");
if (os::guard_memory((char *) base, stack_yellow_zone_size())) {
_stack_guard_state = stack_guard_enabled;
@@ -2563,10 +2546,10 @@ void JavaThread::enable_stack_red_zone() {
assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
address base = stack_red_zone_base() - stack_red_zone_size();
- guarantee(base < stack_base(),"Error calculating stack red zone");
- guarantee(base < os::current_stack_pointer(),"Error calculating stack red zone");
+ guarantee(base < stack_base(), "Error calculating stack red zone");
+ guarantee(base < os::current_stack_pointer(), "Error calculating stack red zone");
- if(!os::guard_memory((char *) base, stack_red_zone_size())) {
+ if (!os::guard_memory((char *) base, stack_red_zone_size())) {
warning("Attempt to guard stack red zone failed.");
}
}
@@ -2585,7 +2568,7 @@ void JavaThread::frames_do(void f(frame*, const RegisterMap* map)) {
// ignore is there is no stack
if (!has_last_Java_frame()) return;
// traverse the stack frames. Starts from top frame.
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
frame* fr = fst.current();
f(fr, fst.register_map());
}
@@ -2601,8 +2584,8 @@ void JavaThread::deoptimize() {
bool deopt = false; // Dump stack only if a deopt actually happens.
bool only_at = strlen(DeoptimizeOnlyAt) > 0;
// Iterate over all frames in the thread and deoptimize
- for(; !fst.is_done(); fst.next()) {
- if(fst.current()->can_be_deoptimized()) {
+ for (; !fst.is_done(); fst.next()) {
+ if (fst.current()->can_be_deoptimized()) {
if (only_at) {
// Deoptimize only at particular bcis. DeoptimizeOnlyAt
@@ -2647,7 +2630,7 @@ void JavaThread::deoptimize() {
// Make zombies
void JavaThread::make_zombies() {
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
if (fst.current()->can_be_deoptimized()) {
// it is a Java nmethod
nmethod* nm = CodeCache::find_nmethod(fst.current()->pc());
@@ -2662,7 +2645,7 @@ void JavaThread::deoptimized_wrt_marked_nmethods() {
if (!has_last_Java_frame()) return;
// BiasedLocking needs an updated RegisterMap for the revoke monitors pass
StackFrameStream fst(this, UseBiasedLocking);
- for(; !fst.is_done(); fst.next()) {
+ for (; !fst.is_done(); fst.next()) {
if (fst.current()->should_be_deoptimized()) {
if (LogCompilation && xtty != NULL) {
nmethod* nm = fst.current()->cb()->as_nmethod_or_null();
@@ -2722,7 +2705,7 @@ void JavaThread::oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf)
// Traverse the GCHandles
Thread::oops_do(f, cld_f, cf);
- assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
+ assert((!has_last_Java_frame() && java_call_counter() == 0) ||
(has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
if (has_last_Java_frame()) {
@@ -2747,7 +2730,7 @@ void JavaThread::oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf)
}
// Traverse the execution stack
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
fst.current()->oops_do(f, cld_f, cf, fst.register_map());
}
}
@@ -2782,12 +2765,12 @@ void JavaThread::oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf)
void JavaThread::nmethods_do(CodeBlobClosure* cf) {
Thread::nmethods_do(cf); // (super method is a no-op)
- assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
+ assert((!has_last_Java_frame() && java_call_counter() == 0) ||
(has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
if (has_last_Java_frame()) {
// Traverse the execution stack
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
fst.current()->nmethods_do(cf);
}
}
@@ -2797,7 +2780,7 @@ void JavaThread::metadata_do(void f(Metadata*)) {
Thread::metadata_do(f);
if (has_last_Java_frame()) {
// Traverse the execution stack to call f() on the methods in the stack
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
fst.current()->metadata_do(f);
}
} else if (is_Compiler_thread()) {
@@ -2848,7 +2831,7 @@ void JavaThread::print_on(outputStream *st) const {
Thread::print_on(st);
// print guess for valid stack memory region (assume 4K pages); helps lock debugging
st->print_cr("[" INTPTR_FORMAT "]", (intptr_t)last_Java_sp() & ~right_n_bits(12));
- if (thread_oop != NULL && JDK_Version::is_gte_jdk15x_version()) {
+ if (thread_oop != NULL) {
st->print_cr(" java.lang.Thread.State: %s", java_lang_Thread::thread_status_name(thread_oop));
}
#ifndef PRODUCT
@@ -2860,7 +2843,7 @@ void JavaThread::print_on(outputStream *st) const {
// Called by fatal error handler. The difference between this and
// JavaThread::print() is that we can't grab lock or allocate memory.
void JavaThread::print_on_error(outputStream* st, char *buf, int buflen) const {
- st->print("JavaThread \"%s\"", get_thread_name_string(buf, buflen));
+ st->print("JavaThread \"%s\"", get_thread_name_string(buf, buflen));
oop thread_obj = threadObj();
if (thread_obj != NULL) {
if (java_lang_Thread::is_daemon(thread_obj)) st->print(" daemon");
@@ -3043,7 +3026,7 @@ void JavaThread::print_stack_on(outputStream* st) {
RegisterMap reg_map(this);
vframe* start_vf = last_java_vframe(®_map);
int count = 0;
- for (vframe* f = start_vf; f; f = f->sender() ) {
+ for (vframe* f = start_vf; f; f = f->sender()) {
if (f->is_java_frame()) {
javaVFrame* jvf = javaVFrame::cast(f);
java_lang_Throwable::print_stack_element(st, jvf->method(), jvf->bci());
@@ -3099,9 +3082,9 @@ void JavaThread::popframe_free_preserved_args() {
void JavaThread::trace_frames() {
tty->print_cr("[Describe stack]");
int frame_no = 1;
- for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this); !fst.is_done(); fst.next()) {
tty->print(" %d. ", frame_no++);
- fst.current()->print_value_on(tty,this);
+ fst.current()->print_value_on(tty, this);
tty->cr();
}
}
@@ -3152,7 +3135,7 @@ void JavaThread::print_frame_layout(int depth, bool validate_only) {
PRESERVE_EXCEPTION_MARK;
FrameValues values;
int frame_no = 0;
- for(StackFrameStream fst(this, false); !fst.is_done(); fst.next()) {
+ for (StackFrameStream fst(this, false); !fst.is_done(); fst.next()) {
fst.current()->describe(values, ++frame_no);
if (depth == frame_no) break;
}
@@ -3168,7 +3151,7 @@ void JavaThread::print_frame_layout(int depth, bool validate_only) {
void JavaThread::trace_stack_from(vframe* start_vf) {
ResourceMark rm;
int vframe_no = 1;
- for (vframe* f = start_vf; f; f = f->sender() ) {
+ for (vframe* f = start_vf; f; f = f->sender()) {
if (f->is_java_frame()) {
javaVFrame::cast(f)->print_activation(vframe_no++);
} else {
@@ -3197,7 +3180,7 @@ void JavaThread::trace_stack() {
javaVFrame* JavaThread::last_java_vframe(RegisterMap *reg_map) {
assert(reg_map != NULL, "a map must be given");
frame f = last_frame();
- for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender() ) {
+ for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender()) {
if (vf->is_java_frame()) return javaVFrame::cast(vf);
}
return NULL;
@@ -3319,7 +3302,7 @@ void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) {
// The VM preresolves methods to these classes. Make sure that they get initialized
initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK);
- initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK);
+ initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK);
call_initializeSystemClass(CHECK);
// get the Java runtime name after java.lang.System is initialized
@@ -3453,7 +3436,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
main_thread->create_stack_guard_pages();
// Initialize Java-Level synchronization subsystem
- ObjectMonitor::Initialize() ;
+ ObjectMonitor::Initialize();
// Second phase of bootstrapping, VM is about entering multi-thread mode
MemTracker::bootstrap_multi_thread();
@@ -3501,7 +3484,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
}
}
- assert (Universe::is_fully_initialized(), "not initialized");
+ assert(Universe::is_fully_initialized(), "not initialized");
if (VerifyDuringStartup) {
// Make sure we're starting with a clean slate.
VM_Verify verify_op;
@@ -3927,7 +3910,7 @@ bool Threads::destroy_vm() {
#endif
// Wait until we are the last non-daemon thread to execute
{ MutexLocker nu(Threads_lock);
- while (Threads::number_of_non_daemon_threads() > 1 )
+ while (Threads::number_of_non_daemon_threads() > 1)
// This wait should make safepoint checks, wait without a timeout,
// and wait as a suspend-equivalent condition.
//
@@ -3948,15 +3931,8 @@ bool Threads::destroy_vm() {
}
os::wait_for_keypress_at_exit();
- if (JDK_Version::is_jdk12x_version()) {
- // We are the last thread running, so check if finalizers should be run.
- // For 1.3 or later this is done in thread->invoke_shutdown_hooks()
- HandleMark rm(thread);
- Universe::run_finalizers_on_exit();
- } else {
- // run Java level shutdown hooks
- thread->invoke_shutdown_hooks();
- }
+ // run Java level shutdown hooks
+ thread->invoke_shutdown_hooks();
before_exit(thread);
@@ -3968,14 +3944,8 @@ bool Threads::destroy_vm() {
// GC vm_operations can get caught at the safepoint, and the
// heap is unparseable if they are caught. Grab the Heap_lock
// to prevent this. The GC vm_operations will not be able to
- // queue until after the vm thread is dead.
- // After this point, we'll never emerge out of the safepoint before
- // the VM exits, so concurrent GC threads do not need to be explicitly
- // stopped; they remain inactive until the process exits.
- // Note: some concurrent G1 threads may be running during a safepoint,
- // but these will not be accessing the heap, just some G1-specific side
- // data structures that are not accessed by any other threads but them
- // after this point in a terminal safepoint.
+ // queue until after the vm thread is dead. After this point,
+ // we'll never emerge out of the safepoint before the VM exits.
MutexLocker ml(Heap_lock);
@@ -4113,7 +4083,7 @@ void Threads::remove(JavaThread* p) {
bool Threads::includes(JavaThread* p) {
assert(Threads_lock->is_locked(), "sanity check");
ALL_JAVA_THREADS(q) {
- if (q == p ) {
+ if (q == p) {
return true;
}
}
@@ -4398,43 +4368,43 @@ void Threads::print_on_error(outputStream* st, Thread* current, char* buf, int b
// cache-coherency traffic.
-typedef volatile int SpinLockT ;
+typedef volatile int SpinLockT;
void Thread::SpinAcquire (volatile int * adr, const char * LockName) {
if (Atomic::cmpxchg (1, adr, 0) == 0) {
- return ; // normal fast-path return
+ return; // normal fast-path return
}
// Slow-path : We've encountered contention -- Spin/Yield/Block strategy.
- TEVENT (SpinAcquire - ctx) ;
- int ctr = 0 ;
- int Yields = 0 ;
+ TEVENT(SpinAcquire - ctx);
+ int ctr = 0;
+ int Yields = 0;
for (;;) {
while (*adr != 0) {
- ++ctr ;
+ ++ctr;
if ((ctr & 0xFFF) == 0 || !os::is_MP()) {
if (Yields > 5) {
os::naked_short_sleep(1);
} else {
- os::NakedYield() ;
- ++Yields ;
+ os::NakedYield();
+ ++Yields;
}
} else {
- SpinPause() ;
+ SpinPause();
}
}
- if (Atomic::cmpxchg (1, adr, 0) == 0) return ;
+ if (Atomic::cmpxchg(1, adr, 0) == 0) return;
}
}
void Thread::SpinRelease (volatile int * adr) {
- assert (*adr != 0, "invariant") ;
- OrderAccess::fence() ; // guarantee at least release consistency.
+ assert(*adr != 0, "invariant");
+ OrderAccess::fence(); // guarantee at least release consistency.
// Roach-motel semantics.
// It's safe if subsequent LDs and STs float "up" into the critical section,
// but prior LDs and STs within the critical section can't be allowed
// to reorder or float past the ST that releases the lock.
- *adr = 0 ;
+ *adr = 0;
}
// muxAcquire and muxRelease:
@@ -4487,111 +4457,111 @@ void Thread::SpinRelease (volatile int * adr) {
//
-typedef volatile intptr_t MutexT ; // Mux Lock-word
-enum MuxBits { LOCKBIT = 1 } ;
+typedef volatile intptr_t MutexT; // Mux Lock-word
+enum MuxBits { LOCKBIT = 1 };
void Thread::muxAcquire (volatile intptr_t * Lock, const char * LockName) {
- intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
- if (w == 0) return ;
+ intptr_t w = Atomic::cmpxchg_ptr(LOCKBIT, Lock, 0);
+ if (w == 0) return;
if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
- return ;
+ return;
}
- TEVENT (muxAcquire - Contention) ;
- ParkEvent * const Self = Thread::current()->_MuxEvent ;
- assert ((intptr_t(Self) & LOCKBIT) == 0, "invariant") ;
+ TEVENT(muxAcquire - Contention);
+ ParkEvent * const Self = Thread::current()->_MuxEvent;
+ assert((intptr_t(Self) & LOCKBIT) == 0, "invariant");
for (;;) {
- int its = (os::is_MP() ? 100 : 0) + 1 ;
+ int its = (os::is_MP() ? 100 : 0) + 1;
// Optional spin phase: spin-then-park strategy
while (--its >= 0) {
- w = *Lock ;
+ w = *Lock;
if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
- return ;
+ return;
}
}
- Self->reset() ;
- Self->OnList = intptr_t(Lock) ;
+ Self->reset();
+ Self->OnList = intptr_t(Lock);
// The following fence() isn't _strictly necessary as the subsequent
// CAS() both serializes execution and ratifies the fetched *Lock value.
OrderAccess::fence();
for (;;) {
- w = *Lock ;
+ w = *Lock;
if ((w & LOCKBIT) == 0) {
if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
- Self->OnList = 0 ; // hygiene - allows stronger asserts
- return ;
+ Self->OnList = 0; // hygiene - allows stronger asserts
+ return;
}
- continue ; // Interference -- *Lock changed -- Just retry
+ continue; // Interference -- *Lock changed -- Just retry
}
- assert (w & LOCKBIT, "invariant") ;
- Self->ListNext = (ParkEvent *) (w & ~LOCKBIT );
- if (Atomic::cmpxchg_ptr (intptr_t(Self)|LOCKBIT, Lock, w) == w) break ;
+ assert(w & LOCKBIT, "invariant");
+ Self->ListNext = (ParkEvent *) (w & ~LOCKBIT);
+ if (Atomic::cmpxchg_ptr(intptr_t(Self)|LOCKBIT, Lock, w) == w) break;
}
while (Self->OnList != 0) {
- Self->park() ;
+ Self->park();
}
}
}
void Thread::muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) {
- intptr_t w = Atomic::cmpxchg_ptr (LOCKBIT, Lock, 0) ;
- if (w == 0) return ;
+ intptr_t w = Atomic::cmpxchg_ptr(LOCKBIT, Lock, 0);
+ if (w == 0) return;
if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
- return ;
+ return;
}
- TEVENT (muxAcquire - Contention) ;
- ParkEvent * ReleaseAfter = NULL ;
+ TEVENT(muxAcquire - Contention);
+ ParkEvent * ReleaseAfter = NULL;
if (ev == NULL) {
- ev = ReleaseAfter = ParkEvent::Allocate (NULL) ;
+ ev = ReleaseAfter = ParkEvent::Allocate(NULL);
}
- assert ((intptr_t(ev) & LOCKBIT) == 0, "invariant") ;
+ assert((intptr_t(ev) & LOCKBIT) == 0, "invariant");
for (;;) {
- guarantee (ev->OnList == 0, "invariant") ;
- int its = (os::is_MP() ? 100 : 0) + 1 ;
+ guarantee(ev->OnList == 0, "invariant");
+ int its = (os::is_MP() ? 100 : 0) + 1;
// Optional spin phase: spin-then-park strategy
while (--its >= 0) {
- w = *Lock ;
+ w = *Lock;
if ((w & LOCKBIT) == 0 && Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
if (ReleaseAfter != NULL) {
- ParkEvent::Release (ReleaseAfter) ;
+ ParkEvent::Release(ReleaseAfter);
}
- return ;
+ return;
}
}
- ev->reset() ;
- ev->OnList = intptr_t(Lock) ;
+ ev->reset();
+ ev->OnList = intptr_t(Lock);
// The following fence() isn't _strictly necessary as the subsequent
// CAS() both serializes execution and ratifies the fetched *Lock value.
OrderAccess::fence();
for (;;) {
- w = *Lock ;
+ w = *Lock;
if ((w & LOCKBIT) == 0) {
if (Atomic::cmpxchg_ptr (w|LOCKBIT, Lock, w) == w) {
- ev->OnList = 0 ;
+ ev->OnList = 0;
// We call ::Release while holding the outer lock, thus
// artificially lengthening the critical section.
// Consider deferring the ::Release() until the subsequent unlock(),
// after we've dropped the outer lock.
if (ReleaseAfter != NULL) {
- ParkEvent::Release (ReleaseAfter) ;
+ ParkEvent::Release(ReleaseAfter);
}
- return ;
+ return;
}
- continue ; // Interference -- *Lock changed -- Just retry
+ continue; // Interference -- *Lock changed -- Just retry
}
- assert (w & LOCKBIT, "invariant") ;
- ev->ListNext = (ParkEvent *) (w & ~LOCKBIT );
- if (Atomic::cmpxchg_ptr (intptr_t(ev)|LOCKBIT, Lock, w) == w) break ;
+ assert(w & LOCKBIT, "invariant");
+ ev->ListNext = (ParkEvent *) (w & ~LOCKBIT);
+ if (Atomic::cmpxchg_ptr(intptr_t(ev)|LOCKBIT, Lock, w) == w) break;
}
while (ev->OnList != 0) {
- ev->park() ;
+ ev->park();
}
}
}
@@ -4618,22 +4588,22 @@ void Thread::muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) {
void Thread::muxRelease (volatile intptr_t * Lock) {
for (;;) {
- const intptr_t w = Atomic::cmpxchg_ptr (0, Lock, LOCKBIT) ;
- assert (w & LOCKBIT, "invariant") ;
- if (w == LOCKBIT) return ;
- ParkEvent * List = (ParkEvent *) (w & ~LOCKBIT) ;
- assert (List != NULL, "invariant") ;
- assert (List->OnList == intptr_t(Lock), "invariant") ;
- ParkEvent * nxt = List->ListNext ;
+ const intptr_t w = Atomic::cmpxchg_ptr(0, Lock, LOCKBIT);
+ assert(w & LOCKBIT, "invariant");
+ if (w == LOCKBIT) return;
+ ParkEvent * List = (ParkEvent *)(w & ~LOCKBIT);
+ assert(List != NULL, "invariant");
+ assert(List->OnList == intptr_t(Lock), "invariant");
+ ParkEvent * nxt = List->ListNext;
// The following CAS() releases the lock and pops the head element.
if (Atomic::cmpxchg_ptr (intptr_t(nxt), Lock, w) != w) {
- continue ;
+ continue;
}
- List->OnList = 0 ;
- OrderAccess::fence() ;
- List->unpark () ;
- return ;
+ List->OnList = 0;
+ OrderAccess::fence();
+ List->unpark();
+ return;
}
}
diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp
index a5f0a92246d..003932e74f3 100644
--- a/hotspot/src/share/vm/runtime/thread.hpp
+++ b/hotspot/src/share/vm/runtime/thread.hpp
@@ -244,7 +244,7 @@ class Thread: public ThreadShadow {
// The two classes No_Safepoint_Verifier and No_Allocation_Verifier are used to set these counters.
//
NOT_PRODUCT(int _allow_safepoint_count;) // If 0, thread allow a safepoint to happen
- debug_only (int _allow_allocation_count;) // If 0, the thread is allowed to allocate oops.
+ debug_only(int _allow_allocation_count;) // If 0, the thread is allowed to allocate oops.
// Used by SkipGCALot class.
NOT_PRODUCT(bool _skip_gcalot;) // Should we elide gc-a-lot?
@@ -343,42 +343,16 @@ class Thread: public ThreadShadow {
bool has_async_exception() const { return (_suspend_flags & _has_async_exception) != 0; }
- void set_suspend_flag(SuspendFlags f) {
- assert(sizeof(jint) == sizeof(_suspend_flags), "size mismatch");
- uint32_t flags;
- do {
- flags = _suspend_flags;
- }
- while (Atomic::cmpxchg((jint)(flags | f),
- (volatile jint*)&_suspend_flags,
- (jint)flags) != (jint)flags);
- }
- void clear_suspend_flag(SuspendFlags f) {
- assert(sizeof(jint) == sizeof(_suspend_flags), "size mismatch");
- uint32_t flags;
- do {
- flags = _suspend_flags;
- }
- while (Atomic::cmpxchg((jint)(flags & ~f),
- (volatile jint*)&_suspend_flags,
- (jint)flags) != (jint)flags);
- }
+ inline void set_suspend_flag(SuspendFlags f);
+ inline void clear_suspend_flag(SuspendFlags f);
- void set_has_async_exception() {
- set_suspend_flag(_has_async_exception);
- }
- void clear_has_async_exception() {
- clear_suspend_flag(_has_async_exception);
- }
+ inline void set_has_async_exception();
+ inline void clear_has_async_exception();
bool do_critical_native_unlock() const { return (_suspend_flags & _critical_native_unlock) != 0; }
- void set_critical_native_unlock() {
- set_suspend_flag(_critical_native_unlock);
- }
- void clear_critical_native_unlock() {
- clear_suspend_flag(_critical_native_unlock);
- }
+ inline void set_critical_native_unlock();
+ inline void clear_critical_native_unlock();
// Support for Unhandled Oop detection
#ifdef CHECK_UNHANDLED_OOPS
@@ -593,12 +567,12 @@ public:
bool is_inside_jvmti_env_iteration() { return _jvmti_env_iteration_count > 0; }
// Code generation
- static ByteSize exception_file_offset() { return byte_offset_of(Thread, _exception_file ); }
- static ByteSize exception_line_offset() { return byte_offset_of(Thread, _exception_line ); }
- static ByteSize active_handles_offset() { return byte_offset_of(Thread, _active_handles ); }
+ static ByteSize exception_file_offset() { return byte_offset_of(Thread, _exception_file); }
+ static ByteSize exception_line_offset() { return byte_offset_of(Thread, _exception_line); }
+ static ByteSize active_handles_offset() { return byte_offset_of(Thread, _active_handles); }
- static ByteSize stack_base_offset() { return byte_offset_of(Thread, _stack_base ); }
- static ByteSize stack_size_offset() { return byte_offset_of(Thread, _stack_size ); }
+ static ByteSize stack_base_offset() { return byte_offset_of(Thread, _stack_base); }
+ static ByteSize stack_size_offset() { return byte_offset_of(Thread, _stack_size); }
#define TLAB_FIELD_OFFSET(name) \
static ByteSize tlab_##name##_offset() { return byte_offset_of(Thread, _tlab) + ThreadLocalAllocBuffer::name##_offset(); }
@@ -615,35 +589,35 @@ public:
#undef TLAB_FIELD_OFFSET
- static ByteSize allocated_bytes_offset() { return byte_offset_of(Thread, _allocated_bytes ); }
+ static ByteSize allocated_bytes_offset() { return byte_offset_of(Thread, _allocated_bytes); }
public:
- volatile intptr_t _Stalled ;
- volatile int _TypeTag ;
- ParkEvent * _ParkEvent ; // for synchronized()
- ParkEvent * _SleepEvent ; // for Thread.sleep
- ParkEvent * _MutexEvent ; // for native internal Mutex/Monitor
- ParkEvent * _MuxEvent ; // for low-level muxAcquire-muxRelease
- int NativeSyncRecursion ; // diagnostic
+ volatile intptr_t _Stalled;
+ volatile int _TypeTag;
+ ParkEvent * _ParkEvent; // for synchronized()
+ ParkEvent * _SleepEvent; // for Thread.sleep
+ ParkEvent * _MutexEvent; // for native internal Mutex/Monitor
+ ParkEvent * _MuxEvent; // for low-level muxAcquire-muxRelease
+ int NativeSyncRecursion; // diagnostic
- volatile int _OnTrap ; // Resume-at IP delta
- jint _hashStateW ; // Marsaglia Shift-XOR thread-local RNG
- jint _hashStateX ; // thread-specific hashCode generator state
- jint _hashStateY ;
- jint _hashStateZ ;
- void * _schedctl ;
+ volatile int _OnTrap; // Resume-at IP delta
+ jint _hashStateW; // Marsaglia Shift-XOR thread-local RNG
+ jint _hashStateX; // thread-specific hashCode generator state
+ jint _hashStateY;
+ jint _hashStateZ;
+ void * _schedctl;
- volatile jint rng [4] ; // RNG for spin loop
+ volatile jint rng[4]; // RNG for spin loop
// Low-level leaf-lock primitives used to implement synchronization
// and native monitor-mutex infrastructure.
// Not for general synchronization use.
- static void SpinAcquire (volatile int * Lock, const char * Name) ;
- static void SpinRelease (volatile int * Lock) ;
- static void muxAcquire (volatile intptr_t * Lock, const char * Name) ;
- static void muxAcquireW (volatile intptr_t * Lock, ParkEvent * ev) ;
- static void muxRelease (volatile intptr_t * Lock) ;
+ static void SpinAcquire(volatile int * Lock, const char * Name);
+ static void SpinRelease(volatile int * Lock);
+ static void muxAcquire(volatile intptr_t * Lock, const char * Name);
+ static void muxAcquireW(volatile intptr_t * Lock, ParkEvent * ev);
+ static void muxRelease(volatile intptr_t * Lock);
};
// Inline implementation of Thread::current()
@@ -915,6 +889,9 @@ class JavaThread: public Thread {
// support for JNI critical regions
jint _jni_active_critical; // count of entries into JNI critical region
+ // Checked JNI: function name requires exception check
+ char* _pending_jni_exception_check_fn;
+
// For deadlock detection.
int _depth_first_number;
@@ -930,7 +907,7 @@ class JavaThread: public Thread {
intptr_t _instruction;
const char* _file;
int _line;
- } _jmp_ring[ jump_ring_buffer_size ];
+ } _jmp_ring[jump_ring_buffer_size];
#endif /* PRODUCT */
#if INCLUDE_ALL_GCS
@@ -1071,8 +1048,8 @@ class JavaThread: public Thread {
// Suspend/resume support for JavaThread
private:
- void set_ext_suspended() { set_suspend_flag (_ext_suspended); }
- void clear_ext_suspended() { clear_suspend_flag(_ext_suspended); }
+ inline void set_ext_suspended();
+ inline void clear_ext_suspended();
public:
void java_suspend();
@@ -1120,11 +1097,11 @@ class JavaThread: public Thread {
// via the appropriate -XX options.
bool wait_for_ext_suspend_completion(int count, int delay, uint32_t *bits);
- void set_external_suspend() { set_suspend_flag (_external_suspend); }
- void clear_external_suspend() { clear_suspend_flag(_external_suspend); }
+ inline void set_external_suspend();
+ inline void clear_external_suspend();
- void set_deopt_suspend() { set_suspend_flag (_deopt_suspend); }
- void clear_deopt_suspend() { clear_suspend_flag(_deopt_suspend); }
+ inline void set_deopt_suspend();
+ inline void clear_deopt_suspend();
bool is_deopt_suspend() { return (_suspend_flags & _deopt_suspend) != 0; }
bool is_external_suspend() const {
@@ -1212,11 +1189,7 @@ class JavaThread: public Thread {
void set_pending_unsafe_access_error() { _special_runtime_exit_condition = _async_unsafe_access_error; }
- void set_pending_async_exception(oop e) {
- _pending_async_exception = e;
- _special_runtime_exit_condition = _async_exception;
- set_has_async_exception();
- }
+ inline void set_pending_async_exception(oop e);
// Fast-locking support
bool is_lock_owned(address adr) const;
@@ -1333,34 +1306,34 @@ class JavaThread: public Thread {
#endif /* PRODUCT */
// For assembly stub generation
- static ByteSize threadObj_offset() { return byte_offset_of(JavaThread, _threadObj ); }
+ static ByteSize threadObj_offset() { return byte_offset_of(JavaThread, _threadObj); }
#ifndef PRODUCT
- static ByteSize jmp_ring_index_offset() { return byte_offset_of(JavaThread, _jmp_ring_index ); }
- static ByteSize jmp_ring_offset() { return byte_offset_of(JavaThread, _jmp_ring ); }
+ static ByteSize jmp_ring_index_offset() { return byte_offset_of(JavaThread, _jmp_ring_index); }
+ static ByteSize jmp_ring_offset() { return byte_offset_of(JavaThread, _jmp_ring); }
#endif /* PRODUCT */
- static ByteSize jni_environment_offset() { return byte_offset_of(JavaThread, _jni_environment ); }
- static ByteSize last_Java_sp_offset() {
+ static ByteSize jni_environment_offset() { return byte_offset_of(JavaThread, _jni_environment); }
+ static ByteSize last_Java_sp_offset() {
return byte_offset_of(JavaThread, _anchor) + JavaFrameAnchor::last_Java_sp_offset();
}
- static ByteSize last_Java_pc_offset() {
+ static ByteSize last_Java_pc_offset() {
return byte_offset_of(JavaThread, _anchor) + JavaFrameAnchor::last_Java_pc_offset();
}
- static ByteSize frame_anchor_offset() {
+ static ByteSize frame_anchor_offset() {
return byte_offset_of(JavaThread, _anchor);
}
- static ByteSize callee_target_offset() { return byte_offset_of(JavaThread, _callee_target ); }
- static ByteSize vm_result_offset() { return byte_offset_of(JavaThread, _vm_result ); }
- static ByteSize vm_result_2_offset() { return byte_offset_of(JavaThread, _vm_result_2 ); }
- static ByteSize thread_state_offset() { return byte_offset_of(JavaThread, _thread_state ); }
- static ByteSize saved_exception_pc_offset() { return byte_offset_of(JavaThread, _saved_exception_pc ); }
- static ByteSize osthread_offset() { return byte_offset_of(JavaThread, _osthread ); }
- static ByteSize exception_oop_offset() { return byte_offset_of(JavaThread, _exception_oop ); }
- static ByteSize exception_pc_offset() { return byte_offset_of(JavaThread, _exception_pc ); }
+ static ByteSize callee_target_offset() { return byte_offset_of(JavaThread, _callee_target); }
+ static ByteSize vm_result_offset() { return byte_offset_of(JavaThread, _vm_result); }
+ static ByteSize vm_result_2_offset() { return byte_offset_of(JavaThread, _vm_result_2); }
+ static ByteSize thread_state_offset() { return byte_offset_of(JavaThread, _thread_state); }
+ static ByteSize saved_exception_pc_offset() { return byte_offset_of(JavaThread, _saved_exception_pc); }
+ static ByteSize osthread_offset() { return byte_offset_of(JavaThread, _osthread); }
+ static ByteSize exception_oop_offset() { return byte_offset_of(JavaThread, _exception_oop); }
+ static ByteSize exception_pc_offset() { return byte_offset_of(JavaThread, _exception_pc); }
static ByteSize exception_handler_pc_offset() { return byte_offset_of(JavaThread, _exception_handler_pc); }
static ByteSize stack_overflow_limit_offset() { return byte_offset_of(JavaThread, _stack_overflow_limit); }
static ByteSize is_method_handle_return_offset() { return byte_offset_of(JavaThread, _is_method_handle_return); }
- static ByteSize stack_guard_state_offset() { return byte_offset_of(JavaThread, _stack_guard_state ); }
- static ByteSize suspend_flags_offset() { return byte_offset_of(JavaThread, _suspend_flags ); }
+ static ByteSize stack_guard_state_offset() { return byte_offset_of(JavaThread, _stack_guard_state); }
+ static ByteSize suspend_flags_offset() { return byte_offset_of(JavaThread, _suspend_flags); }
static ByteSize do_not_unlock_if_synchronized_offset() { return byte_offset_of(JavaThread, _do_not_unlock_if_synchronized); }
static ByteSize should_post_on_exceptions_flag_offset() {
@@ -1400,6 +1373,12 @@ class JavaThread: public Thread {
assert(_jni_active_critical >= 0,
"JNI critical nesting problem?"); }
+ // Checked JNI, is the programmer required to check for exceptions, specify which function name
+ bool is_pending_jni_exception_check() const { return _pending_jni_exception_check_fn != NULL; }
+ void clear_pending_jni_exception_check() { _pending_jni_exception_check_fn = NULL; }
+ const char* get_pending_jni_exception_check() const { return _pending_jni_exception_check_fn; }
+ void set_pending_jni_exception_check(const char* fn_name) { _pending_jni_exception_check_fn = (char*) fn_name; }
+
// For deadlock detection
int depth_first_number() { return _depth_first_number; }
void set_depth_first_number(int dfn) { _depth_first_number = dfn; }
@@ -1413,7 +1392,7 @@ class JavaThread: public Thread {
void remove_monitor_chunk(MonitorChunk* chunk);
bool in_deopt_handler() const { return _in_deopt_handler > 0; }
void inc_in_deopt_handler() { _in_deopt_handler++; }
- void dec_in_deopt_handler() {
+ void dec_in_deopt_handler() {
assert(_in_deopt_handler > 0, "mismatched deopt nesting");
if (_in_deopt_handler > 0) { // robustness
_in_deopt_handler--;
@@ -1767,7 +1746,7 @@ private:
uint _claimed_par_id;
public:
uint get_claimed_par_id() { return _claimed_par_id; }
- void set_claimed_par_id(uint id) { _claimed_par_id = id;}
+ void set_claimed_par_id(uint id) { _claimed_par_id = id; }
};
// Inline implementation of JavaThread::current
@@ -1802,7 +1781,7 @@ inline bool JavaThread::stack_yellow_zone_enabled() {
inline size_t JavaThread::stack_available(address cur_sp) {
// This code assumes java stacks grow down
address low_addr; // Limit on the address for deepest stack depth
- if ( _stack_guard_state == stack_guard_unused) {
+ if (_stack_guard_state == stack_guard_unused) {
low_addr = stack_base() - stack_size();
} else {
low_addr = stack_yellow_zone_base();
diff --git a/hotspot/src/share/vm/runtime/thread.inline.hpp b/hotspot/src/share/vm/runtime/thread.inline.hpp
index b68e7d1ae38..26a3330805b 100644
--- a/hotspot/src/share/vm/runtime/thread.inline.hpp
+++ b/hotspot/src/share/vm/runtime/thread.inline.hpp
@@ -27,6 +27,7 @@
#define SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
+#include "runtime/atomic.inline.hpp"
#include "runtime/thread.hpp"
#ifdef TARGET_OS_FAMILY_linux
# include "thread_linux.inline.hpp"
@@ -46,6 +47,40 @@
#undef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
+inline void Thread::set_suspend_flag(SuspendFlags f) {
+ assert(sizeof(jint) == sizeof(_suspend_flags), "size mismatch");
+ uint32_t flags;
+ do {
+ flags = _suspend_flags;
+ }
+ while (Atomic::cmpxchg((jint)(flags | f),
+ (volatile jint*)&_suspend_flags,
+ (jint)flags) != (jint)flags);
+}
+inline void Thread::clear_suspend_flag(SuspendFlags f) {
+ assert(sizeof(jint) == sizeof(_suspend_flags), "size mismatch");
+ uint32_t flags;
+ do {
+ flags = _suspend_flags;
+ }
+ while (Atomic::cmpxchg((jint)(flags & ~f),
+ (volatile jint*)&_suspend_flags,
+ (jint)flags) != (jint)flags);
+}
+
+inline void Thread::set_has_async_exception() {
+ set_suspend_flag(_has_async_exception);
+}
+inline void Thread::clear_has_async_exception() {
+ clear_suspend_flag(_has_async_exception);
+}
+inline void Thread::set_critical_native_unlock() {
+ set_suspend_flag(_critical_native_unlock);
+}
+inline void Thread::clear_critical_native_unlock() {
+ clear_suspend_flag(_critical_native_unlock);
+}
+
inline jlong Thread::cooked_allocated_bytes() {
jlong allocated_bytes = OrderAccess::load_acquire(&_allocated_bytes);
if (UseTLAB) {
@@ -59,6 +94,33 @@ inline jlong Thread::cooked_allocated_bytes() {
return allocated_bytes;
}
+inline void JavaThread::set_ext_suspended() {
+ set_suspend_flag (_ext_suspended);
+}
+inline void JavaThread::clear_ext_suspended() {
+ clear_suspend_flag(_ext_suspended);
+}
+
+inline void JavaThread::set_external_suspend() {
+ set_suspend_flag(_external_suspend);
+}
+inline void JavaThread::clear_external_suspend() {
+ clear_suspend_flag(_external_suspend);
+}
+
+inline void JavaThread::set_deopt_suspend() {
+ set_suspend_flag(_deopt_suspend);
+}
+inline void JavaThread::clear_deopt_suspend() {
+ clear_suspend_flag(_deopt_suspend);
+}
+
+inline void JavaThread::set_pending_async_exception(oop e) {
+ _pending_async_exception = e;
+ _special_runtime_exit_condition = _async_exception;
+ set_has_async_exception();
+}
+
#ifdef PPC64
inline JavaThreadState JavaThread::thread_state() const {
return (JavaThreadState) OrderAccess::load_acquire((volatile jint*)&_thread_state);
diff --git a/hotspot/src/share/vm/runtime/vframe.cpp b/hotspot/src/share/vm/runtime/vframe.cpp
index 79da635c443..57900245436 100644
--- a/hotspot/src/share/vm/runtime/vframe.cpp
+++ b/hotspot/src/share/vm/runtime/vframe.cpp
@@ -480,9 +480,8 @@ void vframeStreamCommon::skip_prefixed_method_and_wrappers() {
void vframeStreamCommon::skip_reflection_related_frames() {
while (!at_end() &&
- (JDK_Version::is_gte_jdk14x_version() &&
(method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) ||
- method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) {
+ method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass()))) {
next();
}
}
diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index 1ae7ddf6681..33fe915e7fe 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -104,6 +104,7 @@
#include "utilities/globalDefinitions.hpp"
#include "utilities/hashtable.hpp"
#include "utilities/macros.hpp"
+
#ifdef TARGET_ARCH_x86
# include "vmStructs_x86.hpp"
#endif
@@ -168,6 +169,11 @@
#include "gc_implementation/parallelScavenge/vmStructs_parallelgc.hpp"
#include "gc_implementation/g1/vmStructs_g1.hpp"
#endif // INCLUDE_ALL_GCS
+
+#if INCLUDE_TRACE
+ #include "runtime/vmStructs_trace.hpp"
+#endif
+
#ifdef COMPILER2
#include "opto/addnode.hpp"
#include "opto/block.hpp"
@@ -1390,6 +1396,8 @@ typedef TwoOopHashtable SymbolTwoOopHashtable;
/* unsigned short on Win32 */ \
declare_unsigned_integer_type(u1) \
declare_unsigned_integer_type(u2) \
+ declare_unsigned_integer_type(u4) \
+ declare_unsigned_integer_type(u8) \
declare_unsigned_integer_type(unsigned) \
\
/*****************************/ \
@@ -2923,6 +2931,11 @@ VMStructEntry VMStructs::localHotSpotVMStructs[] = {
GENERATE_STATIC_VM_STRUCT_ENTRY)
#endif // INCLUDE_ALL_GCS
+#if INCLUDE_TRACE
+ VM_STRUCTS_TRACE(GENERATE_NONSTATIC_VM_STRUCT_ENTRY,
+ GENERATE_STATIC_VM_STRUCT_ENTRY)
+#endif
+
VM_STRUCTS_CPU(GENERATE_NONSTATIC_VM_STRUCT_ENTRY,
GENERATE_STATIC_VM_STRUCT_ENTRY,
GENERATE_UNCHECKED_NONSTATIC_VM_STRUCT_ENTRY,
@@ -2968,6 +2981,11 @@ VMTypeEntry VMStructs::localHotSpotVMTypes[] = {
GENERATE_TOPLEVEL_VM_TYPE_ENTRY)
#endif // INCLUDE_ALL_GCS
+#if INCLUDE_TRACE
+ VM_TYPES_TRACE(GENERATE_VM_TYPE_ENTRY,
+ GENERATE_TOPLEVEL_VM_TYPE_ENTRY)
+#endif
+
VM_TYPES_CPU(GENERATE_VM_TYPE_ENTRY,
GENERATE_TOPLEVEL_VM_TYPE_ENTRY,
GENERATE_OOP_VM_TYPE_ENTRY,
@@ -3003,6 +3021,10 @@ VMIntConstantEntry VMStructs::localHotSpotVMIntConstants[] = {
VM_INT_CONSTANTS_PARNEW(GENERATE_VM_INT_CONSTANT_ENTRY)
#endif // INCLUDE_ALL_GCS
+#if INCLUDE_TRACE
+ VM_INT_CONSTANTS_TRACE(GENERATE_VM_INT_CONSTANT_ENTRY)
+#endif
+
VM_INT_CONSTANTS_CPU(GENERATE_VM_INT_CONSTANT_ENTRY,
GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY,
GENERATE_C1_VM_INT_CONSTANT_ENTRY,
@@ -3065,8 +3087,14 @@ VMStructs::init() {
VM_STRUCTS_G1(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
CHECK_STATIC_VM_STRUCT_ENTRY);
+
#endif // INCLUDE_ALL_GCS
+#if INCLUDE_TRACE
+ VM_STRUCTS_TRACE(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
+ CHECK_STATIC_VM_STRUCT_ENTRY);
+#endif
+
VM_STRUCTS_CPU(CHECK_NONSTATIC_VM_STRUCT_ENTRY,
CHECK_STATIC_VM_STRUCT_ENTRY,
CHECK_NO_OP,
@@ -3105,8 +3133,14 @@ VMStructs::init() {
VM_TYPES_G1(CHECK_VM_TYPE_ENTRY,
CHECK_SINGLE_ARG_VM_TYPE_NO_OP);
+
#endif // INCLUDE_ALL_GCS
+#if INCLUDE_TRACE
+ VM_TYPES_TRACE(CHECK_VM_TYPE_ENTRY,
+ CHECK_SINGLE_ARG_VM_TYPE_NO_OP);
+#endif
+
VM_TYPES_CPU(CHECK_VM_TYPE_ENTRY,
CHECK_SINGLE_ARG_VM_TYPE_NO_OP,
CHECK_SINGLE_ARG_VM_TYPE_NO_OP,
@@ -3169,6 +3203,12 @@ VMStructs::init() {
debug_only(VM_STRUCTS_G1(ENSURE_FIELD_TYPE_PRESENT,
ENSURE_FIELD_TYPE_PRESENT));
#endif // INCLUDE_ALL_GCS
+
+#if INCLUDE_TRACE
+ debug_only(VM_STRUCTS_TRACE(ENSURE_FIELD_TYPE_PRESENT,
+ ENSURE_FIELD_TYPE_PRESENT));
+#endif
+
debug_only(VM_STRUCTS_CPU(ENSURE_FIELD_TYPE_PRESENT,
ENSURE_FIELD_TYPE_PRESENT,
CHECK_NO_OP,
diff --git a/langtools/test/tools/javac/diags/examples/StaticImportNotSupported.java b/hotspot/src/share/vm/runtime/vmStructs_trace.hpp
similarity index 76%
rename from langtools/test/tools/javac/diags/examples/StaticImportNotSupported.java
rename to hotspot/src/share/vm/runtime/vmStructs_trace.hpp
index c545c19cd06..b959c0f4a1f 100644
--- a/langtools/test/tools/javac/diags/examples/StaticImportNotSupported.java
+++ b/hotspot/src/share/vm/runtime/vmStructs_trace.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -19,11 +19,17 @@
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
+ *
*/
-// key: compiler.err.static.import.not.supported.in.source
-// options: -source 1.4 -Xlint:-options
+#ifndef SHARE_VM_RUNTIME_VMSTRUCTS_TRACE_HPP
+#define SHARE_VM_RUNTIME_VMSTRUCTS_TRACE_HPP
-import static java.util.regex.Pattern.*;
+#define VM_INT_CONSTANTS_TRACE(a)
-class StaticImportNotSupported { }
+#define VM_STRUCTS_TRACE(a, b)
+
+#define VM_TYPES_TRACE(a, b)
+
+
+#endif // SHARE_VM_RUNTIME_VMSTRUCTS_TRACE_HPP
diff --git a/hotspot/src/share/vm/runtime/vm_operations.cpp b/hotspot/src/share/vm/runtime/vm_operations.cpp
index d46e1f775ac..6f27fe3fecc 100644
--- a/hotspot/src/share/vm/runtime/vm_operations.cpp
+++ b/hotspot/src/share/vm/runtime/vm_operations.cpp
@@ -184,9 +184,7 @@ bool VM_PrintThreads::doit_prologue() {
assert(Thread::current()->is_Java_thread(), "just checking");
// Make sure AbstractOwnableSynchronizer is loaded
- if (JDK_Version::is_gte_jdk16x_version()) {
- java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(JavaThread::current());
- }
+ java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(JavaThread::current());
// Get Heap_lock if concurrent locks will be dumped
if (_print_concurrent_locks) {
@@ -225,7 +223,7 @@ bool VM_FindDeadlocks::doit_prologue() {
assert(Thread::current()->is_Java_thread(), "just checking");
// Load AbstractOwnableSynchronizer class
- if (_concurrent_locks && JDK_Version::is_gte_jdk16x_version()) {
+ if (_concurrent_locks) {
java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(JavaThread::current());
}
@@ -283,9 +281,7 @@ bool VM_ThreadDump::doit_prologue() {
assert(Thread::current()->is_Java_thread(), "just checking");
// Load AbstractOwnableSynchronizer class before taking thread snapshots
- if (JDK_Version::is_gte_jdk16x_version()) {
- java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(JavaThread::current());
- }
+ java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(JavaThread::current());
if (_with_locked_synchronizers) {
// Acquire Heap_lock to dump concurrent locks
diff --git a/hotspot/src/share/vm/runtime/vm_operations.hpp b/hotspot/src/share/vm/runtime/vm_operations.hpp
index 8f2f0ba06f7..4e32a3adfa2 100644
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp
@@ -98,6 +98,7 @@
template(LinuxDllLoad) \
template(RotateGCLog) \
template(WhiteBoxOperation) \
+ template(ClassLoaderStatsOperation) \
class VM_Operation: public CHeapObj {
public:
diff --git a/hotspot/src/share/vm/runtime/vm_version.cpp b/hotspot/src/share/vm/runtime/vm_version.cpp
index 5df7d221a2b..a1779a85fe2 100644
--- a/hotspot/src/share/vm/runtime/vm_version.cpp
+++ b/hotspot/src/share/vm/runtime/vm_version.cpp
@@ -72,14 +72,16 @@ int Abstract_VM_Version::_reserve_for_allocation_prefetch = 0;
#ifndef JRE_RELEASE_VERSION
#error JRE_RELEASE_VERSION must be defined
#endif
-#ifndef HOTSPOT_BUILD_TARGET
- #error HOTSPOT_BUILD_TARGET must be defined
-#endif
-#ifdef PRODUCT
- #define VM_RELEASE HOTSPOT_RELEASE_VERSION
-#else
+// NOTE: Builds within Visual Studio do not define the build target in
+// HOTSPOT_RELEASE_VERSION, so it must be done here
+#if defined(VISUAL_STUDIO_BUILD) && !defined(PRODUCT)
+ #ifndef HOTSPOT_BUILD_TARGET
+ #error HOTSPOT_BUILD_TARGET must be defined
+ #endif
#define VM_RELEASE HOTSPOT_RELEASE_VERSION "-" HOTSPOT_BUILD_TARGET
+#else
+ #define VM_RELEASE HOTSPOT_RELEASE_VERSION
#endif
// HOTSPOT_RELEASE_VERSION follows the JDK release version naming convention
@@ -160,8 +162,7 @@ const char* Abstract_VM_Version::vm_vendor() {
#ifdef VENDOR
return XSTR(VENDOR);
#else
- return JDK_Version::is_gte_jdk17x_version() ?
- "Oracle Corporation" : "Sun Microsystems Inc.";
+ return "Oracle Corporation";
#endif
}
@@ -222,20 +223,12 @@ const char* Abstract_VM_Version::internal_vm_info_string() {
#ifndef HOTSPOT_BUILD_COMPILER
#ifdef _MSC_VER
- #if _MSC_VER == 1100
- #define HOTSPOT_BUILD_COMPILER "MS VC++ 5.0"
- #elif _MSC_VER == 1200
- #define HOTSPOT_BUILD_COMPILER "MS VC++ 6.0"
- #elif _MSC_VER == 1310
- #define HOTSPOT_BUILD_COMPILER "MS VC++ 7.1 (VS2003)"
- #elif _MSC_VER == 1400
- #define HOTSPOT_BUILD_COMPILER "MS VC++ 8.0 (VS2005)"
- #elif _MSC_VER == 1500
- #define HOTSPOT_BUILD_COMPILER "MS VC++ 9.0 (VS2008)"
- #elif _MSC_VER == 1600
+ #if _MSC_VER == 1600
#define HOTSPOT_BUILD_COMPILER "MS VC++ 10.0 (VS2010)"
#elif _MSC_VER == 1700
#define HOTSPOT_BUILD_COMPILER "MS VC++ 11.0 (VS2012)"
+ #elif _MSC_VER == 1800
+ #define HOTSPOT_BUILD_COMPILER "MS VC++ 12.0 (VS2013)"
#else
#define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
#endif
diff --git a/hotspot/src/share/vm/services/diagnosticCommand.cpp b/hotspot/src/share/vm/services/diagnosticCommand.cpp
index ca031f87963..892e2ce57b6 100644
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "classfile/classLoaderStats.hpp"
#include "gc_implementation/shared/vmGCOperations.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/os.hpp"
@@ -58,6 +59,7 @@ void DCmdRegistrant::register_dcmds(){
#endif // INCLUDE_SERVICES
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false));
DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false));
+ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false));
// Enhanced JMX Agent Support
// These commands won't be exported via the DiagnosticCommandMBean until an
diff --git a/hotspot/src/share/vm/services/management.cpp b/hotspot/src/share/vm/services/management.cpp
index dc901876104..2d6f2ff1d23 100644
--- a/hotspot/src/share/vm/services/management.cpp
+++ b/hotspot/src/share/vm/services/management.cpp
@@ -1229,10 +1229,8 @@ JVM_ENTRY(jint, jmm_GetThreadInfo(JNIEnv *env, jlongArray ids, jint maxDepth, jo
"The length of the given ThreadInfo array does not match the length of the given array of thread IDs", -1);
}
- if (JDK_Version::is_gte_jdk16x_version()) {
- // make sure the AbstractOwnableSynchronizer klass is loaded before taking thread snapshots
- java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(CHECK_0);
- }
+ // make sure the AbstractOwnableSynchronizer klass is loaded before taking thread snapshots
+ java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(CHECK_0);
// Must use ThreadDumpResult to store the ThreadSnapshot.
// GC may occur after the thread snapshots are taken but before
@@ -1303,10 +1301,8 @@ JVM_END
JVM_ENTRY(jobjectArray, jmm_DumpThreads(JNIEnv *env, jlongArray thread_ids, jboolean locked_monitors, jboolean locked_synchronizers))
ResourceMark rm(THREAD);
- if (JDK_Version::is_gte_jdk16x_version()) {
- // make sure the AbstractOwnableSynchronizer klass is loaded before taking thread snapshots
- java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(CHECK_NULL);
- }
+ // make sure the AbstractOwnableSynchronizer klass is loaded before taking thread snapshots
+ java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(CHECK_NULL);
typeArrayOop ta = typeArrayOop(JNIHandles::resolve(thread_ids));
int num_threads = (ta != NULL ? ta->length() : 0);
diff --git a/hotspot/src/share/vm/services/memPtr.cpp b/hotspot/src/share/vm/services/memPtr.cpp
index bc460517c58..2bab4b28d9a 100644
--- a/hotspot/src/share/vm/services/memPtr.cpp
+++ b/hotspot/src/share/vm/services/memPtr.cpp
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
+#include "runtime/atomic.inline.hpp"
#include "services/memPtr.hpp"
#include "services/memTracker.hpp"
diff --git a/hotspot/src/share/vm/services/memPtr.hpp b/hotspot/src/share/vm/services/memPtr.hpp
index c54f0934a94..cae454cc318 100644
--- a/hotspot/src/share/vm/services/memPtr.hpp
+++ b/hotspot/src/share/vm/services/memPtr.hpp
@@ -26,7 +26,6 @@
#define SHARE_VM_SERVICES_MEM_PTR_HPP
#include "memory/allocation.hpp"
-#include "runtime/atomic.hpp"
#include "runtime/os.hpp"
#include "runtime/safepoint.hpp"
diff --git a/hotspot/src/share/vm/services/memRecorder.cpp b/hotspot/src/share/vm/services/memRecorder.cpp
index afe7bd245df..b8707f58360 100644
--- a/hotspot/src/share/vm/services/memRecorder.cpp
+++ b/hotspot/src/share/vm/services/memRecorder.cpp
@@ -24,7 +24,7 @@
#include "precompiled.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "services/memBaseline.hpp"
#include "services/memRecorder.hpp"
#include "services/memPtr.hpp"
diff --git a/hotspot/src/share/vm/services/memTracker.cpp b/hotspot/src/share/vm/services/memTracker.cpp
index 213e24e1bd0..190c004b374 100644
--- a/hotspot/src/share/vm/services/memTracker.cpp
+++ b/hotspot/src/share/vm/services/memTracker.cpp
@@ -24,7 +24,7 @@
#include "precompiled.hpp"
#include "oops/instanceKlass.hpp"
-#include "runtime/atomic.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/safepoint.hpp"
diff --git a/hotspot/src/share/vm/services/memTracker.hpp b/hotspot/src/share/vm/services/memTracker.hpp
index 1072e5d6a3d..52715a68764 100644
--- a/hotspot/src/share/vm/services/memTracker.hpp
+++ b/hotspot/src/share/vm/services/memTracker.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, 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
@@ -481,17 +481,9 @@ class MemTracker : AllStatic {
if (_slowdown_calling_thread && thr != _worker_thread) {
#ifdef _WINDOWS
// On Windows, os::NakedYield() does not work as well
- // as os::yield_all()
- os::yield_all();
+ // as short sleep.
+ os::naked_short_sleep(1);
#else
- // On Solaris, os::yield_all() depends on os::sleep()
- // which requires JavaTherad in _thread_in_vm state.
- // Transits thread to _thread_in_vm state can be dangerous
- // if caller holds lock, as it may deadlock with Threads_lock.
- // So use NaKedYield instead.
- //
- // Linux and BSD, NakedYield() and yield_all() implementations
- // are the same.
os::NakedYield();
#endif
}
diff --git a/hotspot/src/share/vm/services/threadService.cpp b/hotspot/src/share/vm/services/threadService.cpp
index 02156a2f3e2..74d3ea1383a 100644
--- a/hotspot/src/share/vm/services/threadService.cpp
+++ b/hotspot/src/share/vm/services/threadService.cpp
@@ -29,6 +29,7 @@
#include "memory/oopFactory.hpp"
#include "oops/instanceKlass.hpp"
#include "oops/oop.inline.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/init.hpp"
#include "runtime/thread.hpp"
@@ -665,17 +666,15 @@ void ConcurrentLocksDump::dump_at_safepoint() {
// dump all locked concurrent locks
assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
- if (JDK_Version::is_gte_jdk16x_version()) {
- ResourceMark rm;
+ ResourceMark rm;
- GrowableArray* aos_objects = new GrowableArray(INITIAL_ARRAY_SIZE);
+ GrowableArray* aos_objects = new GrowableArray(INITIAL_ARRAY_SIZE);
- // Find all instances of AbstractOwnableSynchronizer
- HeapInspection::find_instances_at_safepoint(SystemDictionary::abstract_ownable_synchronizer_klass(),
+ // Find all instances of AbstractOwnableSynchronizer
+ HeapInspection::find_instances_at_safepoint(SystemDictionary::abstract_ownable_synchronizer_klass(),
aos_objects);
- // Build a map of thread to its owned AQS locks
- build_map(aos_objects);
- }
+ // Build a map of thread to its owned AQS locks
+ build_map(aos_objects);
}
diff --git a/hotspot/src/share/vm/shark/sharkRuntime.cpp b/hotspot/src/share/vm/shark/sharkRuntime.cpp
index fd9916e111b..bf609bce455 100644
--- a/hotspot/src/share/vm/shark/sharkRuntime.cpp
+++ b/hotspot/src/share/vm/shark/sharkRuntime.cpp
@@ -24,6 +24,7 @@
*/
#include "precompiled.hpp"
+#include "runtime/atomic.inline.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/deoptimization.hpp"
#include "runtime/thread.hpp"
diff --git a/hotspot/src/share/vm/trace/tracetypes.xml b/hotspot/src/share/vm/trace/tracetypes.xml
index eb1c708eadb..f41dfc03f3e 100644
--- a/hotspot/src/share/vm/trace/tracetypes.xml
+++ b/hotspot/src/share/vm/trace/tracetypes.xml
@@ -98,6 +98,7 @@ Now we can use the content + data type in declaring event fields.
+
finalargs = new ArrayList();
String[] defaultArgs = new String[] {
"-XX:+UseG1GC",
- "-XX:+UseCompressedOops",
"-Xmn4m",
"-Xmx20m",
"-XX:InitiatingHeapOccupancyPercent=100", // we don't want the additional GCs due to initial marking
diff --git a/hotspot/test/gc/logging/TestGCId.java b/hotspot/test/gc/logging/TestGCId.java
new file mode 100644
index 00000000000..98f9491467b
--- /dev/null
+++ b/hotspot/test/gc/logging/TestGCId.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestGCId
+ * @bug 8043607
+ * @summary Ensure that the GCId is logged
+ * @key gc
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.ProcessTools;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+public class TestGCId {
+ public static void main(String[] args) throws Exception {
+ testGCId("UseParallelGC", "PrintGC");
+ testGCId("UseParallelGC", "PrintGCDetails");
+
+ testGCId("UseG1GC", "PrintGC");
+ testGCId("UseG1GC", "PrintGCDetails");
+
+ testGCId("UseConcMarkSweepGC", "PrintGC");
+ testGCId("UseConcMarkSweepGC", "PrintGCDetails");
+
+ testGCId("UseSerialGC", "PrintGC");
+ testGCId("UseSerialGC", "PrintGCDetails");
+ }
+
+ private static void verifyContainsGCIDs(OutputAnalyzer output) {
+ output.shouldMatch("^#0: \\[");
+ output.shouldMatch("^#1: \\[");
+ output.shouldHaveExitValue(0);
+ }
+
+ private static void verifyContainsNoGCIDs(OutputAnalyzer output) {
+ output.shouldNotMatch("^#[0-9]+: \\[");
+ output.shouldHaveExitValue(0);
+ }
+
+ private static void testGCId(String gcFlag, String logFlag) throws Exception {
+ // GCID logging enabled
+ ProcessBuilder pb_enabled =
+ ProcessTools.createJavaProcessBuilder("-XX:+" + gcFlag, "-XX:+" + logFlag, "-Xmx10M", "-XX:+PrintGCID", GCTest.class.getName());
+ verifyContainsGCIDs(new OutputAnalyzer(pb_enabled.start()));
+
+ // GCID logging disabled
+ ProcessBuilder pb_disabled =
+ ProcessTools.createJavaProcessBuilder("-XX:+" + gcFlag, "-XX:+" + logFlag, "-Xmx10M", "-XX:-PrintGCID", GCTest.class.getName());
+ verifyContainsNoGCIDs(new OutputAnalyzer(pb_disabled.start()));
+
+ // GCID logging default
+ ProcessBuilder pb_default =
+ ProcessTools.createJavaProcessBuilder("-XX:+" + gcFlag, "-XX:+" + logFlag, "-Xmx10M", GCTest.class.getName());
+ verifyContainsGCIDs(new OutputAnalyzer(pb_default.start()));
+ }
+
+ static class GCTest {
+ private static byte[] garbage;
+ public static void main(String [] args) {
+ System.out.println("Creating garbage");
+ // create 128MB of garbage. This should result in at least one GC
+ for (int i = 0; i < 1024; i++) {
+ garbage = new byte[128 * 1024];
+ }
+ // do a system gc to get one more gc
+ System.gc();
+ System.out.println("Done");
+ }
+ }
+}
diff --git a/hotspot/test/runtime/8001071/Test8001071.sh b/hotspot/test/runtime/8001071/Test8001071.sh
deleted file mode 100644
index 5fb4a7f9965..00000000000
--- a/hotspot/test/runtime/8001071/Test8001071.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-
-# Copyright (c) 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
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-
-## @test
-## @bug 8001071
-## @summary Add simple range check into VM implemenation of Unsafe access methods
-## @compile Test8001071.java
-## @run shell Test8001071.sh
-## @author filipp.zhinkin@oracle.com
-
-VERSION=`${TESTJAVA}/bin/java ${TESTVMOPTS} -version 2>&1`
-
-if [ -n "`echo $VERSION | grep debug`" -o -n "`echo $VERSION | grep jvmg`" ]; then
- echo "Build type check passed"
- echo "Continue testing"
-else
- echo "Fastdebug build is required for this test"
- exit 0
-fi
-
-${TESTJAVA}/bin/java -cp ${TESTCLASSES} ${TESTVMOPTS} Test8001071 2>&1
-
-HS_ERR_FILE=hs_err_pid*.log
-
-if [ ! -f $HS_ERR_FILE ]
-then
- echo "hs_err_pid log file was not found"
- echo "Test failed"
- exit 1
-fi
-
-grep "assert(byte_offset < p_size) failed: Unsafe access: offset.*> object's size.*" $HS_ERR_FILE
-
-if [ "0" = "$?" ];
-then
- echo "Range check assertion failed as expected"
- echo "Test passed"
- exit 0
-else
- echo "Range check assertion was not failed"
- echo "Test failed"
- exit 1
-fi
diff --git a/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java b/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java
index 73f0c804312..458a781de80 100644
--- a/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java
+++ b/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java
@@ -44,8 +44,16 @@ public class XShareAuto {
"-server", "-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=./sample.jsa", "-version");
output = new OutputAnalyzer(pb.start());
- output.shouldNotContain("sharing");
- output.shouldHaveExitValue(0);
+ // We asked for server but it could be aliased to something else
+ if (output.getOutput().contains("Server VM")) {
+ // In server case we don't expect to see sharing flag
+ output.shouldNotContain("sharing");
+ output.shouldHaveExitValue(0);
+ }
+ else {
+ System.out.println("Skipping test - no Server VM available");
+ return;
+ }
pb = ProcessTools.createJavaProcessBuilder(
"-server", "-Xshare:auto", "-XX:+UnlockDiagnosticVMOptions",
diff --git a/hotspot/test/runtime/EnclosingMethodAttr/EnclMethTest.jcod b/hotspot/test/runtime/EnclosingMethodAttr/EnclMethTest.jcod
new file mode 100644
index 00000000000..956b643b055
--- /dev/null
+++ b/hotspot/test/runtime/EnclosingMethodAttr/EnclMethTest.jcod
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This test has a EnclosingMethod attribute with an illegal
+ * attribute_length field value of 6. This should cause a
+ * java.lang.ClassFormatError exception to be thrown.
+ */
+
+class EnclMethTest {
+ 0xCAFEBABE;
+ 0; // minor version
+ 52; // version
+ [22] { // Constant Pool
+ ; // first element is empty
+ Field #3 #14; // #1 at 0x0A
+ Method #4 #15; // #2 at 0x0F
+ class #16; // #3 at 0x14
+ class #19; // #4 at 0x17
+ Utf8 "this$0"; // #5 at 0x1A
+ Utf8 "La;"; // #6 at 0x23
+ Utf8 "Synthetic"; // #7 at 0x29
+ Utf8 ""; // #8 at 0x35
+ Utf8 "(Ljava/lang/Object;)V"; // #9 at 0x3E
+ Utf8 "Code"; // #10 at 0x56
+ Utf8 "LineNumberTable"; // #11 at 0x5D
+ Utf8 "SourceFile"; // #12 at 0x6F
+ Utf8 "a.java"; // #13 at 0x7C
+ NameAndType #5 #6; // #14 at 0x85
+ NameAndType #8 #20; // #15 at 0x8A
+ Utf8 "EnclMethTest"; // #16 at 0x8F
+ Utf8 "Loc"; // #17 at 0x9E
+ Utf8 "InnerClasses"; // #18 at 0xA4
+ Utf8 "java/lang/Object"; // #19 at 0xB3
+ Utf8 "()V"; // #20 at 0xC6
+ Utf8 "EnclosingMethod"; // #21 at 0xCC
+ } // Constant Pool
+
+ 0x0000; // access
+ #3;// this_cpx
+ #4;// super_cpx
+
+ [0] { // Interfaces
+ } // Interfaces
+
+ [1] { // fields
+ { // Member at 0xE8
+ 0x0000; // access
+ #5; // name_cpx
+ #6; // sig_cpx
+ [1] { // Attributes
+ Attr(#7, 0) { // Synthetic at 0xF0
+ } // end Synthetic
+ } // Attributes
+ } // Member
+ } // fields
+
+ [1] { // methods
+ { // Member at 0xF8
+ 0x0001; // access
+ #8; // name_cpx
+ #20; // sig_cpx
+ [1] { // Attributes
+ Attr(#10, 17) { // Code at 0x0100
+ 2; // max_stack
+ 2; // max_locals
+ Bytes[5]{
+ 0x2AB70002B1;
+ };
+ [0] { // Traps
+ } // end Traps
+ [0] { // Attributes
+ } // Attributes
+ } // end Code
+ } // Attributes
+ } // Member
+ } // methods
+
+ [3] { // Attributes
+ Attr(#12, 2) { // SourceFile at 0x0119
+ #13;
+ } // end SourceFile
+ ;
+ Attr(#18, 10) { // InnerClasses at 0x0121
+ [1] { // InnerClasses
+ #3 #0 #17 0; // at 0x0131
+ }
+ } // end InnerClasses
+ ;
+ Attr(#21, 6) { // EnclosingMethod at 0x0131
+ // invalid length of EnclosingMethod attr: 6 (should be 4) !!
+ 0x0004000F;
+ } // end EnclosingMethod
+ } // Attributes
+} // end class EnclMethTest
diff --git a/langtools/test/tools/javac/mixedTarget/CompatibleAbstracts1.java b/hotspot/test/runtime/EnclosingMethodAttr/EnclMethodAttr.java
similarity index 56%
rename from langtools/test/tools/javac/mixedTarget/CompatibleAbstracts1.java
rename to hotspot/test/runtime/EnclosingMethodAttr/EnclMethodAttr.java
index 4aada78617c..82b5424813f 100644
--- a/langtools/test/tools/javac/mixedTarget/CompatibleAbstracts1.java
+++ b/hotspot/test/runtime/EnclosingMethodAttr/EnclMethodAttr.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -23,33 +23,25 @@
/*
* @test
- * @bug 5009712
- * @summary 1.4 javac should not accept the Covariant Return Type
- * @author gafter
- *
- * @compile CompatibleAbstracts1.java
- * @compile CompatibleAbstracts2.java
- * @compile -source 1.4 CompatibleAbstracts2.java
- * @compile CompatibleAbstracts3.java
- * @compile/fail -source 1.4 CompatibleAbstracts3.java
- * @compile CompatibleAbstracts4.java
- * @compile/fail -source 1.4 CompatibleAbstracts4.java
- * @compile CompatibleAbstracts5.java
- * @compile/fail -source 1.4 CompatibleAbstracts5.java
+ * @bug 8044738
+ * @library /testlibrary
+ * @summary Check attribute_length of EnclosingMethod attribute
+ * @run main EnclMethodAttr
*/
-interface A {
- A f();
+import java.io.File;
+import com.oracle.java.testlibrary.*;
+
+public class EnclMethodAttr {
+
+ static final String testsrc = System.getProperty("test.src");
+
+ public static void main(String args[]) throws Throwable {
+ System.out.println("Regression test for bug 8044738");
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-jar", testsrc + File.separator + "enclMethodAttr.jar");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("java.lang.ClassFormatError: Wrong EnclosingMethod");
+ }
}
-interface B extends A {
- B f();
-}
-
-interface C {
- B f();
-}
-
-interface D {
- D f();
-}
diff --git a/hotspot/test/runtime/EnclosingMethodAttr/enclMethodAttr.jar b/hotspot/test/runtime/EnclosingMethodAttr/enclMethodAttr.jar
new file mode 100644
index 00000000000..590e7ae37b6
Binary files /dev/null and b/hotspot/test/runtime/EnclosingMethodAttr/enclMethodAttr.jar differ
diff --git a/hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java b/hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java
index 06b2274d823..979aefcd446 100644
--- a/hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java
+++ b/hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java
@@ -24,6 +24,7 @@
/*
* @test
* @bug 8036823
+ * @bug 8046287
* @summary Creates two threads contending for the same lock and checks
* whether jstack reports "locked" by more than one thread.
*
@@ -52,10 +53,13 @@ public class TestThreadDumpMonitorContention {
// looking for header lines with these patterns:
// "ContendingThread-1" #19 prio=5 os_prio=64 tid=0x000000000079c000 nid=0x23 runnable [0xffff80ffb8b87000]
// "ContendingThread-2" #21 prio=5 os_prio=64 tid=0x0000000000780000 nid=0x2f waiting for monitor entry [0xfffffd7fc1111000]
+ // "ContendingThread-2" #24 prio=5 os_prio=64 tid=0x0000000000ec8800 nid=0x31 waiting on condition [0xfffffd7bbfffe000]
final static Pattern HEADER_PREFIX_PATTERN = Pattern.compile(
"^\"ContendingThread-.*");
- final static Pattern HEADER_WAITING_PATTERN = Pattern.compile(
+ final static Pattern HEADER_WAITING_PATTERN1 = Pattern.compile(
"^\"ContendingThread-.* waiting for monitor entry .*");
+ final static Pattern HEADER_WAITING_PATTERN2 = Pattern.compile(
+ "^\"ContendingThread-.* waiting on condition .*");
final static Pattern HEADER_RUNNABLE_PATTERN = Pattern.compile(
"^\"ContendingThread-.* runnable .*");
@@ -80,17 +84,34 @@ public class TestThreadDumpMonitorContention {
final static Pattern WAITING_PATTERN = Pattern.compile(
".* waiting to lock \\<.*\\(a TestThreadDumpMonitorContention.*");
+ final static Object barrier = new Object();
volatile static boolean done = false;
+ static int barrier_cnt = 0;
+ static int blank_line_match_cnt = 0;
static int error_cnt = 0;
- static String header_line = null;
static boolean have_header_line = false;
static boolean have_thread_state_line = false;
- static int match_cnt = 0;
- static String[] match_list = new String[2];
+ static String header_line = null;
+ static int header_prefix_match_cnt = 0;
+ static int locked_line_match_cnt = 0;
+ static String[] locked_match_list = new String[2];
static int n_samples = 15;
+ static int sum_both_running_cnt = 0;
+ static int sum_both_waiting_cnt = 0;
+ static int sum_contended_cnt = 0;
+ static int sum_locked_hdr_runnable_cnt = 0;
+ static int sum_locked_hdr_waiting1_cnt = 0;
+ static int sum_locked_hdr_waiting2_cnt = 0;
+ static int sum_locked_thr_state_blocked_cnt = 0;
+ static int sum_locked_thr_state_runnable_cnt = 0;
+ static int sum_one_waiting_cnt = 0;
+ static int sum_uncontended_cnt = 0;
+ static int sum_waiting_hdr_waiting1_cnt = 0;
+ static int sum_waiting_thr_state_blocked_cnt = 0;
static String thread_state_line = null;
static boolean verbose = false;
+ static int waiting_line_match_cnt = 0;
public static void main(String[] args) throws Exception {
if (args.length != 0) {
@@ -110,6 +131,11 @@ public class TestThreadDumpMonitorContention {
Runnable runnable = new Runnable() {
public void run() {
+ synchronized (barrier) {
+ // let the main thread know we're running
+ barrier_cnt++;
+ barrier.notify();
+ }
while (!done) {
synchronized (this) { }
}
@@ -118,8 +144,16 @@ public class TestThreadDumpMonitorContention {
Thread[] thread_list = new Thread[2];
thread_list[0] = new Thread(runnable, "ContendingThread-1");
thread_list[1] = new Thread(runnable, "ContendingThread-2");
- thread_list[0].start();
- thread_list[1].start();
+ synchronized (barrier) {
+ thread_list[0].start();
+ thread_list[1].start();
+
+ // Wait until the contending threads are running so that
+ // we don't sample any thread init states.
+ while (barrier_cnt < 2) {
+ barrier.wait();
+ }
+ }
doSamples();
@@ -143,11 +177,12 @@ public class TestThreadDumpMonitorContention {
// Example:
// "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f runnable [0xfffffd7fc1111000]
// java.lang.Thread.State: RUNNABLE
- // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:67)
+ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140)
// at java.lang.Thread.run(Thread.java:745)
//
static boolean checkBlankLine(String line) {
if (line.length() == 0) {
+ blank_line_match_cnt++;
have_header_line = false;
have_thread_state_line = false;
return true;
@@ -161,49 +196,73 @@ public class TestThreadDumpMonitorContention {
// Example 1:
// "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f runnable [0xfffffd7fc1111000]
// java.lang.Thread.State: RUNNABLE
- // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:67)
+ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140)
// - locked <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1)
// at java.lang.Thread.run(Thread.java:745)
//
// Example 2:
// "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f waiting for monitor entry [0xfffffd7fc1111000]
// java.lang.Thread.State: BLOCKED (on object monitor)
- // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:67)
+ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140)
// - locked <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1)
// at java.lang.Thread.run(Thread.java:745)
//
+ // Example 3:
+ // "ContendingThread-2" #24 prio=5 os_prio=64 tid=0x0000000000ec8800 nid=0x31 waiting on condition [0xfffffd7bbfffe000]
+ // java.lang.Thread.State: RUNNABLE
+ // JavaThread state: _thread_blocked
+ // Thread: 0x0000000000ec8800 [0x31] State: _at_safepoint _has_called_back 0 _at_poll_safepoint 0
+ // JavaThread state: _thread_blocked
+ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140)
+ // - locked <0xfffffd7e6d03eb28> (a TestThreadDumpMonitorContention$1)
+ // at java.lang.Thread.run(Thread.java:745)
+ //
static boolean checkLockedLine(String line) {
Matcher matcher = LOCK_PATTERN.matcher(line);
if (matcher.matches()) {
if (verbose) {
System.out.println("locked_line='" + line + "'");
}
- match_list[match_cnt] = new String(line);
- match_cnt++;
+ locked_match_list[locked_line_match_cnt] = new String(line);
+ locked_line_match_cnt++;
matcher = HEADER_RUNNABLE_PATTERN.matcher(header_line);
- if (!matcher.matches()) {
+ if (matcher.matches()) {
+ sum_locked_hdr_runnable_cnt++;
+ } else {
// It's strange, but a locked line can also
- // match the HEADER_WAITING_PATTERN.
- matcher = HEADER_WAITING_PATTERN.matcher(header_line);
- if (!matcher.matches()) {
- System.err.println();
- System.err.println("ERROR: header line does " +
- "not match runnable or waiting patterns.");
- System.err.println("ERROR: header_line='" +
- header_line + "'");
- System.err.println("ERROR: locked_line='" + line + "'");
- error_cnt++;
+ // match the HEADER_WAITING_PATTERN{1,2}.
+ matcher = HEADER_WAITING_PATTERN1.matcher(header_line);
+ if (matcher.matches()) {
+ sum_locked_hdr_waiting1_cnt++;
+ } else {
+ matcher = HEADER_WAITING_PATTERN2.matcher(header_line);
+ if (matcher.matches()) {
+ sum_locked_hdr_waiting2_cnt++;
+ } else {
+ System.err.println();
+ System.err.println("ERROR: header line does " +
+ "not match runnable or waiting patterns.");
+ System.err.println("ERROR: header_line='" +
+ header_line + "'");
+ System.err.println("ERROR: locked_line='" + line +
+ "'");
+ error_cnt++;
+ }
}
}
matcher = THREAD_STATE_RUNNABLE_PATTERN.matcher(thread_state_line);
- if (!matcher.matches()) {
+ if (matcher.matches()) {
+ sum_locked_thr_state_runnable_cnt++;
+ } else {
// It's strange, but a locked line can also
// match the THREAD_STATE_BLOCKED_PATTERN.
matcher = THREAD_STATE_BLOCKED_PATTERN.matcher(
thread_state_line);
- if (!matcher.matches()) {
+ if (matcher.matches()) {
+ sum_locked_thr_state_blocked_cnt++;
+ } else {
System.err.println();
System.err.println("ERROR: thread state line does not " +
"match runnable or waiting patterns.");
@@ -229,19 +288,22 @@ public class TestThreadDumpMonitorContention {
// Example:
// "ContendingThread-2" #22 prio=5 os_prio=64 tid=0x00000000007b9800 nid=0x30 waiting for monitor entry [0xfffffd7fc1010000]
// java.lang.Thread.State: BLOCKED (on object monitor)
- // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:67)
+ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140)
// - waiting to lock <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1)
// at java.lang.Thread.run(Thread.java:745)
//
static boolean checkWaitingLine(String line) {
Matcher matcher = WAITING_PATTERN.matcher(line);
if (matcher.matches()) {
+ waiting_line_match_cnt++;
if (verbose) {
System.out.println("waiting_line='" + line + "'");
}
- matcher = HEADER_WAITING_PATTERN.matcher(header_line);
- if (!matcher.matches()) {
+ matcher = HEADER_WAITING_PATTERN1.matcher(header_line);
+ if (matcher.matches()) {
+ sum_waiting_hdr_waiting1_cnt++;
+ } else {
System.err.println();
System.err.println("ERROR: header line does " +
"not match a waiting pattern.");
@@ -251,7 +313,9 @@ public class TestThreadDumpMonitorContention {
}
matcher = THREAD_STATE_BLOCKED_PATTERN.matcher(thread_state_line);
- if (!matcher.matches()) {
+ if (matcher.matches()) {
+ sum_waiting_thr_state_blocked_cnt++;
+ } else {
System.err.println();
System.err.println("ERROR: thread state line " +
"does not match a waiting pattern.");
@@ -273,7 +337,10 @@ public class TestThreadDumpMonitorContention {
static void doSamples() throws Exception {
for (int count = 0; count < n_samples; count++) {
- match_cnt = 0;
+ blank_line_match_cnt = 0;
+ header_prefix_match_cnt = 0;
+ locked_line_match_cnt = 0;
+ waiting_line_match_cnt = 0;
// verbose mode or an error has a lot of output so add more space
if (verbose || error_cnt > 0) System.out.println();
System.out.println("Sample #" + count);
@@ -290,12 +357,12 @@ public class TestThreadDumpMonitorContention {
// a failure and we report it
// - for a stack trace that matches LOCKED_PATTERN, we verify:
// - the header line matches HEADER_RUNNABLE_PATTERN
- // or HEADER_WAITING_PATTERN
+ // or HEADER_WAITING_PATTERN{1,2}
// - the thread state line matches THREAD_STATE_BLOCKED_PATTERN
// or THREAD_STATE_RUNNABLE_PATTERN
// - we report any mismatches as failures
// - for a stack trace that matches WAITING_PATTERN, we verify:
- // - the header line matches HEADER_WAITING_PATTERN
+ // - the header line matches HEADER_WAITING_PATTERN1
// - the thread state line matches THREAD_STATE_BLOCKED_PATTERN
// - we report any mismatches as failures
// - the stack traces that match HEADER_PREFIX_PATTERN may
@@ -324,6 +391,7 @@ public class TestThreadDumpMonitorContention {
if (!have_header_line) {
matcher = HEADER_PREFIX_PATTERN.matcher(line);
if (matcher.matches()) {
+ header_prefix_match_cnt++;
if (verbose) {
System.out.println();
System.out.println("header='" + line + "'");
@@ -366,19 +434,80 @@ public class TestThreadDumpMonitorContention {
}
process.waitFor();
- if (match_cnt == 2) {
- if (match_list[0].equals(match_list[1])) {
- System.err.println();
- System.err.println("ERROR: matching lock lines:");
- System.err.println("ERROR: line[0]'" + match_list[0] + "'");
- System.err.println("ERROR: line[1]'" + match_list[1] + "'");
- error_cnt++;
- }
- }
+ if (header_prefix_match_cnt != 2) {
+ System.err.println();
+ System.err.println("ERROR: should match exactly two headers.");
+ System.err.println("ERROR: header_prefix_match_cnt=" +
+ header_prefix_match_cnt);
+ error_cnt++;
+ }
+
+ if (locked_line_match_cnt == 2) {
+ if (locked_match_list[0].equals(locked_match_list[1])) {
+ System.err.println();
+ System.err.println("ERROR: matching lock lines:");
+ System.err.println("ERROR: line[0]'" +
+ locked_match_list[0] + "'");
+ System.err.println("ERROR: line[1]'" +
+ locked_match_list[1] + "'");
+ error_cnt++;
+ }
+ }
+
+ if (locked_line_match_cnt == 1) {
+ // one thread has the lock
+ if (waiting_line_match_cnt == 1) {
+ // and the other contended for it
+ sum_contended_cnt++;
+ } else {
+ // and the other is just running
+ sum_uncontended_cnt++;
+ }
+ } else if (waiting_line_match_cnt == 1) {
+ // one thread is waiting
+ sum_one_waiting_cnt++;
+ } else if (waiting_line_match_cnt == 2) {
+ // both threads are waiting
+ sum_both_waiting_cnt++;
+ } else {
+ // both threads are running
+ sum_both_running_cnt++;
+ }
// slight delay between jstack launches
Thread.sleep(500);
}
+
+ if (error_cnt != 0) {
+ // skip summary info since there were errors
+ return;
+ }
+
+ System.out.println("INFO: Summary for all samples:");
+ System.out.println("INFO: both_running_cnt=" + sum_both_running_cnt);
+ System.out.println("INFO: both_waiting_cnt=" + sum_both_waiting_cnt);
+ System.out.println("INFO: contended_cnt=" + sum_contended_cnt);
+ System.out.println("INFO: one_waiting_cnt=" + sum_one_waiting_cnt);
+ System.out.println("INFO: uncontended_cnt=" + sum_uncontended_cnt);
+ System.out.println("INFO: locked_hdr_runnable_cnt=" +
+ sum_locked_hdr_runnable_cnt);
+ System.out.println("INFO: locked_hdr_waiting1_cnt=" +
+ sum_locked_hdr_waiting1_cnt);
+ System.out.println("INFO: locked_hdr_waiting2_cnt=" +
+ sum_locked_hdr_waiting2_cnt);
+ System.out.println("INFO: locked_thr_state_blocked_cnt=" +
+ sum_locked_thr_state_blocked_cnt);
+ System.out.println("INFO: locked_thr_state_runnable_cnt=" +
+ sum_locked_thr_state_runnable_cnt);
+ System.out.println("INFO: waiting_hdr_waiting1_cnt=" +
+ sum_waiting_hdr_waiting1_cnt);
+ System.out.println("INFO: waiting_thr_state_blocked_cnt=" +
+ sum_waiting_thr_state_blocked_cnt);
+
+ if (sum_contended_cnt == 0) {
+ System.err.println("WARNING: the primary scenario for 8036823" +
+ " has not been exercised by this test run.");
+ }
}
// This helper relies on RuntimeMXBean.getName() returning a string
diff --git a/hotspot/test/runtime/Unsafe/RangeCheck.java b/hotspot/test/runtime/Unsafe/RangeCheck.java
new file mode 100644
index 00000000000..4d4ea2e048a
--- /dev/null
+++ b/hotspot/test/runtime/Unsafe/RangeCheck.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8001071
+ * @summary Add simple range check into VM implemenation of Unsafe access methods
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+import sun.misc.Unsafe;
+
+public class RangeCheck {
+
+ public static void main(String args[]) throws Exception {
+ if (!Platform.isDebugBuild()) {
+ System.out.println("Testing assert which requires a debug build. Passing silently.");
+ return;
+ }
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ true,
+ "-Xmx32m",
+ "-XX:-TransmitErrorReport",
+ "-XX:-InlineUnsafeOps", // The compiler intrinsics doesn't have the assert
+ DummyClassWithMainRangeCheck.class.getName());
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldMatch("assert\\(byte_offset < p_size\\) failed: Unsafe access: offset \\d+ > object's size \\d+");
+ }
+
+ public static class DummyClassWithMainRangeCheck {
+ public static void main(String args[]) throws Exception {
+ Unsafe unsafe = Utils.getUnsafe();
+ unsafe.getObject(new DummyClassWithMainRangeCheck(), Short.MAX_VALUE);
+ }
+ }
+}
diff --git a/hotspot/test/runtime/memory/ReadFromNoaccessArea.java b/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
index 1078dd2e4ea..484240287ce 100644
--- a/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
+++ b/hotspot/test/runtime/memory/ReadFromNoaccessArea.java
@@ -47,6 +47,7 @@ public class ReadFromNoaccessArea {
"-XX:+WhiteBoxAPI",
"-XX:+UseCompressedOops",
"-XX:HeapBaseMinAddress=33G",
+ "-Xmx32m",
DummyClassWithMainTryingToReadFromNoaccessArea.class.getName());
OutputAnalyzer output = new OutputAnalyzer(pb.start());
diff --git a/hotspot/test/runtime/memory/ReserveMemory.java b/hotspot/test/runtime/memory/ReserveMemory.java
index 9e37d52ccda..3a65ca605c2 100644
--- a/hotspot/test/runtime/memory/ReserveMemory.java
+++ b/hotspot/test/runtime/memory/ReserveMemory.java
@@ -57,6 +57,7 @@ public class ReserveMemory {
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:-TransmitErrorReport",
+ "-Xmx32m",
"ReserveMemory",
"test");
diff --git a/hotspot/test/runtime/verifier/TestANewArray.java b/hotspot/test/runtime/verifier/TestANewArray.java
new file mode 100644
index 00000000000..e8f58da2a41
--- /dev/null
+++ b/hotspot/test/runtime/verifier/TestANewArray.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import jdk.internal.org.objectweb.asm.ClassWriter;
+import jdk.internal.org.objectweb.asm.MethodVisitor;
+import static jdk.internal.org.objectweb.asm.Opcodes.*;
+
+import com.oracle.java.testlibrary.*;
+
+/*
+ * @test
+ * @summary Test that anewarray bytecode is valid only if it specifies 255 or fewer dimensions.
+ * @library /testlibrary
+ * @compile -XDignore.symbol.file TestANewArray.java
+ * @run main/othervm TestANewArray 49
+ * @run main/othervm TestANewArray 50
+ * @run main/othervm TestANewArray 51
+ * @run main/othervm TestANewArray 52
+ */
+
+/*
+ * Testing anewarray instruction with 254, 255 & 264 dimensions to verify JVMS 8,
+ * Section 4.9.1, Static Constraints that states the following:
+ *
+ * "No anewarray instruction may be used to create an array of more than 255 dimensions."
+ *
+ */
+
+public class TestANewArray {
+
+ static String classCName = null; // the generated class name
+
+ static final int test_Dimension_254 = 254; // should always pass
+ static final int test_Dimension_255 = 255; // should always pass, except for cfv 49
+ static final int test_Dimension_264 = 264; // should always fail
+
+ static final String array_Dimension_254 = genArrayDim(test_Dimension_254);
+ static final String array_Dimension_255 = genArrayDim(test_Dimension_255);
+ static final String array_Dimension_264 = genArrayDim(test_Dimension_264);
+
+ public static void main(String... args) throws Exception {
+ int cfv = Integer.parseInt(args[0]);
+
+ // 254 array dimensions
+ byte[] classFile_254 = dumpClassFile(cfv, test_Dimension_254, array_Dimension_254);
+ writeClassFileFromByteArray(classFile_254);
+ System.err.println("Running with cfv: " + cfv + ", test_Dimension_254");
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, "-verify", "-cp", ".", classCName);
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("java.lang.VerifyError");
+ output.shouldHaveExitValue(0);
+
+ // 255 array dimensions
+ byte[] classFile_255 = dumpClassFile(cfv, test_Dimension_255, array_Dimension_255);
+ writeClassFileFromByteArray(classFile_255);
+ System.err.println("Running with cfv: " + cfv + ", test_Dimension_255");
+ pb = ProcessTools.createJavaProcessBuilder(true, "-verify", "-cp", ".", classCName);
+ output = new OutputAnalyzer(pb.start());
+ if (cfv == 49) {
+ // The type-inferencing verifier used for <=49.0 ClassFiles detects an anewarray instruction
+ // with exactly 255 dimensions and incorrectly issues the "Array with too many dimensions" VerifyError.
+ output.shouldContain("Array with too many dimensions");
+ output.shouldHaveExitValue(1);
+ } else {
+ // 255 dimensions should always pass, except for cfv 49
+ output.shouldNotContain("java.lang.VerifyError");
+ output.shouldNotContain("java.lang.ClassFormatError");
+ output.shouldHaveExitValue(0);
+ }
+
+ // 264 array dimensions
+ byte[] classFile_264 = dumpClassFile(cfv, test_Dimension_264, array_Dimension_264);
+ writeClassFileFromByteArray(classFile_264);
+ System.err.println("Running with cfv: " + cfv + ", test_Dimension_264");
+ pb = ProcessTools.createJavaProcessBuilder(true, "-verify", "-cp", ".", classCName);
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("java.lang.ClassFormatError");
+ output.shouldHaveExitValue(1);
+ }
+
+ public static byte[] dumpClassFile(int cfv, int testDimension264, String arrayDim) throws Exception {
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+ MethodVisitor mv;
+
+ classCName = "classCName_" + cfv + "_" + testDimension264;
+
+ cw.visit(cfv, ACC_PUBLIC + ACC_SUPER, classCName, null, "java/lang/Object", null);
+ {
+ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false);
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ }
+ { // classCName main method
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+ mv.visitCode();
+ mv.visitIntInsn(BIPUSH, 1);
+ mv.visitTypeInsn(ANEWARRAY, arrayDim); // Test ANEWARRAY bytecode with various dimensions
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(2, 2);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+ return cw.toByteArray();
+ }
+
+ public static FileOutputStream writeClassFileFromByteArray(byte[] classFileByteArray) throws Exception {
+ FileOutputStream fos = new FileOutputStream(new File(classCName + ".class"));
+ fos.write(classFileByteArray);
+ fos.close();
+ return fos;
+ }
+
+ private static String genArrayDim(int testDim) {
+ StringBuilder array_Dimension = new StringBuilder();
+ for (int i = 0; i < testDim; i++)
+ {
+ array_Dimension.append("[");
+ }
+ return array_Dimension.append("Ljava/lang/Object;").toString();
+ }
+}
diff --git a/hotspot/test/serviceability/dcmd/ClassLoaderStatsTest.java b/hotspot/test/serviceability/dcmd/ClassLoaderStatsTest.java
new file mode 100644
index 00000000000..0b229a8a9a1
--- /dev/null
+++ b/hotspot/test/serviceability/dcmd/ClassLoaderStatsTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ *
+ * @build ClassLoaderStatsTest DcmdUtil
+ * @run main ClassLoaderStatsTest
+ */
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ClassLoaderStatsTest {
+
+ // ClassLoader Parent CLD* Classes ChunkSz BlockSz Type
+ // 0x00000007c0215928 0x0000000000000000 0x0000000000000000 0 0 0 org.eclipse.osgi.baseadaptor.BaseAdaptor$1
+ // 0x00000007c0009868 0x0000000000000000 0x00007fc52aebcc80 1 6144 3768 sun.reflect.DelegatingClassLoader
+ // 0x00000007c0009868 0x0000000000000000 0x00007fc52b8916d0 1 6144 3688 sun.reflect.DelegatingClassLoader
+ // 0x00000007c0009868 0x00000007c0038ba8 0x00007fc52afb8760 1 6144 3688 sun.reflect.DelegatingClassLoader
+ // 0x00000007c0009868 0x0000000000000000 0x00007fc52afbb1a0 1 6144 3688 sun.reflect.DelegatingClassLoader
+ // 0x0000000000000000 0x0000000000000000 0x00007fc523416070 5019 30060544 29956216
+ // 455 1210368 672848 + unsafe anonymous classes
+ // 0x00000007c016b5c8 0x00000007c0038ba8 0x00007fc52a995000 5 8192 5864 org.netbeans.StandardModule$OneModuleClassLoader
+ // 0x00000007c0009868 0x00000007c016b5c8 0x00007fc52ac13640 1 6144 3896 sun.reflect.DelegatingClassLoader
+ // ...
+
+ static Pattern clLine = Pattern.compile("0x\\p{XDigit}*\\s*0x\\p{XDigit}*\\s*0x\\p{XDigit}*\\s*(\\d*)\\s*(\\d*)\\s*(\\d*)\\s*(.*)");
+ static Pattern anonLine = Pattern.compile("\\s*(\\d*)\\s*(\\d*)\\s*(\\d*)\\s*.*");
+
+ public static DummyClassLoader dummyloader;
+
+ public static void main(String arg[]) throws Exception {
+
+ // create a classloader and load our special class
+ dummyloader = new DummyClassLoader();
+ Class> c = Class.forName("TestClass", true, dummyloader);
+ if (c.getClassLoader() != dummyloader) {
+ throw new RuntimeException("TestClass defined by wrong classloader: " + c.getClassLoader());
+ }
+
+ String result = DcmdUtil.executeDcmd("VM.classloader_stats");
+ BufferedReader r = new BufferedReader(new StringReader(result));
+ String line;
+ while((line = r.readLine()) != null) {
+ Matcher m = clLine.matcher(line);
+ if (m.matches()) {
+ // verify that DummyClassLoader has loaded 1 class and 1 anonymous class
+ if (m.group(4).equals("ClassLoaderStatsTest$DummyClassLoader")) {
+ System.out.println("line: " + line);
+ if (!m.group(1).equals("1")) {
+ throw new Exception("Should have loaded 1 class: " + line);
+ }
+ checkPositiveInt(m.group(2));
+ checkPositiveInt(m.group(3));
+
+ String next = r.readLine();
+ System.out.println("next: " + next);
+ Matcher m1 = anonLine.matcher(next);
+ m1.matches();
+ if (!m1.group(1).equals("1")) {
+ throw new Exception("Should have loaded 1 anonymous class, but found : " + m1.group(1));
+ }
+ checkPositiveInt(m1.group(2));
+ checkPositiveInt(m1.group(3));
+ }
+ }
+ }
+ }
+
+ private static void checkPositiveInt(String s) throws Exception {
+ if (Integer.parseInt(s) <= 0) {
+ throw new Exception("Value should have been > 0: " + s);
+ }
+ }
+
+ public static class DummyClassLoader extends ClassLoader {
+
+ public static final String CLASS_NAME = "TestClass";
+
+ static ByteBuffer readClassFile(String name)
+ {
+ File f = new File(System.getProperty("test.classes", "."),
+ name);
+ try (FileInputStream fin = new FileInputStream(f);
+ FileChannel fc = fin.getChannel())
+ {
+ return fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
+ } catch (IOException e) {
+ throw new RuntimeException("Can't open file: " + name, e);
+ }
+ }
+
+ protected Class> loadClass(String name, boolean resolve)
+ throws ClassNotFoundException
+ {
+ Class> c;
+ if (!"TestClass".equals(name)) {
+ c = super.loadClass(name, resolve);
+ } else {
+ // should not delegate to the system class loader
+ c = findClass(name);
+ if (resolve) {
+ resolveClass(c);
+ }
+ }
+ return c;
+ }
+
+ protected Class> findClass(String name)
+ throws ClassNotFoundException
+ {
+ if (!"TestClass".equals(name)) {
+ throw new ClassNotFoundException("Unexpected class: " + name);
+ }
+ return defineClass(name, readClassFile(name + ".class"), null);
+ }
+ } /* DummyClassLoader */
+
+}
+
+class TestClass {
+ static {
+ // force creation of anonymous class (for the lambdaform)
+ Runnable r = () -> System.out.println("Hello");
+ r.run();
+ }
+}
diff --git a/hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java b/hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java
index 6f4b2fd689a..815b3f606ca 100644
--- a/hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java
+++ b/hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java
@@ -26,6 +26,7 @@
* @bug 8028623
* @summary Test hashing of extended characters in Serviceability Agent.
* @library /testlibrary
+ * @ignore 8044416
* @build com.oracle.java.testlibrary.*
* @compile -encoding utf8 Test8028623.java
* @run main Test8028623
diff --git a/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java b/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
index cf313c37962..a76fd4d9a22 100644
--- a/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
+++ b/hotspot/test/testlibrary_tests/whitebox/vm_flags/BooleanTest.java
@@ -25,7 +25,7 @@
* @test BooleanTest
* @bug 8028756
* @library /testlibrary /testlibrary/whitebox
- * @build BooleanTest
+ * @build BooleanTest ClassFileInstaller sun.hotspot.WhiteBox com.oracle.java.testlibrary.*
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI BooleanTest
* @summary testing of WB::set/getBooleanVMFlag()
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 52f9145880b..710410b142d 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -263,3 +263,5 @@ a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16
5afa90c28742d175431be75f9098745510bd2b30 jdk9-b18
f9c82769a6bc2b219a8f01c24afe5c91039267d7 jdk9-b19
94fd4d9d3a75819644b21e18c8a567fd0e973eaf jdk9-b20
+7eb0ab676ea75cb1dd31c613e77008a7d8cb0af7 jdk9-b21
+82b94ff002c6e007a03bf0f364ca94b381e09135 jdk9-b22
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java
index 4d28f2a92f5..db83c73b299 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/JavaClass.java
@@ -78,7 +78,6 @@ import java.util.StringTokenizer;
* class file. Those interested in programatically generating classes
* should see the ClassGen class.
- * @version $Id: JavaClass.java,v 1.4 2007-07-19 04:34:42 ofung Exp $
* @see com.sun.org.apache.bcel.internal.generic.ClassGen
* @author M. Dahm
*/
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/util/Class2HTML.java b/jaxp/src/com/sun/org/apache/bcel/internal/util/Class2HTML.java
index 5a9e094d460..52b9df945c7 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/util/Class2HTML.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/util/Class2HTML.java
@@ -82,7 +82,6 @@ import com.sun.org.apache.bcel.internal.Constants;
* method in the Method's frame will jump to the appropiate method in
* the Code frame.
*
- * @version $Id: Class2HTML.java,v 1.3 2007-07-19 04:34:52 ofung Exp $
* @author M. Dahm
*/
public class Class2HTML implements Constants
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/util/ClassPath.java b/jaxp/src/com/sun/org/apache/bcel/internal/util/ClassPath.java
index 0cd5021ddb1..ac4745ea97f 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/util/ClassPath.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/util/ClassPath.java
@@ -66,7 +66,6 @@ import java.io.*;
* Responsible for loading (class) files from the CLASSPATH. Inspired by
* sun.tools.ClassPath.
*
- * @version $Id: ClassPath.java,v 1.4 2007-07-19 04:34:52 ofung Exp $
* @author M. Dahm
*/
public class ClassPath implements Serializable {
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java b/jaxp/src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java
index 1540f6d5c8b..d264b047ba1 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/util/JavaWrapper.java
@@ -72,7 +72,6 @@ import java.lang.reflect.*;
* java com.sun.org.apache.bcel.internal.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
*
*
- * @version $Id: JavaWrapper.java,v 1.3 2007-07-19 04:34:52 ofung Exp $
* @author M. Dahm
* @see ClassLoader
*/
diff --git a/jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java b/jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java
index 095a6e74b96..9b3b0fa46cd 100644
--- a/jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
*
* @author Huizhe Wang, Oracle
*
- * @version $Id: Constants.java,v 1.14 2011-06-07 04:39:40 joehw Exp $
*/
public final class XalanConstants {
diff --git a/jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java b/jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java
index 034d8eec84b..7d5d104501d 100644
--- a/jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java
@@ -32,7 +32,6 @@ package com.sun.org.apache.xalan.internal.utils;
* class and modified to be used as a general utility for creating objects
* dynamically.
*
- * @version $Id: ObjectFactory.java,v 1.11 2010-11-01 04:34:25 joehw Exp $
*/
public class ObjectFactory {
diff --git a/jaxp/src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java b/jaxp/src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java
index 928da3e9e9d..a6b99891be4 100644
--- a/jaxp/src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/xslt/EnvironmentCheck.java
@@ -92,7 +92,6 @@ import org.w3c.dom.Node;
* of thing but in a much simpler manner.
*
* @author Shane_Curcuru@us.ibm.com
- * @version $Id: EnvironmentCheck.java,v 1.10 2010-11-01 04:34:13 joehw Exp $
*/
public class EnvironmentCheck
{
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrImpl.java
index 352fba6a18c..873f7be9842 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrImpl.java
@@ -109,7 +109,6 @@ import org.w3c.dom.Text;
* @author Arnaud Le Hors, IBM
* @author Joe Kesselman, IBM
* @author Andy Clark, IBM
- * @version $Id: AttrImpl.java,v 1.5 2008/06/10 00:59:32 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrNSImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrNSImpl.java
index 7defc559d01..34de50dccde 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrNSImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttrNSImpl.java
@@ -37,7 +37,6 @@ import org.w3c.dom.DOMException;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
* @author Ralf Pfeiffer, IBM
- * @version $Id: AttrNSImpl.java,v 1.7 2010-11-01 04:39:37 joehw Exp $
*/
public class AttrNSImpl
extends AttrImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttributeMap.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttributeMap.java
index 8d2d054fccc..5f7f4e17340 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttributeMap.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/AttributeMap.java
@@ -40,7 +40,6 @@ import org.w3c.dom.Node;
*
* @xerces.internal
*
- * @version $Id: AttributeMap.java,v 1.7 2010-11-01 04:39:37 joehw Exp $
*/
public class AttributeMap extends NamedNodeMapImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDOMImplementationImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDOMImplementationImpl.java
index f20775e3f7a..45b91dc9aa2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDOMImplementationImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDOMImplementationImpl.java
@@ -52,7 +52,6 @@ import org.w3c.dom.ls.LSSerializer;
*
* @xerces.internal
*
- * @version $Id: CoreDOMImplementationImpl.java,v 1.6 2010-11-01 04:39:37 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*/
public class CoreDOMImplementationImpl
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDocumentImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDocumentImpl.java
index 46cbc349ff4..2fb6f8b225d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDocumentImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/CoreDocumentImpl.java
@@ -79,7 +79,6 @@ import org.w3c.dom.ls.LSSerializer;
* @author Joe Kesselman, IBM
* @author Andy Clark, IBM
* @author Ralf Pfeiffer, IBM
- * @version $Id: CoreDocumentImpl.java,v 1.9 2010-11-01 04:39:37 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java
index 1e8dcd98817..189abdff259 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMConfigurationImpl.java
@@ -68,7 +68,6 @@ import org.w3c.dom.ls.LSResourceResolver;
*
* @author Elena Litani, IBM
* @author Neeraj Bajaj, Sun Microsystems.
- * @version $Id: DOMConfigurationImpl.java,v 1.9 2010-11-01 04:39:37 joehw Exp $
*/
public class DOMConfigurationImpl extends ParserConfigurationSettings
implements XMLParserConfiguration, DOMConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java
index f7d131fdb9b..1d30c9e76b4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMMessageFormatter.java
@@ -31,7 +31,6 @@ import java.util.ResourceBundle;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: DOMMessageFormatter.java,v 1.6 2010-11-01 04:39:38 joehw Exp $
*/
public class DOMMessageFormatter {
public static final String DOM_DOMAIN = "http://www.w3.org/dom/DOMTR";
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java
index 3758f399230..651bd741432 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DOMNormalizer.java
@@ -94,7 +94,6 @@ import org.w3c.dom.Text;
*
* @author Elena Litani, IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
- * @version $Id: DOMNormalizer.java,v 1.9 2010-11-01 04:39:38 joehw Exp $
*/
public class DOMNormalizer implements XMLDocumentHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DeferredDocumentImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DeferredDocumentImpl.java
index 92c03b0baad..8f133b8799a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DeferredDocumentImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DeferredDocumentImpl.java
@@ -40,7 +40,6 @@ import org.w3c.dom.Node;
*
* @xerces.internal
*
- * @version $Id: DeferredDocumentImpl.java,v 1.11 2010-11-01 04:39:38 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*/
public class DeferredDocumentImpl
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DocumentImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DocumentImpl.java
index 4cc06483c56..55d43c6df90 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/DocumentImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/DocumentImpl.java
@@ -76,7 +76,6 @@ import org.w3c.dom.traversal.TreeWalker;
* @author Joe Kesselman, IBM
* @author Andy Clark, IBM
* @author Ralf Pfeiffer, IBM
- * @version $Id: DocumentImpl.java,v 1.6 2010/07/20 20:25:24 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*/
public class DocumentImpl
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/ElementNSImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/ElementNSImpl.java
index 35757db0911..042835e7ce6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/ElementNSImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/ElementNSImpl.java
@@ -42,7 +42,6 @@ import org.w3c.dom.DOMException;
*
* @author Elena litani, IBM
* @author Neeraj Bajaj, Sun Microsystems
- * @version $Id: ElementNSImpl.java,v 1.7 2010-11-01 04:39:39 joehw Exp $
*/
public class ElementNSImpl
extends ElementImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/NamedNodeMapImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/NamedNodeMapImpl.java
index fcf40479703..f3e0c942758 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/NamedNodeMapImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/NamedNodeMapImpl.java
@@ -56,7 +56,6 @@ import org.w3c.dom.Node;
*
* @xerces.internal
*
- * @version $Id: NamedNodeMapImpl.java,v 1.8 2010-11-01 04:39:39 joehw Exp $
* @since PR-DOM-Level-1-19980818.
*/
public class NamedNodeMapImpl
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/NodeListCache.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/NodeListCache.java
index e0923ce9960..585c41e6364 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/NodeListCache.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/NodeListCache.java
@@ -30,7 +30,6 @@ import java.io.Serializable;
*
* @author Arnaud Le Hors, IBM
*
- * @version $Id: NodeListCache.java,v 1.6 2010/07/20 20:25:25 joehw Exp $
*/
class NodeListCache implements Serializable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/PSVIElementNSImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/PSVIElementNSImpl.java
index 7b26a9ad96c..272a7c93a18 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/PSVIElementNSImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/PSVIElementNSImpl.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.xs.*;
*
* @author Sandy Gao, IBM
*
- * @version $Id: PSVIElementNSImpl.java,v 1.6 2010/08/20 18:51:54 joehw Exp $
*/
public class PSVIElementNSImpl extends ElementNSImpl implements ElementPSVI {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/dom/ParentNode.java b/jaxp/src/com/sun/org/apache/xerces/internal/dom/ParentNode.java
index 7725c4c530d..3481afe1f6a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/dom/ParentNode.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/dom/ParentNode.java
@@ -68,7 +68,6 @@ import org.w3c.dom.UserDataHandler;
* @author Arnaud Le Hors, IBM
* @author Joe Kesselman, IBM
* @author Andy Clark, IBM
- * @version $Id: ParentNode.java,v 1.6 2009/07/21 20:30:28 joehw Exp $
*/
public abstract class ParentNode
extends ChildNode {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java
index 4eab0fadfe9..147a3ab43a6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java
@@ -31,7 +31,6 @@ import java.util.NoSuchElementException;
*
* @author Andy Clark, IBM
*
- * @version $Id: Constants.java,v 1.14 2010-11-01 04:39:40 joehw Exp $
*/
public final class Constants {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/Version.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/Version.java
index ac62db7dc26..41a2b620b5c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/Version.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/Version.java
@@ -64,7 +64,6 @@ package com.sun.org.apache.xerces.internal.impl;
/**
* This class defines the version number of the parser.
*
- * @version $Id: Version.java,v 1.4 2010-11-01 04:39:40 joehw Exp $
*/
public class Version {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11DocumentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11DocumentScannerImpl.java
index dda470ae873..cf5f3b9059b 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11DocumentScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11DocumentScannerImpl.java
@@ -96,7 +96,6 @@ import com.sun.org.apache.xerces.internal.xni.XNIException;
* @author Arnaud Le Hors, IBM
* @author Eric Ye, IBM
*
- * @version $Id: XML11DocumentScannerImpl.java,v 1.5 2010/08/04 20:59:09 joehw Exp $
*/
public class XML11DocumentScannerImpl
extends XMLDocumentScannerImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java
index 518c09ab7f6..130c6227511 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java
@@ -77,7 +77,6 @@ import java.io.IOException;
*
* @author Michael Glavassevich, IBM
* @author Neil Graham, IBM
- * @version $Id: XML11EntityScanner.java,v 1.5 2010-11-01 04:39:40 joehw Exp $
*/
public class XML11EntityScanner
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11NSDocumentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11NSDocumentScannerImpl.java
index 7a826dfcc97..7d6b3cbd043 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11NSDocumentScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11NSDocumentScannerImpl.java
@@ -108,7 +108,6 @@ import javax.xml.stream.events.XMLEvent;
* @author Elena Litani, IBM
* @author Michael Glavassevich, IBM
* @author Sunitha Reddy, Sun Microsystems
- * @version $Id: XML11NSDocumentScannerImpl.java,v 1.6 2010-11-01 04:39:40 joehw Exp $
*/
public class XML11NSDocumentScannerImpl extends XML11DocumentScannerImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java
index d2ede948ac1..74db88ca6cd 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDTDScannerImpl.java
@@ -69,7 +69,6 @@ import com.sun.xml.internal.stream.Entity;
* @author Glenn Marcy, IBM
* @author Eric Ye, IBM
*
- * @version $Id: XMLDTDScannerImpl.java,v 1.8 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLDTDScannerImpl
extends XMLScanner
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java
index 01468284cd1..fc8b5098a57 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java
@@ -78,7 +78,6 @@ import javax.xml.stream.events.XMLEvent;
* @author Arnaud Le Hors, IBM
* @author Eric Ye, IBM
* @author Sunitha Reddy, SUN Microsystems
- * @version $Id: XMLDocumentFragmentScannerImpl.java,v 1.19 2010-11-02 19:54:55 joehw Exp $
*
*/
public class XMLDocumentFragmentScannerImpl
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java
index c2d58bd4070..d191de9ba89 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentScannerImpl.java
@@ -65,7 +65,6 @@ import javax.xml.stream.events.XMLEvent;
* Refer to the table in unit-test javax.xml.stream.XMLStreamReaderTest.SupportDTD for changes
* related to property SupportDTD.
* @author Joe Wang, Sun Microsystems
- * @version $Id: XMLDocumentScannerImpl.java,v 1.17 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLDocumentScannerImpl
extends XMLDocumentFragmentScannerImpl{
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java
index 988fd6f9c60..7a70b3abece 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java
@@ -83,7 +83,6 @@ import java.util.StringTokenizer;
* @author K.Venugopal SUN Microsystems
* @author Neeraj Bajaj SUN Microsystems
* @author Sunitha Reddy SUN Microsystems
- * @version $Id: XMLEntityManager.java,v 1.17 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLEntityManager implements XMLComponent, XMLEntityResolver {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLErrorReporter.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLErrorReporter.java
index 8d0ed6d76fd..e6ce89d3816 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLErrorReporter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLErrorReporter.java
@@ -111,7 +111,6 @@ import org.xml.sax.ErrorHandler;
* @author Eric Ye, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XMLErrorReporter.java,v 1.5 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLErrorReporter
implements XMLComponent {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java
index 66b8179b97b..36d72ac51df 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java
@@ -58,7 +58,6 @@ import javax.xml.stream.events.XMLEvent;
* @author Neeraj Bajaj, Sun Microsystems
* @author Venugopal Rao K, Sun Microsystems
* @author Elena Litani, IBM
- * @version $Id: XMLNSDocumentScannerImpl.java,v 1.11 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLNSDocumentScannerImpl
extends XMLDocumentScannerImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNamespaceBinder.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNamespaceBinder.java
index 13c27bc8fed..33a18a84444 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNamespaceBinder.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNamespaceBinder.java
@@ -97,7 +97,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;
*
* @author Andy Clark, IBM
*
- * @version $Id: XMLNamespaceBinder.java,v 1.4 2010-11-01 04:39:41 joehw Exp $
*/
public class XMLNamespaceBinder
implements XMLComponent, XMLDocumentFilter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLScanner.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLScanner.java
index 0cb44b2c0c0..28fbc69270e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLScanner.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLScanner.java
@@ -69,7 +69,6 @@ import com.sun.xml.internal.stream.Entity;
* @author Eric Ye, IBM
* @author K.Venugopal SUN Microsystems
* @author Sunitha Reddy, SUN Microsystems
- * @version $Id: XMLScanner.java,v 1.12 2010-11-01 04:39:41 joehw Exp $
*/
public abstract class XMLScanner
implements XMLComponent {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/BalancedDTDGrammar.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/BalancedDTDGrammar.java
index 0b09e34ffc1..c144a2490b6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/BalancedDTDGrammar.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/BalancedDTDGrammar.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xni.XNIException;
* @xerces.internal
*
* @author Michael Glavassevich, IBM
- * @version $Id: BalancedDTDGrammar.java,v 1.1 2010/08/11 07:18:38 joehw Exp $
*/
final class BalancedDTDGrammar extends DTDGrammar {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammar.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammar.java
index 71a9231f71b..f0478f45fb8 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammar.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/DTDGrammar.java
@@ -101,7 +101,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDSource;
* @author Andy Clark, IBM
* @author Neil Graham, IBM
*
- * @version $Id: DTDGrammar.java,v 1.4 2010/08/11 07:18:37 joehw Exp $
*/
public class DTDGrammar
implements XMLDTDHandler, XMLDTDContentModelHandler, EntityState, Grammar {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDDescription.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDDescription.java
index b9e48e9225e..90a55affe91 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDDescription.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDDescription.java
@@ -75,7 +75,6 @@ import com.sun.org.apache.xerces.internal.util.XMLResourceIdentifierImpl;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XMLDTDDescription.java,v 1.4 2010/08/11 07:18:38 joehw Exp $
*/
public class XMLDTDDescription extends XMLResourceIdentifierImpl
implements com.sun.org.apache.xerces.internal.xni.grammars.XMLDTDDescription {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDLoader.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDLoader.java
index ea343942ea5..eea1b94613f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDLoader.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDLoader.java
@@ -108,7 +108,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
* @author Neil Graham, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XMLDTDLoader.java,v 1.6 2010-11-01 04:39:42 joehw Exp $
*/
public class XMLDTDLoader
extends XMLDTDProcessor
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDProcessor.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDProcessor.java
index 45e1b31e0bc..85bdb7f74c5 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDProcessor.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDProcessor.java
@@ -113,7 +113,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDSource;
*
* @author Neil Graham, IBM
*
- * @version $Id: XMLDTDProcessor.java,v 1.5 2010-11-01 04:39:42 joehw Exp $
*/
public class XMLDTDProcessor
implements XMLComponent, XMLDTDFilter, XMLDTDContentModelFilter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidator.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidator.java
index 05308782e62..01c8c54f7a7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidator.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/XMLDTDValidator.java
@@ -83,7 +83,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;
* @author Jeffrey Rodriguez IBM
* @author Neil Graham, IBM
*
- * @version $Id: XMLDTDValidator.java,v 1.8 2010-11-01 04:39:42 joehw Exp $
*/
public class XMLDTDValidator
implements XMLComponent, XMLDocumentFilter, XMLDTDValidatorFilter, RevalidationHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/models/DFAContentModel.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/models/DFAContentModel.java
index 9a4e0f5c122..008bd6ff8fe 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/models/DFAContentModel.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dtd/models/DFAContentModel.java
@@ -68,7 +68,6 @@ import com.sun.org.apache.xerces.internal.xni.QName;
/**
- * @version $Id: DFAContentModel.java,v 1.4 2010/08/06 23:49:43 joehw Exp $
* DFAContentModel is the derivative of ContentModel that does
* all of the non-trivial element content validation. This class does
* the conversion from the regular expression to the DFA that
@@ -82,7 +81,6 @@ import com.sun.org.apache.xerces.internal.xni.QName;
*
* @xerces.internal
*
- * @version $Id: DFAContentModel.java,v 1.4 2010/08/06 23:49:43 joehw Exp $
*/
public class DFAContentModel
implements ContentModelValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DTDDVFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DTDDVFactory.java
index 15afa2e1407..fd7426f7551 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DTDDVFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DTDDVFactory.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.utils.ObjectFactory;
*
* @author Sandy Gao, IBM
*
- * @version $Id: DTDDVFactory.java,v 1.6 2010-11-01 04:39:43 joehw Exp $
*/
public abstract class DTDDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java
index f38b1d3797f..363b26844f3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/DatatypeException.java
@@ -35,7 +35,6 @@ import java.util.MissingResourceException;
*
* @author Sandy Gao, IBM
*
- * @version $Id: DatatypeException.java,v 1.6 2010-11-01 04:39:43 joehw Exp $
*/
public class DatatypeException extends Exception {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/SchemaDVFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/SchemaDVFactory.java
index 902d9d3fdea..47646f2dad2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/SchemaDVFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/SchemaDVFactory.java
@@ -40,7 +40,6 @@ import com.sun.org.apache.xerces.internal.utils.ObjectFactory;
*
* @author Sandy Gao, IBM
*
- * @version $Id: SchemaDVFactory.java,v 1.6 2010-11-01 04:39:43 joehw Exp $
*/
public abstract class SchemaDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/ValidationContext.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/ValidationContext.java
index 6ff4d66031e..da8d550a84a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/ValidationContext.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/ValidationContext.java
@@ -29,7 +29,6 @@ import java.util.Locale;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: ValidationContext.java,v 1.6 2010/07/23 02:09:29 joehw Exp $
*/
public interface ValidationContext {
// whether to validate against facets
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/util/ByteListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/util/ByteListImpl.java
index 984fb2ab404..3357593489d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/util/ByteListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/util/ByteListImpl.java
@@ -31,7 +31,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.ByteList;
*
* @author Ankit Pasricha, IBM
*
- * @version $Id: ByteListImpl.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class ByteListImpl extends AbstractList implements ByteList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/AbstractDateTimeDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/AbstractDateTimeDV.java
index d9d6587379b..64242a5cf95 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/AbstractDateTimeDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/AbstractDateTimeDV.java
@@ -47,7 +47,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.XSDateTime;
* @author Len Berman
* @author Gopal Sharma, SUN Microsystems Inc.
*
- * @version $Id: AbstractDateTimeDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public abstract class AbstractDateTimeDV extends TypeValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV.java
index fcfa039df43..47185b1725d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.util.ByteListImpl;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: Base64BinaryDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class Base64BinaryDV extends TypeValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseDVFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseDVFactory.java
index 198f3aba046..715b0ee040c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseDVFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseDVFactory.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: BaseDVFactory.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class BaseDVFactory extends SchemaDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseSchemaDVFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseSchemaDVFactory.java
index da30a8f5fed..3cc03f0b449 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseSchemaDVFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/BaseSchemaDVFactory.java
@@ -38,7 +38,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @author Sandy Gao, IBM
* @author Khaled Noaman, IBM
*
- * @version $Id: BaseSchemaDVFactory.java,v 1.2 2010-10-26 23:01:03 joehw Exp $
*/
public abstract class BaseSchemaDVFactory extends SchemaDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateDV.java
index 01b0eabcf6d..d302e22fd1a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystems Inc.
*
- * @version $Id: DateDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class DateDV extends DateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateTimeDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateTimeDV.java
index 6b2011d974d..2a19f8cec9f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateTimeDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DateTimeDV.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: DateTimeDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class DateTimeDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayDV.java
index 1e501f01be4..d0e6ce6021e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayDV.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
*
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
- * @version $Id: DayDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class DayDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayTimeDurationDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayTimeDurationDV.java
index dd16f196cd3..8488503acee 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayTimeDurationDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DayTimeDurationDV.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
*
* @author Ankit Pasricha, IBM
*
- * @version $Id: DayTimeDurationDV.java,v 1.6 2010-11-01 04:39:46 joehw Exp $
*/
class DayTimeDurationDV extends DurationDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java
index e884d0d62d6..a25d6d7243e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DoubleDV.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.XSDouble;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: DoubleDV.java,v 1.7 2010-11-01 04:39:46 joehw Exp $
*/
public class DoubleDV extends TypeValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DurationDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DurationDV.java
index 1ec86d0ae6d..9ad95cc77b4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DurationDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/DurationDV.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
*
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
- * @version $Id: DurationDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class DurationDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ExtendedSchemaDVFactoryImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ExtendedSchemaDVFactoryImpl.java
index fa7e79e42c8..13d166a8f53 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ExtendedSchemaDVFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ExtendedSchemaDVFactoryImpl.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.util.SymbolHash;
*
* @author Khaled Noaman, IBM
*
- * @version $Id: ExtendedSchemaDVFactoryImpl.java,v 1.2 2010-10-26 23:01:03 joehw Exp $
*/
public class ExtendedSchemaDVFactoryImpl extends BaseSchemaDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/FloatDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/FloatDV.java
index 9ff0ecfccd9..f2478233564 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/FloatDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/FloatDV.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.XSFloat;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: FloatDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class FloatDV extends TypeValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/HexBinaryDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/HexBinaryDV.java
index 2b872263637..99bc19709dc 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/HexBinaryDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/HexBinaryDV.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: HexBinaryDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class HexBinaryDV extends TypeValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ListDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ListDV.java
index ca074323d37..07d49b0988c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ListDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/ListDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: ListDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class ListDV extends TypeValidator{
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDV.java
index ea57736397f..175c5ebf2d9 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: MonthDV.java,v 1.8 2010-11-01 04:39:47 joehw Exp $
*/
public class MonthDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDayDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDayDV.java
index 4b4dc118ada..0edc0006ad7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDayDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/MonthDayDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: MonthDayDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class MonthDayDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDVFactoryImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDVFactoryImpl.java
index 3e0570b51aa..5bb8a4350ed 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDVFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/SchemaDVFactoryImpl.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.util.SymbolHash;
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @author Sandy Gao, IBM
*
- * @version $Id: SchemaDVFactoryImpl.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class SchemaDVFactoryImpl extends BaseSchemaDVFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/TimeDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/TimeDV.java
index c9bbae21174..4c7bb4dd46d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/TimeDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/TimeDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: TimeDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class TimeDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDecl.java
index c9c913464e6..fa4a495a571 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDecl.java
@@ -60,7 +60,6 @@ import org.w3c.dom.TypeInfo;
* @author Sandy Gao, IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
*
- * @version $Id: XSSimpleTypeDecl.java 3029 2011-04-24 17:50:18Z joehw $
*/
public class XSSimpleTypeDecl implements XSSimpleType, TypeInfo {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDelegate.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDelegate.java
index 1b683db3457..318bc69299e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDelegate.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/XSSimpleTypeDelegate.java
@@ -39,7 +39,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
*
* @xerces.internal
*
- * @version $Id: XSSimpleTypeDelegate.java,v 1.3 2010-11-01 04:39:47 joehw Exp $
*/
public class XSSimpleTypeDelegate
implements XSSimpleType {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearDV.java
index d069c401a0f..02c5058f55c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: YearDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class YearDV extends AbstractDateTimeDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDV.java
index 6b96deb1ded..b9fde68ca18 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
* @author Elena Litani
* @author Gopal Sharma, SUN Microsystem Inc.
*
- * @version $Id: YearMonthDV.java,v 1.7 2010-11-01 04:39:47 joehw Exp $
*/
public class YearMonthDV extends AbstractDateTimeDV{
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDurationDV.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDurationDV.java
index 4723a65cf32..c11413097ec 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDurationDV.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/dv/xs/YearMonthDurationDV.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
*
* @author Ankit Pasricha, IBM
*
- * @version $Id: YearMonthDurationDV.java,v 1.6 2010-11-01 04:39:47 joehw Exp $
*/
class YearMonthDurationDV extends DurationDV {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java
index adb8c44ab2e..0f7ed95d5a8 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter.java
@@ -33,7 +33,6 @@ import java.util.ResourceBundle;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_de.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_de.java
index 1f9d2816165..24c5e41d4d7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_de.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_de.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_de.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_de implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_es.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_es.java
index 164a2513a9e..5dab448b1fb 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_es.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_es.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_es.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_es implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_fr.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_fr.java
index e4e41292716..1b4974a2e8c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_fr.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_fr.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_fr.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_fr implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_it.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_it.java
index e2dd5132d21..66d1b90951c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_it.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_it.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_it.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_it implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ja.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ja.java
index b3fb8563e67..14363761574 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ja.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ja.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_ja.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_ja implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ko.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ko.java
index 3de7757c5bc..a042bdd9afe 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ko.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_ko.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_ko.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_ko implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_pt_BR.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_pt_BR.java
index 59b3d1d30a7..053445dc06a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_pt_BR.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_pt_BR.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_pt_BR.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_pt_BR implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_sv.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_sv.java
index 00217ae4f7b..bb4d9531d38 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_sv.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_sv.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_sv.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_sv implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java
index 4cfa9686da0..13f6be55cb6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_CN.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_zh_CN.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_zh_CN implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_TW.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_TW.java
index 4f34fa2adc5..1965d571783 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_TW.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessageFormatter_zh_TW.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @xerces.internal
*
* @author Eric Ye, IBM
- * @version $Id: XMLMessageFormatter_zh_TW.java 3094 2012-03-21 05:50:01Z joehw $
*
*/
public class XMLMessageFormatter_zh_TW implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/validation/ValidationState.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/validation/ValidationState.java
index a04c57dcef7..686e2b1c916 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/validation/ValidationState.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/validation/ValidationState.java
@@ -34,7 +34,6 @@ import java.util.Locale;
* @xerces.internal
*
* @author Elena Litani, IBM
- * @version $Id: ValidationState.java,v 1.7 2010-11-01 04:39:53 joehw Exp $
*/
public class ValidationState implements ValidationContext {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/CaseInsensitiveMap.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/CaseInsensitiveMap.java
index 202f239feaf..3f5da982fa4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/CaseInsensitiveMap.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/CaseInsensitiveMap.java
@@ -22,7 +22,6 @@
package com.sun.org.apache.xerces.internal.impl.xpath.regex;
/**
- * @version $Id: CaseInsensitiveMap.java,v 1.1 2010/07/27 06:29:27 joehw Exp $
*/
public class CaseInsensitiveMap {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/ParserForXMLSchema.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/ParserForXMLSchema.java
index 22e2a710c9b..aa18a901dac 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/ParserForXMLSchema.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/ParserForXMLSchema.java
@@ -29,7 +29,6 @@ import java.util.Locale;
* @xerces.internal
*
* @author TAMURA Kent <kent@trl.ibm.co.jp>
- * @version $Id: ParserForXMLSchema.java,v 1.9 2010-11-12 18:09:45 joehw Exp $
*/
class ParserForXMLSchema extends RegexParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java
index ed1cda9ba3e..5435fc799d9 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegexParser.java
@@ -31,7 +31,6 @@ import java.util.Vector;
*
* @xerces.internal
*
- * @version $Id: RegexParser.java,v 1.8 2010-11-01 04:39:54 joehw Exp $
*/
class RegexParser {
static final int T_CHAR = 0;
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java
index fa488d64ad2..0a996b27c10 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/RegularExpression.java
@@ -486,7 +486,6 @@ import com.sun.org.apache.xerces.internal.util.IntStack;
* @xerces.internal
*
* @author TAMURA Kent <kent@trl.ibm.co.jp>
- * @version $Id: RegularExpression.java,v 1.9 2010/07/27 05:02:34 joehw Exp $
*/
public class RegularExpression implements java.io.Serializable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/Token.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/Token.java
index a395e47fdc4..5221b6e8612 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/Token.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/Token.java
@@ -28,7 +28,6 @@ import java.util.Hashtable;
*
* @xerces.internal
*
- * @version $Id: Token.java,v 1.7 2010/07/27 05:02:34 joehw Exp $
*/
class Token implements java.io.Serializable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SchemaGrammar.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SchemaGrammar.java
index ea450035ffd..06ec54dd9d2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SchemaGrammar.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SchemaGrammar.java
@@ -75,7 +75,6 @@ import org.xml.sax.SAXException;
* @author Sandy Gao, IBM
* @author Elena Litani, IBM
*
- * @version $Id: SchemaGrammar.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class SchemaGrammar implements XSGrammar, XSNamespaceItem {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SubstitutionGroupHandler.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SubstitutionGroupHandler.java
index 1fbe4c74cda..f2d4e745af4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SubstitutionGroupHandler.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/SubstitutionGroupHandler.java
@@ -35,7 +35,6 @@ import java.util.Vector;
*
* @author Sandy Gao, IBM
*
- * @version $Id: SubstitutionGroupHandler.java,v 1.6 2010-11-01 04:39:55 joehw Exp $
*/
public class SubstitutionGroupHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java
index d37a0300ed8..63123391ca3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaLoader.java
@@ -98,7 +98,6 @@ import org.xml.sax.InputSource;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XMLSchemaLoader.java,v 1.10 2010-11-01 04:39:55 joehw Exp $
*/
public class XMLSchemaLoader implements XMLGrammarLoader, XMLComponent,
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java
index f7fc09a6d00..fd03b7a8f75 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XMLSchemaValidator.java
@@ -107,7 +107,6 @@ import com.sun.org.apache.xerces.internal.parsers.XMLParser;
* @author Elena Litani IBM
* @author Andy Clark IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
- * @version $Id: XMLSchemaValidator.java,v 1.16 2010-11-01 04:39:55 joehw Exp $
*/
public class XMLSchemaValidator
implements XMLComponent, XMLDocumentFilter, FieldActivator, RevalidationHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeDecl.java
index 183c6f22f63..7542c684f69 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeDecl.java
@@ -41,7 +41,6 @@ import com.sun.org.apache.xerces.internal.xs.XSSimpleTypeDefinition;
*
* @author Elena Litani, IBM
* @author Sandy Gao, IBM
- * @version $Id: XSAttributeDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSAttributeDecl implements XSAttributeDeclaration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeGroupDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeGroupDecl.java
index 8e907051eee..fda0899f9da 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeGroupDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeGroupDecl.java
@@ -39,7 +39,6 @@ import com.sun.org.apache.xerces.internal.xs.XSWildcard;
* @author Sandy Gao, IBM
* @author Rahul Srivastava, Sun Microsystems Inc.
*
- * @version $Id: XSAttributeGroupDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSAttributeGroupDecl implements XSAttributeGroupDefinition {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeUseImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeUseImpl.java
index 174c2852a92..42e64e3c87a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeUseImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSAttributeUseImpl.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: XSAttributeUseImpl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSAttributeUseImpl implements XSAttributeUse {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSComplexTypeDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSComplexTypeDecl.java
index 79f250028b4..3096988cb2e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSComplexTypeDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSComplexTypeDecl.java
@@ -36,7 +36,6 @@ import org.w3c.dom.TypeInfo;
*
* @author Elena Litani, IBM
* @author Sandy Gao, IBM
- * @version $Id: XSComplexTypeDecl.java,v 1.8 2010-11-01 04:39:55 joehw Exp $
*/
public class XSComplexTypeDecl implements XSComplexTypeDefinition, TypeInfo {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSConstraints.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSConstraints.java
index c56ad0d1b57..3b5e28c2d77 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSConstraints.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSConstraints.java
@@ -45,7 +45,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSConstraints.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSConstraints {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDDescription.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDDescription.java
index c35baa8667a..545388002e7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDDescription.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDDescription.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xni.grammars.XMLSchemaDescription;
* @author Neil Graham, IBM
* @author Neeraj Bajaj, SUN Microsystems.
*
- * @version $Id: XSDDescription.java,v 1.6 2010-11-01 04:39:55 joehw Exp $
*/
public class XSDDescription extends XMLResourceIdentifierImpl
implements XMLSchemaDescription {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDeclarationPool.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDeclarationPool.java
index 5578da2a44b..604f50da504 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDeclarationPool.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSDeclarationPool.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.xs.XSSimpleTypeDecl;
* @xerces.internal
*
* @author Elena Litani, IBM
- * @version $Id: XSDeclarationPool.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public final class XSDeclarationPool {
/** Chunk shift (8). */
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSElementDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSElementDecl.java
index 190daa779b0..70d5347e5c2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSElementDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSElementDecl.java
@@ -43,7 +43,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
*
* @author Elena Litani, IBM
* @author Sandy Gao, IBM
- * @version $Id: XSElementDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSElementDecl implements XSElementDeclaration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGrammarBucket.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGrammarBucket.java
index 6d88c5fdd00..456b78ba721 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGrammarBucket.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGrammarBucket.java
@@ -31,7 +31,6 @@ import java.util.Vector;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: XSGrammarBucket.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSGrammarBucket {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGroupDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGroupDecl.java
index a710e53b621..3c51b0c5004 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGroupDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSGroupDecl.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: XSGroupDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSGroupDecl implements XSModelGroupDefinition {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSLoaderImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSLoaderImpl.java
index 136d69e2dbb..48fa9c38448 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSLoaderImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSLoaderImpl.java
@@ -45,7 +45,6 @@ import org.w3c.dom.ls.LSInput;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: XSLoaderImpl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public final class XSLoaderImpl implements XSLoader, DOMConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java
index 0a51a3c6b8f..236b7962373 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSMessageFormatter.java
@@ -34,7 +34,6 @@ import java.util.ResourceBundle;
* @xerces.internal
*
* @author Elena Litani, IBM
- * @version $Id: XSMessageFormatter.java,v 1.6 2010-11-01 04:39:55 joehw Exp $
*/
public class XSMessageFormatter implements MessageFormatter {
/**
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelGroupImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelGroupImpl.java
index 4414003319c..8f63830c7a6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelGroupImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelGroupImpl.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSModelGroupImpl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSModelGroupImpl implements XSModelGroup {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelImpl.java
index bded2950e0b..01201a766ea 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSModelImpl.java
@@ -57,7 +57,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSModelImpl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public final class XSModelImpl extends AbstractList implements XSModel, XSNamespaceItemList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSNotationDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSNotationDecl.java
index 94505f9969d..c34f16b8f88 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSNotationDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSNotationDecl.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @xerces.internal
*
* @author Rahul Srivastava, Sun Microsystems Inc.
- * @version $Id: XSNotationDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSNotationDecl implements XSNotationDeclaration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSParticleDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSParticleDecl.java
index 468f652cbc9..cb2ba9a5066 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSParticleDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSParticleDecl.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTerm;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSParticleDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSParticleDecl implements XSParticle {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSWildcardDecl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSWildcardDecl.java
index ac3a00eac6c..b56db22ba14 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSWildcardDecl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/XSWildcardDecl.java
@@ -38,7 +38,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
* @author Sandy Gao, IBM
* @author Rahul Srivastava, Sun Microsystems Inc.
*
- * @version $Id: XSWildcardDecl.java,v 1.7 2010-11-01 04:39:55 joehw Exp $
*/
public class XSWildcardDecl implements XSWildcard {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Field.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Field.java
index ca968f8d41e..c00e802e6d4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Field.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Field.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
* @xerces.internal
*
* @author Andy Clark, IBM
- * @version $Id: Field.java,v 1.6 2010-11-01 04:39:57 joehw Exp $
*/
public class Field {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Selector.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Selector.java
index f36e5ee3ab3..283e6c1f153 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Selector.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/identity/Selector.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
* @xerces.internal
*
* @author Andy Clark, IBM
- * @version $Id: Selector.java,v 1.7 2010-11-01 04:39:57 joehw Exp $
*/
public class Selector {
@@ -106,7 +105,6 @@ public class Selector {
* Schema identity constraint selector XPath expression.
*
* @author Andy Clark, IBM
- * @version $Id: Selector.java,v 1.7 2010-11-01 04:39:57 joehw Exp $
*/
public static class XPath
extends com.sun.org.apache.xerces.internal.impl.xpath.XPath {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java
index ca8815458d4..e03ca553540 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMBuilder.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.impl.xs.XSParticleDecl;
* @author Elena Litani, IBM
* @author Sandy Gao, IBM
*
- * @version $Id: CMBuilder.java,v 1.11 2010/08/06 23:49:43 joehw Exp $
*/
public class CMBuilder {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMNodeFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMNodeFactory.java
index 6aa06b8828d..8962280abbb 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMNodeFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/CMNodeFactory.java
@@ -35,7 +35,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
*
* @author Neeraj Bajaj
*
- * @version $Id: CMNodeFactory.java,v 1.7 2010-11-01 04:39:58 joehw Exp $
*/
public class CMNodeFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSAllCM.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSAllCM.java
index f2cf0a7b7c1..d3060915341 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSAllCM.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSAllCM.java
@@ -35,7 +35,6 @@ import java.util.ArrayList;
* @xerces.internal
*
* @author Pavani Mukthipudi, Sun Microsystems Inc.
- * @version $Id: XSAllCM.java,v 1.10 2010-11-01 04:39:58 joehw Exp $
*/
public class XSAllCM implements XSCMValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMRepeatingLeaf.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMRepeatingLeaf.java
index 46788962e8e..dd7c1184986 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMRepeatingLeaf.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMRepeatingLeaf.java
@@ -27,7 +27,6 @@ package com.sun.org.apache.xerces.internal.impl.xs.models;
* @xerces.internal
*
* @author Michael Glavassevich, IBM
- * @version $Id: XSCMRepeatingLeaf.java,v 1.1 2010/08/06 23:49:43 joehw Exp $
*/
public final class XSCMRepeatingLeaf extends XSCMLeaf {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMValidator.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMValidator.java
index 341d88bcef0..d387ac52261 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMValidator.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSCMValidator.java
@@ -34,7 +34,6 @@ import java.util.ArrayList;
*
* @author Sandy Gao, IBM
* @author Elena Litani, IBM
- * @version $Id: XSCMValidator.java,v 1.6 2009/07/28 15:18:12 spericas Exp $
*/
public interface XSCMValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSDFACM.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSDFACM.java
index e4b5ee280eb..997ca17cb95 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSDFACM.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSDFACM.java
@@ -45,7 +45,6 @@ import java.util.HashMap;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XSDFACM.java,v 1.9 2010/08/06 23:49:43 joehw Exp $
*/
public class XSDFACM
implements XSCMValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSEmptyCM.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSEmptyCM.java
index 673211fb196..bf730d692c9 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSEmptyCM.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/models/XSEmptyCM.java
@@ -37,7 +37,6 @@ import java.util.ArrayList;
*
* @author Elena Litani, Lisa Martin
* @author IBM
- * @version $Id: XSEmptyCM.java,v 1.7 2009/07/28 15:18:11 spericas Exp $
*/
public class XSEmptyCM implements XSCMValidator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/AttrImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/AttrImpl.java
index 331fc2692bf..89c70ebc0fa 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/AttrImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/AttrImpl.java
@@ -73,7 +73,6 @@ import org.w3c.dom.TypeInfo;
*
* @author Rahul Srivastava, Sun Microsystems Inc.
*
- * @version $Id: AttrImpl.java,v 1.5 2010-11-01 04:40:01 joehw Exp $
*/
public class AttrImpl extends NodeImpl
implements Attr {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/ElementImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/ElementImpl.java
index 24eebf7e8dc..28a6bd678b2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/ElementImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/ElementImpl.java
@@ -31,7 +31,6 @@ import org.w3c.dom.Node;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: ElementImpl.java,v 1.7 2010-11-01 04:40:01 joehw Exp $
*/
public class ElementImpl extends DefaultElement {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOM.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOM.java
index 48d6f1280ea..52ed98f24d9 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOM.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOM.java
@@ -40,7 +40,6 @@ import org.w3c.dom.Node;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: SchemaDOM.java,v 1.7 2010-11-01 04:40:01 joehw Exp $
*/
public class SchemaDOM extends DefaultDocument {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMImplementation.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMImplementation.java
index 105e6367cfb..eb422a2354a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMImplementation.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMImplementation.java
@@ -28,7 +28,6 @@ import org.w3c.dom.DocumentType;
/**
* @xerces.internal
*
- * @version $Id: SchemaDOMImplementation.java,v 1.2 2010-10-26 23:01:18 joehw Exp $
*/
final class SchemaDOMImplementation implements DOMImplementation {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMParser.java
index be28c8c836c..b8e1d54959e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaDOMParser.java
@@ -46,7 +46,6 @@ import org.w3c.dom.Document;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: SchemaDOMParser.java,v 1.8 2010-11-01 04:40:01 joehw Exp $
*/
public class SchemaDOMParser extends DefaultXMLDocumentHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java
index a9b251e91f1..5c9afc2c25e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/opti/SchemaParsingConfig.java
@@ -57,7 +57,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
*
* @author Rahul Srivastava, Sun Microsystems Inc.
*
- * @version $Id: SchemaParsingConfig.java,v 1.8 2010-11-01 04:40:01 joehw Exp $
*/
public class SchemaParsingConfig extends BasicParserConfiguration
implements XMLPullParserConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/StAXSchemaParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/StAXSchemaParser.java
index 3d7e3afdded..84f04e2e53f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/StAXSchemaParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/StAXSchemaParser.java
@@ -54,7 +54,6 @@ import org.w3c.dom.Document;
*
* @xerces.internal
*
- * @version $Id: StAXSchemaParser.java,v 1.2 2010-10-26 23:01:12 joehw Exp $
*/
final class StAXSchemaParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSAttributeChecker.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSAttributeChecker.java
index f9eea6a4dc4..1a3a41476d3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSAttributeChecker.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSAttributeChecker.java
@@ -69,7 +69,6 @@ import org.w3c.dom.Element;
* @xerces.internal
*
* @author Sandy Gao, IBM
- * @version $Id: XSAttributeChecker.java,v 1.12 2010-11-01 04:40:02 joehw Exp $
*/
public class XSAttributeChecker {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractIDConstraintTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractIDConstraintTraverser.java
index c6455231eeb..af38b2f73f6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractIDConstraintTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractIDConstraintTraverser.java
@@ -36,7 +36,6 @@ import org.w3c.dom.Element;
*
* @xerces.internal
*
- * @version $Id: XSDAbstractIDConstraintTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDAbstractIDConstraintTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractParticleTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractParticleTraverser.java
index 364a94a850a..0a0569a1fc2 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractParticleTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractParticleTraverser.java
@@ -37,7 +37,6 @@ import org.w3c.dom.Element;
*
* @author Elena Litani, IBM
* @author Sandy Gao, IBM
- * @version $Id: XSDAbstractParticleTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
abstract class XSDAbstractParticleTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractTraverser.java
index a5e97f08b25..7af4c66754d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAbstractTraverser.java
@@ -58,7 +58,6 @@ import org.w3c.dom.Element;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Neeraj Bajaj, Sun Microsystems Inc.
*
- * @version $Id: XSDAbstractTraverser.java,v 1.8 2010-11-01 04:40:02 joehw Exp $
*/
abstract class XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeGroupTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeGroupTraverser.java
index 0e126704d0b..14d15309ea9 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeGroupTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeGroupTraverser.java
@@ -46,7 +46,6 @@ import org.w3c.dom.Element;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: XSDAttributeGroupTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDAttributeGroupTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeTraverser.java
index 0aa0b32ec33..6174a7b5ec3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDAttributeTraverser.java
@@ -59,7 +59,6 @@ import org.w3c.dom.Element;
*
* @author Sandy Gao, IBM
* @author Neeraj Bajaj, Sun Microsystems, inc.
- * @version $Id: XSDAttributeTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDAttributeTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDComplexTypeTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDComplexTypeTraverser.java
index cfc98b834b8..b786158ac7c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDComplexTypeTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDComplexTypeTraverser.java
@@ -62,7 +62,6 @@ import org.w3c.dom.Element;
*
* @xerces.internal
*
- * @version $Id: XSDComplexTypeTraverser.java,v 1.8 2010-11-01 04:40:02 joehw Exp $
*/
class XSDComplexTypeTraverser extends XSDAbstractParticleTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDElementTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDElementTraverser.java
index 0d480580d6a..e0e4c464c21 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDElementTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDElementTraverser.java
@@ -69,7 +69,6 @@ import org.w3c.dom.Element;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSDElementTraverser.java,v 1.9 2010-11-01 04:40:02 joehw Exp $
*/
class XSDElementTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDGroupTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDGroupTraverser.java
index 915f482ddbe..99e2ec99319 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDGroupTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDGroupTraverser.java
@@ -47,7 +47,6 @@ import org.w3c.dom.Element;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Elena Litani, IBM
* @author Lisa Martin, IBM
- * @version $Id: XSDGroupTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDGroupTraverser extends XSDAbstractParticleTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java
index d6a6e948f65..bf6defa6ca7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDHandler.java
@@ -131,7 +131,6 @@ import org.xml.sax.helpers.XMLReaderFactory;
* @author Neil Graham, IBM
* @author Pavani Mukthipudi, Sun Microsystems
*
- * @version $Id: XSDHandler.java,v 1.9 2010-11-01 04:40:02 joehw Exp $
*/
public class XSDHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDKeyrefTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDKeyrefTraverser.java
index 07d160e2998..7d590acf55f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDKeyrefTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDKeyrefTraverser.java
@@ -35,7 +35,6 @@ import org.w3c.dom.Element;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XSDKeyrefTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDKeyrefTraverser extends XSDAbstractIDConstraintTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDNotationTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDNotationTraverser.java
index 846c9b94326..27acd055d2f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDNotationTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDNotationTraverser.java
@@ -45,7 +45,6 @@ import org.w3c.dom.Element;
*
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Elena Litani, IBM
- * @version $Id: XSDNotationTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDNotationTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDSimpleTypeTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDSimpleTypeTraverser.java
index 355881edc84..1564227b1f5 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDSimpleTypeTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDSimpleTypeTraverser.java
@@ -78,7 +78,6 @@ import org.w3c.dom.Element;
* @author Neeraj Bajaj, Sun Microsystems, Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: XSDSimpleTypeTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDSimpleTypeTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDUniqueOrKeyTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDUniqueOrKeyTraverser.java
index 054dd9deb04..2e36be5745e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDUniqueOrKeyTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDUniqueOrKeyTraverser.java
@@ -35,7 +35,6 @@ import org.w3c.dom.Element;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XSDUniqueOrKeyTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDUniqueOrKeyTraverser extends XSDAbstractIDConstraintTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDWildcardTraverser.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDWildcardTraverser.java
index 60bfb54d88d..c368b74ccfd 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDWildcardTraverser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDWildcardTraverser.java
@@ -57,7 +57,6 @@ import org.w3c.dom.Element;
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
*
- * @version $Id: XSDWildcardTraverser.java,v 1.7 2010-11-01 04:40:02 joehw Exp $
*/
class XSDWildcardTraverser extends XSDAbstractTraverser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDocumentInfo.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDocumentInfo.java
index b75639f16a4..b941ea90236 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDocumentInfo.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/traversers/XSDocumentInfo.java
@@ -43,7 +43,6 @@ import org.w3c.dom.NamedNodeMap;
* @xerces.internal
*
* @author Neil Graham, IBM
- * @version $Id: XSDocumentInfo.java,v 1.5 2007/10/15 22:27:48 spericas Exp $
*/
class XSDocumentInfo {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/LSInputListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/LSInputListImpl.java
index c8a93293e05..4f3bb757ed1 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/LSInputListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/LSInputListImpl.java
@@ -34,7 +34,6 @@ import org.w3c.dom.ls.LSInput;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: LSInputListImpl.java,v 1.2 2010-10-26 23:01:04 joehw Exp $
*/
public final class LSInputListImpl extends AbstractList implements LSInputList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ObjectListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ObjectListImpl.java
index 9f0a1964cdb..1d29360a05d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ObjectListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ObjectListImpl.java
@@ -31,7 +31,6 @@ import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
*
* @xerces.internal
*
- * @version $Id: ObjectListImpl.java,v 1.2 2010-10-26 23:01:04 joehw Exp $
*/
public final class ObjectListImpl extends AbstractList implements ObjectList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ShortListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ShortListImpl.java
index 9a3ba385747..9dc0641ef26 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ShortListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/ShortListImpl.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xs.XSException;
*
* @author Sandy Gao, IBM
*
- * @version $Id: ShortListImpl.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public final class ShortListImpl extends AbstractList implements ShortList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/StringListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/StringListImpl.java
index 5f22628b4f7..cf3d46a494e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/StringListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/StringListImpl.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.xs.StringList;
*
* @author Sandy Gao, IBM
*
- * @version $Id: StringListImpl.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public final class StringListImpl extends AbstractList implements StringList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSGrammarPool.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSGrammarPool.java
index 3f83e8373ff..a3f0bc71a37 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSGrammarPool.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSGrammarPool.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.xs.XSModel;
*
* @xerces.internal
*
- * @version $Id: XSGrammarPool.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public class XSGrammarPool extends XMLGrammarPoolImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSInputSource.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSInputSource.java
index 4ca114bbedc..393393c08a0 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSInputSource.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSInputSource.java
@@ -29,7 +29,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObject;
/**
* @xerces.internal
*
- * @version $Id: XSInputSource.java,v 1.2 2010-10-26 23:01:05 joehw Exp $
*/
public final class XSInputSource extends XMLInputSource {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMap4Types.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMap4Types.java
index 63f6f475564..a2c6b29df41 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMap4Types.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMap4Types.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSNamedMap4Types.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public final class XSNamedMap4Types extends XSNamedMapImpl {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMapImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMapImpl.java
index 17406566405..b15f1ed47b3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMapImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSNamedMapImpl.java
@@ -41,7 +41,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObject;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSNamedMapImpl.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public class XSNamedMapImpl extends AbstractMap implements XSNamedMap {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSObjectListImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSObjectListImpl.java
index b5e0de2d52a..7c5b4f7c40f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSObjectListImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/xs/util/XSObjectListImpl.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.xs.XSObjectList;
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSObjectListImpl.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public class XSObjectListImpl extends AbstractList implements XSObjectList {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java
index aea63c2eb16..2899ab8dd92 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java
@@ -37,7 +37,6 @@ import org.xml.sax.SAXNotSupportedException;
/**
* @author Rajiv Mordani
* @author Edwin Goei
- * @version $Id: DocumentBuilderFactoryImpl.java,v 1.8 2010-11-01 04:40:06 joehw Exp $
*/
public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory {
/** These are DocumentBuilderFactory attributes not DOM attributes */
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderImpl.java
index 51f22d713b1..a1d9b1ffb2b 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderImpl.java
@@ -58,7 +58,6 @@ import org.xml.sax.SAXNotSupportedException;
/**
* @author Rajiv Mordani
* @author Edwin Goei
- * @version $Id: DocumentBuilderImpl.java,v 1.8 2010-11-01 04:40:06 joehw Exp $
*/
public class DocumentBuilderImpl extends DocumentBuilder
implements JAXPConstants
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserFactoryImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserFactoryImpl.java
index ae9d99509d9..50c5f3db11d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserFactoryImpl.java
@@ -43,7 +43,6 @@ import com.sun.org.apache.xerces.internal.util.SAXMessageFormatter;
* @author Rajiv Mordani
* @author Edwin Goei
*
- * @version $Id: SAXParserFactoryImpl.java,v 1.9 2010-11-01 04:40:06 joehw Exp $
*/
public class SAXParserFactoryImpl extends SAXParserFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java
index 6cc3e9a4678..315b2000ccf 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SAXParserImpl.java
@@ -63,7 +63,6 @@ import org.xml.sax.helpers.DefaultHandler;
* @author Rajiv Mordani
* @author Edwin Goei
*
- * @version $Id: SAXParserImpl.java,v 1.7 2010-11-01 04:40:06 joehw Exp $
*/
public class SAXParserImpl extends javax.xml.parsers.SAXParser
implements JAXPConstants, PSVIProvider {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SchemaValidatorConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SchemaValidatorConfiguration.java
index 9ef80be7742..f919ec08a81 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SchemaValidatorConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/SchemaValidatorConfiguration.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
/**
* Parser configuration for Xerces' XMLSchemaValidator.
*
- * @version $Id: SchemaValidatorConfiguration.java,v 1.5 2010-11-01 04:40:06 joehw Exp $
*/
final class SchemaValidatorConfiguration implements XMLComponentManager {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/UnparsedEntityHandler.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/UnparsedEntityHandler.java
index 5714da3be57..8129066eb3d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/UnparsedEntityHandler.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/UnparsedEntityHandler.java
@@ -39,7 +39,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDSource;
* Events are forwarded to the registered XMLDTDHandler without modification.
*
* @author Michael Glavassevich, IBM
- * @version $Id: UnparsedEntityHandler.java,v 1.6 2010-11-01 04:40:07 joehw Exp $
*/
final class UnparsedEntityHandler implements XMLDTDFilter, EntityState {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DatatypeFactoryImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DatatypeFactoryImpl.java
index 59497a48f5e..aa993a299c5 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DatatypeFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DatatypeFactoryImpl.java
@@ -58,7 +58,6 @@ import javax.xml.datatype.XMLGregorianCalendar;
*
* @author Joseph Fialli
* @author Jeff Suttor
- * @version $Id: DatatypeFactoryImpl.java,v 1.6 2010/05/19 05:02:55 joehw Exp $
*/
public class DatatypeFactoryImpl
extends DatatypeFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationDayTimeImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationDayTimeImpl.java
index 9e5cafda554..83de0154ba6 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationDayTimeImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationDayTimeImpl.java
@@ -46,7 +46,6 @@ import javax.xml.datatype.DatatypeConstants;
*
* @author Vikram Aroskar
* @author Joe Wang
- * @version $Revision: 1.2 $, $Date: 2010/05/19 23:20:06 $
* @see XMLGregorianCalendar#add(Duration)
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationImpl.java
index da5de3e1ff5..b8724a70a34 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationImpl.java
@@ -21,6 +21,7 @@
package com.sun.org.apache.xerces.internal.jaxp.datatype;
+import com.sun.org.apache.xerces.internal.util.DatatypeMessageFormatter;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.Serializable;
@@ -30,13 +31,10 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
-
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
-import com.sun.org.apache.xerces.internal.util.DatatypeMessageFormatter;
-
/**
* Immutable representation of a time span as defined in
* the W3C XML Schema 1.0 specification.
@@ -99,7 +97,6 @@ import com.sun.org.apache.xerces.internal.util.DatatypeMessageFormatter;
*
* @author Kohsuke Kawaguchi
* @author Joseph Fialli
- * @version $Revision: 1.8 $, $Date: 2010/05/19 23:20:06 $
* @see XMLGregorianCalendar#add(Duration)
*/
@@ -120,28 +117,23 @@ class DurationImpl
DatatypeConstants.SECONDS
};
- /**
- * Internal array of value Field ids.
- */
- private static final int[] FIELD_IDS = {
- DatatypeConstants.YEARS.getId(),
- DatatypeConstants.MONTHS.getId(),
- DatatypeConstants.DAYS.getId(),
- DatatypeConstants.HOURS.getId(),
- DatatypeConstants.MINUTES.getId(),
- DatatypeConstants.SECONDS.getId()
- };
/**
* TimeZone for GMT.
*/
private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
- /**
+ /**
* BigDecimal value of 0.
*/
private static final BigDecimal ZERO = BigDecimal.valueOf(0);
+ /**
+ * BigInteger value of Integer's max value.
+ */
+ private static final BigInteger MaxIntAsBigInt =
+ BigInteger.valueOf((long) Integer.MAX_VALUE);
+
/**
* Indicates the sign. -1, 0 or 1 if the duration is negative,
* zero, or positive.
@@ -195,12 +187,12 @@ class DurationImpl
return signum;
}
- /**
- * TODO: Javadoc
- * @param isPositive Sign.
- *
- * @return 1 if positive, else -1.
- */
+ /**
+ * Determine the sign of the duration.
+ *
+ * @param isPositive Sign.
+ * @return 1 if positive, -1 negative, or 0 if all fields are zero.
+ */
protected int calcSignum(boolean isPositive) {
if ((years == null || years.signum() == 0)
&& (months == null || months.signum() == 0)
@@ -694,209 +686,71 @@ class DurationImpl
XMLGregorianCalendarImpl.parse("1903-07-01T00:00:00Z")
};
- /**
- * Partial order relation comparison with this Duration instance.
- *
- * Comparison result must be in accordance with
- * W3C XML Schema 1.0 Part 2, Section 3.2.7.6.2,
- * Order relation on duration.
- *
- * Return:
- *
- * - {@link DatatypeConstants#LESSER} if this
Duration is shorter than duration parameter
- * - {@link DatatypeConstants#EQUAL} if this
Duration is equal to duration parameter
- * - {@link DatatypeConstants#GREATER} if this
Duration is longer than duration parameter
- * - {@link DatatypeConstants#INDETERMINATE} if a conclusive partial order relation cannot be determined
- *
- *
- * @param duration to compare
- *
- * @return the relationship between this Durationand duration parameter as
- * {@link DatatypeConstants#LESSER}, {@link DatatypeConstants#EQUAL}, {@link DatatypeConstants#GREATER}
- * or {@link DatatypeConstants#INDETERMINATE}.
- *
- * @throws UnsupportedOperationException If the underlying implementation
- * cannot reasonably process the request, e.g. W3C XML Schema allows for
- * arbitrarily large/small/precise values, the request may be beyond the
- * implementations capability.
- * @throws NullPointerException if duration is null.
- *
- * @see #isShorterThan(Duration)
- * @see #isLongerThan(Duration)
- */
+ /**
+ * Partial order relation comparison with this Duration instance.
+ *
+ * Comparison result must be in accordance with
+ * W3C XML Schema 1.0 Part 2, Section 3.2.7.6.2,
+ * Order relation on duration.
+ *
+ * Return:
+ *
+ * - {@link DatatypeConstants#LESSER} if this
Duration is shorter than duration parameter
+ * - {@link DatatypeConstants#EQUAL} if this
Duration is equal to duration parameter
+ * - {@link DatatypeConstants#GREATER} if this
Duration is longer than duration parameter
+ * - {@link DatatypeConstants#INDETERMINATE} if a conclusive partial order relation cannot be determined
+ *
+ *
+ * @param duration to compare
+ *
+ * @return the relationship between this Durationand duration parameter as
+ * {@link DatatypeConstants#LESSER}, {@link DatatypeConstants#EQUAL}, {@link DatatypeConstants#GREATER}
+ * or {@link DatatypeConstants#INDETERMINATE}.
+ *
+ * @throws UnsupportedOperationException If the underlying implementation
+ * cannot reasonably process the request, e.g. W3C XML Schema allows for
+ * arbitrarily large/small/precise values, the request may be beyond the
+ * implementations capability.
+ * @throws NullPointerException if duration is null.
+ *
+ * @see #isShorterThan(Duration)
+ * @see #isLongerThan(Duration)
+ */
public int compare(Duration rhs) {
+ /** check if any field in the Durations is too large for the operation
+ * that uses XMLGregorianCalendar for comparison
+ */
+ for (DatatypeConstants.Field field : FIELDS) {
+ checkMaxValue(getField(field), field);
+ checkMaxValue(rhs.getField(field), field);
+ }
- BigInteger maxintAsBigInteger = BigInteger.valueOf(Integer.MAX_VALUE);
+ return compareDates(this, rhs);
+ }
- // check for fields that are too large in this Duration
- if (years != null && years.compareTo(maxintAsBigInteger) == 1) {
+ /**
+ * Check if a field exceeds the maximum value
+ * @param field the value of a field
+ * @param fieldType type of the field, e.g. year, month, day, hour, minute or second.
+ */
+ private void checkMaxValue(Number field, DatatypeConstants.Field fieldType) {
+ BigInteger fieldValue = null;
+ if (fieldType != DatatypeConstants.SECONDS) {
+ fieldValue = (BigInteger) field;
+ } else {
+ BigDecimal rhsSecondsAsBigDecimal = (BigDecimal) field;
+ if ( rhsSecondsAsBigDecimal != null ) {
+ fieldValue = rhsSecondsAsBigDecimal.toBigInteger();
+ }
+ }
+
+ if (fieldValue != null && fieldValue.compareTo(MaxIntAsBigInt) == 1) {
throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.YEARS.toString(), years.toString()})
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " years too large to be supported by this implementation "
- //+ years.toString()
- );
+ DatatypeMessageFormatter.formatMessage(null, "TooLarge",
+ new Object[]{this.getClass().getName() + "#compare(Duration duration)"
+ + fieldType, field.toString()})
+ );
}
- if (months != null && months.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.MONTHS.toString(), months.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " months too large to be supported by this implementation "
- //+ months.toString()
- );
- }
- if (days != null && days.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.DAYS.toString(), days.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " days too large to be supported by this implementation "
- //+ days.toString()
- );
- }
- if (hours != null && hours.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.HOURS.toString(), hours.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " hours too large to be supported by this implementation "
- //+ hours.toString()
- );
- }
- if (minutes != null && minutes.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.MINUTES.toString(), minutes.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " minutes too large to be supported by this implementation "
- //+ minutes.toString()
- );
- }
- if (seconds != null && seconds.toBigInteger().compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.SECONDS.toString(), toString(seconds)})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " seconds too large to be supported by this implementation "
- //+ seconds.toString()
- );
- }
-
- // check for fields that are too large in rhs Duration
- BigInteger rhsYears = (BigInteger) rhs.getField(DatatypeConstants.YEARS);
- if (rhsYears != null && rhsYears.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.YEARS.toString(), rhsYears.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " years too large to be supported by this implementation "
- //+ rhsYears.toString()
- );
- }
- BigInteger rhsMonths = (BigInteger) rhs.getField(DatatypeConstants.MONTHS);
- if (rhsMonths != null && rhsMonths.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.MONTHS.toString(), rhsMonths.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " months too large to be supported by this implementation "
- //+ rhsMonths.toString()
- );
- }
- BigInteger rhsDays = (BigInteger) rhs.getField(DatatypeConstants.DAYS);
- if (rhsDays != null && rhsDays.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.DAYS.toString(), rhsDays.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " days too large to be supported by this implementation "
- //+ rhsDays.toString()
- );
- }
- BigInteger rhsHours = (BigInteger) rhs.getField(DatatypeConstants.HOURS);
- if (rhsHours != null && rhsHours.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.HOURS.toString(), rhsHours.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " hours too large to be supported by this implementation "
- //+ rhsHours.toString()
- );
- }
- BigInteger rhsMinutes = (BigInteger) rhs.getField(DatatypeConstants.MINUTES);
- if (rhsMinutes != null && rhsMinutes.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.MINUTES.toString(), rhsMinutes.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " minutes too large to be supported by this implementation "
- //+ rhsMinutes.toString()
- );
- }
- BigDecimal rhsSecondsAsBigDecimal = (BigDecimal) rhs.getField(DatatypeConstants.SECONDS);
- BigInteger rhsSeconds = null;
- if ( rhsSecondsAsBigDecimal != null ) {
- rhsSeconds = rhsSecondsAsBigDecimal.toBigInteger();
- }
- if (rhsSeconds != null && rhsSeconds.compareTo(maxintAsBigInteger) == 1) {
- throw new UnsupportedOperationException(
- DatatypeMessageFormatter.formatMessage(null, "TooLarge",
- new Object[]{this.getClass().getName() + "#compare(Duration duration)" + DatatypeConstants.SECONDS.toString(), rhsSeconds.toString()})
-
- //this.getClass().getName() + "#compare(Duration duration)"
- //+ " seconds too large to be supported by this implementation "
- //+ rhsSeconds.toString()
- );
- }
-
- // turn this Duration into a GregorianCalendar
- GregorianCalendar lhsCalendar = new GregorianCalendar(
- 1970,
- 1,
- 1,
- 0,
- 0,
- 0);
- lhsCalendar.add(GregorianCalendar.YEAR, getYears() * getSign());
- lhsCalendar.add(GregorianCalendar.MONTH, getMonths() * getSign());
- lhsCalendar.add(GregorianCalendar.DAY_OF_YEAR, getDays() * getSign());
- lhsCalendar.add(GregorianCalendar.HOUR_OF_DAY, getHours() * getSign());
- lhsCalendar.add(GregorianCalendar.MINUTE, getMinutes() * getSign());
- lhsCalendar.add(GregorianCalendar.SECOND, getSeconds() * getSign());
-
- // turn compare Duration into a GregorianCalendar
- GregorianCalendar rhsCalendar = new GregorianCalendar(
- 1970,
- 1,
- 1,
- 0,
- 0,
- 0);
- rhsCalendar.add(GregorianCalendar.YEAR, rhs.getYears() * rhs.getSign());
- rhsCalendar.add(GregorianCalendar.MONTH, rhs.getMonths() * rhs.getSign());
- rhsCalendar.add(GregorianCalendar.DAY_OF_YEAR, rhs.getDays() * rhs.getSign());
- rhsCalendar.add(GregorianCalendar.HOUR_OF_DAY, rhs.getHours() * rhs.getSign());
- rhsCalendar.add(GregorianCalendar.MINUTE, rhs.getMinutes() * rhs.getSign());
- rhsCalendar.add(GregorianCalendar.SECOND, rhs.getSeconds() * rhs.getSign());
-
-
- if (lhsCalendar.equals(rhsCalendar)) {
- return DatatypeConstants.EQUAL;
- }
-
- return compareDates(this, rhs);
}
/**
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationYearMonthImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationYearMonthImpl.java
index abf8c53075f..c4b41b8021b 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationYearMonthImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/DurationYearMonthImpl.java
@@ -42,7 +42,6 @@ import javax.xml.datatype.DatatypeConstants;
*
* @author Vikram Aroskar
* @author Joe Wang
- * @version $Revision: 1.1 $, $Date: 2010/05/19 05:02:55 $
* @see XMLGregorianCalendar#add(Duration)
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
index 6c629e95184..9026a6f5f61 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
@@ -188,7 +188,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
* @author Kohsuke Kawaguchi
* @author Joseph Fialli
* @author Sunitha Reddy
- * @version $Revision: 1.14 $, $Date: 2010-11-10 07:41:41 $
* @see javax.xml.datatype.Duration
* @since 1.5
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/AbstractXMLSchema.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/AbstractXMLSchema.java
index 25e13a7a5ce..2d06bc0555a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/AbstractXMLSchema.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/AbstractXMLSchema.java
@@ -30,7 +30,6 @@ import javax.xml.validation.ValidatorHandler;
* Abstract implementation of Schema for W3C XML Schemas.
*
* @author Michael Glavassevich, IBM
- * @version $Id: AbstractXMLSchema.java,v 1.6 2010-11-01 04:40:07 joehw Exp $
*/
abstract class AbstractXMLSchema extends Schema implements
XSGrammarPoolContainer {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java
index 4c69e70c0e4..fe006533b1d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/DOMValidatorHelper.java
@@ -63,7 +63,6 @@ import org.xml.sax.SAXException;
* A validator helper for DOMSources.
*
* @author Michael Glavassevich, IBM
- * @version $Id: DOMValidatorHelper.java,v 1.9 2010-11-01 04:40:08 joehw Exp $
*/
final class DOMValidatorHelper implements ValidatorHelper, EntityState {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/EmptyXMLSchema.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/EmptyXMLSchema.java
index eca00e81d11..ba50c5175b8 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/EmptyXMLSchema.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/EmptyXMLSchema.java
@@ -29,7 +29,6 @@ import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
* which contains no schema components.
*
* @author Michael Glavassevich, IBM
- * @version $Id: EmptyXMLSchema.java,v 1.6 2010-11-01 04:40:08 joehw Exp $
*/
final class EmptyXMLSchema extends AbstractXMLSchema implements XMLGrammarPool {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java
index 5c510533c98..8c50c4d477b 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/JAXPValidationMessageFormatter.java
@@ -29,7 +29,6 @@ import java.util.ResourceBundle;
* Used to format JAXP Validation API error messages using a specified locale.
*
* @author Michael Glavassevich, IBM
- * @version $Id: JAXPValidationMessageFormatter.java,v 1.5 2010-11-01 04:40:08 joehw Exp $
*/
final class JAXPValidationMessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java
index d6c04fd984a..9e9f5aefc15 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/StreamValidatorHelper.java
@@ -48,7 +48,6 @@ import org.xml.sax.SAXException;
*
* @author Michael Glavassevich, IBM
* @author Sunitha Reddy
- * @version $Id: StreamValidatorHelper.java,v 1.7 2010-11-01 04:40:08 joehw Exp $
*/
final class StreamValidatorHelper implements ValidatorHelper {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java
index fc652af221a..1b6dd4053c1 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorHandlerImpl.java
@@ -94,7 +94,6 @@ import org.xml.sax.ext.EntityResolver2;
* @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
* @author Michael Glavassevich, IBM
*
- * @version $Id: ValidatorHandlerImpl.java,v 1.10 2010-11-01 04:40:08 joehw Exp $
*/
final class ValidatorHandlerImpl extends ValidatorHandler implements
DTDHandler, EntityState, PSVIProvider, ValidatorHelper, XMLDocumentHandler {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java
index f0d18dda6f2..acf5df06994 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/ValidatorImpl.java
@@ -51,7 +51,6 @@ import org.xml.sax.SAXNotSupportedException;
* @author Kohsuke Kawaguchi
* @author Michael Glavassevich, IBM
* @author Sunitha Reddy
- * @version $Id: ValidatorImpl.java,v 1.10 2010-11-01 04:40:08 joehw Exp $
*/
final class ValidatorImpl extends Validator implements PSVIProvider {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java
index f2dadd0fc4a..0bdd28d826f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaFactory.java
@@ -65,7 +65,6 @@ import org.xml.sax.SAXParseException;
* {@link SchemaFactory} for XML Schema.
*
* @author Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
- * @version $Id: XMLSchemaFactory.java,v 1.11 2010-11-01 04:40:08 joehw Exp $
*/
public final class XMLSchemaFactory extends SchemaFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java
index dcbbabd4d4a..58a74191cf0 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XMLSchemaValidatorComponentManager.java
@@ -55,7 +55,6 @@ import org.xml.sax.ErrorHandler;
* An implementation of XMLComponentManager for a schema validator.
*
* @author Michael Glavassevich, IBM
- * @version $Id: XMLSchemaValidatorComponentManager.java,v 1.9 2010-11-01 04:40:08 joehw Exp $
*/
final class XMLSchemaValidatorComponentManager extends ParserConfigurationSettings implements
XMLComponentManager {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XSGrammarPoolContainer.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XSGrammarPoolContainer.java
index 79ef5593b06..431a0f21f01 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XSGrammarPoolContainer.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/validation/XSGrammarPoolContainer.java
@@ -26,7 +26,6 @@ import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarPool;
* A container for grammar pools which only contain schema grammars.
*
* @author Michael Glavassevich, IBM
- * @version $Id: XSGrammarPoolContainer.java,v 1.6 2010-11-01 04:40:08 joehw Exp $
*/
public interface XSGrammarPoolContainer {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser.java
index 88ea9518646..5e6c5773fba 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractDOMParser.java
@@ -85,7 +85,6 @@ import org.xml.sax.SAXException;
* @author Andy Clark, IBM
* @author Elena Litani, IBM
*
- * @version $Id: AbstractDOMParser.java,v 1.10 2010-11-01 04:40:09 joehw Exp $
*/
public class AbstractDOMParser extends AbstractXMLDocumentParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractSAXParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractSAXParser.java
index eea7057417b..881020f0409 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractSAXParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/AbstractSAXParser.java
@@ -77,7 +77,6 @@ import org.xml.sax.helpers.LocatorImpl;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: AbstractSAXParser.java,v 1.6 2010-11-01 04:40:09 joehw Exp $
*/
public abstract class AbstractSAXParser
extends AbstractXMLDocumentParser
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/BasicParserConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/BasicParserConfiguration.java
index 3b352961618..c41f27d5a3f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/BasicParserConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/BasicParserConfiguration.java
@@ -94,7 +94,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: BasicParserConfiguration.java,v 1.6 2010-11-01 04:40:09 joehw Exp $
*/
public abstract class BasicParserConfiguration
extends ParserConfigurationSettings
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParser.java
index f2020efda4b..05814b26396 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParser.java
@@ -58,7 +58,6 @@ import org.xml.sax.helpers.LocatorImpl;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: DOMParser.java,v 1.7 2010-11-01 04:40:09 joehw Exp $
*/
public class DOMParser
extends AbstractDOMParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java
index 614c826047e..0053d984291 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java
@@ -79,7 +79,6 @@ import org.xml.sax.SAXException;
* @author Pavani Mukthipudi, Sun Microsystems Inc.
* @author Elena Litani, IBM
* @author Rahul Srivastava, Sun Microsystems Inc.
- * @version $Id: DOMParserImpl.java,v 1.8 2010-11-01 04:40:09 joehw Exp $
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java
index 0f37f7c375e..ce27b8b1c72 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/DTDConfiguration.java
@@ -87,7 +87,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
* @author Andy Clark, IBM
* @author Neil Graham, IBM
*
- * @version $Id: DTDConfiguration.java,v 1.7 2010-11-01 04:40:09 joehw Exp $
*/
public class DTDConfiguration
extends BasicParserConfiguration
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java
index 469780136cd..834fdbf487a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/NonValidatingConfiguration.java
@@ -59,7 +59,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
* include the replacement text of internal entities, and supply default attribute values".
*
* @author Elena Litani, IBM
- * @version $Id: NonValidatingConfiguration.java,v 1.7 2010-11-01 04:40:09 joehw Exp $
*/
public class NonValidatingConfiguration
extends BasicParserConfiguration
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SAXParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SAXParser.java
index 48b8a1ed538..811d957686e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SAXParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SAXParser.java
@@ -37,7 +37,6 @@ import org.xml.sax.SAXNotSupportedException;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: SAXParser.java,v 1.7 2010-11-01 04:40:09 joehw Exp $
*/
public class SAXParser
extends AbstractSAXParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SecurityConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SecurityConfiguration.java
index 65c85d164ca..7eba8746e59 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SecurityConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/SecurityConfiguration.java
@@ -44,7 +44,6 @@ import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager;
*
* @author Neil Graham, IBM
*
- * @version $Id: SecurityConfiguration.java,v 1.6 2010-11-01 04:40:09 joehw Exp $
*/
public class SecurityConfiguration extends XIncludeAwareParserConfiguration
{
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/StandardParserConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/StandardParserConfiguration.java
index 7caad5bc25a..5ac09f8f866 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/StandardParserConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/StandardParserConfiguration.java
@@ -64,7 +64,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: StandardParserConfiguration.java,v 1.7 2010-11-01 04:40:10 joehw Exp $
*/
public class StandardParserConfiguration
extends DTDConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XIncludeAwareParserConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XIncludeAwareParserConfiguration.java
index 5b795e5357b..9ef0b52222c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XIncludeAwareParserConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XIncludeAwareParserConfiguration.java
@@ -39,7 +39,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: XIncludeAwareParserConfiguration.java,v 1.5 2010-11-01 04:40:10 joehw Exp $
*/
public class XIncludeAwareParserConfiguration extends XML11Configuration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java
index bbcbceed10e..c0283f74e3c 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11Configuration.java
@@ -78,7 +78,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
* @author Neil Graham, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XML11Configuration.java,v 1.9 2010-11-01 04:40:10 joehw Exp $
*/
public class XML11Configuration extends ParserConfigurationSettings
implements XMLPullParserConfiguration, XML11Configurable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11DTDConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11DTDConfiguration.java
index 3dfa85e5bd5..f7591ae608e 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11DTDConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11DTDConfiguration.java
@@ -103,7 +103,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
* @author Michael Glavassevich, IBM
* @author John Kim, IBM
*
- * @version $Id: XML11DTDConfiguration.java,v 1.5 2010-11-01 04:40:10 joehw Exp $
*/
public class XML11DTDConfiguration extends ParserConfigurationSettings
implements XMLPullParserConfiguration, XML11Configurable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11NonValidatingConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11NonValidatingConfiguration.java
index 43f873013e7..36a284239f3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11NonValidatingConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XML11NonValidatingConfiguration.java
@@ -74,7 +74,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
* @author John Kim, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XML11NonValidatingConfiguration.java,v 1.5 2010-11-01 04:40:10 joehw Exp $
*/
public class XML11NonValidatingConfiguration extends ParserConfigurationSettings
implements XMLPullParserConfiguration, XML11Configurable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLDocumentParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLDocumentParser.java
index 8a89e98f297..eba49fbad92 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLDocumentParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLDocumentParser.java
@@ -33,7 +33,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XMLDocumentParser.java,v 1.6 2010-11-01 04:40:10 joehw Exp $
*/
public class XMLDocumentParser
extends AbstractXMLDocumentParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarCachingConfiguration.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarCachingConfiguration.java
index 897b7542fde..4e1181a122f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarCachingConfiguration.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarCachingConfiguration.java
@@ -62,7 +62,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
*
* @author Neil Graham, IBM
*
- * @version $Id: XMLGrammarCachingConfiguration.java,v 1.6 2010-11-01 04:40:10 joehw Exp $
*/
public class XMLGrammarCachingConfiguration
extends XIncludeAwareParserConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarParser.java
index 7d88781e679..1089493f2eb 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarParser.java
@@ -25,7 +25,6 @@ import com.sun.org.apache.xerces.internal.impl.dv.DTDDVFactory;
import com.sun.org.apache.xerces.internal.util.SymbolTable;
/**
- * @version $Id: XMLGrammarParser.java,v 1.6 2010-11-01 04:40:10 joehw Exp $
*/
public abstract class XMLGrammarParser
extends XMLParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarPreparser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarPreparser.java
index 6690922da71..71063cc204f 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarPreparser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLGrammarPreparser.java
@@ -49,7 +49,6 @@ import com.sun.org.apache.xerces.internal.utils.ObjectFactory;
*
* @author Neil Graham, IBM
*
- * @version $Id: XMLGrammarPreparser.java,v 1.7 2010-11-01 04:40:10 joehw Exp $
*/
public class XMLGrammarPreparser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLParser.java b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLParser.java
index 970cc51cd26..fe7801fcbb3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLParser.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/parsers/XMLParser.java
@@ -49,7 +49,6 @@ import org.xml.sax.SAXNotRecognizedException;
* @author Arnaud Le Hors, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XMLParser.java,v 1.5 2007/07/20 14:11:21 spericas Exp $
*/
public abstract class XMLParser {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/DOMUtil.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/DOMUtil.java
index da13e8fd1a9..4a00810f106 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/DOMUtil.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/DOMUtil.java
@@ -42,7 +42,6 @@ import org.w3c.dom.ls.LSException;
* (such as a DTM), we should easily be able to convert our schema
* parsing to utilize it.
*
- * @version $Id: DOMUtil.java,v 1.7 2010-11-01 04:40:14 joehw Exp $
*/
public class DOMUtil {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java
index b964a8fbfd8..500769db59a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/DatatypeMessageFormatter.java
@@ -29,7 +29,6 @@ import java.util.ResourceBundle;
* Used to format JAXP 1.3 Datatype API error messages using a specified locale.
*
* @author Neeraj Bajaj, Sun Microsystems
- * @version $Id: DatatypeMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $
*/
public class DatatypeMessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/EncodingMap.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/EncodingMap.java
index 8b083a3ba46..8c4748966c4 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/EncodingMap.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/EncodingMap.java
@@ -470,7 +470,6 @@ import java.util.Hashtable;
* @author TAMURA Kent, IBM
* @author Andy Clark, IBM
*
- * @version $Id$
*/
public class EncodingMap {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/JAXPNamespaceContextWrapper.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/JAXPNamespaceContextWrapper.java
index cdf62d01ab9..b14922c9154 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/JAXPNamespaceContextWrapper.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/JAXPNamespaceContextWrapper.java
@@ -37,7 +37,6 @@ import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: JAXPNamespaceContextWrapper.java,v 1.2 2010-10-26 23:01:13 joehw Exp $
*/
public final class JAXPNamespaceContextWrapper implements NamespaceContext {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java
index a13d8154c96..17281841704 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java
@@ -43,7 +43,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;
*
* @author Andy Clark, IBM
*
- * @version $Id: ParserConfigurationSettings.java,v 1.6 2010-11-01 04:40:14 joehw Exp $
*/
public class ParserConfigurationSettings
implements XMLComponentManager {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java
index 29648a629f9..5c87f4ba497 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/SAXMessageFormatter.java
@@ -29,7 +29,6 @@ import java.util.ResourceBundle;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: SAXMessageFormatter.java,v 1.6 2010-11-01 04:40:14 joehw Exp $
*/
public class SAXMessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXInputSource.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXInputSource.java
index 24def72fa7b..6cc9aa6cb48 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXInputSource.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXInputSource.java
@@ -30,7 +30,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;
/**
* An XMLInputSource analogue to javax.xml.transform.stax.StAXSource.
*
- * @version $Id: StAXInputSource.java,v 1.2 2010-10-26 23:01:17 joehw Exp $
*/
public final class StAXInputSource extends XMLInputSource {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXLocationWrapper.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXLocationWrapper.java
index 566533d1582..22b806295ac 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXLocationWrapper.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/StAXLocationWrapper.java
@@ -32,7 +32,6 @@ import com.sun.org.apache.xerces.internal.xni.XMLLocator;
*
* @author Michael Glavassevich, IBM
*
- * @version $Id: StAXLocationWrapper.java,v 1.2 2010-10-26 23:01:13 joehw Exp $
*/
public final class StAXLocationWrapper implements XMLLocator {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/SymbolHash.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/SymbolHash.java
index dee8383ea4a..ae0aacb723b 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/SymbolHash.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/SymbolHash.java
@@ -28,7 +28,6 @@ package com.sun.org.apache.xerces.internal.util;
* The hash code uses the same algorithm as SymbolTable class.
*
* @author Elena Litani
- * @version $Id: SymbolHash.java,v 1.7 2010-11-01 04:40:14 joehw Exp $
*/
public class SymbolHash {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/XML11Char.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/XML11Char.java
index d19518e6afa..8c9e3412e7d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/XML11Char.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/XML11Char.java
@@ -41,7 +41,6 @@ import java.util.Arrays;
* @author Neil Graham, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XML11Char.java,v 1.7 2010-11-01 04:40:15 joehw Exp $
*/
public class XML11Char {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLAttributesImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLAttributesImpl.java
index a3b879f2fbc..55717373866 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLAttributesImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLAttributesImpl.java
@@ -83,7 +83,6 @@ import com.sun.org.apache.xerces.internal.xni.XMLString;
* @author Elena Litani, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XMLAttributesImpl.java,v 1.7 2010/05/07 20:13:09 joehw Exp $
*/
public class XMLAttributesImpl
implements XMLAttributes, XMLBufferListener {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLChar.java b/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLChar.java
index 731b31a70ab..b649c34efa8 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLChar.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/util/XMLChar.java
@@ -44,7 +44,6 @@ import java.util.Arrays;
* @author Michael Glavassevich, IBM
* @author Rahul Srivastava, Sun Microsystems Inc.
*
- * @version $Id: XMLChar.java,v 1.7 2010-11-01 04:40:15 joehw Exp $
*/
public class XMLChar {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java b/jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java
index 2e4ceeae001..0ec5ad520a3 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java
@@ -32,7 +32,6 @@ package com.sun.org.apache.xerces.internal.utils;
* when bundled as part of the JDK.
*
*
- * @version $Id: ObjectFactory.java,v 1.6 2010/04/23 01:44:34 joehw Exp $
*/
public final class ObjectFactory {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java b/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java
index a060f99e091..016a6168873 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeHandler.java
@@ -115,7 +115,6 @@ import java.util.Objects;
* @author Peter McCracken, IBM
* @author Michael Glavassevich, IBM
*
- * @version $Id: XIncludeHandler.java,v 1.7 2010-11-01 04:40:18 joehw Exp $
*
* @see XIncludeNamespaceSupport
*/
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java
index 0275615e2fc..4420e29934d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xinclude/XIncludeMessageFormatter.java
@@ -32,7 +32,6 @@ import java.util.ResourceBundle;
*
* @author Peter McCracken, IBM
*
- * @version $Id: XIncludeMessageFormatter.java,v 1.7 2010-11-01 04:40:18 joehw Exp $
*/
public class XIncludeMessageFormatter implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xni/QName.java b/jaxp/src/com/sun/org/apache/xerces/internal/xni/QName.java
index 5c47b7a53be..d6d5ce6a63d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xni/QName.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xni/QName.java
@@ -77,7 +77,6 @@ package com.sun.org.apache.xerces.internal.xni;
* == were used to compare strings
* @author Joe Wang, Oracle
*
- * @version $Id: QName.java,v 1.6 2010/03/18 19:32:31 joehw Exp $
*/
public class QName
implements Cloneable {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xni/XNIException.java b/jaxp/src/com/sun/org/apache/xerces/internal/xni/XNIException.java
index 4247551e5eb..98b9d40abad 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xni/XNIException.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xni/XNIException.java
@@ -32,7 +32,6 @@ package com.sun.org.apache.xerces.internal.xni;
*
* @author Andy Clark, IBM
*
- * @version $Id: XNIException.java,v 1.6 2010-11-01 04:40:19 joehw Exp $
*/
public class XNIException
extends RuntimeException {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLComponentManager.java b/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLComponentManager.java
index 80faa6a6d02..1ea05c6babd 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLComponentManager.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLComponentManager.java
@@ -36,7 +36,6 @@ import com.sun.org.apache.xerces.internal.util.PropertyState;
*
* @author Andy Clark, IBM
*
- * @version $Id: XMLComponentManager.java,v 1.6 2010-11-01 04:40:22 joehw Exp $
*/
public interface XMLComponentManager {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLConfigurationException.java b/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLConfigurationException.java
index b1cd779c483..3f1280d1fb8 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLConfigurationException.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xni/parser/XMLConfigurationException.java
@@ -30,7 +30,6 @@ import com.sun.org.apache.xerces.internal.xni.XNIException;
*
* @author Andy Clark, IBM
*
- * @version $Id: XMLConfigurationException.java,v 1.7 2010-11-01 04:40:22 joehw Exp $
*/
public class XMLConfigurationException
extends XNIException {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java b/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java
index 5f44b08289f..33bf6b880e7 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/ElementSchemePointer.java
@@ -38,7 +38,6 @@ import com.sun.org.apache.xerces.internal.xni.parser.XMLErrorHandler;
*
* @xerces.internal
*
- * @version $Id: ElementSchemePointer.java,v 1.4 2009/06/11 23:51:50 joehw Exp $
*/
final class ElementSchemePointer implements XPointerPart {
@@ -498,7 +497,6 @@ final class ElementSchemePointer implements XPointerPart {
* @xerces.internal
*
* @author Neil Delima, IBM
- * @version $Id: ElementSchemePointer.java,v 1.4 2009/06/11 23:51:50 joehw Exp $
*
*/
private final class Tokens {
@@ -656,7 +654,6 @@ final class ElementSchemePointer implements XPointerPart {
*
* @xerces.internal
*
- * @version $Id: ElementSchemePointer.java,v 1.4 2009/06/11 23:51:50 joehw Exp $
*/
private class Scanner {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java b/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java
index 36ee4811039..12603a8d722 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xpointer/XPointerMessageFormatter.java
@@ -34,7 +34,6 @@ import com.sun.org.apache.xerces.internal.utils.SecuritySupport;
*
* @xerces.internal
*
- * @version $Id: XPointerMessageFormatter.java,v 1.5 2010-11-01 04:40:26 joehw Exp $
*/
final class XPointerMessageFormatter implements MessageFormatter {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ByteList.java b/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ByteList.java
index a1138401296..c1d1edefd03 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ByteList.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ByteList.java
@@ -29,7 +29,6 @@ import com.sun.org.apache.xerces.internal.xs.XSException;
*
* @author Ankit Pasricha, IBM
*
- * @version $Id: ByteList.java,v 1.7 2010-11-01 04:40:31 joehw Exp $
*/
public interface ByteList extends List {
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ObjectList.java b/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ObjectList.java
index c47853f8ea5..141fb0a7b26 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ObjectList.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/xs/datatypes/ObjectList.java
@@ -27,7 +27,6 @@ import java.util.List;
*
* @author Ankit Pasricha, IBM
*
- * @version $Id: ObjectList.java,v 1.7 2010-11-01 04:40:31 joehw Exp $
*/
public interface ObjectList extends List {
diff --git a/jaxp/src/com/sun/org/apache/xml/internal/resolver/readers/DOMCatalogReader.java b/jaxp/src/com/sun/org/apache/xml/internal/resolver/readers/DOMCatalogReader.java
index c5740cb1c66..bd14b28ae39 100644
--- a/jaxp/src/com/sun/org/apache/xml/internal/resolver/readers/DOMCatalogReader.java
+++ b/jaxp/src/com/sun/org/apache/xml/internal/resolver/readers/DOMCatalogReader.java
@@ -57,7 +57,6 @@ import sun.reflect.misc.ReflectUtil;
*
The selection of CatalogParsers is made on the basis of the QName
* of the root element of the document.
*
- * This class requires the Java API for XML Parsing.
*
* @see Catalog
* @see CatalogReader
diff --git a/jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java b/jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java
index c9b36c5b07a..eae65068d82 100644
--- a/jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java
+++ b/jaxp/src/com/sun/org/apache/xml/internal/serialize/DOMSerializerImpl.java
@@ -72,7 +72,6 @@ import org.w3c.dom.ls.LSSerializerFilter;
* @author Gopal Sharma, Sun Microsystems
* @author Arun Yadav, Sun Microsystems
* @author Sunitha Reddy, Sun Microsystems
- * @version $Id: DOMSerializerImpl.java,v 1.11 2010-11-01 04:40:36 joehw Exp $
*/
public class DOMSerializerImpl implements LSSerializer, DOMConfiguration {
diff --git a/jaxp/src/com/sun/org/apache/xml/internal/serialize/EncodingInfo.java b/jaxp/src/com/sun/org/apache/xml/internal/serialize/EncodingInfo.java
index 9c21756f8b3..252483fc53d 100644
--- a/jaxp/src/com/sun/org/apache/xml/internal/serialize/EncodingInfo.java
+++ b/jaxp/src/com/sun/org/apache/xml/internal/serialize/EncodingInfo.java
@@ -29,7 +29,6 @@ import com.sun.org.apache.xerces.internal.util.EncodingMap;
/**
* This class represents an encoding.
*
- * @version $Id: EncodingInfo.java,v 1.6 2007/10/18 03:39:08 joehw Exp $
*/
public class EncodingInfo {
diff --git a/jaxp/src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java b/jaxp/src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java
index 25da0c6517a..2150e31a0b5 100644
--- a/jaxp/src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java
+++ b/jaxp/src/com/sun/org/apache/xml/internal/serialize/SerializerFactory.java
@@ -32,7 +32,6 @@ import java.util.StringTokenizer;
/**
*
*
- * @version $Revision: 1.6 $ $Date: 2010-11-01 04:40:36 $
* @author Scott Boag
* @author Assaf Arkin
*/
diff --git a/jaxp/src/com/sun/org/apache/xml/internal/serializer/Encodings.java b/jaxp/src/com/sun/org/apache/xml/internal/serializer/Encodings.java
index d4d95ff8cf2..80eb8a5d969 100644
--- a/jaxp/src/com/sun/org/apache/xml/internal/serializer/Encodings.java
+++ b/jaxp/src/com/sun/org/apache/xml/internal/serializer/Encodings.java
@@ -50,7 +50,6 @@ import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
* to override encoding names and provide the last printable character
* for each encoding.
*
- * @version $Revision: 1.11 $ $Date: 2010-11-01 04:34:44 $
* @author Assaf Arkin
*/
diff --git a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java
index 925ce9c1234..dc64401eda6 100644
--- a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java
+++ b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathExpressionImpl.java
@@ -52,7 +52,6 @@ import org.xml.sax.InputSource;
/**
* The XPathExpression interface encapsulates a (compiled) XPath expression.
*
- * @version $Revision: 1.10 $
* @author Ramesh Mandava
*/
public class XPathExpressionImpl implements javax.xml.xpath.XPathExpression{
diff --git a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java
index b050af44674..c649306da4b 100644
--- a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java
+++ b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java
@@ -36,7 +36,6 @@ import javax.xml.xpath.XPathVariableResolver;
/**
* The XPathFactory builds XPaths.
*
- * @version $Revision: 1.11 $
* @author Ramesh Mandava
*/
public class XPathFactoryImpl extends XPathFactory {
diff --git a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java
index af82f378917..ebd6b2c712f 100644
--- a/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java
+++ b/jaxp/src/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java
@@ -54,7 +54,6 @@ import java.io.IOException;
* of an XPath expression.
*
*
- * @version $Revision: 1.10 $
* @author Ramesh Mandava
*/
public class XPathImpl implements javax.xml.xpath.XPath {
diff --git a/jaxp/src/javax/xml/XMLConstants.java b/jaxp/src/javax/xml/XMLConstants.java
index 8e805ec03da..70b8bdfa812 100644
--- a/jaxp/src/javax/xml/XMLConstants.java
+++ b/jaxp/src/javax/xml/XMLConstants.java
@@ -29,7 +29,6 @@ package javax.xml;
* Utility class to contain basic XML values as constants.
*
* @author Jeff Suttor
- * @version $Revision: 1.8 $, $Date: 2010/05/25 16:19:45 $
* @see Extensible Markup Language (XML) 1.1
* @see Extensible Markup Language (XML) 1.0 (Second Edition)
* @see XML 1.0 Second Edition Specification Errata
diff --git a/jaxp/src/javax/xml/datatype/DatatypeFactory.java b/jaxp/src/javax/xml/datatype/DatatypeFactory.java
index 8138f98de1d..0a96c5760ef 100644
--- a/jaxp/src/javax/xml/datatype/DatatypeFactory.java
+++ b/jaxp/src/javax/xml/datatype/DatatypeFactory.java
@@ -72,7 +72,6 @@ import java.util.regex.Pattern;
* @author Jeff Suttor
* @author Neeraj Bajaj
*
- * @version $Revision: 1.13 $, $Date: 2010/03/11 23:10:53 $
* @since 1.5
*/
public abstract class DatatypeFactory {
diff --git a/jaxp/src/javax/xml/datatype/package.html b/jaxp/src/javax/xml/datatype/package.html
index af81454af96..de065acc664 100644
--- a/jaxp/src/javax/xml/datatype/package.html
+++ b/jaxp/src/javax/xml/datatype/package.html
@@ -31,7 +31,6 @@ questions.
javax.xml.xpath
-
diff --git a/jaxp/src/javax/xml/namespace/QName.java b/jaxp/src/javax/xml/namespace/QName.java
index 994b2a3816c..4792f772337 100644
--- a/jaxp/src/javax/xml/namespace/QName.java
+++ b/jaxp/src/javax/xml/namespace/QName.java
@@ -62,7 +62,6 @@ import javax.xml.XMLConstants;
* QName is immutable.
*
* @author Jeff Suttor
- * @version $Revision: 1.8 $, $Date: 2010/03/18 03:06:17 $
* @see
* XML Schema Part2: Datatypes specification
* @see
diff --git a/jaxp/src/javax/xml/parsers/DocumentBuilder.java b/jaxp/src/javax/xml/parsers/DocumentBuilder.java
index 33c325d11af..95530bcdf73 100644
--- a/jaxp/src/javax/xml/parsers/DocumentBuilder.java
+++ b/jaxp/src/javax/xml/parsers/DocumentBuilder.java
@@ -57,6 +57,7 @@ import org.xml.sax.SAXException;
* communicate with the application using these existing APIs.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public abstract class DocumentBuilder {
diff --git a/jaxp/src/javax/xml/parsers/DocumentBuilderFactory.java b/jaxp/src/javax/xml/parsers/DocumentBuilderFactory.java
index ed77da8a73f..0625b850986 100644
--- a/jaxp/src/javax/xml/parsers/DocumentBuilderFactory.java
+++ b/jaxp/src/javax/xml/parsers/DocumentBuilderFactory.java
@@ -34,8 +34,7 @@ import javax.xml.validation.Schema;
* @author Jeff Suttor
* @author Neeraj Bajaj
*
- * @version $Revision: 1.9 $, $Date: 2010/05/25 16:19:44 $
-
+ * @since 1.4
*/
public abstract class DocumentBuilderFactory {
@@ -440,6 +439,7 @@ public abstract class DocumentBuilderFactory {
* @throws ParserConfigurationException if this DocumentBuilderFactory or the DocumentBuilders
* it creates cannot support this feature.
* @throws NullPointerException If the name parameter is null.
+ * @since 1.5
*/
public abstract void setFeature(String name, boolean value)
throws ParserConfigurationException;
@@ -461,6 +461,7 @@ public abstract class DocumentBuilderFactory {
*
* @throws ParserConfigurationException if this DocumentBuilderFactory
* or the DocumentBuilders it creates cannot support this feature.
+ * @since 1.5
*/
public abstract boolean getFeature(String name)
throws ParserConfigurationException;
diff --git a/jaxp/src/javax/xml/parsers/FactoryConfigurationError.java b/jaxp/src/javax/xml/parsers/FactoryConfigurationError.java
index be008262124..0dc01a91aa9 100644
--- a/jaxp/src/javax/xml/parsers/FactoryConfigurationError.java
+++ b/jaxp/src/javax/xml/parsers/FactoryConfigurationError.java
@@ -32,7 +32,7 @@ package javax.xml.parsers;
* or instantiated.
*
* @author Jeff Suttor
- * @version $Revision: 1.7 $, $Date: 2010-11-01 04:36:09 $
+ * @since 1.4
*/
public class FactoryConfigurationError extends Error {
diff --git a/jaxp/src/javax/xml/parsers/ParserConfigurationException.java b/jaxp/src/javax/xml/parsers/ParserConfigurationException.java
index ed9ecfc03d2..587d4175784 100644
--- a/jaxp/src/javax/xml/parsers/ParserConfigurationException.java
+++ b/jaxp/src/javax/xml/parsers/ParserConfigurationException.java
@@ -29,6 +29,7 @@ package javax.xml.parsers;
* Indicates a serious configuration error.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class ParserConfigurationException extends Exception {
diff --git a/jaxp/src/javax/xml/parsers/SAXParser.java b/jaxp/src/javax/xml/parsers/SAXParser.java
index 8a58bee232a..9be9381f59e 100644
--- a/jaxp/src/javax/xml/parsers/SAXParser.java
+++ b/jaxp/src/javax/xml/parsers/SAXParser.java
@@ -75,6 +75,7 @@ import org.xml.sax.helpers.DefaultHandler;
* this revised class.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public abstract class SAXParser {
diff --git a/jaxp/src/javax/xml/parsers/SAXParserFactory.java b/jaxp/src/javax/xml/parsers/SAXParserFactory.java
index b0a3bb67f8e..7de367e702e 100644
--- a/jaxp/src/javax/xml/parsers/SAXParserFactory.java
+++ b/jaxp/src/javax/xml/parsers/SAXParserFactory.java
@@ -37,8 +37,7 @@ import org.xml.sax.SAXNotSupportedException;
* @author Jeff Suttor
* @author Neeraj Bajaj
*
- * @version $Revision: 1.9 $, $Date: 2010/05/25 16:19:44 $
- *
+ * @since 1.4
*/
public abstract class SAXParserFactory {
diff --git a/jaxp/src/javax/xml/transform/ErrorListener.java b/jaxp/src/javax/xml/transform/ErrorListener.java
index b81e6119605..5d8d82c3662 100644
--- a/jaxp/src/javax/xml/transform/ErrorListener.java
+++ b/jaxp/src/javax/xml/transform/ErrorListener.java
@@ -49,6 +49,8 @@ package javax.xml.transform;
*
* Transformers may use this mechanism to report XML parsing
* errors as well as transformation errors.
+ *
+ * @since 1.4
*/
public interface ErrorListener {
diff --git a/jaxp/src/javax/xml/transform/OutputKeys.java b/jaxp/src/javax/xml/transform/OutputKeys.java
index 3c0fc35e049..ac1a0213239 100644
--- a/jaxp/src/javax/xml/transform/OutputKeys.java
+++ b/jaxp/src/javax/xml/transform/OutputKeys.java
@@ -33,6 +33,7 @@ package javax.xml.transform;
*
* @see
* section 16 of the XSL Transformations (XSLT) W3C Recommendation
+ * @since 1.4
*/
public class OutputKeys {
diff --git a/jaxp/src/javax/xml/transform/Result.java b/jaxp/src/javax/xml/transform/Result.java
index 47472852707..fb5a42ee923 100644
--- a/jaxp/src/javax/xml/transform/Result.java
+++ b/jaxp/src/javax/xml/transform/Result.java
@@ -30,6 +30,7 @@ package javax.xml.transform;
* needed to build a transformation result tree.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public interface Result {
diff --git a/jaxp/src/javax/xml/transform/Source.java b/jaxp/src/javax/xml/transform/Source.java
index 3af6969d09f..fe3d7111439 100644
--- a/jaxp/src/javax/xml/transform/Source.java
+++ b/jaxp/src/javax/xml/transform/Source.java
@@ -28,6 +28,8 @@ package javax.xml.transform;
/**
* An object that implements this interface contains the information
* needed to act as source input (XML source or transformation instructions).
+ *
+ * @since 1.4
*/
public interface Source {
diff --git a/jaxp/src/javax/xml/transform/SourceLocator.java b/jaxp/src/javax/xml/transform/SourceLocator.java
index 475e6546392..e5cd840f686 100644
--- a/jaxp/src/javax/xml/transform/SourceLocator.java
+++ b/jaxp/src/javax/xml/transform/SourceLocator.java
@@ -28,6 +28,8 @@ package javax.xml.transform;
/**
* This interface is primarily for the purposes of reporting where
* an error occurred in the XML source or transformation instructions.
+ *
+ * @since 1.4
*/
public interface SourceLocator {
diff --git a/jaxp/src/javax/xml/transform/Templates.java b/jaxp/src/javax/xml/transform/Templates.java
index 9952368e7bc..9e3871800fe 100644
--- a/jaxp/src/javax/xml/transform/Templates.java
+++ b/jaxp/src/javax/xml/transform/Templates.java
@@ -37,6 +37,8 @@ import java.util.Properties;
* Templates must be threadsafe for a given instance
* over multiple threads running concurrently, and may
* be used multiple times in a given session.
+ *
+ * @since 1.4
*/
public interface Templates {
diff --git a/jaxp/src/javax/xml/transform/Transformer.java b/jaxp/src/javax/xml/transform/Transformer.java
index 783e87a73fb..96292803f2e 100644
--- a/jaxp/src/javax/xml/transform/Transformer.java
+++ b/jaxp/src/javax/xml/transform/Transformer.java
@@ -45,6 +45,7 @@ import java.util.Properties;
* output properties are preserved across transformations.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public abstract class Transformer {
diff --git a/jaxp/src/javax/xml/transform/TransformerConfigurationException.java b/jaxp/src/javax/xml/transform/TransformerConfigurationException.java
index 7e24ac808b7..a81fde2989c 100644
--- a/jaxp/src/javax/xml/transform/TransformerConfigurationException.java
+++ b/jaxp/src/javax/xml/transform/TransformerConfigurationException.java
@@ -27,6 +27,8 @@ package javax.xml.transform;
/**
* Indicates a serious configuration error.
+ *
+ * @since 1.4
*/
public class TransformerConfigurationException extends TransformerException {
diff --git a/jaxp/src/javax/xml/transform/TransformerException.java b/jaxp/src/javax/xml/transform/TransformerException.java
index 0985ebb0594..dfd48246e27 100644
--- a/jaxp/src/javax/xml/transform/TransformerException.java
+++ b/jaxp/src/javax/xml/transform/TransformerException.java
@@ -31,6 +31,8 @@ import java.lang.reflect.InvocationTargetException;
/**
* This class specifies an exceptional condition that occured
* during the transformation process.
+ *
+ * @since 1.4
*/
public class TransformerException extends Exception {
diff --git a/jaxp/src/javax/xml/transform/TransformerFactoryConfigurationError.java b/jaxp/src/javax/xml/transform/TransformerFactoryConfigurationError.java
index b8ac36cd58a..3eda99138af 100644
--- a/jaxp/src/javax/xml/transform/TransformerFactoryConfigurationError.java
+++ b/jaxp/src/javax/xml/transform/TransformerFactoryConfigurationError.java
@@ -30,6 +30,8 @@ package javax.xml.transform;
* exists. This error will typically be thrown when the class of a
* transformation factory specified in the system properties cannot be found
* or instantiated.
+ *
+ * @since 1.4
*/
public class TransformerFactoryConfigurationError extends Error {
private static final long serialVersionUID = -6527718720676281516L;
diff --git a/jaxp/src/javax/xml/transform/URIResolver.java b/jaxp/src/javax/xml/transform/URIResolver.java
index a4ea4c052ad..d8a3ac090a2 100644
--- a/jaxp/src/javax/xml/transform/URIResolver.java
+++ b/jaxp/src/javax/xml/transform/URIResolver.java
@@ -28,6 +28,8 @@ package javax.xml.transform;
/**
* An object that implements this interface that can be called by the processor
* to turn a URI used in document(), xsl:import, or xsl:include into a Source object.
+ *
+ * @since 1.4
*/
public interface URIResolver {
diff --git a/jaxp/src/javax/xml/transform/dom/DOMLocator.java b/jaxp/src/javax/xml/transform/dom/DOMLocator.java
index 13a7446148f..a68c031b72b 100644
--- a/jaxp/src/javax/xml/transform/dom/DOMLocator.java
+++ b/jaxp/src/javax/xml/transform/dom/DOMLocator.java
@@ -37,6 +37,8 @@ import org.w3c.dom.Node;
* object returned by an exception. A {@link javax.xml.transform.Transformer}
* may use this object for purposes other than error reporting, for instance,
* to indicate the source node that originated a result node.
+ *
+ * @since 1.4
*/
public interface DOMLocator extends SourceLocator {
diff --git a/jaxp/src/javax/xml/transform/dom/DOMResult.java b/jaxp/src/javax/xml/transform/dom/DOMResult.java
index c7adfc4ef40..67ec2418740 100644
--- a/jaxp/src/javax/xml/transform/dom/DOMResult.java
+++ b/jaxp/src/javax/xml/transform/dom/DOMResult.java
@@ -35,6 +35,7 @@ import org.w3c.dom.Node;
* which may be retrieved with {@link #getNode()}.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class DOMResult implements Result {
diff --git a/jaxp/src/javax/xml/transform/dom/DOMSource.java b/jaxp/src/javax/xml/transform/dom/DOMSource.java
index 83e64fd471b..dc4e93e07f1 100644
--- a/jaxp/src/javax/xml/transform/dom/DOMSource.java
+++ b/jaxp/src/javax/xml/transform/dom/DOMSource.java
@@ -40,6 +40,7 @@ import org.w3c.dom.Node;
*
* @author Jeff Suttor
* @see Document Object Model (DOM) Level 2 Specification
+ * @since 1.4
*/
public class DOMSource implements Source {
diff --git a/jaxp/src/javax/xml/transform/sax/SAXResult.java b/jaxp/src/javax/xml/transform/sax/SAXResult.java
index b0158b3dcdc..bc88d6bd206 100644
--- a/jaxp/src/javax/xml/transform/sax/SAXResult.java
+++ b/jaxp/src/javax/xml/transform/sax/SAXResult.java
@@ -34,6 +34,7 @@ import org.xml.sax.ext.LexicalHandler;
* Acts as an holder for a transformation Result.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class SAXResult implements Result {
diff --git a/jaxp/src/javax/xml/transform/sax/SAXSource.java b/jaxp/src/javax/xml/transform/sax/SAXSource.java
index 52315646cf3..0d573780e56 100644
--- a/jaxp/src/javax/xml/transform/sax/SAXSource.java
+++ b/jaxp/src/javax/xml/transform/sax/SAXSource.java
@@ -41,6 +41,7 @@ import org.xml.sax.XMLReader;
* {@link javax.xml.parsers.SAXParserFactory#setNamespaceAware(boolean awareness)} method.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class SAXSource implements Source {
diff --git a/jaxp/src/javax/xml/transform/sax/SAXTransformerFactory.java b/jaxp/src/javax/xml/transform/sax/SAXTransformerFactory.java
index 777e0bf2420..cb419e20c37 100644
--- a/jaxp/src/javax/xml/transform/sax/SAXTransformerFactory.java
+++ b/jaxp/src/javax/xml/transform/sax/SAXTransformerFactory.java
@@ -39,6 +39,8 @@ import org.xml.sax.XMLFilter;
* for an XMLReader used during a transformation, it should use a URIResolver
* to return the SAXSource which provides (with getXMLReader) a reference to
* the XMLReader.
+ *
+ * @since 1.4
*/
public abstract class SAXTransformerFactory extends TransformerFactory {
diff --git a/jaxp/src/javax/xml/transform/sax/TemplatesHandler.java b/jaxp/src/javax/xml/transform/sax/TemplatesHandler.java
index 34b5ba2bec4..b2efea5d88c 100644
--- a/jaxp/src/javax/xml/transform/sax/TemplatesHandler.java
+++ b/jaxp/src/javax/xml/transform/sax/TemplatesHandler.java
@@ -34,6 +34,8 @@ import org.xml.sax.ContentHandler;
* parse events (parsing transformation instructions) into a Templates object.
*
* Note that TemplatesHandler does not need to implement LexicalHandler.
+ *
+ * @since 1.4
*/
public interface TemplatesHandler extends ContentHandler {
diff --git a/jaxp/src/javax/xml/transform/sax/TransformerHandler.java b/jaxp/src/javax/xml/transform/sax/TransformerHandler.java
index 8bced5e8649..3c15367f892 100644
--- a/jaxp/src/javax/xml/transform/sax/TransformerHandler.java
+++ b/jaxp/src/javax/xml/transform/sax/TransformerHandler.java
@@ -36,6 +36,8 @@ import org.xml.sax.ext.LexicalHandler;
* A TransformerHandler
* listens for SAX ContentHandler parse events and transforms
* them to a Result.
+ *
+ * @since 1.4
*/
public interface TransformerHandler
extends ContentHandler, LexicalHandler, DTDHandler {
diff --git a/jaxp/src/javax/xml/transform/stream/StreamResult.java b/jaxp/src/javax/xml/transform/stream/StreamResult.java
index 39df253fa12..57db8665801 100644
--- a/jaxp/src/javax/xml/transform/stream/StreamResult.java
+++ b/jaxp/src/javax/xml/transform/stream/StreamResult.java
@@ -37,6 +37,7 @@ import java.net.MalformedURLException;
* which may be XML, plain Text, HTML, or some other form of markup.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class StreamResult implements Result {
diff --git a/jaxp/src/javax/xml/transform/stream/StreamSource.java b/jaxp/src/javax/xml/transform/stream/StreamSource.java
index ad41b9d303d..7627d5e3b55 100644
--- a/jaxp/src/javax/xml/transform/stream/StreamSource.java
+++ b/jaxp/src/javax/xml/transform/stream/StreamSource.java
@@ -39,6 +39,7 @@ import javax.xml.transform.Source;
* StreamSource instances may only be used once.
*
* @author Jeff Suttor
+ * @since 1.4
*/
public class StreamSource implements Source {
diff --git a/jaxp/src/javax/xml/validation/SchemaFactoryFinder.java b/jaxp/src/javax/xml/validation/SchemaFactoryFinder.java
index 907e67a66fa..16b84f636bd 100644
--- a/jaxp/src/javax/xml/validation/SchemaFactoryFinder.java
+++ b/jaxp/src/javax/xml/validation/SchemaFactoryFinder.java
@@ -40,7 +40,6 @@ import java.util.ServiceLoader;
* Implementation of {@link SchemaFactory#newInstance(String)}.
*
* @author Kohsuke Kawaguchi
- * @version $Revision: 1.8 $, $Date: 2010-11-01 04:36:13 $
* @since 1.5
*/
class SchemaFactoryFinder {
diff --git a/jaxp/src/javax/xml/xpath/XPathFactoryFinder.java b/jaxp/src/javax/xml/xpath/XPathFactoryFinder.java
index f99ddc8a0c2..bceeda854e8 100644
--- a/jaxp/src/javax/xml/xpath/XPathFactoryFinder.java
+++ b/jaxp/src/javax/xml/xpath/XPathFactoryFinder.java
@@ -40,7 +40,6 @@ import java.util.ServiceLoader;
* Implementation of {@link XPathFactory#newInstance(String)}.
*
* @author Kohsuke Kawaguchi
- * @version $Revision: 1.7 $, $Date: 2010-11-01 04:36:14 $
* @since 1.5
*/
class XPathFactoryFinder {
diff --git a/jaxp/src/javax/xml/xpath/package.html b/jaxp/src/javax/xml/xpath/package.html
index 6f49222a255..82415a2d407 100644
--- a/jaxp/src/javax/xml/xpath/package.html
+++ b/jaxp/src/javax/xml/xpath/package.html
@@ -32,7 +32,6 @@ questions.
-
diff --git a/jaxp/src/org/w3c/dom/Attr.java b/jaxp/src/org/w3c/dom/Attr.java
index 8231a54156a..8db99e9a6a1 100644
--- a/jaxp/src/org/w3c/dom/Attr.java
+++ b/jaxp/src/org/w3c/dom/Attr.java
@@ -239,7 +239,7 @@ public interface Attr extends Node {
/**
* The Element node this attribute is attached to or
* null if this attribute is not in use.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Element getOwnerElement();
@@ -249,7 +249,7 @@ public interface Attr extends Node {
* after loading the document or invoking
* Document.normalizeDocument(), schemaTypeInfo
* may not be reliable if the node was moved.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public TypeInfo getSchemaTypeInfo();
@@ -297,7 +297,7 @@ public interface Attr extends Node {
* reevaluated in accordance to the schema used. As a consequence, if
* the Attr.schemaTypeInfo attribute contains an ID type,
* isId will always return true.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean isId();
diff --git a/jaxp/src/org/w3c/dom/DOMConfiguration.java b/jaxp/src/org/w3c/dom/DOMConfiguration.java
index 4a3e66b020c..320ca42b592 100644
--- a/jaxp/src/org/w3c/dom/DOMConfiguration.java
+++ b/jaxp/src/org/w3c/dom/DOMConfiguration.java
@@ -383,7 +383,7 @@ package org.w3c.dom;
* set, Document.normalizeDocument() will invoke the resource
* resolver instead of using Document.documentURI.
* See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMConfiguration {
/**
diff --git a/jaxp/src/org/w3c/dom/DOMError.java b/jaxp/src/org/w3c/dom/DOMError.java
index 15821c865d4..c0a00cd5c3c 100644
--- a/jaxp/src/org/w3c/dom/DOMError.java
+++ b/jaxp/src/org/w3c/dom/DOMError.java
@@ -44,7 +44,7 @@ package org.w3c.dom;
/**
* DOMError is an interface that describes an error.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMError {
// ErrorSeverity
diff --git a/jaxp/src/org/w3c/dom/DOMErrorHandler.java b/jaxp/src/org/w3c/dom/DOMErrorHandler.java
index 1de0cb9387e..82e9988deff 100644
--- a/jaxp/src/org/w3c/dom/DOMErrorHandler.java
+++ b/jaxp/src/org/w3c/dom/DOMErrorHandler.java
@@ -53,7 +53,7 @@ package org.w3c.dom;
*
The application that is using the DOM implementation is expected to
* implement this interface.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMErrorHandler {
/**
diff --git a/jaxp/src/org/w3c/dom/DOMException.java b/jaxp/src/org/w3c/dom/DOMException.java
index b351b7b7362..679c6a7c363 100644
--- a/jaxp/src/org/w3c/dom/DOMException.java
+++ b/jaxp/src/org/w3c/dom/DOMException.java
@@ -116,29 +116,29 @@ public class DOMException extends RuntimeException {
/**
* If an attempt is made to use an object that is not, or is no longer,
* usable.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public static final short INVALID_STATE_ERR = 11;
/**
* If an invalid or illegal string is specified.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public static final short SYNTAX_ERR = 12;
/**
* If an attempt is made to modify the type of the underlying object.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public static final short INVALID_MODIFICATION_ERR = 13;
/**
* If an attempt is made to create or change an object in a way which is
* incorrect with regard to namespaces.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public static final short NAMESPACE_ERR = 14;
/**
* If a parameter or an operation is not supported by the underlying
* object.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public static final short INVALID_ACCESS_ERR = 15;
/**
@@ -147,13 +147,13 @@ public class DOMException extends RuntimeException {
* with respect to "partial validity", this exception would be raised
* and the operation would not be done. This code is used in [DOM Level 3 Validation]
* . Refer to this specification for further information.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public static final short VALIDATION_ERR = 16;
/**
* If the type of an object is incompatible with the expected type of the
* parameter associated to the object.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public static final short TYPE_MISMATCH_ERR = 17;
diff --git a/jaxp/src/org/w3c/dom/DOMImplementation.java b/jaxp/src/org/w3c/dom/DOMImplementation.java
index acf79fe9313..2bcd5f7d39c 100644
--- a/jaxp/src/org/w3c/dom/DOMImplementation.java
+++ b/jaxp/src/org/w3c/dom/DOMImplementation.java
@@ -77,7 +77,7 @@ public interface DOMImplementation {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed through the
* Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public DocumentType createDocumentType(String qualifiedName,
String publicId,
@@ -129,7 +129,7 @@ public interface DOMImplementation {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed through the
* Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Document createDocument(String namespaceURI,
String qualifiedName,
@@ -157,7 +157,7 @@ public interface DOMImplementation {
* return results inconsistent with the primary core
* DOMImplementation such as hasFeature,
* getFeature, etc.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Object getFeature(String feature,
String version);
diff --git a/jaxp/src/org/w3c/dom/DOMImplementationList.java b/jaxp/src/org/w3c/dom/DOMImplementationList.java
index d7712f2e3f0..1fb2caa9b7d 100644
--- a/jaxp/src/org/w3c/dom/DOMImplementationList.java
+++ b/jaxp/src/org/w3c/dom/DOMImplementationList.java
@@ -48,7 +48,7 @@ package org.w3c.dom;
* DOMImplementationList are accessible via an integral index,
* starting from 0.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMImplementationList {
/**
diff --git a/jaxp/src/org/w3c/dom/DOMImplementationSource.java b/jaxp/src/org/w3c/dom/DOMImplementationSource.java
index 41aa1ab01b0..317c4ba6600 100644
--- a/jaxp/src/org/w3c/dom/DOMImplementationSource.java
+++ b/jaxp/src/org/w3c/dom/DOMImplementationSource.java
@@ -49,7 +49,7 @@ package org.w3c.dom;
* listed in the binding-specific list of available sources so that its
* DOMImplementation objects are made available.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMImplementationSource {
/**
diff --git a/jaxp/src/org/w3c/dom/DOMLocator.java b/jaxp/src/org/w3c/dom/DOMLocator.java
index 9104976a56a..ece7db191b0 100644
--- a/jaxp/src/org/w3c/dom/DOMLocator.java
+++ b/jaxp/src/org/w3c/dom/DOMLocator.java
@@ -45,7 +45,7 @@ package org.w3c.dom;
* DOMLocator is an interface that describes a location (e.g.
* where an error occurred).
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMLocator {
/**
diff --git a/jaxp/src/org/w3c/dom/DOMStringList.java b/jaxp/src/org/w3c/dom/DOMStringList.java
index 670bdd0e04e..50d045b9d81 100644
--- a/jaxp/src/org/w3c/dom/DOMStringList.java
+++ b/jaxp/src/org/w3c/dom/DOMStringList.java
@@ -48,7 +48,7 @@ package org.w3c.dom;
* DOMStringList are accessible via an integral index, starting
* from 0.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface DOMStringList {
/**
diff --git a/jaxp/src/org/w3c/dom/Document.java b/jaxp/src/org/w3c/dom/Document.java
index 5e489ac98c4..ab2d6e4f17e 100644
--- a/jaxp/src/org/w3c/dom/Document.java
+++ b/jaxp/src/org/w3c/dom/Document.java
@@ -73,7 +73,7 @@ public interface Document extends Node {
* changing it afterwards is very unlikely to result in a change of the
* features supported.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public DocumentType getDoctype();
@@ -337,7 +337,7 @@ public interface Document extends Node {
* Document.xmlVersion attribute. This may happen when
* importing an XML 1.1 [XML 1.1] element
* into an XML 1.0 document, for instance.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Node importNode(Node importedNode,
boolean deep)
@@ -401,7 +401,7 @@ public interface Document extends Node {
*
NOT_SUPPORTED_ERR: Always thrown if the current document does not
* support the "XML" feature, since namespaces were
* defined by XML.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Element createElementNS(String namespaceURI,
String qualifiedName)
@@ -470,7 +470,7 @@ public interface Document extends Node {
*
NOT_SUPPORTED_ERR: Always thrown if the current document does not
* support the "XML" feature, since namespaces were
* defined by XML.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Attr createAttributeNS(String namespaceURI,
String qualifiedName)
@@ -485,7 +485,7 @@ public interface Document extends Node {
* special value "*" matches all local names.
* @return A new NodeList object containing all the matched
* Elements.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public NodeList getElementsByTagNameNS(String namespaceURI,
String localName);
@@ -501,7 +501,7 @@ public interface Document extends Node {
* ID unless so defined.
* @param elementId The unique id value for an element.
* @return The matching element or null if there is none.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Element getElementById(String elementId);
@@ -509,7 +509,7 @@ public interface Document extends Node {
* An attribute specifying the encoding used for this document at the time
* of the parsing. This is null when it is not known, such
* as when the Document was created in memory.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getInputEncoding();
@@ -517,7 +517,7 @@ public interface Document extends Node {
* An attribute specifying, as part of the XML declaration, the encoding of this document. This is null when
* unspecified or when it is not known, such as when the
* Document was created in memory.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getXmlEncoding();
@@ -529,7 +529,7 @@ public interface Document extends Node {
* Document.normalizeDocument() with the "validate"
* parameter to verify if the value matches the validity
* constraint for standalone document declaration as defined in [XML 1.0].
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean getXmlStandalone();
/**
@@ -543,7 +543,7 @@ public interface Document extends Node {
* @exception DOMException
* NOT_SUPPORTED_ERR: Raised if this document does not support the
* "XML" feature.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setXmlStandalone(boolean xmlStandalone)
throws DOMException;
@@ -570,7 +570,7 @@ public interface Document extends Node {
* objects supporting a version of the "XMLVersion" feature must not
* raise a NOT_SUPPORTED_ERR exception for the same version
* number when using Document.xmlVersion.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getXmlVersion();
/**
@@ -599,7 +599,7 @@ public interface Document extends Node {
* NOT_SUPPORTED_ERR: Raised if the version is set to a value that is
* not supported by this Document or if this document
* does not support the "XML" feature.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setXmlVersion(String xmlVersion)
throws DOMException;
@@ -612,7 +612,7 @@ public interface Document extends Node {
* errors while using Document.normalizeDocument(). In case
* of error, the behavior is undefined. This attribute is
* true by default.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean getStrictErrorChecking();
/**
@@ -623,7 +623,7 @@ public interface Document extends Node {
* errors while using Document.normalizeDocument(). In case
* of error, the behavior is undefined. This attribute is
* true by default.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setStrictErrorChecking(boolean strictErrorChecking);
@@ -638,7 +638,7 @@ public interface Document extends Node {
* "HTML" [DOM Level 2 HTML]
* , the href attribute of the HTML BASE element takes precedence over
* this attribute when computing Node.baseURI.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getDocumentURI();
/**
@@ -652,7 +652,7 @@ public interface Document extends Node {
* "HTML" [DOM Level 2 HTML]
* , the href attribute of the HTML BASE element takes precedence over
* this attribute when computing Node.baseURI.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setDocumentURI(String documentURI);
@@ -723,7 +723,7 @@ public interface Document extends Node {
* DOCUMENT, DOCUMENT_TYPE.
*
NO_MODIFICATION_ALLOWED_ERR: Raised when the source node is
* readonly.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Node adoptNode(Node source)
throws DOMException;
@@ -731,7 +731,7 @@ public interface Document extends Node {
/**
* The configuration used when Document.normalizeDocument()
* is invoked.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public DOMConfiguration getDomConfig();
@@ -765,7 +765,7 @@ public interface Document extends Node {
* " parameter. Note this method might also report fatal errors (
* DOMError.SEVERITY_FATAL_ERROR) if an implementation
* cannot recover from an error.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void normalizeDocument();
@@ -834,7 +834,7 @@ public interface Document extends Node {
* . Also raised, when the node being renamed is an attribute, if the
* qualifiedName, or its prefix, is "xmlns" and the
* namespaceURI is different from "http://www.w3.org/2000/xmlns/".
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Node renameNode(Node n,
String namespaceURI,
diff --git a/jaxp/src/org/w3c/dom/DocumentType.java b/jaxp/src/org/w3c/dom/DocumentType.java
index 3b687e3a1e4..b28bea811b6 100644
--- a/jaxp/src/org/w3c/dom/DocumentType.java
+++ b/jaxp/src/org/w3c/dom/DocumentType.java
@@ -87,14 +87,14 @@ public interface DocumentType extends Node {
/**
* The public identifier of the external subset.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getPublicId();
/**
* The system identifier of the external subset. This may be an absolute
* URI or not.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getSystemId();
@@ -105,7 +105,7 @@ public interface DocumentType extends Node {
* information is available to the implementation. This may vary
* depending on various parameters, including the XML processor used to
* build the document.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getInternalSubset();
diff --git a/jaxp/src/org/w3c/dom/Element.java b/jaxp/src/org/w3c/dom/Element.java
index 195c71f7a95..ab5087d2c52 100644
--- a/jaxp/src/org/w3c/dom/Element.java
+++ b/jaxp/src/org/w3c/dom/Element.java
@@ -203,7 +203,7 @@ public interface Element extends Node {
* NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getAttributeNS(String namespaceURI,
String localName)
@@ -249,7 +249,7 @@ public interface Element extends Node {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public void setAttributeNS(String namespaceURI,
String qualifiedName,
@@ -278,7 +278,7 @@ public interface Element extends Node {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public void removeAttributeNS(String namespaceURI,
String localName)
@@ -299,7 +299,7 @@ public interface Element extends Node {
* NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Attr getAttributeNodeNS(String namespaceURI,
String localName)
@@ -329,7 +329,7 @@ public interface Element extends Node {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Attr setAttributeNodeNS(Attr newAttr)
throws DOMException;
@@ -348,7 +348,7 @@ public interface Element extends Node {
* NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public NodeList getElementsByTagNameNS(String namespaceURI,
String localName)
@@ -362,7 +362,7 @@ public interface Element extends Node {
* @return true if an attribute with the given name is
* specified on this element or has a default value, false
* otherwise.
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public boolean hasAttribute(String name);
@@ -383,7 +383,7 @@ public interface Element extends Node {
* NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed
* through the Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public boolean hasAttributeNS(String namespaceURI,
String localName)
@@ -391,7 +391,7 @@ public interface Element extends Node {
/**
* The type information associated with this element.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public TypeInfo getSchemaTypeInfo();
@@ -413,7 +413,7 @@ public interface Element extends Node {
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
NOT_FOUND_ERR: Raised if the specified node is not an attribute
* of this element.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setIdAttribute(String name,
boolean isId)
@@ -436,7 +436,7 @@ public interface Element extends Node {
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
NOT_FOUND_ERR: Raised if the specified node is not an attribute
* of this element.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setIdAttributeNS(String namespaceURI,
String localName,
@@ -459,7 +459,7 @@ public interface Element extends Node {
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*
NOT_FOUND_ERR: Raised if the specified node is not an attribute
* of this element.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setIdAttributeNode(Attr idAttr,
boolean isId)
diff --git a/jaxp/src/org/w3c/dom/Entity.java b/jaxp/src/org/w3c/dom/Entity.java
index 2242fe1449e..c4e3b8930c7 100644
--- a/jaxp/src/org/w3c/dom/Entity.java
+++ b/jaxp/src/org/w3c/dom/Entity.java
@@ -96,7 +96,7 @@ public interface Entity extends Node {
* of parsing, when it is an external parsed entity. This is
* null if it an entity from the internal subset or if it
* is not known.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getInputEncoding();
@@ -104,7 +104,7 @@ public interface Entity extends Node {
* An attribute specifying, as part of the text declaration, the encoding
* of this entity, when it is an external parsed entity. This is
* null otherwise.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getXmlEncoding();
@@ -112,7 +112,7 @@ public interface Entity extends Node {
* An attribute specifying, as part of the text declaration, the version
* number of this entity, when it is an external parsed entity. This is
* null otherwise.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getXmlVersion();
diff --git a/jaxp/src/org/w3c/dom/NameList.java b/jaxp/src/org/w3c/dom/NameList.java
index 01cfe10c9c0..92ee1814087 100644
--- a/jaxp/src/org/w3c/dom/NameList.java
+++ b/jaxp/src/org/w3c/dom/NameList.java
@@ -48,7 +48,7 @@ package org.w3c.dom;
* implemented. The items in the NameList are accessible via an
* integral index, starting from 0.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface NameList {
/**
diff --git a/jaxp/src/org/w3c/dom/NamedNodeMap.java b/jaxp/src/org/w3c/dom/NamedNodeMap.java
index 00466c16bda..c9d3084f151 100644
--- a/jaxp/src/org/w3c/dom/NamedNodeMap.java
+++ b/jaxp/src/org/w3c/dom/NamedNodeMap.java
@@ -141,7 +141,7 @@ public interface NamedNodeMap {
* NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed through the
* Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Node getNamedItemNS(String namespaceURI,
String localName)
@@ -177,7 +177,7 @@ public interface NamedNodeMap {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed through the
* Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Node setNamedItemNS(Node arg)
throws DOMException;
@@ -203,7 +203,7 @@ public interface NamedNodeMap {
*
NOT_SUPPORTED_ERR: May be raised if the implementation does not
* support the feature "XML" and the language exposed through the
* Document does not support XML Namespaces (such as [HTML 4.01]).
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Node removeNamedItemNS(String namespaceURI,
String localName)
diff --git a/jaxp/src/org/w3c/dom/Node.java b/jaxp/src/org/w3c/dom/Node.java
index 68404b95ebb..a62ad94d91e 100644
--- a/jaxp/src/org/w3c/dom/Node.java
+++ b/jaxp/src/org/w3c/dom/Node.java
@@ -299,7 +299,7 @@ public interface Node {
* which is not used with any Document yet, this is
* null.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public Document getOwnerDocument();
@@ -335,7 +335,7 @@ public interface Node {
* support the insertion of a DocumentType or
* Element node.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public Node insertBefore(Node newChild,
Node refChild)
@@ -373,7 +373,7 @@ public interface Node {
* support the replacement of the DocumentType child or
* Element child.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public Node replaceChild(Node newChild,
Node oldChild)
@@ -393,7 +393,7 @@ public interface Node {
* support the removal of the DocumentType child or the
* Element child.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public Node removeChild(Node oldChild)
throws DOMException;
@@ -422,7 +422,7 @@ public interface Node {
* if the DOM implementation doesn't support the removal of the
* DocumentType child or Element child.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public Node appendChild(Node newChild)
throws DOMException;
@@ -491,7 +491,7 @@ public interface Node {
* sufficient, since XPointers do not differentiate between
* Text nodes and CDATASection nodes.
*
- * @since DOM Level 3
+ * @since 1.4, DOM Level 3
*/
public void normalize();
@@ -503,7 +503,7 @@ public interface Node {
* @return Returns true if the specified feature is
* supported on this node, false otherwise.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public boolean isSupported(String feature,
String version);
@@ -523,7 +523,7 @@ public interface Node {
* attached to. If an attribute is not explicitly given a namespace, it
* simply has no namespace.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getNamespaceURI();
@@ -547,7 +547,7 @@ public interface Node {
* method, such as createElement from the
* Document interface, this is always null.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getPrefix();
/**
@@ -584,7 +584,7 @@ public interface Node {
* this node is "xmlns" [XML Namespaces]
* .
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public void setPrefix(String prefix)
throws DOMException;
@@ -596,7 +596,7 @@ public interface Node {
* method, such as Document.createElement(), this is always
* null.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public String getLocalName();
@@ -605,7 +605,7 @@ public interface Node {
* @return Returns true if this node has any attributes,
* false otherwise.
*
- * @since DOM Level 2
+ * @since 1.4, DOM Level 2
*/
public boolean hasAttributes();
@@ -619,7 +619,7 @@ public interface Node {
* documentURI attribute from the Document
* interface otherwise.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getBaseURI();
@@ -666,7 +666,7 @@ public interface Node {
* implementations that do not coordinate to return consistent
* implementation-specific results.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public short compareDocumentPosition(Node other)
throws DOMException;
@@ -717,7 +717,7 @@ public interface Node {
* fit in a DOMString variable on the implementation
* platform.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getTextContent()
throws DOMException;
@@ -765,7 +765,7 @@ public interface Node {
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public void setTextContent(String textContent)
throws DOMException;
@@ -783,7 +783,7 @@ public interface Node {
* @return Returns true if the nodes are the same,
* false otherwise.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean isSameNode(Node other);
@@ -798,7 +798,7 @@ public interface Node {
* associated to the namespace prefix, the returned namespace prefix
* is implementation dependent.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String lookupPrefix(String namespaceURI);
@@ -810,7 +810,7 @@ public interface Node {
* namespaceURI is the default namespace,
* false otherwise.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean isDefaultNamespace(String namespaceURI);
@@ -824,7 +824,7 @@ public interface Node {
* @return Returns the associated namespace URI or null if
* none is found.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String lookupNamespaceURI(String prefix);
@@ -890,7 +890,7 @@ public interface Node {
* @return Returns true if the nodes are equal,
* false otherwise.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean isEqualNode(Node arg);
@@ -915,7 +915,7 @@ public interface Node {
* with the primary core Node such as attributes,
* childNodes, etc.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Object getFeature(String feature,
String version);
@@ -932,7 +932,7 @@ public interface Node {
* @return Returns the DOMUserData previously associated to
* the given key on this node, or null if there was none.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Object setUserData(String key,
Object data,
@@ -946,7 +946,7 @@ public interface Node {
* @return Returns the DOMUserData associated to the given
* key on this node, or null if there was none.
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Object getUserData(String key);
diff --git a/jaxp/src/org/w3c/dom/Text.java b/jaxp/src/org/w3c/dom/Text.java
index f54d0ee8681..c603dac3ead 100644
--- a/jaxp/src/org/w3c/dom/Text.java
+++ b/jaxp/src/org/w3c/dom/Text.java
@@ -93,7 +93,7 @@ public interface Text extends CharacterData {
* determined to contain whitespace in element content during the load
* of the document or if validation occurs while using
* Document.normalizeDocument().
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public boolean isElementContentWhitespace();
@@ -121,7 +121,7 @@ public interface Text extends CharacterData {
*
* Figure: barTextNode.wholeText value is "barfoo"
*
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public String getWholeText();
@@ -179,7 +179,7 @@ public interface Text extends CharacterData {
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised if one of the Text
* nodes being replaced is readonly.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public Text replaceWholeText(String content)
throws DOMException;
diff --git a/jaxp/src/org/w3c/dom/TypeInfo.java b/jaxp/src/org/w3c/dom/TypeInfo.java
index 044ede0bccb..a67f1c3e8dc 100644
--- a/jaxp/src/org/w3c/dom/TypeInfo.java
+++ b/jaxp/src/org/w3c/dom/TypeInfo.java
@@ -118,7 +118,7 @@ package org.w3c.dom;
* and therefore should define how to represent their type systems using
* TypeInfo.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface TypeInfo {
/**
diff --git a/jaxp/src/org/w3c/dom/UserDataHandler.java b/jaxp/src/org/w3c/dom/UserDataHandler.java
index a4ec6e89832..e6595abfc1f 100644
--- a/jaxp/src/org/w3c/dom/UserDataHandler.java
+++ b/jaxp/src/org/w3c/dom/UserDataHandler.java
@@ -49,7 +49,7 @@ package org.w3c.dom;
* implement various behaviors regarding the data it associates to the DOM
* nodes. This interface defines that handler.
*
See also the Document Object Model (DOM) Level 3 Core Specification.
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public interface UserDataHandler {
// OperationType
diff --git a/jaxp/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java b/jaxp/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java
index cfeeeea4907..48fda761e1e 100644
--- a/jaxp/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java
+++ b/jaxp/src/org/w3c/dom/bootstrap/DOMImplementationRegistry.java
@@ -79,7 +79,7 @@ import java.security.PrivilegedAction;
*
* @see DOMImplementation
* @see DOMImplementationSource
- * @since DOM Level 3
+ * @since 1.5, DOM Level 3
*/
public final class DOMImplementationRegistry {
/**
diff --git a/jaxp/src/org/w3c/dom/events/DocumentEvent.java b/jaxp/src/org/w3c/dom/events/DocumentEvent.java
index cdbbb367f43..2a5f62f10fd 100644
--- a/jaxp/src/org/w3c/dom/events/DocumentEvent.java
+++ b/jaxp/src/org/w3c/dom/events/DocumentEvent.java
@@ -50,7 +50,7 @@ import org.w3c.dom.DOMException;
* implemented on the same object which implements the Document
* interface in an implementation which supports the Event model.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface DocumentEvent {
/**
diff --git a/jaxp/src/org/w3c/dom/events/Event.java b/jaxp/src/org/w3c/dom/events/Event.java
index b1351e9b8dd..efa68650104 100644
--- a/jaxp/src/org/w3c/dom/events/Event.java
+++ b/jaxp/src/org/w3c/dom/events/Event.java
@@ -51,7 +51,7 @@ package org.w3c.dom.events;
* type of event they accompany. These derived interfaces are also
* implemented by the object passed to the event listener.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface Event {
// PhaseType
diff --git a/jaxp/src/org/w3c/dom/events/EventException.java b/jaxp/src/org/w3c/dom/events/EventException.java
index 6273f64063a..1d646b4f63c 100644
--- a/jaxp/src/org/w3c/dom/events/EventException.java
+++ b/jaxp/src/org/w3c/dom/events/EventException.java
@@ -45,7 +45,7 @@ package org.w3c.dom.events;
* Event operations may throw an EventException as specified in
* their method descriptions.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public class EventException extends RuntimeException {
public EventException(short code, String message) {
diff --git a/jaxp/src/org/w3c/dom/events/EventListener.java b/jaxp/src/org/w3c/dom/events/EventListener.java
index 2adfe58f647..a11dec1ef86 100644
--- a/jaxp/src/org/w3c/dom/events/EventListener.java
+++ b/jaxp/src/org/w3c/dom/events/EventListener.java
@@ -54,7 +54,7 @@ package org.w3c.dom.events;
* the user wishes the same EventListeners to be added to the
* newly created copy the user must add them manually.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface EventListener {
/**
diff --git a/jaxp/src/org/w3c/dom/events/EventTarget.java b/jaxp/src/org/w3c/dom/events/EventTarget.java
index 46ac1f62266..3fd5aefa458 100644
--- a/jaxp/src/org/w3c/dom/events/EventTarget.java
+++ b/jaxp/src/org/w3c/dom/events/EventTarget.java
@@ -50,7 +50,7 @@ package org.w3c.dom.events;
* EventListeners on an EventTarget and dispatch
* of events to that EventTarget.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface EventTarget {
/**
diff --git a/jaxp/src/org/w3c/dom/events/MouseEvent.java b/jaxp/src/org/w3c/dom/events/MouseEvent.java
index dee4cda5b5c..7a21af99b05 100644
--- a/jaxp/src/org/w3c/dom/events/MouseEvent.java
+++ b/jaxp/src/org/w3c/dom/events/MouseEvent.java
@@ -58,7 +58,7 @@ import org.w3c.dom.views.AbstractView;
* bubbling to obtain notification of mouse events which occur within its
* descendent elements.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface MouseEvent extends UIEvent {
/**
diff --git a/jaxp/src/org/w3c/dom/events/MutationEvent.java b/jaxp/src/org/w3c/dom/events/MutationEvent.java
index a520b6f0a5c..1dc5c815991 100644
--- a/jaxp/src/org/w3c/dom/events/MutationEvent.java
+++ b/jaxp/src/org/w3c/dom/events/MutationEvent.java
@@ -47,7 +47,7 @@ import org.w3c.dom.Node;
* The MutationEvent interface provides specific contextual
* information associated with Mutation events.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface MutationEvent extends Event {
// attrChangeType
diff --git a/jaxp/src/org/w3c/dom/events/UIEvent.java b/jaxp/src/org/w3c/dom/events/UIEvent.java
index 0931c5ff874..01192194ced 100644
--- a/jaxp/src/org/w3c/dom/events/UIEvent.java
+++ b/jaxp/src/org/w3c/dom/events/UIEvent.java
@@ -47,7 +47,7 @@ import org.w3c.dom.views.AbstractView;
* The UIEvent interface provides specific contextual information
* associated with User Interface events.
*
See also the Document Object Model (DOM) Level 2 Events Specification.
- * @since DOM Level 2
+ * @since 1.5, DOM Level 2
*/
public interface UIEvent extends Event {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/DOMImplementationLS.java b/jaxp/src/org/w3c/dom/ls/DOMImplementationLS.java
index c876dafcd6b..13b863e7536 100644
--- a/jaxp/src/org/w3c/dom/ls/DOMImplementationLS.java
+++ b/jaxp/src/org/w3c/dom/ls/DOMImplementationLS.java
@@ -57,6 +57,8 @@ import org.w3c.dom.DOMException;
* "3.0" (respectively).
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface DOMImplementationLS {
// DOMImplementationLSMode
diff --git a/jaxp/src/org/w3c/dom/ls/LSException.java b/jaxp/src/org/w3c/dom/ls/LSException.java
index f23d38a0a9c..fad53bafc1d 100644
--- a/jaxp/src/org/w3c/dom/ls/LSException.java
+++ b/jaxp/src/org/w3c/dom/ls/LSException.java
@@ -54,6 +54,8 @@ package org.w3c.dom.ls;
* implementation dependent.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public class LSException extends RuntimeException {
public LSException(short code, String message) {
diff --git a/jaxp/src/org/w3c/dom/ls/LSInput.java b/jaxp/src/org/w3c/dom/ls/LSInput.java
index a9b08c17bf1..f6f69b986cb 100644
--- a/jaxp/src/org/w3c/dom/ls/LSInput.java
+++ b/jaxp/src/org/w3c/dom/ls/LSInput.java
@@ -82,6 +82,8 @@ package org.w3c.dom.ls;
* modify the copies, if necessary).
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSInput {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSLoadEvent.java b/jaxp/src/org/w3c/dom/ls/LSLoadEvent.java
index 5c9b7671e75..a4f938d0c89 100644
--- a/jaxp/src/org/w3c/dom/ls/LSLoadEvent.java
+++ b/jaxp/src/org/w3c/dom/ls/LSLoadEvent.java
@@ -49,6 +49,8 @@ import org.w3c.dom.events.Event;
* of a document load.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSLoadEvent extends Event {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSOutput.java b/jaxp/src/org/w3c/dom/ls/LSOutput.java
index c6ace48cf3e..b69f8d8f367 100644
--- a/jaxp/src/org/w3c/dom/ls/LSOutput.java
+++ b/jaxp/src/org/w3c/dom/ls/LSOutput.java
@@ -74,6 +74,8 @@ package org.w3c.dom.ls;
* modify the copies, if necessary).
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSOutput {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSParser.java b/jaxp/src/org/w3c/dom/ls/LSParser.java
index 72d7db2f89c..0ddbd49ddfb 100644
--- a/jaxp/src/org/w3c/dom/ls/LSParser.java
+++ b/jaxp/src/org/w3c/dom/ls/LSParser.java
@@ -166,6 +166,8 @@ import org.w3c.dom.DOMException;
* permission denied,...), XML well-formedness errors, and so on.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSParser {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSParserFilter.java b/jaxp/src/org/w3c/dom/ls/LSParserFilter.java
index 0638c382dd4..96797bbb3cf 100644
--- a/jaxp/src/org/w3c/dom/ls/LSParserFilter.java
+++ b/jaxp/src/org/w3c/dom/ls/LSParserFilter.java
@@ -73,6 +73,8 @@ import org.w3c.dom.Element;
* throwing exceptions from a filter is DOM implementation dependent.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSParserFilter {
// Constants returned by startElement and acceptNode
diff --git a/jaxp/src/org/w3c/dom/ls/LSProgressEvent.java b/jaxp/src/org/w3c/dom/ls/LSProgressEvent.java
index 25a76a6a469..6e1b5653ef7 100644
--- a/jaxp/src/org/w3c/dom/ls/LSProgressEvent.java
+++ b/jaxp/src/org/w3c/dom/ls/LSProgressEvent.java
@@ -53,6 +53,8 @@ import org.w3c.dom.events.Event;
* input dependent.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSProgressEvent extends Event {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSResourceResolver.java b/jaxp/src/org/w3c/dom/ls/LSResourceResolver.java
index bcb57be01e1..2361c2dd5eb 100644
--- a/jaxp/src/org/w3c/dom/ls/LSResourceResolver.java
+++ b/jaxp/src/org/w3c/dom/ls/LSResourceResolver.java
@@ -63,6 +63,8 @@ package org.w3c.dom.ls;
* interface.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSResourceResolver {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSSerializer.java b/jaxp/src/org/w3c/dom/ls/LSSerializer.java
index 6553f2112eb..05b003a15a7 100644
--- a/jaxp/src/org/w3c/dom/ls/LSSerializer.java
+++ b/jaxp/src/org/w3c/dom/ls/LSSerializer.java
@@ -204,6 +204,8 @@ import org.w3c.dom.DOMException;
* permission denied,...) and so on.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSSerializer {
/**
diff --git a/jaxp/src/org/w3c/dom/ls/LSSerializerFilter.java b/jaxp/src/org/w3c/dom/ls/LSSerializerFilter.java
index bc8e7241799..1263473c753 100644
--- a/jaxp/src/org/w3c/dom/ls/LSSerializerFilter.java
+++ b/jaxp/src/org/w3c/dom/ls/LSSerializerFilter.java
@@ -70,6 +70,8 @@ import org.w3c.dom.traversal.NodeFilter;
* document.
*
See also the Document Object Model (DOM) Level 3 Load
and Save Specification.
+ *
+ * @since 1.5
*/
public interface LSSerializerFilter extends NodeFilter {
/**
diff --git a/jaxp/src/org/w3c/dom/package.html b/jaxp/src/org/w3c/dom/package.html
index def37a39016..a95de6c6ea7 100644
--- a/jaxp/src/org/w3c/dom/package.html
+++ b/jaxp/src/org/w3c/dom/package.html
@@ -3,13 +3,11 @@
org.w3c.dom package
-Provides the interfaces for the Document Object Model (DOM) which is a
-component API of the Java API for XML
-Processing. The Document Object Model Level 2 Core API allows programs
-to dynamically access and update the content and structure of documents.
-See the specification
-for more information.
+Provides the interfaces for the Document Object Model (DOM). Supports the
+Document Object Model Level 2 Core APIi,
+Document Object Model (DOM) Level 3 Core,
+and Document Object Model (DOM) Level 3 Load and Save.
-@since JDK1.4
+@since 1.4