This commit is contained in:
J. Duke 2017-07-05 20:19:40 +02:00
commit dc345a08a6
248 changed files with 6599 additions and 2043 deletions

View File

@ -292,3 +292,4 @@ f7c11da0b0481d49cc7a65a453336c108191e821 jdk9-b42
b6cca3e6175a69f39e5799b7349ddb0176630291 jdk9-b47
0064e246d83f6f9fc245c19b6d05041ecaf4b6d4 jdk9-b48
d91ed1951b948210590ce1394bea5515357246ba jdk9-b49
d1f37d39ff2421f956a6ddf316cf763807bc3363 jdk9-b50

View File

@ -1463,14 +1463,13 @@
<h4>Building with ccache</h4>
<p>A simple way to radically speed up compilation of native code
(typically hotspot and native libraries in JDK) is to install
ccache. This will cache and reuse prior compilation results, if the
source code is unchanged. However, ccache versions prior to 3.1.4
does not work correctly with the precompiled headers used in
OpenJDK. So if your platform supports ccache at 3.1.4 or later, we
highly recommend installing it. This is currently only supported on
linux.</p>
<p>The OpenJDK build supports building with ccache
when using gcc or clang. Using ccache can
radically speed up compilation of native code if
you often rebuild the same sources. Your milage
may vary however so we recommend evaluating it for
yourself. To enable it, make sure it's on the path
and configure with <code>--enable-ccache</code>.</p>
<h4>Building on local disk</h4>

View File

@ -242,6 +242,9 @@ AC_DEFUN_ONCE([BASIC_INIT],
[
# Save the original command line. This is passed to us by the wrapper configure script.
AC_SUBST(CONFIGURE_COMMAND_LINE)
# Save the path variable before it gets changed
ORIGINAL_PATH="$PATH"
AC_SUBST(ORIGINAL_PATH)
DATE_WHEN_CONFIGURED=`LANG=C date`
AC_SUBST(DATE_WHEN_CONFIGURED)
AC_MSG_NOTICE([Configuration created at $DATE_WHEN_CONFIGURED.])

View File

@ -164,19 +164,26 @@ AC_DEFUN([BPERF_SETUP_CCACHE],
[enable using ccache to speed up recompilations @<:@disabled@:>@])])
CCACHE=
CCACHE_STATUS=
AC_MSG_CHECKING([is ccache enabled])
ENABLE_CCACHE=$enable_ccache
if test "x$enable_ccache" = xyes; then
AC_MSG_RESULT([yes])
OLD_PATH="$PATH"
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
if test "x$TOOLCHAIN_TYPE" = "xgcc" -o "x$TOOLCHAIN_TYPE" = "xclang"; then
AC_MSG_RESULT([yes])
OLD_PATH="$PATH"
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
fi
BASIC_REQUIRE_PROGS(CCACHE, ccache)
PATH="$OLD_PATH"
CCACHE_VERSION=[`$CCACHE --version | head -n1 | $SED 's/[A-Za-z ]*//'`]
CCACHE_STATUS="Active ($CCACHE_VERSION)"
else
AC_MSG_RESULT([no])
AC_MSG_WARN([ccache is not supported with toolchain type $TOOLCHAIN_TYPE])
fi
BASIC_REQUIRE_PROGS(CCACHE, ccache)
CCACHE_STATUS="enabled"
PATH="$OLD_PATH"
elif test "x$enable_ccache" = xno; then
AC_MSG_RESULT([no, explicitly disabled])
CCACHE_STATUS="Disabled"
elif test "x$enable_ccache" = x; then
AC_MSG_RESULT([no])
else
@ -206,35 +213,31 @@ AC_DEFUN([BPERF_SETUP_CCACHE],
AC_DEFUN([BPERF_SETUP_CCACHE_USAGE],
[
if test "x$CCACHE" != x; then
# Only use ccache if it is 3.1.4 or later, which supports
# precompiled headers.
AC_MSG_CHECKING([if ccache supports precompiled headers])
HAS_GOOD_CCACHE=`($CCACHE --version | head -n 1 | grep -E 3.1.@<:@456789@:>@) 2> /dev/null`
if test "x$HAS_GOOD_CCACHE" = x; then
AC_MSG_RESULT([no, disabling ccache])
CCACHE=
CCACHE_STATUS="disabled"
else
AC_MSG_RESULT([yes])
if test "x$USE_PRECOMPILED_HEADER" = "x1"; then
HAS_BAD_CCACHE=[`$ECHO $CCACHE_VERSION | \
$GREP -e '^1.*' -e '^2.*' -e '^3\.0.*' -e '^3\.1\.[0123]'`]
if test "x$HAS_BAD_CCACHE" != "x"; then
AC_MSG_ERROR([Precompiled headers requires ccache 3.1.4 or later, found $CCACHE_VERSION])
fi
AC_MSG_CHECKING([if C-compiler supports ccache precompiled headers])
CCACHE_PRECOMP_FLAG="-fpch-preprocess"
PUSHED_FLAGS="$CXXFLAGS"
CXXFLAGS="-fpch-preprocess $CXXFLAGS"
CXXFLAGS="$CCACHE_PRECOMP_FLAG $CXXFLAGS"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [CC_KNOWS_CCACHE_TRICK=yes], [CC_KNOWS_CCACHE_TRICK=no])
CXXFLAGS="$PUSHED_FLAGS"
if test "x$CC_KNOWS_CCACHE_TRICK" = xyes; then
AC_MSG_RESULT([yes])
CFLAGS_CCACHE="$CCACHE_PRECOMP_FLAG"
AC_SUBST(CFLAGS_CCACHE)
CCACHE_SLOPPINESS=pch_defines,time_macros
else
AC_MSG_RESULT([no, disabling ccaching of precompiled headers])
CCACHE=
CCACHE_STATUS="disabled"
AC_MSG_RESULT([no])
AC_MSG_ERROR([Cannot use ccache with precompiled headers without compiler support for $CCACHE_PRECOMP_FLAG])
fi
fi
fi
if test "x$CCACHE" != x; then
CCACHE_SLOPPINESS=time_macros
CCACHE="CCACHE_COMPRESS=1 $SET_CCACHE_DIR CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS $CCACHE"
CCACHE_FLAGS=-fpch-preprocess
CCACHE="CCACHE_COMPRESS=1 $SET_CCACHE_DIR \
CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS CCACHE_BASEDIR=$TOPDIR $CCACHE"
if test "x$SET_CCACHE_DIR" != x; then
mkdir -p $CCACHE_DIR > /dev/null 2>&1

View File

@ -40,8 +40,9 @@ if test "x$BASH" = x; then
echo "Error: This script must be run using bash." 1>&2
exit 1
fi
# Force autoconf to use bash
# Force autoconf to use bash. This also means we must disable autoconf re-exec.
export CONFIG_SHELL=$BASH
export _as_can_reexec=no
conf_script_dir="$TOPDIR/common/autoconf"

View File

@ -629,6 +629,7 @@ ac_includes_default="\
ac_subst_vars='LTLIBOBJS
LIBOBJS
CFLAGS_CCACHE
CCACHE
USE_PRECOMPILED_HEADER
SJAVAC_SERVER_DIR
@ -991,6 +992,7 @@ CAT
BASH
BASENAME
DATE_WHEN_CONFIGURED
ORIGINAL_PATH
CONFIGURE_COMMAND_LINE
target_alias
host_alias
@ -4333,7 +4335,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=1421247827
DATE_WHEN_GENERATED=1423567509
###############################################################################
#
@ -4366,6 +4368,9 @@ DATE_WHEN_GENERATED=1421247827
# Save the original command line. This is passed to us by the wrapper configure script.
# Save the path variable before it gets changed
ORIGINAL_PATH="$PATH"
DATE_WHEN_CONFIGURED=`LANG=C date`
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuration created at $DATE_WHEN_CONFIGURED." >&5
@ -27438,8 +27443,8 @@ $as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;}
# The trailing space for everyone except PATH is no typo, but is needed due
# to trailing \ in the Windows paths. These will be stripped later.
$ECHO "$WINPATH_BASH -c 'echo VS_PATH="'\"$PATH\" > set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo VS_INCLUDE="'\"$INCLUDE \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo VS_LIB="'\"$LIB \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo VS_INCLUDE="'\"$INCLUDE\;$include \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo VS_LIB="'\"$LIB\;$lib \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo VCINSTALLDIR="'\"$VCINSTALLDIR \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo WindowsSdkDir="'\"$WindowsSdkDir \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
$ECHO "$WINPATH_BASH -c 'echo WINDOWSSDKDIR="'\"$WINDOWSSDKDIR \" >> set-vs-env.sh' >> $EXTRACT_VC_ENV_BAT_FILE
@ -27486,9 +27491,9 @@ $as_echo "present but broken" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
$as_echo "ok" >&6; }
# Remove any trailing "\" and " " from the variables.
VS_INCLUDE=`$ECHO "$VS_INCLUDE" | $SED 's/\\\\* *$//'`
VS_LIB=`$ECHO "$VS_LIB" | $SED 's/\\\\* *$//'`
# Remove any trailing "\" ";" and " " from the variables.
VS_INCLUDE=`$ECHO "$VS_INCLUDE" | $SED -e 's/\\\\*;* *$//'`
VS_LIB=`$ECHO "$VS_LIB" | $SED 's/\\\\*;* *$//'`
VCINSTALLDIR=`$ECHO "$VCINSTALLDIR" | $SED 's/\\\\* *$//'`
WindowsSDKDir=`$ECHO "$WindowsSDKDir" | $SED 's/\\\\* *$//'`
WINDOWSSDKDIR=`$ECHO "$WINDOWSSDKDIR" | $SED 's/\\\\* *$//'`
@ -27499,6 +27504,268 @@ $as_echo "ok" >&6; }
# Convert VS_INCLUDE into SYSROOT_CFLAGS
OLDIFS="$IFS"
IFS=";"
for i in $VS_INCLUDE; do
ipath=$i
IFS="$OLDIFS"
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
# Input might be given as Windows format, start by converting to
# unix format.
path="$ipath"
new_path=`$CYGPATH -u "$path"`
# Cygwin tries to hide some aspects of the Windows file system, such that binaries are
# named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
# the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
# "foo.exe" is OK but "foo" is an error.
#
# This test is therefore slightly more accurate than "test -f" to check for file precense.
# It is also a way to make sure we got the proper file name for the real test later on.
test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
if test "x$test_shortpath" = x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of ipath, which resolves as \"$path\", is invalid." >&5
$as_echo "$as_me: The path of ipath, which resolves as \"$path\", is invalid." >&6;}
as_fn_error $? "Cannot locate the the path of ipath" "$LINENO" 5
fi
# Call helper function which possibly converts this using DOS-style short mode.
# If so, the updated path is stored in $new_path.
input_path="$new_path"
# Check if we need to convert this using DOS-style short mode. If the path
# contains just simple characters, use it. Otherwise (spaces, weird characters),
# take no chances and rewrite it.
# Note: m4 eats our [], so we need to use [ and ] instead.
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
if test "x$has_forbidden_chars" != x; then
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
shortmode_path=`$CYGPATH -s -m -a "$input_path"`
path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
# Going to short mode and back again did indeed matter. Since short mode is
# case insensitive, let's make it lowercase to improve readability.
shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
# Now convert it back to Unix-stile (cygpath)
input_path=`$CYGPATH -u "$shortmode_path"`
new_path="$input_path"
fi
fi
test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
if test "x$test_cygdrive_prefix" = x; then
# As a simple fix, exclude /usr/bin since it's not a real path.
if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
# The path is in a Cygwin special directory (e.g. /home). We need this converted to
# a path prefixed by /cygdrive for fixpath to work.
new_path="$CYGWIN_ROOT_PATH$input_path"
fi
fi
if test "x$path" != "x$new_path"; then
ipath="$new_path"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting ipath to \"$new_path\"" >&5
$as_echo "$as_me: Rewriting ipath to \"$new_path\"" >&6;}
fi
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
path="$ipath"
has_colon=`$ECHO $path | $GREP ^.:`
new_path="$path"
if test "x$has_colon" = x; then
# Not in mixed or Windows style, start by that.
new_path=`cmd //c echo $path`
fi
input_path="$new_path"
# Check if we need to convert this using DOS-style short mode. If the path
# contains just simple characters, use it. Otherwise (spaces, weird characters),
# take no chances and rewrite it.
# Note: m4 eats our [], so we need to use [ and ] instead.
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
if test "x$has_forbidden_chars" != x; then
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
fi
windows_path="$new_path"
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
unix_path=`$CYGPATH -u "$windows_path"`
new_path="$unix_path"
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
new_path="$unix_path"
fi
if test "x$path" != "x$new_path"; then
ipath="$new_path"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting ipath to \"$new_path\"" >&5
$as_echo "$as_me: Rewriting ipath to \"$new_path\"" >&6;}
fi
# Save the first 10 bytes of this path to the storage, so fixpath can work.
all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
else
# We're on a unix platform. Hooray! :)
path="$ipath"
has_space=`$ECHO "$path" | $GREP " "`
if test "x$has_space" != x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of ipath, which resolves as \"$path\", is invalid." >&5
$as_echo "$as_me: The path of ipath, which resolves as \"$path\", is invalid." >&6;}
as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
fi
# Use eval to expand a potential ~
eval path="$path"
if test ! -f "$path" && test ! -d "$path"; then
as_fn_error $? "The path of ipath, which resolves as \"$path\", is not found." "$LINENO" 5
fi
ipath="`cd "$path"; $THEPWDCMD -L`"
fi
IFS=";"
SYSROOT_CFLAGS="$SYSROOT_CFLAGS -I$ipath"
done
# Convert VS_LIB into SYSROOT_LDFLAGS
for i in $VS_LIB; do
libpath=$i
IFS="$OLDIFS"
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
# Input might be given as Windows format, start by converting to
# unix format.
path="$libpath"
new_path=`$CYGPATH -u "$path"`
# Cygwin tries to hide some aspects of the Windows file system, such that binaries are
# named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
# the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
# "foo.exe" is OK but "foo" is an error.
#
# This test is therefore slightly more accurate than "test -f" to check for file precense.
# It is also a way to make sure we got the proper file name for the real test later on.
test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
if test "x$test_shortpath" = x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of libpath, which resolves as \"$path\", is invalid." >&5
$as_echo "$as_me: The path of libpath, which resolves as \"$path\", is invalid." >&6;}
as_fn_error $? "Cannot locate the the path of libpath" "$LINENO" 5
fi
# Call helper function which possibly converts this using DOS-style short mode.
# If so, the updated path is stored in $new_path.
input_path="$new_path"
# Check if we need to convert this using DOS-style short mode. If the path
# contains just simple characters, use it. Otherwise (spaces, weird characters),
# take no chances and rewrite it.
# Note: m4 eats our [], so we need to use [ and ] instead.
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
if test "x$has_forbidden_chars" != x; then
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
shortmode_path=`$CYGPATH -s -m -a "$input_path"`
path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
# Going to short mode and back again did indeed matter. Since short mode is
# case insensitive, let's make it lowercase to improve readability.
shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
# Now convert it back to Unix-stile (cygpath)
input_path=`$CYGPATH -u "$shortmode_path"`
new_path="$input_path"
fi
fi
test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
if test "x$test_cygdrive_prefix" = x; then
# As a simple fix, exclude /usr/bin since it's not a real path.
if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
# The path is in a Cygwin special directory (e.g. /home). We need this converted to
# a path prefixed by /cygdrive for fixpath to work.
new_path="$CYGWIN_ROOT_PATH$input_path"
fi
fi
if test "x$path" != "x$new_path"; then
libpath="$new_path"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting libpath to \"$new_path\"" >&5
$as_echo "$as_me: Rewriting libpath to \"$new_path\"" >&6;}
fi
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
path="$libpath"
has_colon=`$ECHO $path | $GREP ^.:`
new_path="$path"
if test "x$has_colon" = x; then
# Not in mixed or Windows style, start by that.
new_path=`cmd //c echo $path`
fi
input_path="$new_path"
# Check if we need to convert this using DOS-style short mode. If the path
# contains just simple characters, use it. Otherwise (spaces, weird characters),
# take no chances and rewrite it.
# Note: m4 eats our [], so we need to use [ and ] instead.
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
if test "x$has_forbidden_chars" != x; then
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
fi
windows_path="$new_path"
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
unix_path=`$CYGPATH -u "$windows_path"`
new_path="$unix_path"
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
new_path="$unix_path"
fi
if test "x$path" != "x$new_path"; then
libpath="$new_path"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting libpath to \"$new_path\"" >&5
$as_echo "$as_me: Rewriting libpath to \"$new_path\"" >&6;}
fi
# Save the first 10 bytes of this path to the storage, so fixpath can work.
all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
else
# We're on a unix platform. Hooray! :)
path="$libpath"
has_space=`$ECHO "$path" | $GREP " "`
if test "x$has_space" != x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of libpath, which resolves as \"$path\", is invalid." >&5
$as_echo "$as_me: The path of libpath, which resolves as \"$path\", is invalid." >&6;}
as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
fi
# Use eval to expand a potential ~
eval path="$path"
if test ! -f "$path" && test ! -d "$path"; then
as_fn_error $? "The path of libpath, which resolves as \"$path\", is not found." "$LINENO" 5
fi
libpath="`cd "$path"; $THEPWDCMD -L`"
fi
IFS=";"
SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS -libpath:$libpath"
done
IFS="$OLDIFS"
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
@ -50616,16 +50883,17 @@ fi
CCACHE=
CCACHE_STATUS=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking is ccache enabled" >&5
$as_echo_n "checking is ccache enabled... " >&6; }
ENABLE_CCACHE=$enable_ccache
if test "x$enable_ccache" = xyes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
if test "x$TOOLCHAIN_TYPE" = "xgcc" -o "x$TOOLCHAIN_TYPE" = "xclang"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
OLD_PATH="$PATH"
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
fi
OLD_PATH="$PATH"
if test "x$TOOLCHAIN_PATH" != x; then
PATH=$TOOLCHAIN_PATH:$PATH
fi
@ -50819,11 +51087,19 @@ $as_echo "$tool_specified" >&6; }
fi
CCACHE_STATUS="enabled"
PATH="$OLD_PATH"
PATH="$OLD_PATH"
CCACHE_VERSION=`$CCACHE --version | head -n1 | $SED 's/[A-Za-z ]*//'`
CCACHE_STATUS="Active ($CCACHE_VERSION)"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ccache is not supported with toolchain type $TOOLCHAIN_TYPE" >&5
$as_echo "$as_me: WARNING: ccache is not supported with toolchain type $TOOLCHAIN_TYPE" >&2;}
fi
elif test "x$enable_ccache" = xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, explicitly disabled" >&5
$as_echo "no, explicitly disabled" >&6; }
CCACHE_STATUS="Disabled"
elif test "x$enable_ccache" = x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
@ -50854,23 +51130,17 @@ $as_echo "$as_me: WARNING: --with-ccache-dir has no meaning when ccache is not e
if test "x$CCACHE" != x; then
if test "x$CCACHE" != x; then
# Only use ccache if it is 3.1.4 or later, which supports
# precompiled headers.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ccache supports precompiled headers" >&5
$as_echo_n "checking if ccache supports precompiled headers... " >&6; }
HAS_GOOD_CCACHE=`($CCACHE --version | head -n 1 | grep -E 3.1.[456789]) 2> /dev/null`
if test "x$HAS_GOOD_CCACHE" = x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabling ccache" >&5
$as_echo "no, disabling ccache" >&6; }
CCACHE=
CCACHE_STATUS="disabled"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
if test "x$USE_PRECOMPILED_HEADER" = "x1"; then
HAS_BAD_CCACHE=`$ECHO $CCACHE_VERSION | \
$GREP -e '^1.*' -e '^2.*' -e '^3\.0.*' -e '^3\.1\.[0123]'`
if test "x$HAS_BAD_CCACHE" != "x"; then
as_fn_error $? "Precompiled headers requires ccache 3.1.4 or later, found $CCACHE_VERSION" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if C-compiler supports ccache precompiled headers" >&5
$as_echo_n "checking if C-compiler supports ccache precompiled headers... " >&6; }
CCACHE_PRECOMP_FLAG="-fpch-preprocess"
PUSHED_FLAGS="$CXXFLAGS"
CXXFLAGS="-fpch-preprocess $CXXFLAGS"
CXXFLAGS="$CCACHE_PRECOMP_FLAG $CXXFLAGS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@ -50892,19 +51162,18 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test "x$CC_KNOWS_CCACHE_TRICK" = xyes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
CFLAGS_CCACHE="$CCACHE_PRECOMP_FLAG"
CCACHE_SLOPPINESS=pch_defines,time_macros
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabling ccaching of precompiled headers" >&5
$as_echo "no, disabling ccaching of precompiled headers" >&6; }
CCACHE=
CCACHE_STATUS="disabled"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "Cannot use ccache with precompiled headers without compiler support for $CCACHE_PRECOMP_FLAG" "$LINENO" 5
fi
fi
fi
if test "x$CCACHE" != x; then
CCACHE_SLOPPINESS=time_macros
CCACHE="CCACHE_COMPRESS=1 $SET_CCACHE_DIR CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS $CCACHE"
CCACHE_FLAGS=-fpch-preprocess
CCACHE="CCACHE_COMPRESS=1 $SET_CCACHE_DIR \
CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS CCACHE_BASEDIR=$TOPDIR $CCACHE"
if test "x$SET_CCACHE_DIR" != x; then
mkdir -p $CCACHE_DIR > /dev/null 2>&1

View File

@ -109,8 +109,8 @@ LD:=@HOTSPOT_LD@
MT:=@HOTSPOT_MT@
RC:=@HOTSPOT_RC@
EXTRA_CFLAGS=@LEGACY_EXTRA_CFLAGS@
EXTRA_CXXFLAGS=@LEGACY_EXTRA_CXXFLAGS@
EXTRA_CFLAGS=@LEGACY_EXTRA_CFLAGS@ $(CFLAGS_CCACHE)
EXTRA_CXXFLAGS=@LEGACY_EXTRA_CXXFLAGS@ $(CFLAGS_CCACHE)
EXTRA_LDFLAGS=@LEGACY_EXTRA_LDFLAGS@
USE_PRECOMPILED_HEADER=@USE_PRECOMPILED_HEADER@
@ -132,6 +132,13 @@ else
ZIP_DEBUGINFO_FILES:=0
endif
ifeq ($(OPENJDK_TARGET_OS), windows)
# On Windows, the Visual Studio toolchain needs the LIB and INCLUDE
# environment variables (in Windows path style).
export INCLUDE:=@VS_INCLUDE@
export LIB:=@VS_LIB@
endif
# Sneak this in via the spec.gmk file, since we don't want to mess around too much with the Hotspot make files.
# This is needed to get the LOG setting to work properly.
include $(SRC_ROOT)/make/common/MakeBase.gmk

View File

@ -129,14 +129,12 @@ LIBDL:=@LIBDL@
# colon or semicolon
PATH_SEP:=@PATH_SEP@
# Save the original path before replacing it with the Visual Studio tools
ORIGINAL_PATH:=@ORIGINAL_PATH@
ifeq ($(OPENJDK_TARGET_OS), windows)
# On Windows, the Visual Studio toolchain needs the LIB and INCLUDE
# environment variables (in Windows path style), and the PATH needs to
# be adjusted to include Visual Studio tools (but this needs to be in
# cygwin/msys style).
# On Windows, the Visual Studio toolchain needs the PATH to be adjusted
# to include Visual Studio tools (this needs to be in cygwin/msys style).
export PATH:=@VS_PATH@
export INCLUDE:=@VS_INCLUDE@
export LIB:=@VS_LIB@
endif
SYSROOT_CFLAGS := @SYSROOT_CFLAGS@
@ -328,6 +326,8 @@ CXX_FLAG_DEPS:=@CXX_FLAG_DEPS@
CFLAGS_WARNINGS_ARE_ERRORS:=@CFLAGS_WARNINGS_ARE_ERRORS@
CFLAGS_CCACHE:=@CFLAGS_CCACHE@
# Tools that potentially need to be cross compilation aware.
CC:=@FIXPATH@ @CCACHE@ @CC@

View File

@ -213,9 +213,9 @@ AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV],
AC_MSG_ERROR([Your VC command prompt seems broken, INCLUDE and/or LIB is missing.])
else
AC_MSG_RESULT([ok])
# Remove any trailing "\" and " " from the variables.
VS_INCLUDE=`$ECHO "$VS_INCLUDE" | $SED 's/\\\\* *$//'`
VS_LIB=`$ECHO "$VS_LIB" | $SED 's/\\\\* *$//'`
# Remove any trailing "\" ";" and " " from the variables.
VS_INCLUDE=`$ECHO "$VS_INCLUDE" | $SED -e 's/\\\\*;* *$//'`
VS_LIB=`$ECHO "$VS_LIB" | $SED 's/\\\\*;* *$//'`
VCINSTALLDIR=`$ECHO "$VCINSTALLDIR" | $SED 's/\\\\* *$//'`
WindowsSDKDir=`$ECHO "$WindowsSDKDir" | $SED 's/\\\\* *$//'`
WINDOWSSDKDIR=`$ECHO "$WINDOWSSDKDIR" | $SED 's/\\\\* *$//'`
@ -226,6 +226,26 @@ AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV],
AC_SUBST(VS_PATH)
AC_SUBST(VS_INCLUDE)
AC_SUBST(VS_LIB)
# Convert VS_INCLUDE into SYSROOT_CFLAGS
OLDIFS="$IFS"
IFS=";"
for i in $VS_INCLUDE; do
ipath=$i
IFS="$OLDIFS"
BASIC_FIXUP_PATH([ipath])
IFS=";"
SYSROOT_CFLAGS="$SYSROOT_CFLAGS -I$ipath"
done
# Convert VS_LIB into SYSROOT_LDFLAGS
for i in $VS_LIB; do
libpath=$i
IFS="$OLDIFS"
BASIC_FIXUP_PATH([libpath])
IFS=";"
SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS -libpath:$libpath"
done
IFS="$OLDIFS"
fi
else
AC_MSG_RESULT([not found])

View File

@ -292,3 +292,4 @@ e27c725d6c9d155667b35255f442d4ceb8c3c084 jdk9-b40
ee8447ca632e1d39180b4767c749db101bff7314 jdk9-b47
a13c49c5f2899b702652a460ed7aa73123e671e6 jdk9-b48
9285d14eb7b6b0815679bae98dd936dbc136218d jdk9-b49
224f593393e5b01b3c8f1e591b7f4b1790a3737a jdk9-b50

View File

@ -452,3 +452,4 @@ a184ee1d717297bd35b7c3e35393e137921a3ed2 jdk9-b46
3b241fb72b8925b75941d612db762a6d5da66d02 jdk9-b47
cc775a4a24c7f5d9e624b4205e9fbd48a17331f6 jdk9-b48
360cd1fc42f10941a9fd17cc32d5b85a22d12a0b jdk9-b49
e0947f58c9c1426aa0d98b98ebb78357b27a7b99 jdk9-b50

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2015, 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
@ -44,15 +44,22 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("SymbolTable");
theTableField = type.getAddressField("_the_table");
sharedTableField = type.getAddressField("_shared_table");
}
// Fields
private static AddressField theTableField;
private static AddressField sharedTableField;
private CompactHashTable sharedTable;
// Accessors
public static SymbolTable getTheTable() {
Address tmp = theTableField.getValue();
return (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
SymbolTable table = (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
Address shared = sharedTableField.getStaticFieldAddress();
table.sharedTable = (CompactHashTable)VMObjectFactory.newObject(CompactHashTable.class, shared);
return table;
}
public SymbolTable(Address addr) {
@ -73,8 +80,9 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
/** Clone of VM's "temporary" probe routine, as the SA currently
does not support mutation so lookup() would have no effect
anyway. Returns null if the given string is not in the symbol
table. */
anyway. Searches the regular symbol table and the shared symbol
table. Null is returned if the given name is not found in both
tables. */
public Symbol probe(byte[] name) {
long hashValue = hashSymbol(name);
for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
@ -85,7 +93,8 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
}
}
}
return null;
return sharedTable.probe(name, hashValue);
}
public interface SymbolVisitor {

View File

@ -0,0 +1,120 @@
/*
* Copyright (c) 2015, 2015, 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.utilities;
import java.util.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.types.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.utilities.*;
public class CompactHashTable extends VMObject {
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
initialize(VM.getVM().getTypeDataBase());
}
});
}
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("SymbolCompactHashTable");
baseAddressField = type.getAddressField("_base_address");
bucketCountField = type.getCIntegerField("_bucket_count");
tableEndOffsetField = type.getCIntegerField("_table_end_offset");
bucketsField = type.getAddressField("_buckets");
uintSize = db.lookupType("juint").getSize();
}
// Fields
private static CIntegerField bucketCountField;
private static CIntegerField tableEndOffsetField;
private static AddressField baseAddressField;
private static AddressField bucketsField;
private static long uintSize;
private static int BUCKET_OFFSET_MASK = 0x3FFFFFFF;
private static int BUCKET_TYPE_SHIFT = 30;
private static int COMPACT_BUCKET_TYPE = 1;
public CompactHashTable(Address addr) {
super(addr);
}
private int bucketCount() {
return (int)bucketCountField.getValue(addr);
}
private int tableEndOffset() {
return (int)tableEndOffsetField.getValue(addr);
}
private boolean isCompactBucket(int bucket_info) {
return (bucket_info >> BUCKET_TYPE_SHIFT) == COMPACT_BUCKET_TYPE;
}
private int bucketOffset(int bucket_info) {
return bucket_info & BUCKET_OFFSET_MASK;
}
public Symbol probe(byte[] name, long hash) {
long symOffset;
Symbol sym;
Address baseAddress = baseAddressField.getValue(addr);
Address bucket = bucketsField.getValue(addr);
Address bucketEnd = bucket;
long index = hash % bucketCount();
int bucketInfo = (int)bucket.getCIntegerAt(index * uintSize, uintSize, true);
int bucketOffset = bucketOffset(bucketInfo);
int nextBucketInfo = (int)bucket.getCIntegerAt((index+1) * uintSize, uintSize, true);
int nextBucketOffset = bucketOffset(nextBucketInfo);
bucket = bucket.addOffsetTo(bucketOffset * uintSize);
if (isCompactBucket(bucketInfo)) {
symOffset = bucket.getCIntegerAt(0, uintSize, true);
sym = Symbol.create(baseAddress.addOffsetTo(symOffset));
if (sym.equals(name)) {
return sym;
}
} else {
bucketEnd = bucket.addOffsetTo(nextBucketOffset * uintSize);
while (bucket.lessThan(bucketEnd)) {
long symHash = bucket.getCIntegerAt(0, uintSize, true);
if (symHash == hash) {
symOffset = bucket.getCIntegerAt(uintSize, uintSize, true);
Address symAddr = baseAddress.addOffsetTo(symOffset);
sym = Symbol.create(symAddr);
if (sym.equals(name)) {
return sym;
}
}
bucket = bucket.addOffsetTo(2 * uintSize);
}
}
return null;
}
}

View File

@ -143,7 +143,6 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
}
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
ShouldNotReachHere();
break;
default:

View File

@ -115,7 +115,6 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
}
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
ShouldNotReachHere();
break;
default :

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2015, 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
@ -123,7 +123,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
intptr_t* sender_sp = NULL;
intptr_t* sender_unextended_sp = NULL;
address sender_pc = NULL;
intptr_t* saved_fp = NULL;
if (is_interpreted_frame()) {
// fp must be safe
@ -132,7 +134,12 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
sender_pc = (address) this->fp()[return_addr_offset];
// for interpreted frames, the value below is the sender "raw" sp,
// which can be different from the sender unextended sp (the sp seen
// by the sender) because of current frame local variables
sender_sp = (intptr_t*) addr_at(sender_sp_offset);
sender_unextended_sp = (intptr_t*) this->fp()[interpreter_frame_sender_sp_offset];
saved_fp = (intptr_t*) this->fp()[link_offset];
} else {
// must be some sort of compiled/runtime frame
@ -144,8 +151,11 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
sender_sp = _unextended_sp + _cb->frame_size();
sender_unextended_sp = sender_sp;
// On Intel the return_address is always the word on the stack
sender_pc = (address) *(sender_sp-1);
// Note: frame::sender_sp_offset is only valid for compiled frame
saved_fp = (intptr_t*) *(sender_sp - frame::sender_sp_offset);
}
@ -156,7 +166,6 @@ bool frame::safe_for_sender(JavaThread *thread) {
// only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved ebp
// is really a frame pointer.
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
@ -165,7 +174,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
// construct the potential sender
frame sender(sender_sp, saved_fp, sender_pc);
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
return sender.is_interpreted_frame_valid(thread);
@ -194,7 +203,6 @@ bool frame::safe_for_sender(JavaThread *thread) {
// Could be the call_stub
if (StubRoutines::returns_to_call_stub(sender_pc)) {
intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
if (!saved_fp_safe) {
@ -203,7 +211,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
// construct the potential sender
frame sender(sender_sp, saved_fp, sender_pc);
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
// Validate the JavaCallWrapper an entry frame must have
address jcw = (address)sender.entry_frame_call_wrapper();
@ -568,8 +576,11 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
if (!m->is_valid_method()) return false;
// stack frames shouldn't be much larger than max_stack elements
if (fp() - sp() > 1024 + m->max_stack()*Interpreter::stackElementSize) {
// this test requires the use the unextended_sp which is the sp as seen by
// the current frame, and not sp which is the "raw" pc which could point
// further because of local variables of the callee method inserted after
// method arguments
if (fp() - unextended_sp() > 1024 + m->max_stack()*Interpreter::stackElementSize) {
return false;
}

View File

@ -185,7 +185,6 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
}
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
if (val == noreg) {
__ movptr(obj, NULL_WORD);
} else {

View File

@ -189,7 +189,6 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
}
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
if (val == noreg) {
__ store_heap_oop_null(obj);
} else {

View File

@ -1432,7 +1432,6 @@ void LIRGenerator::pre_barrier(LIR_Opr addr_opr, LIR_Opr pre_val,
// No pre barriers
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
// No pre barriers
break;
default :
@ -1454,7 +1453,6 @@ void LIRGenerator::post_barrier(LIR_OprDesc* addr, LIR_OprDesc* new_val) {
CardTableModRef_post_barrier(addr, new_val);
break;
case BarrierSet::ModRef:
case BarrierSet::Other:
// No post barriers
break;
default :

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2015, 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
@ -62,6 +62,7 @@
#include "utilities/globalDefinitions.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
#include "utilities/resourceHash.hpp"
#if INCLUDE_CDS
#include "classfile/systemDictionaryShared.hpp"
#endif
@ -693,7 +694,6 @@ void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Hand
}
class NameSigHash: public ResourceObj {
public:
Symbol* _name; // name
@ -1370,6 +1370,33 @@ void ClassFileParser::parse_linenumber_table(
}
class LVT_Hash : public AllStatic {
public:
static bool equals(LocalVariableTableElement const& e0, LocalVariableTableElement const& e1) {
/*
* 3-tuple start_bci/length/slot has to be unique key,
* so the following comparison seems to be redundant:
* && elem->name_cp_index == entry->_elem->name_cp_index
*/
return (e0.start_bci == e1.start_bci &&
e0.length == e1.length &&
e0.name_cp_index == e1.name_cp_index &&
e0.slot == e1.slot);
}
static unsigned int hash(LocalVariableTableElement const& e0) {
unsigned int raw_hash = e0.start_bci;
raw_hash = e0.length + raw_hash * 37;
raw_hash = e0.name_cp_index + raw_hash * 37;
raw_hash = e0.slot + raw_hash * 37;
return raw_hash;
}
};
// Class file LocalVariableTable elements.
class Classfile_LVT_Element VALUE_OBJ_CLASS_SPEC {
public:
@ -1380,88 +1407,6 @@ class Classfile_LVT_Element VALUE_OBJ_CLASS_SPEC {
u2 slot;
};
class LVT_Hash: public CHeapObj<mtClass> {
public:
LocalVariableTableElement *_elem; // element
LVT_Hash* _next; // Next entry in hash table
};
unsigned int hash(LocalVariableTableElement *elem) {
unsigned int raw_hash = elem->start_bci;
raw_hash = elem->length + raw_hash * 37;
raw_hash = elem->name_cp_index + raw_hash * 37;
raw_hash = elem->slot + raw_hash * 37;
return raw_hash % HASH_ROW_SIZE;
}
void initialize_hashtable(LVT_Hash** table) {
for (int i = 0; i < HASH_ROW_SIZE; i++) {
table[i] = NULL;
}
}
void clear_hashtable(LVT_Hash** table) {
for (int i = 0; i < HASH_ROW_SIZE; i++) {
LVT_Hash* current = table[i];
LVT_Hash* next;
while (current != NULL) {
next = current->_next;
current->_next = NULL;
delete(current);
current = next;
}
table[i] = NULL;
}
}
LVT_Hash* LVT_lookup(LocalVariableTableElement *elem, int index, LVT_Hash** table) {
LVT_Hash* entry = table[index];
/*
* 3-tuple start_bci/length/slot has to be unique key,
* so the following comparison seems to be redundant:
* && elem->name_cp_index == entry->_elem->name_cp_index
*/
while (entry != NULL) {
if (elem->start_bci == entry->_elem->start_bci
&& elem->length == entry->_elem->length
&& elem->name_cp_index == entry->_elem->name_cp_index
&& elem->slot == entry->_elem->slot
) {
return entry;
}
entry = entry->_next;
}
return NULL;
}
// Return false if the local variable is found in table.
// Return true if no duplicate is found.
// And local variable is added as a new entry in table.
bool LVT_put_after_lookup(LocalVariableTableElement *elem, LVT_Hash** table) {
// First lookup for duplicates
int index = hash(elem);
LVT_Hash* entry = LVT_lookup(elem, index, table);
if (entry != NULL) {
return false;
}
// No duplicate is found, allocate a new entry and fill it.
if ((entry = new LVT_Hash()) == NULL) {
return false;
}
entry->_elem = elem;
// Insert into hash table
entry->_next = table[index];
table[index] = entry;
return true;
}
void copy_lvt_element(Classfile_LVT_Element *src, LocalVariableTableElement *lvt) {
lvt->start_bci = Bytes::get_Java_u2((u1*) &src->start_bci);
lvt->length = Bytes::get_Java_u2((u1*) &src->length);
@ -1861,8 +1806,12 @@ void ClassFileParser::copy_localvariable_table(ConstMethod* cm,
u2** localvariable_type_table_start,
TRAPS) {
LVT_Hash** lvt_Hash = NEW_RESOURCE_ARRAY(LVT_Hash*, HASH_ROW_SIZE);
initialize_hashtable(lvt_Hash);
ResourceMark rm(THREAD);
typedef ResourceHashtable<LocalVariableTableElement, LocalVariableTableElement*,
&LVT_Hash::hash, &LVT_Hash::equals> LVT_HashTable;
LVT_HashTable* table = new LVT_HashTable();
// To fill LocalVariableTable in
Classfile_LVT_Element* cf_lvt;
@ -1872,11 +1821,10 @@ void ClassFileParser::copy_localvariable_table(ConstMethod* cm,
cf_lvt = (Classfile_LVT_Element *) localvariable_table_start[tbl_no];
for (int idx = 0; idx < localvariable_table_length[tbl_no]; idx++, lvt++) {
copy_lvt_element(&cf_lvt[idx], lvt);
// If no duplicates, add LVT elem in hashtable lvt_Hash.
if (LVT_put_after_lookup(lvt, lvt_Hash) == false
// If no duplicates, add LVT elem in hashtable.
if (table->put(*lvt, lvt) == false
&& _need_verify
&& _major_version >= JAVA_1_5_VERSION) {
clear_hashtable(lvt_Hash);
classfile_parse_error("Duplicated LocalVariableTable attribute "
"entry for '%s' in class file %s",
_cp->symbol_at(lvt->name_cp_index)->as_utf8(),
@ -1893,29 +1841,25 @@ void ClassFileParser::copy_localvariable_table(ConstMethod* cm,
cf_lvtt = (Classfile_LVT_Element *) localvariable_type_table_start[tbl_no];
for (int idx = 0; idx < localvariable_type_table_length[tbl_no]; idx++) {
copy_lvt_element(&cf_lvtt[idx], &lvtt_elem);
int index = hash(&lvtt_elem);
LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash);
LocalVariableTableElement** entry = table->get(lvtt_elem);
if (entry == NULL) {
if (_need_verify) {
clear_hashtable(lvt_Hash);
classfile_parse_error("LVTT entry for '%s' in class file %s "
"does not match any LVT entry",
_cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
CHECK);
}
} else if (entry->_elem->signature_cp_index != 0 && _need_verify) {
clear_hashtable(lvt_Hash);
} else if ((*entry)->signature_cp_index != 0 && _need_verify) {
classfile_parse_error("Duplicated LocalVariableTypeTable attribute "
"entry for '%s' in class file %s",
_cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
CHECK);
} else {
// to add generic signatures into LocalVariableTable
entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index;
(*entry)->signature_cp_index = lvtt_elem.descriptor_cp_index;
}
}
}
clear_hashtable(lvt_Hash);
}

View File

@ -188,6 +188,7 @@ public:
// dump time.
//
template <class T, class N> class CompactHashtable VALUE_OBJ_CLASS_SPEC {
friend class VMStructs;
uintx _base_address;
juint _entry_count;
juint _bucket_count;

View File

@ -3525,9 +3525,14 @@ class RegisterHumongousWithInCSetFastTestClosure : public HeapRegionClosure {
size_t card_index;
while (hrrs.has_next(card_index)) {
jbyte* card_ptr = (jbyte*)bs->byte_for_index(card_index);
if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
*card_ptr = CardTableModRefBS::dirty_card_val();
_dcq.enqueue(card_ptr);
// The remembered set might contain references to already freed
// regions. Filter out such entries to avoid failing card table
// verification.
if (!g1h->heap_region_containing(bs->addr_for(card_ptr))->is_free()) {
if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
*card_ptr = CardTableModRefBS::dirty_card_val();
_dcq.enqueue(card_ptr);
}
}
}
r->rem_set()->clear_locked();

View File

@ -139,6 +139,8 @@ G1CollectorPolicy::G1CollectorPolicy() :
_survivor_cset_region_length(0),
_old_cset_region_length(0),
_sigma(G1ConfidencePercent / 100.0),
_collection_set(NULL),
_collection_set_bytes_used_before(0),
@ -161,17 +163,8 @@ G1CollectorPolicy::G1CollectorPolicy() :
_gc_overhead_perc(0.0) {
uintx confidence_perc = G1ConfidencePercent;
// Put an artificial ceiling on this so that it's not set to a silly value.
if (confidence_perc > 100) {
confidence_perc = 100;
warning("G1ConfidencePercent is set to a value that is too large, "
"it's been updated to %u", confidence_perc);
}
// '_sigma' must be initialized before the SurvRateGroups below because they
// indirecty access '_sigma' trough the 'this' pointer in their constructor.
_sigma = (double) confidence_perc / 100.0;
// SurvRateGroups below must be initialized after '_sigma' because they
// indirectly access '_sigma' through this object passed to their constructor.
_short_lived_surv_rate_group =
new SurvRateGroup(this, "Short Lived", G1YoungSurvRateNumRegionsSummary);
_survivor_surv_rate_group =

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2015, 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
@ -36,11 +36,10 @@ void G1HotCardCache::initialize(G1RegionToSpaceMapper* card_counts_storage) {
if (default_use_cache()) {
_use_cache = true;
_hot_cache_size = (1 << G1ConcRSLogCacheSize);
_hot_cache_size = (size_t)1 << G1ConcRSLogCacheSize;
_hot_cache = NEW_C_HEAP_ARRAY(jbyte*, _hot_cache_size, mtGC);
_n_hot = 0;
_hot_cache_idx = 0;
reset_hot_cache_internal();
// For refining the cards in the hot cache in parallel
_hot_cache_par_chunk_size = ClaimChunkSize;
@ -64,26 +63,21 @@ jbyte* G1HotCardCache::insert(jbyte* card_ptr) {
// return it for immediate refining.
return card_ptr;
}
// Otherwise, the card is hot.
jbyte* res = NULL;
MutexLockerEx x(HotCardCache_lock, Mutex::_no_safepoint_check_flag);
if (_n_hot == _hot_cache_size) {
res = _hot_cache[_hot_cache_idx];
_n_hot--;
}
size_t index = Atomic::add(1, &_hot_cache_idx) - 1;
size_t masked_index = index & (_hot_cache_size - 1);
jbyte* current_ptr = _hot_cache[masked_index];
// Now _n_hot < _hot_cache_size, and we can insert at _hot_cache_idx.
_hot_cache[_hot_cache_idx] = card_ptr;
_hot_cache_idx++;
if (_hot_cache_idx == _hot_cache_size) {
// Wrap around
_hot_cache_idx = 0;
}
_n_hot++;
return res;
// Try to store the new card pointer into the cache. Compare-and-swap to guard
// against the unlikely event of a race resulting in another card pointer to
// have already been written to the cache. In this case we will return
// card_ptr in favor of the other option, which would be starting over. This
// should be OK since card_ptr will likely be the older card already when/if
// this ever happens.
jbyte* previous_ptr = (jbyte*)Atomic::cmpxchg_ptr(card_ptr,
&_hot_cache[masked_index],
current_ptr);
return (previous_ptr == current_ptr) ? previous_ptr : card_ptr;
}
void G1HotCardCache::drain(uint worker_i,
@ -96,38 +90,38 @@ void G1HotCardCache::drain(uint worker_i,
assert(_hot_cache != NULL, "Logic");
assert(!use_cache(), "cache should be disabled");
int start_idx;
while ((start_idx = _hot_cache_par_claimed_idx) < _n_hot) { // read once
int end_idx = start_idx + _hot_cache_par_chunk_size;
while (_hot_cache_par_claimed_idx < _hot_cache_size) {
size_t end_idx = Atomic::add(_hot_cache_par_chunk_size,
&_hot_cache_par_claimed_idx);
size_t start_idx = end_idx - _hot_cache_par_chunk_size;
// The current worker has successfully claimed the chunk [start_idx..end_idx)
end_idx = MIN2(end_idx, _hot_cache_size);
for (size_t i = start_idx; i < end_idx; i++) {
jbyte* card_ptr = _hot_cache[i];
if (card_ptr != NULL) {
if (g1rs->refine_card(card_ptr, worker_i, true)) {
// The part of the heap spanned by the card contains references
// that point into the current collection set.
// We need to record the card pointer in the DirtyCardQueueSet
// that we use for such cards.
//
// The only time we care about recording cards that contain
// references that point into the collection set is during
// RSet updating while within an evacuation pause.
// In this case worker_i should be the id of a GC worker thread
assert(SafepointSynchronize::is_at_safepoint(), "Should be at a safepoint");
assert(worker_i < ParallelGCThreads,
err_msg("incorrect worker id: %u", worker_i));
if (start_idx ==
Atomic::cmpxchg(end_idx, &_hot_cache_par_claimed_idx, start_idx)) {
// The current worker has successfully claimed the chunk [start_idx..end_idx)
end_idx = MIN2(end_idx, _n_hot);
for (int i = start_idx; i < end_idx; i++) {
jbyte* card_ptr = _hot_cache[i];
if (card_ptr != NULL) {
if (g1rs->refine_card(card_ptr, worker_i, true)) {
// The part of the heap spanned by the card contains references
// that point into the current collection set.
// We need to record the card pointer in the DirtyCardQueueSet
// that we use for such cards.
//
// The only time we care about recording cards that contain
// references that point into the collection set is during
// RSet updating while within an evacuation pause.
// In this case worker_i should be the id of a GC worker thread
assert(SafepointSynchronize::is_at_safepoint(), "Should be at a safepoint");
assert(worker_i < ParallelGCThreads,
err_msg("incorrect worker id: %u", worker_i));
into_cset_dcq->enqueue(card_ptr);
}
into_cset_dcq->enqueue(card_ptr);
}
} else {
break;
}
}
}
// The existing entries in the hot card cache, which were just refined
// above, are discarded prior to re-enabling the cache near the end of the GC.
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2015, 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
@ -54,21 +54,30 @@ class HeapRegion;
// code, increasing throughput.
class G1HotCardCache: public CHeapObj<mtGC> {
G1CollectedHeap* _g1h;
G1CollectedHeap* _g1h;
bool _use_cache;
G1CardCounts _card_counts;
// The card cache table
jbyte** _hot_cache;
jbyte** _hot_cache;
int _hot_cache_size;
int _n_hot;
int _hot_cache_idx;
size_t _hot_cache_size;
int _hot_cache_par_chunk_size;
volatile int _hot_cache_par_claimed_idx;
int _hot_cache_par_chunk_size;
bool _use_cache;
// Avoids false sharing when concurrently updating _hot_cache_idx or
// _hot_cache_par_claimed_idx. These are never updated at the same time
// thus it's not necessary to separate them as well
char _pad_before[DEFAULT_CACHE_LINE_SIZE];
G1CardCounts _card_counts;
volatile size_t _hot_cache_idx;
volatile size_t _hot_cache_par_claimed_idx;
char _pad_after[DEFAULT_CACHE_LINE_SIZE];
// The number of cached cards a thread claims when flushing the cache
static const int ClaimChunkSize = 32;
@ -113,16 +122,25 @@ class G1HotCardCache: public CHeapObj<mtGC> {
void reset_hot_cache() {
assert(SafepointSynchronize::is_at_safepoint(), "Should be at a safepoint");
assert(Thread::current()->is_VM_thread(), "Current thread should be the VMthread");
_hot_cache_idx = 0; _n_hot = 0;
if (default_use_cache()) {
reset_hot_cache_internal();
}
}
bool hot_cache_is_empty() { return _n_hot == 0; }
// Zeros the values in the card counts table for entire committed heap
void reset_card_counts();
// Zeros the values in the card counts table for the given region
void reset_card_counts(HeapRegion* hr);
private:
void reset_hot_cache_internal() {
assert(_hot_cache != NULL, "Logic");
_hot_cache_idx = 0;
for (size_t i = 0; i < _hot_cache_size; i++) {
_hot_cache[i] = NULL;
}
}
};
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1HOTCARDCACHE_HPP

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2015, 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
@ -32,11 +32,8 @@
#include "runtime/orderAccess.inline.hpp"
#include "runtime/thread.inline.hpp"
G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap) :
CardTableModRefBS(whole_heap)
{
_kind = G1SATBCT;
}
G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap, BarrierSet::Name kind) :
CardTableModRefBS(whole_heap, kind) { }
void G1SATBCardTableModRefBS::enqueue(oop pre_val) {
// Nulls should have been already filtered.
@ -132,11 +129,10 @@ void G1SATBCardTableLoggingModRefBSChangedListener::on_commit(uint start_idx, si
G1SATBCardTableLoggingModRefBS::
G1SATBCardTableLoggingModRefBS(MemRegion whole_heap) :
G1SATBCardTableModRefBS(whole_heap),
G1SATBCardTableModRefBS(whole_heap, BarrierSet::G1SATBCTLogging),
_dcqs(JavaThread::dirty_card_queue_set()),
_listener()
{
_kind = G1SATBCTLogging;
_listener.set_card_table(this);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2015, 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
@ -43,6 +43,9 @@ protected:
g1_young_gen = CT_MR_BS_last_reserved << 1
};
G1SATBCardTableModRefBS(MemRegion whole_heap, BarrierSet::Name kind);
~G1SATBCardTableModRefBS() { }
public:
static int g1_young_card_val() { return g1_young_gen; }
@ -50,8 +53,6 @@ public:
// pre-marking object graph.
static void enqueue(oop pre_val);
G1SATBCardTableModRefBS(MemRegion whole_heap);
bool is_a(BarrierSet::Name bsn) {
return bsn == BarrierSet::G1SATBCT || CardTableModRefBS::is_a(bsn);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2015, 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
@ -420,7 +420,7 @@ oops_on_card_seq_iterate_careful(MemRegion mr,
oop obj;
HeapWord* next = cur;
while (next <= start) {
do {
cur = next;
obj = oop(cur);
if (obj->klass_or_null() == NULL) {
@ -429,45 +429,38 @@ oops_on_card_seq_iterate_careful(MemRegion mr,
}
// Otherwise...
next = cur + block_size(cur);
}
} while (next <= start);
// If we finish the above loop...We have a parseable object that
// begins on or before the start of the memory region, and ends
// inside or spans the entire region.
assert(obj == oop(cur), "sanity");
assert(cur <= start, "Loop postcondition");
assert(obj->klass_or_null() != NULL, "Loop postcondition");
assert((cur + block_size(cur)) > start, "Loop postcondition");
if (!g1h->is_obj_dead(obj)) {
obj->oop_iterate(cl, mr);
}
while (cur < end) {
do {
obj = oop(cur);
assert((cur + block_size(cur)) > (HeapWord*)obj, "Loop invariant");
if (obj->klass_or_null() == NULL) {
// Ran into an unparseable point.
return cur;
};
}
// Otherwise:
next = cur + block_size(cur);
// Advance the current pointer. "obj" still points to the object to iterate.
cur = cur + block_size(cur);
if (!g1h->is_obj_dead(obj)) {
if (next < end || !obj->is_objArray()) {
// This object either does not span the MemRegion
// boundary, or if it does it's not an array.
// Apply closure to whole object.
// Non-objArrays are sometimes marked imprecise at the object start. We
// always need to iterate over them in full.
// We only iterate over object arrays in full if they are completely contained
// in the memory region.
if (!obj->is_objArray() || (((HeapWord*)obj) >= start && cur <= end)) {
obj->oop_iterate(cl);
} else {
// This obj is an array that spans the boundary.
// Stop at the boundary.
obj->oop_iterate(cl, mr);
}
}
cur = next;
}
} while (cur < end);
return NULL;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2015, 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
@ -54,7 +54,7 @@ class CardTableExtension : public CardTableModRefBS {
};
CardTableExtension(MemRegion whole_heap) :
CardTableModRefBS(whole_heap) { }
CardTableModRefBS(whole_heap, BarrierSet::CardTableModRef) { }
// Too risky for the 4/10/02 putback
// BarrierSet::Name kind() { return BarrierSet::CardTableExtension; }

View File

@ -103,6 +103,9 @@ const char* GCCause::to_string(GCCause::Cause cause) {
case _last_ditch_collection:
return "Last ditch collection";
case _dcmd_gc_run:
return "Diagnostic Command";
case _last_gc_cause:
return "ILLEGAL VALUE - last gc cause - ILLEGAL VALUE";

View File

@ -74,6 +74,9 @@ class GCCause : public AllStatic {
_g1_humongous_allocation,
_last_ditch_collection,
_dcmd_gc_run,
_last_gc_cause
};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2015, 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
@ -39,9 +39,7 @@ public:
CardTableModRef,
CardTableExtension,
G1SATBCT,
G1SATBCTLogging,
Other,
Uninit
G1SATBCTLogging
};
enum Flags {
@ -57,9 +55,11 @@ protected:
static const int _max_covered_regions = 2;
Name _kind;
BarrierSet(Name kind) : _kind(kind) { }
~BarrierSet() { }
public:
BarrierSet() { _kind = Uninit; }
// To get around prohibition on RTTI.
BarrierSet::Name kind() { return _kind; }
virtual bool is_a(BarrierSet::Name bsn) = 0;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2015, 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
@ -53,8 +53,8 @@ size_t CardTableModRefBS::compute_byte_map_size()
return align_size_up(_guard_index + 1, MAX2(_page_size, granularity));
}
CardTableModRefBS::CardTableModRefBS(MemRegion whole_heap) :
ModRefBarrierSet(),
CardTableModRefBS::CardTableModRefBS(MemRegion whole_heap, BarrierSet::Name kind) :
ModRefBarrierSet(kind),
_whole_heap(whole_heap),
_guard_index(0),
_guard_region(),
@ -72,8 +72,6 @@ CardTableModRefBS::CardTableModRefBS(MemRegion whole_heap) :
_lowest_non_clean_base_chunk_index(NULL),
_last_LNC_resizing_collection(NULL)
{
_kind = BarrierSet::CardTableModRef;
assert((uintptr_t(_whole_heap.start()) & (card_size - 1)) == 0, "heap must start at card boundary");
assert((uintptr_t(_whole_heap.end()) & (card_size - 1)) == 0, "heap must end at card boundary");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2015, 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
@ -284,20 +284,22 @@ public:
return bsn == BarrierSet::CardTableModRef || ModRefBarrierSet::is_a(bsn);
}
CardTableModRefBS(MemRegion whole_heap);
~CardTableModRefBS();
virtual void initialize();
// *** Barrier set functions.
bool has_write_ref_pre_barrier() { return false; }
protected:
CardTableModRefBS(MemRegion whole_heap, BarrierSet::Name kind);
~CardTableModRefBS();
// Record a reference update. Note that these versions are precise!
// The scanning code has to handle the fact that the write barrier may be
// either precise or imprecise. We make non-virtual inline variants of
// these functions here for performance.
protected:
void write_ref_field_work(oop obj, size_t offset, oop newVal);
virtual void write_ref_field_work(void* field, oop newVal, bool release = false);
public:
@ -478,7 +480,7 @@ protected:
bool card_may_have_been_dirty(jbyte cv);
public:
CardTableModRefBSForCTRS(MemRegion whole_heap) :
CardTableModRefBS(whole_heap) {}
CardTableModRefBS(whole_heap, BarrierSet::CardTableModRef) {}
void set_CTRS(CardTableRS* rs) { _rs = rs; }
};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2015, 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,8 +37,6 @@ class Generation;
class ModRefBarrierSet: public BarrierSet {
public:
ModRefBarrierSet() { _kind = BarrierSet::ModRef; }
bool is_a(BarrierSet::Name bsn) {
return bsn == BarrierSet::ModRef;
}
@ -59,7 +57,12 @@ public:
void read_ref_field(void* field) {}
void read_prim_field(HeapWord* field, size_t bytes) {}
protected:
ModRefBarrierSet(BarrierSet::Name kind) : BarrierSet(kind) { }
~ModRefBarrierSet() { }
virtual void write_ref_field_work(void* field, oop new_val, bool release = false) = 0;
public:
void write_prim_field(HeapWord* field, size_t bytes,

View File

@ -1528,7 +1528,6 @@ void GraphKit::pre_barrier(bool do_load,
case BarrierSet::ModRef:
break;
case BarrierSet::Other:
default :
ShouldNotReachHere();
@ -1547,7 +1546,6 @@ bool GraphKit::can_move_pre_barrier() const {
case BarrierSet::ModRef:
return true; // There is no pre-barrier
case BarrierSet::Other:
default :
ShouldNotReachHere();
}
@ -1578,7 +1576,6 @@ void GraphKit::post_barrier(Node* ctl,
case BarrierSet::ModRef:
break;
case BarrierSet::Other:
default :
ShouldNotReachHere();

View File

@ -57,18 +57,6 @@
#define DEFAULT_VENDOR_URL_BUG "http://bugreport.java.com/bugreport/crash.jsp"
#define DEFAULT_JAVA_LAUNCHER "generic"
// Disable options not supported in this release, with a warning if they
// were explicitly requested on the command-line
#define UNSUPPORTED_OPTION(opt, description) \
do { \
if (opt) { \
if (FLAG_IS_CMDLINE(opt)) { \
warning(description " is disabled in this release."); \
} \
FLAG_SET_DEFAULT(opt, false); \
} \
} while(0)
#define UNSUPPORTED_GC_OPTION(gc) \
do { \
if (gc) { \
@ -2316,6 +2304,7 @@ bool Arguments::check_vm_args_consistency() {
status = status && verify_percentage(G1MaxNewSizePercent, "G1MaxNewSizePercent");
status = status && verify_interval(G1NewSizePercent, 0, G1MaxNewSizePercent, "G1NewSizePercent");
status = status && verify_percentage(G1ConfidencePercent, "G1ConfidencePercent");
status = status && verify_percentage(InitiatingHeapOccupancyPercent,
"InitiatingHeapOccupancyPercent");
status = status && verify_min_value(G1RefProcDrainInterval, 1,
@ -3853,6 +3842,8 @@ jint Arguments::parse(const JavaVMInitArgs* args) {
#endif
#endif
ArgumentsExt::report_unsupported_options();
#ifndef PRODUCT
if (TraceBytecodesAt != 0) {
TraceBytecodes = true;

View File

@ -632,4 +632,16 @@ bool Arguments::check_gc_consistency_ergo() {
return check_gc_consistency_user();
}
// Disable options not supported in this release, with a warning if they
// were explicitly requested on the command-line
#define UNSUPPORTED_OPTION(opt, description) \
do { \
if (opt) { \
if (FLAG_IS_CMDLINE(opt)) { \
warning(description " is disabled in this release."); \
} \
FLAG_SET_DEFAULT(opt, false); \
} \
} while(0)
#endif // SHARE_VM_RUNTIME_ARGUMENTS_HPP

View File

@ -37,6 +37,7 @@ public:
// no additional parsing needed in Arguments::parse() for the option.
// Otherwise returns false.
static inline bool process_options(const JavaVMOption *option) { return false; }
static inline void report_unsupported_options() { }
};
void ArgumentsExt::select_gc_ergonomically() {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2015, 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
@ -120,7 +120,6 @@ Monitor* SecondaryFreeList_lock = NULL;
Mutex* OldSets_lock = NULL;
Monitor* RootRegionScan_lock = NULL;
Mutex* MMUTracker_lock = NULL;
Mutex* HotCardCache_lock = NULL;
Monitor* GCTaskManager_lock = NULL;
@ -199,7 +198,6 @@ void mutex_init() {
def(OldSets_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
def(RootRegionScan_lock , Monitor, leaf , true, Monitor::_safepoint_check_never);
def(MMUTracker_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
def(HotCardCache_lock , Mutex , special , true, Monitor::_safepoint_check_never);
def(EvacFailureStack_lock , Mutex , nonleaf , true, Monitor::_safepoint_check_never);
def(StringDedupQueue_lock , Monitor, leaf, true, Monitor::_safepoint_check_never);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2015, 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
@ -122,7 +122,6 @@ extern Mutex* OldSets_lock; // protects the old region sets
extern Monitor* RootRegionScan_lock; // used to notify that the CM threads have finished scanning the IM snapshot regions
extern Mutex* MMUTracker_lock; // protects the MMU
// tracker data structures
extern Mutex* HotCardCache_lock; // protects the hot card cache
extern Mutex* Management_lock; // a lock used to serialize JVM management
extern Monitor* Service_lock; // a lock used for service thread operation

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2015, 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,7 @@
#include "classfile/javaClasses.hpp"
#include "classfile/loaderConstraints.hpp"
#include "classfile/placeholders.hpp"
#include "classfile/compactHashtable.hpp"
#include "classfile/stringTable.hpp"
#include "classfile/systemDictionary.hpp"
#include "ci/ciField.hpp"
@ -243,6 +244,7 @@ typedef TwoOopHashtable<Klass*, mtClass> KlassTwoOopHashtable;
typedef Hashtable<Klass*, mtClass> KlassHashtable;
typedef HashtableEntry<Klass*, mtClass> KlassHashtableEntry;
typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
//--------------------------------------------------------------------------------
// VM_STRUCTS
@ -624,6 +626,7 @@ typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
/***************/ \
\
static_field(SymbolTable, _the_table, SymbolTable*) \
static_field(SymbolTable, _shared_table, SymbolCompactHashTable) \
\
/***************/ \
/* StringTable */ \
@ -632,6 +635,16 @@ typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
static_field(StringTable, _the_table, StringTable*) \
\
/********************/ \
/* CompactHashTable */ \
/********************/ \
\
nonstatic_field(SymbolCompactHashTable, _base_address, uintx) \
nonstatic_field(SymbolCompactHashTable, _entry_count, juint) \
nonstatic_field(SymbolCompactHashTable, _bucket_count, juint) \
nonstatic_field(SymbolCompactHashTable, _table_end_offset, juint) \
nonstatic_field(SymbolCompactHashTable, _buckets, juint*) \
\
/********************/ \
/* SystemDictionary */ \
/********************/ \
\
@ -1580,6 +1593,8 @@ typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
declare_type(ResourceArea, Arena) \
declare_toplevel_type(Chunk) \
\
declare_toplevel_type(SymbolCompactHashTable) \
\
/***********************************************************/ \
/* Thread hierarchy (needed for run-time type information) */ \
/***********************************************************/ \
@ -2213,7 +2228,6 @@ typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
declare_constant(BarrierSet::CardTableExtension) \
declare_constant(BarrierSet::G1SATBCT) \
declare_constant(BarrierSet::G1SATBCTLogging) \
declare_constant(BarrierSet::Other) \
\
declare_constant(BlockOffsetSharedArray::LogN) \
declare_constant(BlockOffsetSharedArray::LogN_words) \

View File

@ -267,7 +267,7 @@ int VMUptimeDCmd::num_arguments() {
void SystemGCDCmd::execute(DCmdSource source, TRAPS) {
if (!DisableExplicitGC) {
Universe::heap()->collect(GCCause::_java_lang_system_gc);
Universe::heap()->collect(GCCause::_dcmd_gc_run);
} else {
output()->print_cr("Explicit GC is disabled, no GC has been performed.");
}

View File

@ -97,7 +97,7 @@ needs_jdk = \
runtime/XCheckJniJsig/XCheckJSig.java \
serviceability/attach/AttachWithStalePidFile.java \
serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java \
serviceability/dcmd/DynLibDcmdTest.java
serviceability/dcmd/vm/DynLibsTest.java
# JRE adds further tests to compact3
@ -145,7 +145,8 @@ needs_compact3 = \
gc/survivorAlignment \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \
serviceability/threads/TestFalseDeadLock.java \
compiler/codecache/jmx
compiler/codecache/jmx \
serviceability/dcmd
# Compact 2 adds full VM tests
compact2 = \
@ -224,6 +225,7 @@ needs_g1gc = \
gc/arguments/TestAlignmentToUseLargePages.java \
gc/arguments/TestG1HeapRegionSize.java \
gc/arguments/TestG1HeapSizeFlags.java \
gc/arguments/TestG1PercentageOptions.java \
gc/arguments/TestMaxHeapSizeTools.java \
gc/arguments/TestMaxNewSize.java \
gc/arguments/TestParallelGCThreads.java \

View File

@ -0,0 +1,89 @@
/*
* Copyright (c) 2015, 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 TestG1PercentageOptions
* @key gc
* @bug 8068942
* @summary Test argument processing of various percentage options
* @library /testlibrary
* @run driver TestG1PercentageOptions
*/
import com.oracle.java.testlibrary.*;
public class TestG1PercentageOptions {
private static final class OptionDescription {
public final String name;
public final String[] valid;
public final String[] invalid;
OptionDescription(String name_, String[] valid_, String[] invalid_) {
name = name_;
valid = valid_;
invalid = invalid_;
}
}
private static final String[] defaultValid = new String[] {
"0", "1", "50", "95", "100" };
private static final String[] defaultInvalid = new String[] {
"-10", "110", "bad" };
// All of the G1 product arguments that are percentages.
private static final OptionDescription[] percentOptions = new OptionDescription[] {
new OptionDescription("G1ConfidencePercent", defaultValid, defaultInvalid)
// Other percentage options are not yet validated by argument processing.
};
private static void check(String flag, boolean is_valid) throws Exception {
String[] flags = new String[] { "-XX:+UseG1GC", flag, "-version" };
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(flags);
OutputAnalyzer output = new OutputAnalyzer(pb.start());
if (is_valid) {
output.shouldHaveExitValue(0);
} else {
output.shouldHaveExitValue(1);
}
}
private static
void check(String name, String value, boolean is_valid) throws Exception {
check("-XX:" + name + "=" + value, is_valid);
}
public static void main(String args[]) throws Exception {
for (OptionDescription option : percentOptions) {
for (String value : option.valid) {
check(option.name, value, true);
}
for (String value : option.invalid) {
check(option.name, value, false);
}
check("-XX:" + option.name, false);
check("-XX:+" + option.name, false);
check("-XX:-" + option.name, false);
}
}
}

View File

@ -0,0 +1,293 @@
/*
* Copyright (c) 2015, 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 creates a duplicate LVT entry
class DuplicateLVT {
0xCAFEBABE;
0; // minor version
52; // version
[] { // Constant Pool
; // first element is empty
Method #34 #68; // #1
double 0x3FF199999999999A;; // #2
float 0x3F99999A; // #4
long 0xFFFFFFFFCAFEBABE;; // #5
class #69; // #7
Method #7 #68; // #8
String #70; // #9
Method #7 #71; // #10
Field #72 #73; // #11
class #74; // #12
Method #12 #68; // #13
String #75; // #14
Method #12 #76; // #15
Method #12 #77; // #16
Method #12 #78; // #17
Method #79 #80; // #18
String #81; // #19
Method #12 #82; // #20
String #83; // #21
Method #12 #84; // #22
String #85; // #23
Method #12 #86; // #24
String #87; // #25
Method #12 #88; // #26
String #89; // #27
String #90; // #28
Method #12 #91; // #29
String #92; // #30
String #93; // #31
Method #12 #94; // #32
class #95; // #33
class #96; // #34
Utf8 "<init>"; // #35
Utf8 "()V"; // #36
Utf8 "Code"; // #37
Utf8 "LineNumberTable"; // #38
Utf8 "LocalVariableTable"; // #39
Utf8 "this"; // #40
Utf8 "LDuplicateLVT;"; // #41
Utf8 "main"; // #42
Utf8 "([Ljava/lang/String;)V"; // #43
Utf8 "args"; // #44
Utf8 "[Ljava/lang/String;"; // #45
Utf8 "b"; // #46
Utf8 "Z"; // #47
Utf8 "by"; // #48
Utf8 "B"; // #49
Utf8 "c"; // #50
Utf8 "C"; // #51
Utf8 "d"; // #52
Utf8 "D"; // #53
Utf8 "f"; // #54
Utf8 "F"; // #55
Utf8 "i"; // #56
Utf8 "I"; // #57
Utf8 "l"; // #58
Utf8 "J"; // #59
Utf8 "s"; // #60
Utf8 "S"; // #61
Utf8 "list"; // #62
Utf8 "Ljava/util/ArrayList;"; // #63
Utf8 "LocalVariableTypeTable"; // #64
Utf8 "Ljava/util/ArrayList<Ljava/lang/String;>;"; // #65
Utf8 "SourceFile"; // #66
Utf8 "DuplicateLVT.java"; // #67
NameAndType #35 #36; // #68
Utf8 "java/util/ArrayList"; // #69
Utf8 "me"; // #70
NameAndType #97 #98; // #71
class #99; // #72
NameAndType #100 #101; // #73
Utf8 "java/lang/StringBuilder"; // #74
Utf8 "b="; // #75
NameAndType #102 #103; // #76
NameAndType #102 #104; // #77
NameAndType #105 #106; // #78
class #107; // #79
NameAndType #108 #109; // #80
Utf8 "by="; // #81
NameAndType #102 #110; // #82
Utf8 "c="; // #83
NameAndType #102 #111; // #84
Utf8 "d="; // #85
NameAndType #102 #112; // #86
Utf8 "f="; // #87
NameAndType #102 #113; // #88
Utf8 "i="; // #89
Utf8 "l="; // #90
NameAndType #102 #114; // #91
Utf8 "s="; // #92
Utf8 "ArrayList<String>="; // #93
NameAndType #102 #115; // #94
Utf8 "DuplicateLVT"; // #95
Utf8 "java/lang/Object"; // #96
Utf8 "add"; // #97
Utf8 "(Ljava/lang/Object;)Z"; // #98
Utf8 "java/lang/System"; // #99
Utf8 "out"; // #100
Utf8 "Ljava/io/PrintStream;"; // #101
Utf8 "append"; // #102
Utf8 "(Ljava/lang/String;)Ljava/lang/StringBuilder;"; // #103
Utf8 "(Z)Ljava/lang/StringBuilder;"; // #104
Utf8 "toString"; // #105
Utf8 "()Ljava/lang/String;"; // #106
Utf8 "java/io/PrintStream"; // #107
Utf8 "println"; // #108
Utf8 "(Ljava/lang/String;)V"; // #109
Utf8 "(I)Ljava/lang/StringBuilder;"; // #110
Utf8 "(C)Ljava/lang/StringBuilder;"; // #111
Utf8 "(D)Ljava/lang/StringBuilder;"; // #112
Utf8 "(F)Ljava/lang/StringBuilder;"; // #113
Utf8 "(J)Ljava/lang/StringBuilder;"; // #114
Utf8 "(Ljava/lang/Object;)Ljava/lang/StringBuilder;"; // #115
} // Constant Pool
0x0021; // access
#33;// this_cpx
#34;// super_cpx
[] { // Interfaces
} // Interfaces
[] { // fields
} // fields
[] { // methods
{ // Member
0x0001; // access
#35; // name_cpx
#36; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
1; // max_stack
1; // max_locals
Bytes[]{
0x2AB70001B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 26;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 5 40 41 0;
}
} // end LocalVariableTable
} // Attributes
} // end Code
} // Attributes
} // Member
;
{ // Member
0x0009; // access
#42; // name_cpx
#43; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
4; // max_stack
12; // max_locals
Bytes[]{
0x043C10423D10583E;
0x1400023904120438;
0x06102A3607140005;
0x37081058360ABB00;
0x0759B700083A0B19;
0x0B1209B6000A57B2;
0x000BBB000C59B700;
0x0D120EB6000F1BB6;
0x0010B60011B60012;
0xB2000BBB000C59B7;
0x000D1213B6000F1C;
0xB60014B60011B600;
0x12B2000BBB000C59;
0xB7000D1215B6000F;
0x1DB60016B60011B6;
0x0012B2000BBB000C;
0x59B7000D1217B600;
0x0F1804B60018B600;
0x11B60012B2000BBB;
0x000C59B7000D1219;
0xB6000F1706B6001A;
0xB60011B60012B200;
0x0BBB000C59B7000D;
0x121BB6000F1507B6;
0x0014B60011B60012;
0xB2000BBB000C59B7;
0x000D121CB6000F16;
0x08B6001DB60011B6;
0x0012B2000BBB000C;
0x59B7000D121EB600;
0x0F150AB60014B600;
0x11B60012B2000BBB;
0x000C59B7000D121F;
0xB6000F190BB60020;
0xB60011B60012B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 28;
2 29;
5 30;
8 31;
13 32;
17 33;
21 34;
26 35;
30 36;
39 37;
47 39;
72 40;
97 41;
122 42;
148 43;
174 44;
200 45;
226 46;
252 47;
278 48;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 279 44 45 0;
2 277 46 47 1;
5 274 48 49 2;
5 274 48 49 2;
8 271 50 51 3;
13 266 52 53 4;
17 262 54 55 6;
21 258 56 57 7;
26 253 58 59 8;
30 249 60 61 10;
39 240 62 63 11;
}
} // end LocalVariableTable
;
Attr(#64) { // LocalVariableTypeTable
[] { // LocalVariableTypeTable
39 240 62 65 11;
}
} // end LocalVariableTypeTable
} // Attributes
} // end Code
} // Attributes
} // Member
} // methods
[] { // Attributes
Attr(#66) { // SourceFile
#67;
} // end SourceFile
} // Attributes
} // end class DuplicateLVT

View File

@ -0,0 +1,293 @@
/*
* Copyright (c) 2015, 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.
*/
// There's a duplicate LVTT entry below.
class DuplicateLVTT {
0xCAFEBABE;
0; // minor version
52; // version
[] { // Constant Pool
; // first element is empty
Method #34 #68; // #1
double 0x3FF199999999999A;; // #2
float 0x3F99999A; // #4
long 0xFFFFFFFFCAFEBABE;; // #5
class #69; // #7
Method #7 #68; // #8
String #70; // #9
Method #7 #71; // #10
Field #72 #73; // #11
class #74; // #12
Method #12 #68; // #13
String #75; // #14
Method #12 #76; // #15
Method #12 #77; // #16
Method #12 #78; // #17
Method #79 #80; // #18
String #81; // #19
Method #12 #82; // #20
String #83; // #21
Method #12 #84; // #22
String #85; // #23
Method #12 #86; // #24
String #87; // #25
Method #12 #88; // #26
String #89; // #27
String #90; // #28
Method #12 #91; // #29
String #92; // #30
String #93; // #31
Method #12 #94; // #32
class #95; // #33
class #96; // #34
Utf8 "<init>"; // #35
Utf8 "()V"; // #36
Utf8 "Code"; // #37
Utf8 "LineNumberTable"; // #38
Utf8 "LocalVariableTable"; // #39
Utf8 "this"; // #40
Utf8 "LDuplicateLVTT;"; // #41
Utf8 "main"; // #42
Utf8 "([Ljava/lang/String;)V"; // #43
Utf8 "args"; // #44
Utf8 "[Ljava/lang/String;"; // #45
Utf8 "b"; // #46
Utf8 "Z"; // #47
Utf8 "by"; // #48
Utf8 "B"; // #49
Utf8 "c"; // #50
Utf8 "C"; // #51
Utf8 "d"; // #52
Utf8 "D"; // #53
Utf8 "f"; // #54
Utf8 "F"; // #55
Utf8 "i"; // #56
Utf8 "I"; // #57
Utf8 "l"; // #58
Utf8 "J"; // #59
Utf8 "s"; // #60
Utf8 "S"; // #61
Utf8 "list"; // #62
Utf8 "Ljava/util/ArrayList;"; // #63
Utf8 "LocalVariableTypeTable"; // #64
Utf8 "Ljava/util/ArrayList<Ljava/lang/String;>;"; // #65
Utf8 "SourceFile"; // #66
Utf8 "DuplicateLVTT.java"; // #67
NameAndType #35 #36; // #68
Utf8 "java/util/ArrayList"; // #69
Utf8 "me"; // #70
NameAndType #97 #98; // #71
class #99; // #72
NameAndType #100 #101; // #73
Utf8 "java/lang/StringBuilder"; // #74
Utf8 "b="; // #75
NameAndType #102 #103; // #76
NameAndType #102 #104; // #77
NameAndType #105 #106; // #78
class #107; // #79
NameAndType #108 #109; // #80
Utf8 "by="; // #81
NameAndType #102 #110; // #82
Utf8 "c="; // #83
NameAndType #102 #111; // #84
Utf8 "d="; // #85
NameAndType #102 #112; // #86
Utf8 "f="; // #87
NameAndType #102 #113; // #88
Utf8 "i="; // #89
Utf8 "l="; // #90
NameAndType #102 #114; // #91
Utf8 "s="; // #92
Utf8 "ArrayList<String>="; // #93
NameAndType #102 #115; // #94
Utf8 "DuplicateLVTT"; // #95
Utf8 "java/lang/Object"; // #96
Utf8 "add"; // #97
Utf8 "(Ljava/lang/Object;)Z"; // #98
Utf8 "java/lang/System"; // #99
Utf8 "out"; // #100
Utf8 "Ljava/io/PrintStream;"; // #101
Utf8 "append"; // #102
Utf8 "(Ljava/lang/String;)Ljava/lang/StringBuilder;"; // #103
Utf8 "(Z)Ljava/lang/StringBuilder;"; // #104
Utf8 "toString"; // #105
Utf8 "()Ljava/lang/String;"; // #106
Utf8 "java/io/PrintStream"; // #107
Utf8 "println"; // #108
Utf8 "(Ljava/lang/String;)V"; // #109
Utf8 "(I)Ljava/lang/StringBuilder;"; // #110
Utf8 "(C)Ljava/lang/StringBuilder;"; // #111
Utf8 "(D)Ljava/lang/StringBuilder;"; // #112
Utf8 "(F)Ljava/lang/StringBuilder;"; // #113
Utf8 "(J)Ljava/lang/StringBuilder;"; // #114
Utf8 "(Ljava/lang/Object;)Ljava/lang/StringBuilder;"; // #115
} // Constant Pool
0x0021; // access
#33;// this_cpx
#34;// super_cpx
[] { // Interfaces
} // Interfaces
[] { // fields
} // fields
[] { // methods
{ // Member
0x0001; // access
#35; // name_cpx
#36; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
1; // max_stack
1; // max_locals
Bytes[]{
0x2AB70001B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 26;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 5 40 41 0;
}
} // end LocalVariableTable
} // Attributes
} // end Code
} // Attributes
} // Member
;
{ // Member
0x0009; // access
#42; // name_cpx
#43; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
4; // max_stack
12; // max_locals
Bytes[]{
0x043C10423D10583E;
0x1400023904120438;
0x06102A3607140005;
0x37081058360ABB00;
0x0759B700083A0B19;
0x0B1209B6000A57B2;
0x000BBB000C59B700;
0x0D120EB6000F1BB6;
0x0010B60011B60012;
0xB2000BBB000C59B7;
0x000D1213B6000F1C;
0xB60014B60011B600;
0x12B2000BBB000C59;
0xB7000D1215B6000F;
0x1DB60016B60011B6;
0x0012B2000BBB000C;
0x59B7000D1217B600;
0x0F1804B60018B600;
0x11B60012B2000BBB;
0x000C59B7000D1219;
0xB6000F1706B6001A;
0xB60011B60012B200;
0x0BBB000C59B7000D;
0x121BB6000F1507B6;
0x0014B60011B60012;
0xB2000BBB000C59B7;
0x000D121CB6000F16;
0x08B6001DB60011B6;
0x0012B2000BBB000C;
0x59B7000D121EB600;
0x0F150AB60014B600;
0x11B60012B2000BBB;
0x000C59B7000D121F;
0xB6000F190BB60020;
0xB60011B60012B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 28;
2 29;
5 30;
8 31;
13 32;
17 33;
21 34;
26 35;
30 36;
39 37;
47 39;
72 40;
97 41;
122 42;
148 43;
174 44;
200 45;
226 46;
252 47;
278 48;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 279 44 45 0;
2 277 46 47 1;
5 274 48 49 2;
8 271 50 51 3;
13 266 52 53 4;
17 262 54 55 6;
21 258 56 57 7;
26 253 58 59 8;
30 249 60 61 10;
39 240 62 63 11;
}
} // end LocalVariableTable
;
Attr(#64) { // LocalVariableTypeTable
[] { // LocalVariableTypeTable
39 240 62 65 11;
39 240 62 65 11;
}
} // end LocalVariableTypeTable
} // Attributes
} // end Code
} // Attributes
} // Member
} // methods
[] { // Attributes
Attr(#66) { // SourceFile
#67;
} // end SourceFile
} // Attributes
} // end class DuplicateLVTT

View File

@ -0,0 +1,292 @@
/*
* Copyright (c) 2015, 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.
*/
// The LVTT entry points to a non-existant LVT entry
class NotFoundLVTT {
0xCAFEBABE;
0; // minor version
52; // version
[] { // Constant Pool
; // first element is empty
Method #34 #68; // #1
double 0x3FF199999999999A;; // #2
float 0x3F99999A; // #4
long 0xFFFFFFFFCAFEBABE;; // #5
class #69; // #7
Method #7 #68; // #8
String #70; // #9
Method #7 #71; // #10
Field #72 #73; // #11
class #74; // #12
Method #12 #68; // #13
String #75; // #14
Method #12 #76; // #15
Method #12 #77; // #16
Method #12 #78; // #17
Method #79 #80; // #18
String #81; // #19
Method #12 #82; // #20
String #83; // #21
Method #12 #84; // #22
String #85; // #23
Method #12 #86; // #24
String #87; // #25
Method #12 #88; // #26
String #89; // #27
String #90; // #28
Method #12 #91; // #29
String #92; // #30
String #93; // #31
Method #12 #94; // #32
class #95; // #33
class #96; // #34
Utf8 "<init>"; // #35
Utf8 "()V"; // #36
Utf8 "Code"; // #37
Utf8 "LineNumberTable"; // #38
Utf8 "LocalVariableTable"; // #39
Utf8 "this"; // #40
Utf8 "LNotFoundLVTT;"; // #41
Utf8 "main"; // #42
Utf8 "([Ljava/lang/String;)V"; // #43
Utf8 "args"; // #44
Utf8 "[Ljava/lang/String;"; // #45
Utf8 "b"; // #46
Utf8 "Z"; // #47
Utf8 "by"; // #48
Utf8 "B"; // #49
Utf8 "c"; // #50
Utf8 "C"; // #51
Utf8 "d"; // #52
Utf8 "D"; // #53
Utf8 "f"; // #54
Utf8 "F"; // #55
Utf8 "i"; // #56
Utf8 "I"; // #57
Utf8 "l"; // #58
Utf8 "J"; // #59
Utf8 "s"; // #60
Utf8 "S"; // #61
Utf8 "list"; // #62
Utf8 "Ljava/util/ArrayList;"; // #63
Utf8 "LocalVariableTypeTable"; // #64
Utf8 "Ljava/util/ArrayList<Ljava/lang/String;>;"; // #65
Utf8 "SourceFile"; // #66
Utf8 "NotFoundLVTT.java"; // #67
NameAndType #35 #36; // #68
Utf8 "java/util/ArrayList"; // #69
Utf8 "me"; // #70
NameAndType #97 #98; // #71
class #99; // #72
NameAndType #100 #101; // #73
Utf8 "java/lang/StringBuilder"; // #74
Utf8 "b="; // #75
NameAndType #102 #103; // #76
NameAndType #102 #104; // #77
NameAndType #105 #106; // #78
class #107; // #79
NameAndType #108 #109; // #80
Utf8 "by="; // #81
NameAndType #102 #110; // #82
Utf8 "c="; // #83
NameAndType #102 #111; // #84
Utf8 "d="; // #85
NameAndType #102 #112; // #86
Utf8 "f="; // #87
NameAndType #102 #113; // #88
Utf8 "i="; // #89
Utf8 "l="; // #90
NameAndType #102 #114; // #91
Utf8 "s="; // #92
Utf8 "ArrayList<String>="; // #93
NameAndType #102 #115; // #94
Utf8 "NotFoundLVTT"; // #95
Utf8 "java/lang/Object"; // #96
Utf8 "add"; // #97
Utf8 "(Ljava/lang/Object;)Z"; // #98
Utf8 "java/lang/System"; // #99
Utf8 "out"; // #100
Utf8 "Ljava/io/PrintStream;"; // #101
Utf8 "append"; // #102
Utf8 "(Ljava/lang/String;)Ljava/lang/StringBuilder;"; // #103
Utf8 "(Z)Ljava/lang/StringBuilder;"; // #104
Utf8 "toString"; // #105
Utf8 "()Ljava/lang/String;"; // #106
Utf8 "java/io/PrintStream"; // #107
Utf8 "println"; // #108
Utf8 "(Ljava/lang/String;)V"; // #109
Utf8 "(I)Ljava/lang/StringBuilder;"; // #110
Utf8 "(C)Ljava/lang/StringBuilder;"; // #111
Utf8 "(D)Ljava/lang/StringBuilder;"; // #112
Utf8 "(F)Ljava/lang/StringBuilder;"; // #113
Utf8 "(J)Ljava/lang/StringBuilder;"; // #114
Utf8 "(Ljava/lang/Object;)Ljava/lang/StringBuilder;"; // #115
} // Constant Pool
0x0021; // access
#33;// this_cpx
#34;// super_cpx
[] { // Interfaces
} // Interfaces
[] { // fields
} // fields
[] { // methods
{ // Member
0x0001; // access
#35; // name_cpx
#36; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
1; // max_stack
1; // max_locals
Bytes[]{
0x2AB70001B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 26;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 5 40 41 0;
}
} // end LocalVariableTable
} // Attributes
} // end Code
} // Attributes
} // Member
;
{ // Member
0x0009; // access
#42; // name_cpx
#43; // sig_cpx
[] { // Attributes
Attr(#37) { // Code
4; // max_stack
12; // max_locals
Bytes[]{
0x043C10423D10583E;
0x1400023904120438;
0x06102A3607140005;
0x37081058360ABB00;
0x0759B700083A0B19;
0x0B1209B6000A57B2;
0x000BBB000C59B700;
0x0D120EB6000F1BB6;
0x0010B60011B60012;
0xB2000BBB000C59B7;
0x000D1213B6000F1C;
0xB60014B60011B600;
0x12B2000BBB000C59;
0xB7000D1215B6000F;
0x1DB60016B60011B6;
0x0012B2000BBB000C;
0x59B7000D1217B600;
0x0F1804B60018B600;
0x11B60012B2000BBB;
0x000C59B7000D1219;
0xB6000F1706B6001A;
0xB60011B60012B200;
0x0BBB000C59B7000D;
0x121BB6000F1507B6;
0x0014B60011B60012;
0xB2000BBB000C59B7;
0x000D121CB6000F16;
0x08B6001DB60011B6;
0x0012B2000BBB000C;
0x59B7000D121EB600;
0x0F150AB60014B600;
0x11B60012B2000BBB;
0x000C59B7000D121F;
0xB6000F190BB60020;
0xB60011B60012B1;
};
[] { // Traps
} // end Traps
[] { // Attributes
Attr(#38) { // LineNumberTable
[] { // LineNumberTable
0 28;
2 29;
5 30;
8 31;
13 32;
17 33;
21 34;
26 35;
30 36;
39 37;
47 39;
72 40;
97 41;
122 42;
148 43;
174 44;
200 45;
226 46;
252 47;
278 48;
}
} // end LineNumberTable
;
Attr(#39) { // LocalVariableTable
[] { // LocalVariableTable
0 279 44 45 0;
2 277 46 47 1;
5 274 48 49 2;
8 271 50 51 3;
13 266 52 53 4;
17 262 54 55 6;
21 258 56 57 7;
26 253 58 59 8;
30 249 60 61 10;
39 240 62 63 11;
}
} // end LocalVariableTable
;
Attr(#64) { // LocalVariableTypeTable
[] { // LocalVariableTypeTable
38 240 62 65 11;
}
} // end LocalVariableTypeTable
} // Attributes
} // end Code
} // Attributes
} // Member
} // methods
[] { // Attributes
Attr(#66) { // SourceFile
#67;
} // end SourceFile
} // Attributes
} // end class NotFoundLVTT

View File

@ -0,0 +1,83 @@
/*
* Copyright (c) 2015, 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 8049632
* @summary Test ClassFileParser::copy_localvariable_table cases
* @library /testlibrary
* @compile -g -XDignore.symbol.file TestLVT.java
* @run main TestLVT
*/
import com.oracle.java.testlibrary.*;
import java.util.*;
public class TestLVT {
public static void main(String[] args) throws Exception {
test(); // Test good LVT in this test
String jarFile = System.getProperty("test.src") + "/testcase.jar";
// java -cp $testSrc/testcase.jar DuplicateLVT
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-cp", jarFile, "DuplicateLVT");
new OutputAnalyzer(pb.start())
.shouldContain("Duplicated LocalVariableTable attribute entry for 'by' in class file DuplicateLVT")
.shouldHaveExitValue(1);
// java -cp $testclasses/testcase.jar DuplicateLVTT
pb = ProcessTools.createJavaProcessBuilder("-cp", jarFile, "DuplicateLVTT");
new OutputAnalyzer(pb.start())
.shouldContain("Duplicated LocalVariableTypeTable attribute entry for 'list' in class file DuplicateLVTT")
.shouldHaveExitValue(1);
// java -cp $testclasses/testcase.jar NotFoundLVTT
pb = ProcessTools.createJavaProcessBuilder("-cp", jarFile, "NotFoundLVTT");
new OutputAnalyzer(pb.start())
.shouldContain("LVTT entry for 'list' in class file NotFoundLVTT does not match any LVT entry")
.shouldHaveExitValue(1);
}
public static void test() {
boolean b = true;
byte by = 0x42;
char c = 'X';
double d = 1.1;
float f = (float) 1.2;
int i = 42;
long l = 0xCAFEBABE;
short s = 88;
ArrayList<String> list = new ArrayList<String>();
list.add("me");
System.out.println("b=" + b);
System.out.println("by=" + by);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("f=" + f);
System.out.println("i=" + i);
System.out.println("l=" + l);
System.out.println("s=" + s);
System.out.println("ArrayList<String>=" + list);
}
}

Binary file not shown.

View File

@ -25,7 +25,7 @@
* @test
* @summary Verifies behaviour of Unsafe.allocateMemory
* @library /testlibrary
* @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:MallocMaxTestWords=20m AllocateMemory
* @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:MallocMaxTestWords=100m AllocateMemory
*/
import com.oracle.java.testlibrary.*;
@ -56,7 +56,7 @@ public class AllocateMemory {
// allocateMemory() should throw an OutOfMemoryError when the underlying malloc fails,
// we test this by limiting the malloc using -XX:MallocMaxTestWords
try {
address = unsafe.allocateMemory(20 * 1024 * 1024 * 8);
address = unsafe.allocateMemory(100 * 1024 * 1024 * 8);
} catch (OutOfMemoryError e) {
// Expected
return;

View File

@ -26,6 +26,7 @@
* @bug 7162400
* @key regression
* @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues
* @ignore 8024055
* @library /testlibrary
* @build com.oracle.java.testlibrary.* AttachWithStalePidFileTarget
* @run main AttachWithStalePidFile

View File

@ -1,73 +0,0 @@
/*
* 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.
*/
import sun.management.ManagementFactoryHelper;
import com.sun.management.DiagnosticCommandMBean;
public class DcmdUtil
{
public static String executeDcmd(String cmd, String ... args) {
DiagnosticCommandMBean dcmd = ManagementFactoryHelper.getDiagnosticCommandMBean();
Object[] dcmdArgs = {args};
String[] signature = {String[].class.getName()};
try {
System.out.print("> " + cmd + " ");
for (String s : args) {
System.out.print(s + " ");
}
System.out.println(":");
String result = (String) dcmd.invoke(transform(cmd), dcmdArgs, signature);
System.out.println(result);
return result;
} catch(Exception ex) {
ex.printStackTrace();
}
return null;
}
private static String transform(String name) {
StringBuilder sb = new StringBuilder();
boolean toLower = true;
boolean toUpper = false;
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
if (c == '.' || c == '_') {
toLower = false;
toUpper = true;
} else {
if (toUpper) {
toUpper = false;
sb.append(Character.toUpperCase(c));
} else if(toLower) {
sb.append(Character.toLowerCase(c));
} else {
sb.append(c);
}
}
}
return sb.toString();
}
}

View File

@ -24,17 +24,23 @@
/*
* @test CodeCacheTest
* @bug 8054889
* @library ..
* @build DcmdUtil CodeCacheTest
* @run main/othervm -XX:+SegmentedCodeCache CodeCacheTest
* @run main/othervm -XX:-SegmentedCodeCache CodeCacheTest
* @run main/othervm -Xint -XX:+SegmentedCodeCache CodeCacheTest
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+SegmentedCodeCache CodeCacheTest
* @run testng/othervm -XX:-SegmentedCodeCache CodeCacheTest
* @run testng/othervm -Xint -XX:+SegmentedCodeCache CodeCacheTest
* @summary Test of diagnostic command Compiler.codecache
*/
import java.io.BufferedReader;
import java.io.StringReader;
import java.lang.reflect.Method;
import org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -72,7 +78,7 @@ public class CodeCacheTest {
private static boolean getFlagBool(String flag, String where) {
Matcher m = Pattern.compile(flag + "\\s+:?= (true|false)").matcher(where);
if (!m.find()) {
throw new RuntimeException("Could not find value for flag " + flag + " in output string");
Assert.fail("Could not find value for flag " + flag + " in output string");
}
return m.group(1).equals("true");
}
@ -80,16 +86,16 @@ public class CodeCacheTest {
private static int getFlagInt(String flag, String where) {
Matcher m = Pattern.compile(flag + "\\s+:?=\\s+\\d+").matcher(where);
if (!m.find()) {
throw new RuntimeException("Could not find value for flag " + flag + " in output string");
Assert.fail("Could not find value for flag " + flag + " in output string");
}
String match = m.group();
return Integer.parseInt(match.substring(match.lastIndexOf(" ") + 1, match.length()));
}
public static void main(String arg[]) throws Exception {
public void run(CommandExecutor executor) {
// Get number of code cache segments
int segmentsCount = 0;
String flags = DcmdUtil.executeDcmd("VM.flags", "-all");
String flags = executor.execute("VM.flags -all").getOutput();
if (!getFlagBool("SegmentedCodeCache", flags) || !getFlagBool("UseCompiler", flags)) {
// No segmentation
segmentsCount = 1;
@ -102,29 +108,29 @@ public class CodeCacheTest {
}
// Get output from dcmd (diagnostic command)
String result = DcmdUtil.executeDcmd("Compiler.codecache");
BufferedReader r = new BufferedReader(new StringReader(result));
OutputAnalyzer output = executor.execute("Compiler.codecache");
Iterator<String> lines = output.asLines().iterator();
// Validate code cache segments
String line;
Matcher m;
for (int s = 0; s < segmentsCount; ++s) {
// Validate first line
line = r.readLine();
line = lines.next();
m = line1.matcher(line);
if (m.matches()) {
for (int i = 2; i <= 5; i++) {
int val = Integer.parseInt(m.group(i));
if (val < 0) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
}
} else {
throw new Exception("Regexp 1 failed");
Assert.fail("Regexp 1 failed to match line: " + line);
}
// Validate second line
line = r.readLine();
line = lines.next();
m = line2.matcher(line);
if (m.matches()) {
String start = m.group(1);
@ -133,44 +139,49 @@ public class CodeCacheTest {
// Lexical compare of hex numbers to check that they look sane.
if (start.compareTo(mark) > 1) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
if (mark.compareTo(top) > 1) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
} else {
throw new Exception("Regexp 2 failed line: " + line);
Assert.fail("Regexp 2 failed to match line: " + line);
}
}
// Validate third line
line = r.readLine();
line = lines.next();
m = line3.matcher(line);
if (m.matches()) {
int blobs = Integer.parseInt(m.group(1));
if (blobs <= 0) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
int nmethods = Integer.parseInt(m.group(2));
if (nmethods < 0) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
int adapters = Integer.parseInt(m.group(3));
if (adapters <= 0) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
if (blobs < (nmethods + adapters)) {
throw new Exception("Failed parsing dcmd codecache output");
Assert.fail("Failed parsing dcmd codecache output");
}
} else {
throw new Exception("Regexp 3 failed");
Assert.fail("Regexp 3 failed to match line: " + line);
}
// Validate fourth line
line = r.readLine();
line = lines.next();
m = line4.matcher(line);
if (!m.matches()) {
throw new Exception("Regexp 4 failed");
Assert.fail("Regexp 4 failed to match line: " + line);
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -24,14 +24,21 @@
/*
* @test CodelistTest
* @bug 8054889
* @library ..
* @build DcmdUtil MethodIdentifierParser CodelistTest
* @run main CodelistTest
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @build MethodIdentifierParser
* @run testng CodelistTest
* @summary Test of diagnostic command Compiler.codelist
*/
import java.io.BufferedReader;
import java.io.StringReader;
import org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import java.lang.reflect.Method;
public class CodelistTest {
@ -51,19 +58,17 @@ public class CodelistTest {
*
*/
public static void main(String arg[]) throws Exception {
public void run(CommandExecutor executor) {
int ok = 0;
int fail = 0;
// Get output from dcmd (diagnostic command)
String result = DcmdUtil.executeDcmd("Compiler.codelist");
BufferedReader r = new BufferedReader(new StringReader(result));
OutputAnalyzer output = executor.execute("Compiler.codelist");
// Grab a method name from the output
String line;
int count = 0;
while((line = r.readLine()) != null) {
for (String line : output.asLines()) {
count++;
String[] parts = line.split(" ");
@ -83,14 +88,16 @@ public class CodelistTest {
}
MethodIdentifierParser mf = new MethodIdentifierParser(methodPrintedInLogFormat);
Method m;
Method m = null;
try {
m = mf.getMethod();
} catch (NoSuchMethodException e) {
m = null;
} catch (ClassNotFoundException e) {
Assert.fail("Test error: Caught unexpected exception", e);
}
if (m == null) {
throw new Exception("Test failed on: " + methodPrintedInLogFormat);
Assert.fail("Test failed on: " + methodPrintedInLogFormat);
}
if (count > 10) {
// Testing 10 entries is enough. Lets not waste time.
@ -98,4 +105,9 @@ public class CodelistTest {
}
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -24,17 +24,22 @@
/*
* @test CompilerQueueTest
* @bug 8054889
* @library ..
* @library /testlibrary
* @ignore 8069160
* @build DcmdUtil CompilerQueueTest
* @run main CompilerQueueTest
* @run main/othervm -XX:-TieredCompilation CompilerQueueTest
* @run main/othervm -Xint CompilerQueueTest
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng CompilerQueueTest
* @run testng/othervm -XX:-TieredCompilation CompilerQueueTest
* @run testng/othervm -Xint CompilerQueueTest
* @summary Test of diagnostic command Compiler.queue
*/
import java.io.BufferedReader;
import java.io.StringReader;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import org.testng.annotations.Test;
import java.util.Iterator;
public class CompilerQueueTest {
@ -60,52 +65,55 @@ public class CompilerQueueTest {
*
**/
public static void main(String arg[]) throws Exception {
public void run(CommandExecutor executor) {
// Get output from dcmd (diagnostic command)
String result = DcmdUtil.executeDcmd("Compiler.queue");
BufferedReader r = new BufferedReader(new StringReader(result));
OutputAnalyzer output = executor.execute("Compiler.queue");
Iterator<String> lines = output.asLines().iterator();
String str = r.readLine();
while (str != null) {
while (lines.hasNext()) {
String str = lines.next();
if (str.startsWith("Contents of C")) {
match(r.readLine(), "----------------------------");
str = r.readLine();
match(lines.next(), "----------------------------");
str = lines.next();
if (!str.equals("Empty")) {
while (str.charAt(0) != '-') {
validateMethodLine(str);
str = r.readLine();
str = lines.next();
}
} else {
str = r.readLine();
str = lines.next();
}
match(str,"----------------------------");
str = r.readLine();
} else {
throw new Exception("Failed parsing dcmd queue, line: " + str);
Assert.fail("Failed parsing dcmd queue, line: " + str);
}
}
}
private static void validateMethodLine(String str) throws Exception {
private static void validateMethodLine(String str) {
// Skip until package/class name begins. Trim to remove whitespace that
// may differ.
String name = str.substring(14).trim();
int sep = name.indexOf("::");
if (sep == -1) {
throw new Exception("Failed dcmd queue, didn't find separator :: in: " + name);
Assert.fail("Failed dcmd queue, didn't find separator :: in: " + name);
}
try {
Class.forName(name.substring(0, sep));
} catch (ClassNotFoundException e) {
throw new Exception("Failed dcmd queue, Class for name: " + str);
Assert.fail("Failed dcmd queue, Class for name: " + str);
}
}
public static void match(String line, String str) throws Exception {
public static void match(String line, String str) {
if (!line.equals(str)) {
throw new Exception("String equals: " + line + ", " + str);
Assert.fail("String equals: " + line + ", " + str);
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -51,11 +51,11 @@ public class MethodIdentifierParser {
// Add sanity check for extracted fields
}
public Method getMethod() throws NoSuchMethodException, SecurityException, ClassNotFoundException, Exception {
public Method getMethod() throws NoSuchMethodException, SecurityException, ClassNotFoundException {
try {
return Class.forName(className).getDeclaredMethod(methodName, getParamenterDescriptorArray());
} catch (UnexpectedTokenException e) {
throw new Exception("Parse failed");
throw new RuntimeException("Parse failed");
}
}

View File

@ -0,0 +1,69 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.PidJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.MainClassJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.FileJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import org.testng.annotations.Test;
/*
* @test
* @summary Test of diagnostic command help (tests all DCMD executors)
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData HelpTest
*/
public class HelpTest {
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("help");
output.shouldContain("The following commands are available");
output.shouldContain("help");
output.shouldContain("VM.version");
}
@Test
public void pid() {
run(new PidJcmdExecutor());
}
@Test
public void mainClass() {
run(new MainClassJcmdExecutor());
}
@Test
public void file() {
run(new FileJcmdExecutor());
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.PidJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.MainClassJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.FileJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import org.testng.annotations.Test;
/*
* @test
* @summary Test of invalid diagnostic command (tests all DCMD executors)
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData InvalidCommandTest
*/
public class InvalidCommandTest {
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("asdf");
output.shouldContain("Unknown diagnostic command");
}
@Test
public void pid() {
run(new PidJcmdExecutor());
}
@Test
public void mainClass() {
run(new MainClassJcmdExecutor());
}
@Test
public void file() {
run(new FileJcmdExecutor());
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.PidJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.MainClassJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.FileJcmdExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import org.testng.annotations.Test;
/*
* @test
* @summary Test of diagnostic command VM.version (tests all DCMD executors)
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+UsePerfData VMVersionTest
*/
public class VMVersionTest {
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("VM.version");
output.shouldMatch(".*(?:HotSpot|OpenJDK).*VM.*");
}
@Test
public void pid() {
run(new PidJcmdExecutor());
}
@Test
public void mainClass() {
run(new MainClassJcmdExecutor());
}
@Test
public void file() {
run(new FileJcmdExecutor());
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,40 @@
/*
* Copyright (c) 2015, 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
* @summary Test of diagnostic command GC.class_histogram -all=true
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @build ClassHistogramTest
* @run testng ClassHistogramAllTest
*/
public class ClassHistogramAllTest extends ClassHistogramTest {
public ClassHistogramAllTest() {
super();
classHistogramArgs = "-all=true";
}
/* See ClassHistogramTest for test cases */
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import java.util.regex.Pattern;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* @test
* @summary Test of diagnostic command GC.class_histogram
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng ClassHistogramTest
*/
public class ClassHistogramTest {
public static class TestClass {}
public static TestClass[] instances = new TestClass[1024];
protected String classHistogramArgs = "";
static {
for (int i = 0; i < instances.length; ++i) {
instances[i] = new TestClass();
}
}
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("GC.class_histogram " + classHistogramArgs);
/*
* example output:
* num #instances #bytes class name
* ----------------------------------------------
* 1: 1647 1133752 [B
* 2: 6198 383168 [C
* 3: 1464 165744 java.lang.Class
* 4: 6151 147624 java.lang.String
* 5: 2304 73728 java.util.concurrent.ConcurrentHashMap$Node
* 6: 1199 64280 [Ljava.lang.Object;
* ...
*/
/* Require at least one java.lang.Class */
output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Class\\s*$");
/* Require at least one java.lang.String */
output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.String\\s*$");
/* Require at least one java.lang.Object */
output.shouldMatch("^\\s+\\d+:\\s+\\d+\\s+\\d+\\s+java.lang.Object\\s*$");
/* Require at exactly one TestClass[] */
output.shouldMatch("^\\s+\\d+:\\s+1\\s+\\d+\\s+" +
Pattern.quote(TestClass[].class.getName()) + "\\s*$");
/* Require at exactly 1024 TestClass */
output.shouldMatch("^\\s+\\d+:\\s+1024\\s+\\d+\\s+" +
Pattern.quote(TestClass.class.getName()) + "\\s*$");
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 2015, 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
* @summary Test of diagnostic command GC.heap_dump -all=true
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @build HeapDumpTest
* @run testng HeapDumpAllTest
*/
public class HeapDumpAllTest extends HeapDumpTest {
public HeapDumpAllTest() {
super();
heapDumpArgs = "-all=true";
}
/* See HeapDumpTest for test cases */
}

View File

@ -0,0 +1,90 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import org.testng.Assert;
import java.io.IOException;
import com.oracle.java.testlibrary.JDKToolFinder;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.PidJcmdExecutor;
/*
* @test
* @summary Test of diagnostic command GC.heap_dump
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng HeapDumpTest
*/
public class HeapDumpTest {
protected String heapDumpArgs = "";
public void run(CommandExecutor executor) {
String fileName = "jcmd.gc.heap_dump." + System.currentTimeMillis() + ".hprof";
String cmd = "GC.heap_dump " + heapDumpArgs + " " + fileName;
executor.execute(cmd);
verifyHeapDump(fileName);
}
private void verifyHeapDump(String fileName) {
String jhat = JDKToolFinder.getJDKTool("jhat");
String[] cmd = { jhat, "-parseonly", "true", fileName };
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
Process p = null;
OutputAnalyzer output = null;
try {
p = pb.start();
output = new OutputAnalyzer(p);
/*
* Some hprof dumps of all objects contain constantPoolOop references that cannot be resolved, so we ignore
* failures about resolving constantPoolOop fields using a negative lookahead
*/
output.shouldNotMatch(".*WARNING(?!.*Failed to resolve object.*constantPoolOop.*).*");
} catch (IOException e) {
Assert.fail("Test error: Caught exception while reading stdout/err of jhat", e);
} finally {
if (p != null) {
p.destroy();
}
}
if (output.getExitValue() != 0) {
Assert.fail("Test error: jhat exit code was nonzero");
}
}
/* GC.heap_dump is not available over JMX, running jcmd pid executor instead */
@Test
public void pid() {
run(new PidJcmdExecutor());
}
}

View File

@ -0,0 +1,98 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import org.testng.Assert;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* @test
* @summary Test of diagnostic command GC.run_finalization
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng RunFinalizationTest
*/
public class RunFinalizationTest {
static ReentrantLock lock = new ReentrantLock();
static Condition cond = lock.newCondition();
static volatile boolean wasFinalized = false;
static volatile boolean wasInitialized = false;
class MyObject {
public MyObject() {
/* Make sure object allocation/deallocation is not optimized out */
wasInitialized = true;
}
protected void finalize() {
lock.lock();
wasFinalized = true;
cond.signalAll();
lock.unlock();
}
}
public static MyObject o;
public void run(CommandExecutor executor) {
lock.lock();
o = new MyObject();
o = null;
System.gc();
executor.execute("GC.run_finalization");
int waited = 0;
int waitTime = 15;
try {
System.out.println("Waiting for signal from finalizer");
while (!cond.await(waitTime, TimeUnit.SECONDS)) {
waited += waitTime;
System.out.println(String.format("Waited %d seconds", waited));
}
System.out.println("Received signal");
} catch (InterruptedException e) {
Assert.fail("Test error: Interrupted while waiting for signal from finalizer", e);
} finally {
lock.unlock();
}
if (!wasFinalized) {
Assert.fail("Test failure: Object was not finalized");
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,65 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import org.testng.Assert;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* @test
* @summary Test of diagnostic command GC.run
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+PrintGCDetails -Xloggc:RunGC.gclog RunGCTest
*/
public class RunGCTest {
public void run(CommandExecutor executor) {
executor.execute("GC.run");
Path gcLogPath = Paths.get("RunGC.gclog").toAbsolutePath();
String gcLog = null;
try {
gcLog = new String(Files.readAllBytes(gcLogPath));
} catch (IOException e) {
Assert.fail("Test error: Could not read GC log file: " + gcLogPath, e);
}
OutputAnalyzer output = new OutputAnalyzer(gcLog, "");
output.shouldMatch(".*\\[Full GC \\(System(\\.gc\\(\\))?.*");
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2015, 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
* @summary Test of diagnostic command Thread.print -l=true
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @build PrintTest
* @run testng PrintConcurrentLocksTest
*/
public class PrintConcurrentLocksTest extends PrintTest {
public PrintConcurrentLocksTest() {
jucLocks = true;
}
/* See PrintTest for test cases */
}

View File

@ -0,0 +1,174 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;
/*
* @test
* @summary Test of diagnostic command Thread.print
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng PrintTest
*/
public class PrintTest {
protected boolean jucLocks = false;
CyclicBarrier readyBarrier = new CyclicBarrier(3);
CyclicBarrier doneBarrier = new CyclicBarrier(3);
private void waitForBarrier(CyclicBarrier b) {
try {
b.await();
} catch (InterruptedException | BrokenBarrierException e) {
Assert.fail("Test error: Caught unexpected exception:", e);
}
}
class MonitorThread extends Thread {
Object lock = new Object();
public void run() {
/* Hold lock on "lock" to show up in thread dump */
synchronized (lock) {
/* Signal that we're ready for thread dump */
waitForBarrier(readyBarrier);
/* Released when the thread dump has been taken */
waitForBarrier(doneBarrier);
}
}
}
class LockThread extends Thread {
ReentrantLock lock = new ReentrantLock();
public void run() {
/* Hold lock "lock" to show up in thread dump */
lock.lock();
/* Signal that we're ready for thread dump */
waitForBarrier(readyBarrier);
/* Released when the thread dump has been taken */
waitForBarrier(doneBarrier);
lock.unlock();
}
}
public void run(CommandExecutor executor) {
MonitorThread mThread = new MonitorThread();
mThread.start();
LockThread lThread = new LockThread();
lThread.start();
/* Wait for threads to get ready */
waitForBarrier(readyBarrier);
/* Execute */
OutputAnalyzer output = executor.execute("Thread.print" + (jucLocks ? " -l=true" : ""));
/* Signal that we've got the thread dump */
waitForBarrier(doneBarrier);
/*
* Example output (trimmed) with arrows indicating the rows we are looking for:
*
* ...
* "Thread-2" #24 prio=5 os_prio=0 tid=0x00007f913411f800 nid=0x4fc9 waiting on condition [0x00007f91fbffe000]
* java.lang.Thread.State: WAITING (parking)
* at sun.misc.Unsafe.park(Native Method)
* - parking to wait for <0x000000071a0868a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
* at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
* at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
* at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:234)
* at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
* at Print.waitForBarrier(Print.java:26)
* at Print.access$000(Print.java:18)
* at Print$LockThread.run(Print.java:58)
*
* --> Locked ownable synchronizers:
* --> - <0x000000071a294930> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
*
* "Thread-1" #23 prio=5 os_prio=0 tid=0x00007f913411e800 nid=0x4fc8 waiting on condition [0x00007f9200113000]
* java.lang.Thread.State: WAITING (parking)
* at sun.misc.Unsafe.park(Native Method)
* - parking to wait for <0x000000071a0868a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
* at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
* at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
* at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:234)
* at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
* at Print.waitForBarrier(Print.java:26)
* at Print.access$000(Print.java:18)
* at Print$MonitorThread.run(Print.java:42)
* --> - locked <0x000000071a294390> (a java.lang.Object)
*
* Locked ownable synchronizers:
* - None
*
* "MainThread" #22 prio=5 os_prio=0 tid=0x00007f923015b000 nid=0x4fc7 in Object.wait() [0x00007f9200840000]
* java.lang.Thread.State: WAITING (on object monitor)
* at java.lang.Object.wait(Native Method)
* - waiting on <0x000000071a70ad98> (a java.lang.UNIXProcess)
* at java.lang.Object.wait(Object.java:502)
* at java.lang.UNIXProcess.waitFor(UNIXProcess.java:397)
* - locked <0x000000071a70ad98> (a java.lang.UNIXProcess)
* at com.oracle.java.testlibrary.dcmd.JcmdExecutor.executeImpl(JcmdExecutor.java:32)
* at com.oracle.java.testlibrary.dcmd.CommandExecutor.execute(CommandExecutor.java:24)
* --> at Print.run(Print.java:74)
* at Print.file(Print.java:112)
* ...
*/
output.shouldMatch(".*at " + Pattern.quote(PrintTest.class.getName()) + "\\.run.*");
output.shouldMatch(".*- locked <0x\\p{XDigit}+> \\(a " + Pattern.quote(mThread.lock.getClass().getName()) + "\\).*");
String jucLockPattern1 = ".*Locked ownable synchronizers:.*";
String jucLockPattern2 = ".*- <0x\\p{XDigit}+> \\(a " + Pattern.quote(lThread.lock.getClass().getName()) + ".*";
if (jucLocks) {
output.shouldMatch(jucLockPattern1);
output.shouldMatch(jucLockPattern2);
} else {
output.shouldNotMatch(jucLockPattern1);
output.shouldNotMatch(jucLockPattern2);
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -23,18 +23,26 @@
/*
* @test
*
* @build ClassLoaderStatsTest DcmdUtil
* @run main ClassLoaderStatsTest
* @summary Test of diagnostic command VM.classloader_stats
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng ClassLoaderStatsTest
*/
import java.io.BufferedReader;
import org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
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.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -57,36 +65,36 @@ public class ClassLoaderStatsTest {
public static DummyClassLoader dummyloader;
public static void main(String arg[]) throws Exception {
public void run(CommandExecutor executor) throws ClassNotFoundException {
// 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());
Assert.fail("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) {
OutputAnalyzer output = executor.execute("VM.classloader_stats");
Iterator<String> lines = output.asLines().iterator();
while (lines.hasNext()) {
String line = lines.next();
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);
Assert.fail("Should have loaded 1 class: " + line);
}
checkPositiveInt(m.group(2));
checkPositiveInt(m.group(3));
String next = r.readLine();
String next = lines.next();
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));
Assert.fail("Should have loaded 1 anonymous class, but found : " + m1.group(1));
}
checkPositiveInt(m1.group(2));
checkPositiveInt(m1.group(3));
@ -95,9 +103,9 @@ public class ClassLoaderStatsTest {
}
}
private static void checkPositiveInt(String s) throws Exception {
private static void checkPositiveInt(String s) {
if (Integer.parseInt(s) <= 0) {
throw new Exception("Value should have been > 0: " + s);
Assert.fail("Value should have been > 0: " + s);
}
}
@ -114,8 +122,11 @@ public class ClassLoaderStatsTest {
{
return fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
} catch (IOException e) {
throw new RuntimeException("Can't open file: " + name, e);
Assert.fail("Can't open file: " + name, e);
}
/* Will not reach here as Assert.fail() throws exception */
return null;
}
protected Class<?> loadClass(String name, boolean resolve)
@ -144,6 +155,10 @@ public class ClassLoaderStatsTest {
}
} /* DummyClassLoader */
@Test
public void jmx() throws ClassNotFoundException {
run(new JMXExecutor());
}
}
class TestClass {

View File

@ -0,0 +1,49 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.OutputAnalyzer;
import org.testng.annotations.Test;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* @test
* @summary Test of diagnostic command VM.command_line
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+ThereShouldNotBeAnyVMOptionNamedLikeThis CommandLineTest
*/
public class CommandLineTest {
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("VM.command_line");
output.shouldContain("-XX:+IgnoreUnrecognizedVMOptions");
output.shouldContain("-XX:+ThereShouldNotBeAnyVMOptionNamedLikeThis");
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -1,6 +1,10 @@
import java.util.HashSet;
import java.util.Set;
import org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.Platform;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
@ -29,14 +33,15 @@ import com.oracle.java.testlibrary.Platform;
* @test
* @summary Test of VM.dynlib diagnostic command via MBean
* @library /testlibrary
* @build com.oracle.java.testlibrary.* DcmdUtil
* @run main DynLibDcmdTest
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng DynLibsTest
*/
public class DynLibDcmdTest {
public class DynLibsTest {
public static void main(String[] args) throws Exception {
String result = DcmdUtil.executeDcmd("VM.dynlibs");
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("VM.dynlibs");
String osDependentBaseString = null;
if (Platform.isAix()) {
@ -52,18 +57,16 @@ public class DynLibDcmdTest {
}
if (osDependentBaseString == null) {
throw new Exception("Unsupported OS");
Assert.fail("Unsupported OS");
}
Set<String> expectedContent = new HashSet<>();
expectedContent.add(String.format(osDependentBaseString, "jvm"));
expectedContent.add(String.format(osDependentBaseString, "java"));
expectedContent.add(String.format(osDependentBaseString, "management"));
output.shouldContain(String.format(osDependentBaseString, "jvm"));
output.shouldContain(String.format(osDependentBaseString, "java"));
output.shouldContain(String.format(osDependentBaseString, "management"));
}
for(String expected : expectedContent) {
if (!result.contains(expected)) {
throw new Exception("Dynamic library list output did not contain the expected string: '" + expected + "'");
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,56 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import org.testng.annotations.Test;
/*
* @test
* @summary Test of diagnostic command VM.flags
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng/othervm -Xmx129m -XX:+PrintGC -XX:+UnlockDiagnosticVMOptions -XX:+IgnoreUnrecognizedVMOptions -XX:+ThereShouldNotBeAnyVMOptionNamedLikeThis_Right -XX:-TieredCompilation FlagsTest
*/
public class FlagsTest {
public void run(CommandExecutor executor) {
OutputAnalyzer output = executor.execute("VM.flags");
/* The following are interpreted by the JVM as actual "flags" */
output.shouldContain("-XX:+PrintGC");
output.shouldContain("-XX:+UnlockDiagnosticVMOptions");
output.shouldContain("-XX:+IgnoreUnrecognizedVMOptions");
output.shouldContain("-XX:-TieredCompilation");
/* The following are not */
output.shouldNotContain("-Xmx129m");
output.shouldNotContain("-XX:+ThereShouldNotBeAnyVMOptionNamedLikeThis_Right");
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
/*
* @test
* @summary Test of diagnostic command VM.system_properties
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng SystemPropertiesTest
*/
public class SystemPropertiesTest {
private final static String PROPERTY_NAME = "SystemPropertiesTestPropertyName";
private final static String PROPERTY_VALUE = "SystemPropertiesTestPropertyValue";
public void run(CommandExecutor executor) {
System.setProperty(PROPERTY_NAME, PROPERTY_VALUE);
OutputAnalyzer output = executor.execute("VM.system_properties");
output.shouldContain(PROPERTY_NAME + "=" + PROPERTY_VALUE);
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (c) 2015, 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 org.testng.annotations.Test;
import org.testng.Assert;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.dcmd.CommandExecutor;
import com.oracle.java.testlibrary.dcmd.JMXExecutor;
import java.text.NumberFormat;
import java.text.ParseException;
/*
* @test
* @summary Test of diagnostic command VM.uptime
* @library /testlibrary
* @build com.oracle.java.testlibrary.*
* @build com.oracle.java.testlibrary.dcmd.*
* @run testng UptimeTest
*/
public class UptimeTest {
public void run(CommandExecutor executor) {
double someUptime = 1.0;
long startTime = System.currentTimeMillis();
try {
synchronized (this) {
/* Loop to guard against spurious wake ups */
while (System.currentTimeMillis() < (startTime + someUptime * 1000)) {
wait((int) someUptime * 1000);
}
}
} catch (InterruptedException e) {
Assert.fail("Test error: Exception caught when sleeping:", e);
}
OutputAnalyzer output = executor.execute("VM.uptime");
output.stderrShouldBeEmpty();
/*
* Output should be:
* [pid]:
* xx.yyy s
*
* If there is only one line in output there is no "[pid]:" printout;
* skip first line, split on whitespace and grab first half
*/
int index = output.asLines().size() == 1 ? 0 : 1;
String uptimeString = output.asLines().get(index).split("\\s+")[0];
try {
double uptime = NumberFormat.getNumberInstance().parse(uptimeString).doubleValue();
if (uptime < someUptime) {
Assert.fail(String.format(
"Test failure: Uptime was less than intended sleep time: %.3f s < %.3f s",
uptime, someUptime));
}
} catch (ParseException e) {
Assert.fail("Test failure: Could not parse uptime string: " +
uptimeString, e);
}
}
@Test
public void jmx() {
run(new JMXExecutor());
}
}

View File

@ -24,6 +24,8 @@
package com.oracle.java.testlibrary;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -69,6 +71,58 @@ public final class OutputAnalyzer {
}
/**
* Verify that the stdout contents of output buffer is empty
*
* @throws RuntimeException
* If stdout was not empty
*/
public void stdoutShouldBeEmpty() {
if (!getStdout().isEmpty()) {
reportDiagnosticSummary();
throw new RuntimeException("stdout was not empty");
}
}
/**
* Verify that the stderr contents of output buffer is empty
*
* @throws RuntimeException
* If stderr was not empty
*/
public void stderrShouldBeEmpty() {
if (!getStderr().isEmpty()) {
reportDiagnosticSummary();
throw new RuntimeException("stderr was not empty");
}
}
/**
* Verify that the stdout contents of output buffer is not empty
*
* @throws RuntimeException
* If stdout was empty
*/
public void stdoutShouldNotBeEmpty() {
if (getStdout().isEmpty()) {
reportDiagnosticSummary();
throw new RuntimeException("stdout was empty");
}
}
/**
* Verify that the stderr contents of output buffer is not empty
*
* @throws RuntimeException
* If stderr was empty
*/
public void stderrShouldNotBeEmpty() {
if (getStderr().isEmpty()) {
reportDiagnosticSummary();
throw new RuntimeException("stderr was empty");
}
}
/**
* Verify that the stdout and stderr contents of output buffer contains the string
*
* @param expectedString String that buffer should contain
@ -365,4 +419,18 @@ public final class OutputAnalyzer {
public int getExitValue() {
return exitValue;
}
/**
* Get the contents of the output buffer (stdout and stderr) as list of strings.
* Output will be split by newlines.
*
* @return Contents of the output buffer as list of strings
*/
public List<String> asLines() {
return asLines(getOutput());
}
private List<String> asLines(String buffer) {
return Arrays.asList(buffer.split("(\\r\\n|\\n|\\r)"));
}
}

View File

@ -184,23 +184,36 @@ public final class ProcessTools {
return executeProcess(pb);
}
/**
* Executes a process, waits for it to finish and returns the process output.
* @param pb The ProcessBuilder to execute.
* @return The output from the process.
*/
public static OutputAnalyzer executeProcess(ProcessBuilder pb) throws Throwable {
OutputAnalyzer output = null;
try {
output = new OutputAnalyzer(pb.start());
return output;
} catch (Throwable t) {
System.out.println("executeProcess() failed: " + t);
throw t;
} finally {
System.out.println(getProcessLog(pb, output));
/**
* Executes a process, waits for it to finish and returns the process output.
* The process will have exited before this method returns.
* @param pb The ProcessBuilder to execute.
* @return The {@linkplain OutputAnalyzer} instance wrapping the process.
*/
public static OutputAnalyzer executeProcess(ProcessBuilder pb) throws Exception {
OutputAnalyzer output = null;
Process p = null;
boolean failed = false;
try {
p = pb.start();
output = new OutputAnalyzer(p);
p.waitFor();
return output;
} catch (Throwable t) {
if (p != null) {
p.destroyForcibly().waitFor();
}
failed = true;
System.out.println("executeProcess() failed: " + t);
throw t;
} finally {
if (failed) {
System.err.println(getProcessLog(pb, output));
}
}
}
}
/**
* Executes a process, waits for it to finish and returns the process output.

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import com.oracle.java.testlibrary.OutputAnalyzer;
/**
* Abstract base class for Diagnostic Command executors
*/
public abstract class CommandExecutor {
/**
* Execute a diagnostic command
*
* @param cmd The diagnostic command to execute
* @return an {@link jdk.testlibrary.OutputAnalyzer} encapsulating the output of the command
* @throws CommandExecutorException if there is an exception on the "calling side" while trying to execute the
* Diagnostic Command. Exceptions thrown on the remote side are available as textual representations in
* stderr, regardless of the specific executor used.
*/
public final OutputAnalyzer execute(String cmd) throws CommandExecutorException {
System.out.printf("Running DCMD '%s' through '%s'%n", cmd, this.getClass().getSimpleName());
OutputAnalyzer oa = executeImpl(cmd);
System.out.println("---------------- stdout ----------------");
System.out.println(oa.getStdout());
System.out.println("---------------- stderr ----------------");
System.out.println(oa.getStderr());
System.out.println("----------------------------------------");
System.out.println();
return oa;
}
protected abstract OutputAnalyzer executeImpl(String cmd) throws CommandExecutorException;
}

View File

@ -0,0 +1,36 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
/**
* CommandExecutorException encapsulates exceptions thrown (on the "calling side") from the execution of Diagnostic
* Commands
*/
public class CommandExecutorException extends RuntimeException {
private static final long serialVersionUID = -7039597746579144280L;
public CommandExecutorException(String message, Throwable e) {
super(message, e);
}
}

View File

@ -0,0 +1,81 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
/**
* Executes Diagnostic Commands on the target VM (specified by pid) using the jcmd tool and its ability to read
* Diagnostic Commands from a file.
*/
public class FileJcmdExecutor extends PidJcmdExecutor {
/**
* Instantiates a new FileJcmdExecutor targeting the current VM
*/
public FileJcmdExecutor() {
super();
}
/**
* Instantiates a new FileJcmdExecutor targeting the VM indicated by the given pid
*
* @param target Pid of the target VM
*/
public FileJcmdExecutor(String target) {
super(target);
}
protected List<String> createCommandLine(String cmd) throws CommandExecutorException {
File cmdFile = createTempFile();
writeCommandToTemporaryFile(cmd, cmdFile);
return Arrays.asList(jcmdBinary, Integer.toString(pid),
"-f", cmdFile.getAbsolutePath());
}
private void writeCommandToTemporaryFile(String cmd, File cmdFile) {
try (PrintWriter pw = new PrintWriter(cmdFile)) {
pw.println(cmd);
} catch (IOException e) {
String message = "Could not write to file: " + cmdFile.getAbsolutePath();
throw new CommandExecutorException(message, e);
}
}
private File createTempFile() {
try {
File cmdFile = File.createTempFile("input", "jcmd");
cmdFile.deleteOnExit();
return cmdFile;
} catch (IOException e) {
throw new CommandExecutorException("Could not create temporary file", e);
}
}
}

View File

@ -0,0 +1,187 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import com.oracle.java.testlibrary.OutputAnalyzer;
import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.management.ManagementFactory;
import java.util.HashMap;
/**
* Executes Diagnostic Commands on the target VM (specified by a host/port combination or a full JMX Service URL) using
* the JMX interface. If the target is not the current VM, the JMX Remote interface must be enabled beforehand.
*/
public class JMXExecutor extends CommandExecutor {
private final MBeanServerConnection mbs;
/**
* Instantiates a new JMXExecutor targeting the current VM
*/
public JMXExecutor() {
super();
mbs = ManagementFactory.getPlatformMBeanServer();
}
/**
* Instantiates a new JMXExecutor targeting the VM indicated by the given host/port combination or a full JMX
* Service URL
*
* @param target a host/port combination on the format "host:port" or a full JMX Service URL of the target VM
*/
public JMXExecutor(String target) {
String urlStr;
if (target.matches("^\\w[\\w\\-]*(\\.[\\w\\-]+)*:\\d+$")) {
/* Matches "hostname:port" */
urlStr = String.format("service:jmx:rmi:///jndi/rmi://%s/jmxrmi", target);
} else if (target.startsWith("service:")) {
urlStr = target;
} else {
throw new IllegalArgumentException("Could not recognize target string: " + target);
}
try {
JMXServiceURL url = new JMXServiceURL(urlStr);
JMXConnector c = JMXConnectorFactory.connect(url, new HashMap<>());
mbs = c.getMBeanServerConnection();
} catch (IOException e) {
throw new CommandExecutorException("Could not initiate connection to target: " + target, e);
}
}
protected OutputAnalyzer executeImpl(String cmd) throws CommandExecutorException {
String stdout = "";
String stderr = "";
String[] cmdParts = cmd.split(" ", 2);
String operation = commandToMethodName(cmdParts[0]);
Object[] dcmdArgs = produceArguments(cmdParts);
String[] signature = {String[].class.getName()};
ObjectName beanName = getMBeanName();
try {
stdout = (String) mbs.invoke(beanName, operation, dcmdArgs, signature);
}
/* Failures on the "local" side, the one invoking the command. */
catch (ReflectionException e) {
Throwable cause = e.getCause();
if (cause instanceof NoSuchMethodException) {
/* We want JMXExecutor to match the behavior of the other CommandExecutors */
String message = "Unknown diagnostic command: " + operation;
stderr = exceptionTraceAsString(new IllegalArgumentException(message, e));
} else {
rethrowExecutorException(operation, dcmdArgs, e);
}
}
/* Failures on the "local" side, the one invoking the command. */
catch (InstanceNotFoundException | IOException e) {
rethrowExecutorException(operation, dcmdArgs, e);
}
/* Failures on the remote side, the one executing the invoked command. */
catch (MBeanException e) {
stdout = exceptionTraceAsString(e);
}
return new OutputAnalyzer(stdout, stderr);
}
private void rethrowExecutorException(String operation, Object[] dcmdArgs,
Exception e) throws CommandExecutorException {
String message = String.format("Could not invoke: %s %s", operation,
String.join(" ", (String[]) dcmdArgs[0]));
throw new CommandExecutorException(message, e);
}
private ObjectName getMBeanName() throws CommandExecutorException {
String MBeanName = "com.sun.management:type=DiagnosticCommand";
try {
return new ObjectName(MBeanName);
} catch (MalformedObjectNameException e) {
String message = "MBean not found: " + MBeanName;
throw new CommandExecutorException(message, e);
}
}
private Object[] produceArguments(String[] cmdParts) {
Object[] dcmdArgs = {new String[0]}; /* Default: No arguments */
if (cmdParts.length == 2) {
dcmdArgs[0] = cmdParts[1].split(" ");
}
return dcmdArgs;
}
/**
* Convert from diagnostic command to MBean method name
*
* Examples:
* help --> help
* VM.version --> vmVersion
* VM.command_line --> vmCommandLine
*/
private static String commandToMethodName(String cmd) {
String operation = "";
boolean up = false; /* First letter is to be lower case */
/*
* If a '.' or '_' is encountered it is not copied,
* instead the next character will be converted to upper case
*/
for (char c : cmd.toCharArray()) {
if (('.' == c) || ('_' == c)) {
up = true;
} else if (up) {
operation = operation.concat(Character.toString(c).toUpperCase());
up = false;
} else {
operation = operation.concat(Character.toString(c).toLowerCase());
}
}
return operation;
}
private static String exceptionTraceAsString(Throwable cause) {
StringWriter sw = new StringWriter();
cause.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
}

View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import com.oracle.java.testlibrary.JDKToolFinder;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.oracle.java.testlibrary.ProcessTools;
import java.util.List;
/**
* Base class for Diagnostic Command Executors using the jcmd tool
*/
public abstract class JcmdExecutor extends CommandExecutor {
protected String jcmdBinary;
protected abstract List<String> createCommandLine(String cmd) throws CommandExecutorException;
protected JcmdExecutor() {
jcmdBinary = JDKToolFinder.getJDKTool("jcmd");
}
protected OutputAnalyzer executeImpl(String cmd) throws CommandExecutorException {
List<String> commandLine = createCommandLine(cmd);
try {
System.out.printf("Executing command '%s'%n", commandLine);
OutputAnalyzer output = ProcessTools.executeProcess(new ProcessBuilder(commandLine));
System.out.printf("Command returned with exit code %d%n", output.getExitValue());
return output;
} catch (Exception e) {
String message = String.format("Caught exception while executing '%s'", commandLine);
throw new CommandExecutorException(message, e);
}
}
}

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import java.util.Arrays;
import java.util.List;
/**
* Executes Diagnostic Commands on the target VM (specified by main class) using the jcmd tool
*/
public class MainClassJcmdExecutor extends JcmdExecutor {
private final String mainClass;
/**
* Instantiates a new MainClassJcmdExecutor targeting the current VM
*/
public MainClassJcmdExecutor() {
super();
mainClass = System.getProperty("sun.java.command").split(" ")[0];
}
/**
* Instantiates a new MainClassJcmdExecutor targeting the VM indicated by the given main class
*
* @param target Main class of the target VM
*/
public MainClassJcmdExecutor(String target) {
super();
mainClass = target;
}
protected List<String> createCommandLine(String cmd) throws CommandExecutorException {
return Arrays.asList(jcmdBinary, mainClass, cmd);
}
}

View File

@ -0,0 +1,63 @@
/*
* Copyright (c) 2015, 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 com.oracle.java.testlibrary.dcmd;
import com.oracle.java.testlibrary.ProcessTools;
import java.util.Arrays;
import java.util.List;
/**
* Executes Diagnostic Commands on the target VM (specified by pid) using the jcmd tool
*/
public class PidJcmdExecutor extends JcmdExecutor {
protected final int pid;
/**
* Instantiates a new PidJcmdExecutor targeting the current VM
*/
public PidJcmdExecutor() {
super();
try {
pid = ProcessTools.getProcessId();
} catch (Exception e) {
throw new CommandExecutorException("Could not determine own pid", e);
}
}
/**
* Instantiates a new PidJcmdExecutor targeting the VM indicated by the given pid
*
* @param target Pid of the target VM
*/
public PidJcmdExecutor(String target) {
super();
pid = Integer.valueOf(target);
}
protected List<String> createCommandLine(String cmd) throws CommandExecutorException {
return Arrays.asList(jcmdBinary, Integer.toString(pid), cmd);
}
}

View File

@ -292,3 +292,4 @@ a12d347f84176200593999f4da91ae2bb86865b2 jdk9-b39
e391de88e69b59d7c618387e3cf91032f6991ce9 jdk9-b47
833051855168a973780fafeb6fc59e7370bcf400 jdk9-b48
786058752e0ac3e48d7aef79e0885d29d6a2a7eb jdk9-b49
74ead7bddde19263fd463bc1bd87de84f27d1b5e jdk9-b50

View File

@ -295,3 +295,4 @@ e529374fbe526dbd668e5e98fc047b42b3bc6d33 jdk9-b45
6c17d648d03e4bf4729c3645f8db55d34115e0b7 jdk9-b47
33e7e699804892c0496adf60ad67cc12855aeb61 jdk9-b48
435a49db1de0589acc86b2cc5fd61d546f94b56c jdk9-b49
45a30e7ee623031a1532685512dd2c2d8e8fa0ad jdk9-b50

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, 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
@ -45,14 +45,14 @@ import java.io.InputStream;
* specialized forms of the method available:
*
* <ul>
* <li>{@link #newInstance(String,ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br/>
* <li>{@link #newInstance(String,ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
* The JAXBContext instance is initialized from a list of colon
* separated Java package names. Each java package contains
* JAXB mapped classes, schema-derived classes and/or user annotated
* classes. Additionally, the java package may contain JAXB package annotations
* that must be processed. (see JLS, Section 7.4.1 "Named Packages").
* </li>
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br/>
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
* The JAXBContext instance is initialized with class(es)
* passed as parameter(s) and classes that are statically reachable from
* these class(es). See {@link #newInstance(Class...)} for details.
@ -64,8 +64,8 @@ import java.io.InputStream;
* class containing the following method signatures:</i>
*
* <pre>
* public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Map&lt;String,Object> properties ) throws JAXBException
* public static JAXBContext createContext( Class[] classes, Map&lt;String,Object> properties ) throws JAXBException
* public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Map&lt;String,Object&gt; properties ) throws JAXBException
* public static JAXBContext createContext( Class[] classes, Map&lt;String,Object&gt; properties ) throws JAXBException
* </pre>
*
* <p><i>
@ -256,7 +256,7 @@ import java.io.InputStream;
* @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li><li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
* @see Marshaller
* @see Unmarshaller
* @see S 7.4.1 "Named Packages" in Java Language Specification</a>
* @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages" in Java Language Specification</a>
* @since 1.6, JAXB 1.0
*/
public abstract class JAXBContext {
@ -352,7 +352,7 @@ public abstract class JAXBContext {
* <p>
* To maintain compatibility with JAXB 1.0 schema to java
* interface/implementation binding, enabled by schema customization
* <tt>&lt;jaxb:globalBindings valueClass="false"></tt>,
* <tt>&lt;jaxb:globalBindings valueClass="false"&gt;</tt>,
* the JAXB provider will ensure that each package on the context path
* has a <tt>jaxb.properties</tt> file which contains a value for the
* <tt>javax.xml.bind.context.factory</tt> property and that all values

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, 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
@ -48,7 +48,7 @@ public class JAXBException extends Exception {
* Exception reference
*
*/
private Throwable linkedException;
private volatile Throwable linkedException;
static final long serialVersionUID = -5621384651494307979L;
@ -133,7 +133,7 @@ public class JAXBException extends Exception {
* indicates that the linked exception does not exist or
* is unknown).
*/
public synchronized void setLinkedException( Throwable exception ) {
public void setLinkedException( Throwable exception ) {
this.linkedException = exception;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2015, 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
@ -51,7 +51,7 @@ public abstract class JAXBIntrospector {
* <ol>
* <li>It is an instance of <code>javax.xml.bind.JAXBElement</code>.</li>
* <li>The class of <code>object</code> is annotated with
* <code>&#64XmlRootElement</code>.
* <code>&#64;XmlRootElement</code>.
* </li>
* </ol>
*
@ -74,7 +74,7 @@ public abstract class JAXBIntrospector {
*
* <p>Convenience method to abstract whether working with either
* a javax.xml.bind.JAXBElement instance or an instance of
* <tt>&#64XmlRootElement</tt> annotated Java class.</p>
* <tt>&#64;XmlRootElement</tt> annotated Java class.</p>
*
* @param jaxbElement object that #isElement(Object) returns true.
*

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, 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
@ -175,7 +175,7 @@ import java.io.File;
* encoding used during these marshal operations. Client applications are
* expected to supply a valid character encoding name as defined in the
* <a href="http://www.w3.org/TR/2000/REC-xml-20001006#charencoding">W3C XML 1.0
* Recommendation</a> and supported by your Java Platform</a>.
* Recommendation</a> and supported by your Java Platform.
* </blockquote>
*
* <p>
@ -664,7 +664,7 @@ public interface Marshaller {
*
* <p>
* Every marshaller internally maintains a
* {@link java.util.Map}&lt;{@link Class},{@link XmlAdapter}>,
* {@link java.util.Map}&lt;{@link Class},{@link XmlAdapter}&gt;,
* which it uses for marshalling classes whose fields/methods are annotated
* with {@link javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter}.
*
@ -750,17 +750,17 @@ public interface Marshaller {
public Schema getSchema();
/**
* <p/>
* <p>
* Register an instance of an implementation of this class with a {@link Marshaller} to externally listen
* for marshal events.
* <p/>
* <p/>
* </p>
* <p>
* This class enables pre and post processing of each marshalled object.
* The event callbacks are called when marshalling from an instance that maps to an xml element or
* complex type definition. The event callbacks are not called when marshalling from an instance of a
* Java datatype that represents a simple type definition.
* <p/>
* <p/>
* </p>
* <p>
* External listener is one of two different mechanisms for defining marshal event callbacks.
* See <a href="Marshaller.html#marshalEventCallback">Marshal Event Callbacks</a> for an overview.
*
@ -770,10 +770,10 @@ public interface Marshaller {
*/
public static abstract class Listener {
/**
* <p/>
* <p>
* Callback method invoked before marshalling from <tt>source</tt> to XML.
* <p/>
* <p/>
* </p>
* <p>
* This method is invoked just before marshalling process starts to marshal <tt>source</tt>.
* Note that if the class of <tt>source</tt> defines its own <tt>beforeMarshal</tt> method,
* the class specific callback method is invoked just before this method is invoked.
@ -784,10 +784,10 @@ public interface Marshaller {
}
/**
* <p/>
* <p>
* Callback method invoked after marshalling <tt>source</tt> to XML.
* <p/>
* <p/>
* </p>
* <p>
* This method is invoked after <tt>source</tt> and all its descendants have been marshalled.
* Note that if the class of <tt>source</tt> defines its own <tt>afterMarshal</tt> method,
* the class specific callback method is invoked just before this method is invoked.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015, 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
@ -70,11 +70,11 @@ public abstract class SchemaOutputResolver {
*
* If the {@link Result} object has a system ID, it must be an
* absolute system ID. Those system IDs are relativized by the caller and used
* for &lt;xs:import> statements.
* for &lt;xs:import&gt; statements.
*
* If the {@link Result} object does not have a system ID, a schema
* for the namespace URI is generated but it won't be explicitly
* &lt;xs:import>ed from other schemas.
* &lt;xs:import&gt;ed from other schemas.
*
* If {@code null} is returned, the schema generation for this
* namespace URI will be skipped.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, 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
@ -57,8 +57,9 @@ public class TypeConstraintException extends java.lang.RuntimeException {
* Exception reference
*
*/
private Throwable linkedException;
private volatile Throwable linkedException;
static final long serialVersionUID = -3059799699420143848L;
/**
* Construct a TypeConstraintException with the specified detail message. The
@ -141,7 +142,7 @@ public class TypeConstraintException extends java.lang.RuntimeException {
* indicates that the linked exception does not exist or
* is unknown).
*/
public synchronized void setLinkedException( Throwable exception ) {
public void setLinkedException( Throwable exception ) {
this.linkedException = exception;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, 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
@ -238,13 +238,12 @@ import java.io.Reader;
* to a JAXB mapped class by {@link JAXBContext}, that the root
* element's <tt>xsi:type</tt> attribute takes
* precedence over the unmarshal methods <tt>declaredType</tt> parameter.
* These methods always return a <tt>JAXBElement&lt;declaredType></tt>
* These methods always return a <tt>JAXBElement&lt;declaredType&gt;</tt>
* instance. The table below shows how the properties of the returned JAXBElement
* instance are set.
*
* <a name="unmarshalDeclaredTypeReturn"></a>
* <p>
* <table border="2" rules="all" cellpadding="4">
* <table summary="" border="2" rules="all" cellpadding="4">
* <thead>
* <tr>
* <th align="center" colspan="2">
@ -284,19 +283,19 @@ import java.io.Reader;
* <blockquote>
* <pre>
* Schema fragment for example
* &lt;xs:schema>
* &lt;xs:complexType name="FooType">...&lt;\xs:complexType>
* &lt;!-- global element declaration "PurchaseOrder" -->
* &lt;xs:element name="PurchaseOrder">
* &lt;xs:complexType>
* &lt;xs:sequence>
* &lt;!-- local element declaration "foo" -->
* &lt;xs:element name="foo" type="FooType"/>
* &lt;xs:schema&gt;
* &lt;xs:complexType name="FooType"&gt;...&lt;\xs:complexType&gt;
* &lt;!-- global element declaration "PurchaseOrder" --&gt;
* &lt;xs:element name="PurchaseOrder"&gt;
* &lt;xs:complexType&gt;
* &lt;xs:sequence&gt;
* &lt;!-- local element declaration "foo" --&gt;
* &lt;xs:element name="foo" type="FooType"/&gt;
* ...
* &lt;/xs:sequence>
* &lt;/xs:complexType>
* &lt;/xs:element>
* &lt;/xs:schema>
* &lt;/xs:sequence&gt;
* &lt;/xs:complexType&gt;
* &lt;/xs:element&gt;
* &lt;/xs:schema&gt;
*
* JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
* Unmarshaller u = jc.createUnmarshaller();
@ -309,7 +308,7 @@ import java.io.Reader;
* // local element declaration in schema.
*
* // FooType is the JAXB mapping of the type of local element declaration foo.
* JAXBElement&lt;FooType> foo = u.unmarshal( fooSubtree, FooType.class);
* JAXBElement&lt;FooType&gt; foo = u.unmarshal( fooSubtree, FooType.class);
* </pre>
* </blockquote>
*
@ -390,7 +389,7 @@ import java.io.Reader;
* The external listener callback mechanism enables the registration of a {@link Listener}
* instance with an {@link Unmarshaller#setListener(Listener)}. The external listener receives all callback events,
* allowing for more centralized processing than per class defined callback methods. The external listener
* receives events when unmarshalling proces is marshalling to a JAXB element or to JAXB mapped class.
* receives events when unmarshalling process is marshalling to a JAXB element or to JAXB mapped class.
* <p>
* The 'class defined' and external listener event callback methods are independent of each other,
* both can be called for one event. The invocation ordering when both listener callback methods exist is
@ -1010,7 +1009,7 @@ public interface Unmarshaller {
*
* <p>
* Every unmarshaller internally maintains a
* {@link java.util.Map}&lt;{@link Class},{@link XmlAdapter}>,
* {@link java.util.Map}&lt;{@link Class},{@link XmlAdapter}&gt;,
* which it uses for unmarshalling classes whose fields/methods are annotated
* with {@link javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter}.
*
@ -1050,7 +1049,6 @@ public interface Unmarshaller {
/**
* <p>Associate a context that resolves cid's, content-id URIs, to
* binary data passed as attachments.</p>
* <p/>
* <p>Unmarshal time validation, enabled via {@link #setSchema(Schema)},
* must be supported even when unmarshaller is performing XOP processing.
* </p>
@ -1063,21 +1061,21 @@ public interface Unmarshaller {
AttachmentUnmarshaller getAttachmentUnmarshaller();
/**
* <p/>
* <p>
* Register an instance of an implementation of this class with {@link Unmarshaller} to externally listen
* for unmarshal events.
* <p/>
* <p/>
* </p>
* <p>
* This class enables pre and post processing of an instance of a JAXB mapped class
* as XML data is unmarshalled into it. The event callbacks are called when unmarshalling
* XML content into a JAXBElement instance or a JAXB mapped class that represents a complex type definition.
* The event callbacks are not called when unmarshalling to an instance of a
* Java datatype that represents a simple type definition.
* <p/>
* <p/>
* </p>
* <p>
* External listener is one of two different mechanisms for defining unmarshal event callbacks.
* See <a href="Unmarshaller.html#unmarshalEventCallback">Unmarshal Event Callbacks</a> for an overview.
* <p/>
* </p>
* (@link #setListener(Listener)}
* (@link #getListener()}
*
@ -1085,10 +1083,10 @@ public interface Unmarshaller {
*/
public static abstract class Listener {
/**
* <p/>
* <p>
* Callback method invoked before unmarshalling into <tt>target</tt>.
* <p/>
* <p/>
* </p>
* <p>
* This method is invoked immediately after <tt>target</tt> was created and
* before the unmarshalling of this object begins. Note that
* if the class of <tt>target</tt> defines its own <tt>beforeUnmarshal</tt> method,
@ -1102,10 +1100,10 @@ public interface Unmarshaller {
}
/**
* <p/>
* <p>
* Callback method invoked after unmarshalling XML data into <tt>target</tt>.
* <p/>
* <p/>
* </p>
* <p>
* This method is invoked after all the properties (except IDREF) are unmarshalled into <tt>target</tt>,
* but before <tt>target</tt> is set into its <tt>parent</tt> object.
* Note that if the class of <tt>target</tt> defines its own <tt>afterUnmarshal</tt> method,

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015, 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
@ -62,7 +62,7 @@ import static java.lang.annotation.ElementType.METHOD;
* each attribute that is not statically associated with another
* JavaBean property, via {@link XmlAttribute}, is entered into the
* wildcard attribute map represented by
* {@link Map}&lt;{@link QName},{@link Object}>. The attribute QName is the
* {@link Map}&lt;{@link QName},{@link Object}&gt;. The attribute QName is the
* map's key. The key's value is the String value of the attribute.
*
* @author Kohsuke Kawaguchi, Sun Microsystems, Inc.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015, 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,7 +50,6 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* annotation for the other JavaBean properties on the class, is added to this
* "catch-all" property.
*
* <p>
* <h2>Usages:</h2>
* <pre>
* &#64;XmlAnyElement
@ -61,7 +60,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* public {@link Object}[] others;
*
* &#64;XmlAnyElement
* private List&lt;{@link Element}> nodes;
* private List&lt;{@link Element}&gt; nodes;
*
* &#64;XmlAnyElement
* private {@link Element} node;
@ -88,7 +87,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* <pre>
* // List of java.lang.String or DOM nodes.
* &#64;XmlAnyElement &#64;XmlMixed
* List&lt;Object> others;
* List&lt;Object&gt; others;
* </pre>
*
*
@ -96,13 +95,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
*
* The following schema would produce the following Java class:
* <pre>
* &lt;xs:complexType name="foo">
* &lt;xs:sequence>
* &lt;xs:element name="a" type="xs:int" />
* &lt;xs:element name="b" type="xs:int" />
* &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
* &lt;/xs:sequence>
* &lt;/xs:complexType>
* &lt;xs:complexType name="foo"&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="a" type="xs:int" /&gt;
* &lt;xs:element name="b" type="xs:int" /&gt;
* &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /&gt;
* &lt;/xs:sequence&gt;
* &lt;/xs:complexType&gt;
* </pre>
*
* <pre>
@ -110,35 +109,35 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* int a;
* int b;
* &#64;{@link XmlAnyElement}
* List&lt;Element> any;
* List&lt;Element&gt; any;
* }
* </pre>
*
* It can unmarshal instances like
*
* <pre>
* &lt;foo xmlns:e="extra">
* &lt;a>1</a>
* &lt;e:other /> // this will be bound to DOM, because unmarshalling is orderless
* &lt;b>3</b>
* &lt;e:other />
* &lt;c>5</c> // this will be bound to DOM, because the annotation doesn't remember namespaces.
* &lt;/foo>
* &lt;foo xmlns:e="extra"&gt;
* &lt;a&gt;1&lt;/a&gt;
* &lt;e:other /&gt; // this will be bound to DOM, because unmarshalling is orderless
* &lt;b&gt;3&lt;/b&gt;
* &lt;e:other /&gt;
* &lt;c&gt;5&lt;/c&gt; // this will be bound to DOM, because the annotation doesn't remember namespaces.
* &lt;/foo&gt;
* </pre>
*
*
*
* The following schema would produce the following Java class:
* <pre>
* &lt;xs:complexType name="bar">
* &lt;xs:complexContent>
* &lt;xs:extension base="foo">
* &lt;xs:sequence>
* &lt;xs:element name="c" type="xs:int" />
* &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
* &lt;/xs:sequence>
* &lt;/xs:extension>
* &lt;/xs:complexType>
* &lt;xs:complexType name="bar"&gt;
* &lt;xs:complexContent&gt;
* &lt;xs:extension base="foo"&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="c" type="xs:int" /&gt;
* &lt;xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /&gt;
* &lt;/xs:sequence&gt;
* &lt;/xs:extension&gt;
* &lt;/xs:complexType&gt;
* </pre>
*
* <pre>
@ -152,14 +151,14 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* It can unmarshal instances like
*
* <pre>
* &lt;bar xmlns:e="extra">
* &lt;a>1</a>
* &lt;e:other /> // this will be bound to DOM, because unmarshalling is orderless
* &lt;b>3</b>
* &lt;e:other />
* &lt;c>5</c> // this now goes to Bar.c
* &lt;e:other /> // this will go to Foo.any
* &lt;/bar>
* &lt;bar xmlns:e="extra"&gt;
* &lt;a&gt;1&lt;/a&gt;
* &lt;e:other /&gt; // this will be bound to DOM, because unmarshalling is orderless
* &lt;b&gt;3&lt;/b&gt;
* &lt;e:other /&gt;
* &lt;c&gt;5&lt;/c&gt; // this now goes to Bar.c
* &lt;e:other /&gt; // this will go to Foo.any
* &lt;/bar&gt;
* </pre>
*
*
@ -173,13 +172,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* <p>
* The following schema would produce the following Java class:
* <pre>
* &lt;xs:complexType name="foo">
* &lt;xs:choice maxOccurs="unbounded" minOccurs="0">
* &lt;xs:element name="a" type="xs:int" />
* &lt;xs:element name="b" type="xs:int" />
* &lt;xs:any namespace="##other" processContents="lax" />
* &lt;/xs:choice>
* &lt;/xs:complexType>
* &lt;xs:complexType name="foo"&gt;
* &lt;xs:choice maxOccurs="unbounded" minOccurs="0"&gt;
* &lt;xs:element name="a" type="xs:int" /&gt;
* &lt;xs:element name="b" type="xs:int" /&gt;
* &lt;xs:any namespace="##other" processContents="lax" /&gt;
* &lt;/xs:choice&gt;
* &lt;/xs:complexType&gt;
* </pre>
*
* <pre>
@ -189,27 +188,27 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* &#64;{@link XmlElementRef}(name="a", type="JAXBElement.class")
* &#64;{@link XmlElementRef}(name="b", type="JAXBElement.class")
* })
* {@link List}&lt;{@link Object}> others;
* {@link List}&lt;{@link Object}&gt; others;
* }
*
* &#64;XmlRegistry
* class ObjectFactory {
* ...
* &#64;XmlElementDecl(name = "a", namespace = "", scope = Foo.class)
* {@link JAXBElement}&lt;Integer> createFooA( Integer i ) { ... }
* {@link JAXBElement}&lt;Integer&gt; createFooA( Integer i ) { ... }
*
* &#64;XmlElementDecl(name = "b", namespace = "", scope = Foo.class)
* {@link JAXBElement}&lt;Integer> createFooB( Integer i ) { ... }
* {@link JAXBElement}&lt;Integer&gt; createFooB( Integer i ) { ... }
* </pre>
*
* It can unmarshal instances like
*
* <pre>
* &lt;foo xmlns:e="extra">
* &lt;a>1</a> // this will unmarshal to a {@link JAXBElement} instance whose value is 1.
* &lt;e:other /> // this will unmarshal to a DOM {@link Element}.
* &lt;b>3</b> // this will unmarshal to a {@link JAXBElement} instance whose value is 1.
* &lt;/foo>
* &lt;foo xmlns:e="extra"&gt;
* &lt;a&gt;1&lt;/a&gt; // this will unmarshal to a {@link JAXBElement} instance whose value is 1.
* &lt;e:other /&gt; // this will unmarshal to a DOM {@link Element}.
* &lt;b&gt;3&lt;/b&gt; // this will unmarshal to a {@link JAXBElement} instance whose value is 1.
* &lt;/foo&gt;
* </pre>
*
*
@ -227,10 +226,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
* </pre>
* then the following document will unmarshal like this:
* <pre>
* &lt;foo>
* &lt;unknown />
* &lt;foo />
* &lt;/foo>
* &lt;foo&gt;
* &lt;unknown /&gt;
* &lt;foo /&gt;
* &lt;/foo&gt;
*
* Foo foo = unmarshal();
* // 1 for 'unknown', another for 'foo'

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015, 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
@ -52,14 +52,14 @@ import java.lang.annotation.Target;
* </pre>
* The above code maps to the following XML:
* <pre>
* &lt;xs:element name="foo" xmlns:ref="http://ws-i.org/profiles/basic/1.1/xsd">
* &lt;xs:complexType>
* &lt;xs:sequence>
* &lt;xs:element name="body" type="ref:swaRef" minOccurs="0" />
* &lt;/xs:sequence>
* &lt;xs:attribute name="data" type="ref:swaRef" use="optional" />
* &lt;/xs:complexType>
* &lt;/xs:element>
* &lt;xs:element name="foo" xmlns:ref="http://ws-i.org/profiles/basic/1.1/xsd"&gt;
* &lt;xs:complexType&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="body" type="ref:swaRef" minOccurs="0" /&gt;
* &lt;/xs:sequence&gt;
* &lt;xs:attribute name="data" type="ref:swaRef" use="optional" /&gt;
* &lt;/xs:complexType&gt;
* &lt;/xs:element&gt;
* </pre>
*
* <p>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2015, 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
@ -56,8 +56,8 @@ import static java.lang.annotation.RetentionPolicy.*;
* simple type.
* <pre>
* // Examples
* &#64;XmlAttribute List&lt;Integer> items; //legal
* &#64;XmlAttribute List&lt;Bar> foo; // illegal if Bar does not map to a schema simple type
* &#64;XmlAttribute List&lt;Integer&gt; items; //legal
* &#64;XmlAttribute List&lt;Bar&gt; foo; // illegal if Bar does not map to a schema simple type
* </pre>
* </li>
* <li> If the type of the field or the property is a non
@ -80,7 +80,6 @@ import static java.lang.annotation.RetentionPolicy.*;
* {@link XmlInlineBinaryData},
* {@link javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter}.</li>
* </ul>
* </p>
*
* <p> <b>Example 1: </b>Map a JavaBean property to an XML attribute.</p>
* <pre>
@ -91,12 +90,12 @@ import static java.lang.annotation.RetentionPolicy.*;
* public void setPrice(java.math.BigDecimal ) {...};
* }
*
* &lt;!-- Example: XML Schema fragment -->
* &lt;xs:complexType name="USPrice">
* &lt;xs:sequence>
* &lt;/xs:sequence>
* &lt;xs:attribute name="price" type="xs:decimal"/>
* &lt;/xs:complexType>
* &lt;!-- Example: XML Schema fragment --&gt;
* &lt;xs:complexType name="USPrice"&gt;
* &lt;xs:sequence&gt;
* &lt;/xs:sequence&gt;
* &lt;xs:attribute name="price" type="xs:decimal"/&gt;
* &lt;/xs:complexType&gt;
* </pre>
*
* <p> <b>Example 2: </b>Map a JavaBean property to an XML attribute with anonymous type.</p>
@ -107,17 +106,17 @@ import static java.lang.annotation.RetentionPolicy.*;
* // Example: Code fragment
* class Foo {
* ...
* &#64;XmlAttribute List&lt;Integer> items;
* &#64;XmlAttribute List&lt;Integer&gt; items;
* }
*
* &lt;!-- Example: XML Schema fragment -->
* &lt;xs:complexType name="foo">
* &lt;!-- Example: XML Schema fragment --&gt;
* &lt;xs:complexType name="foo"&gt;
* ...
* &lt;xs:attribute name="items">
* &lt;xs:simpleType>
* &lt;xs:list itemType="xs:int"/>
* &lt;/xs:simpleType>
* &lt;/xs:complexType>
* &lt;xs:attribute name="items"&gt;
* &lt;xs:simpleType&gt;
* &lt;xs:list itemType="xs:int"/&gt;
* &lt;/xs:simpleType&gt;
* &lt;/xs:complexType&gt;
*
* </pre>
* @author Sekhar Vajjhala, Sun Microsystems, Inc.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2015, 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
@ -83,12 +83,12 @@ import static java.lang.annotation.RetentionPolicy.*;
* public java.math.BigDecimal price;
* }
*
* &lt;!-- Example: Local XML Schema element -->
* &lt;xs:complexType name="USPrice"/>
* &lt;xs:sequence>
* &lt;xs:element name="itemprice" type="xs:decimal" minOccurs="0"/>
* &lt;/sequence>
* &lt;/xs:complexType>
* &lt;!-- Example: Local XML Schema element --&gt;
* &lt;xs:complexType name="USPrice"/&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="itemprice" type="xs:decimal" minOccurs="0"/&gt;
* &lt;/sequence&gt;
* &lt;/xs:complexType&gt;
* </pre>
* <p>
*
@ -101,12 +101,12 @@ import static java.lang.annotation.RetentionPolicy.*;
* public java.math.BigDecimal price;
* }
*
* &lt;!-- Example: Local XML Schema element -->
* &lt;xs:complexType name="USPrice">
* &lt;xs:sequence>
* &lt;xs:element name="price" type="xs:decimal" nillable="true" minOccurs="0"/>
* &lt;/sequence>
* &lt;/xs:complexType>
* &lt;!-- Example: Local XML Schema element --&gt;
* &lt;xs:complexType name="USPrice"&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="price" type="xs:decimal" nillable="true" minOccurs="0"/&gt;
* &lt;/sequence&gt;
* &lt;/xs:complexType&gt;
* </pre>
* <p>
* <b> Example 3: </b> Map a field to a nillable, required element.
@ -118,14 +118,13 @@ import static java.lang.annotation.RetentionPolicy.*;
* public java.math.BigDecimal price;
* }
*
* &lt;!-- Example: Local XML Schema element -->
* &lt;xs:complexType name="USPrice">
* &lt;xs:sequence>
* &lt;xs:element name="price" type="xs:decimal" nillable="true" minOccurs="1"/>
* &lt;/sequence>
* &lt;/xs:complexType>
* &lt;!-- Example: Local XML Schema element --&gt;
* &lt;xs:complexType name="USPrice"&gt;
* &lt;xs:sequence&gt;
* &lt;xs:element name="price" type="xs:decimal" nillable="true" minOccurs="1"/&gt;
* &lt;/sequence&gt;
* &lt;/xs:complexType&gt;
* </pre>
* <p>
*
* <p> <b>Example 4: </b>Map a JavaBean property to an XML element
* with anonymous type.</p>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2015, 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
@ -62,23 +62,23 @@ import static java.lang.annotation.ElementType.METHOD;
* &#64;XmlRegistry
* class ObjectFactory {
* &#64;XmlElementDecl(name="foo")
* JAXBElement&lt;String> createFoo(String s) { ... }
* JAXBElement&lt;String&gt; createFoo(String s) { ... }
* }
* </pre>
* <pre>
* &lt;!-- XML input -->
* &lt;foo>string</foo>
* &lt;!-- XML input --&gt;
* &lt;foo&gt;string&lt;/foo&gt;
*
* // Example: code fragment corresponding to XML input
* JAXBElement<String> o =
* (JAXBElement<String>)unmarshaller.unmarshal(aboveDocument);
* JAXBElement&lt;String&gt; o =
* (JAXBElement&lt;String&gt;)unmarshaller.unmarshal(aboveDocument);
* // print JAXBElement instance to show values
* System.out.println(o.getName()); // prints "{}foo"
* System.out.println(o.getValue()); // prints "string"
* System.out.println(o.getValue().getClass()); // prints "java.lang.String"
*
* &lt;!-- Example: XML schema definition -->
* &lt;xs:element name="foo" type="xs:string"/>
* &lt;!-- Example: XML schema definition --&gt;
* &lt;xs:element name="foo" type="xs:string"/&gt;
* </pre>
*
* <p><b>Example 2: </b> Element declaration with non local scope
@ -91,16 +91,16 @@ import static java.lang.annotation.ElementType.METHOD;
* this javadoc.
*
* <pre>
* &lt;!-- Example: XML schema definition -->
* &lt;xs:schema>
* &lt;xs:complexType name="pea">
* &lt;xs:choice maxOccurs="unbounded">
* &lt;xs:element name="foo" type="xs:string"/>
* &lt;xs:element name="bar" type="xs:string"/>
* &lt;/xs:choice>
* &lt;/xs:complexType>
* &lt;xs:element name="foo" type="xs:int"/>
* &lt;/xs:schema>
* &lt;!-- Example: XML schema definition --&gt;
* &lt;xs:schema&gt;
* &lt;xs:complexType name="pea"&gt;
* &lt;xs:choice maxOccurs="unbounded"&gt;
* &lt;xs:element name="foo" type="xs:string"/&gt;
* &lt;xs:element name="bar" type="xs:string"/&gt;
* &lt;/xs:choice&gt;
* &lt;/xs:complexType&gt;
* &lt;xs:element name="foo" type="xs:int"/&gt;
* &lt;/xs:schema&gt;
* </pre>
* <pre>
* // Example: expected default binding
@ -109,19 +109,19 @@ import static java.lang.annotation.ElementType.METHOD;
* &#64;XmlElementRef(name="foo",type=JAXBElement.class)
* &#64;XmlElementRef(name="bar",type=JAXBElement.class)
* })
* List&lt;JAXBElement&lt;String>> fooOrBar;
* List&lt;JAXBElement&lt;String&gt;&gt; fooOrBar;
* }
*
* &#64;XmlRegistry
* class ObjectFactory {
* &#64;XmlElementDecl(scope=Pea.class,name="foo")
* JAXBElement<String> createPeaFoo(String s);
* JAXBElement&lt;String&gt; createPeaFoo(String s);
*
* &#64;XmlElementDecl(scope=Pea.class,name="bar")
* JAXBElement<String> createPeaBar(String s);
* JAXBElement&lt;String&gt; createPeaBar(String s);
*
* &#64;XmlElementDecl(name="foo")
* JAXBElement<Integer> createFoo(Integer i);
* JAXBElement&lt;Integer&gt; createFoo(Integer i);
* }
*
* </pre>

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2015, 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
@ -57,8 +57,8 @@ import static java.lang.annotation.ElementType.METHOD;
* (section 5.5.5, "Element Property" of JAXB 2.0 specification). An
* element property method signature is of the form:
* <pre>
* public void setTerm(JAXBElement<? extends Operator>);
* public JAXBElement<? extends Operator> getTerm();
* public void setTerm(JAXBElement&lt;? extends Operator&gt;);
* public JAXBElement&lt;? extends Operator&gt; getTerm();
* </pre>
* <p>
* An element factory method annotated with {@link XmlElementDecl} is
@ -106,7 +106,7 @@ import static java.lang.annotation.ElementType.METHOD;
* // element name will be derived from the &#64;XmlRootElement
* // annotation on the type (for e.g. "jar" for JarTask).
* &#64;XmlElementRef
* List&lt;Task> tasks;
* List&lt;Task&gt; tasks;
* }
*
* abstract class Task {
@ -122,16 +122,16 @@ import static java.lang.annotation.ElementType.METHOD;
* ...
* }
*
* &lt;!-- XML Schema fragment -->
* &lt;xs:element name="target" type="Target">
* &lt;xs:complexType name="Target">
* &lt;xs:sequence>
* &lt;xs:choice maxOccurs="unbounded">
* &lt;xs:element ref="jar">
* &lt;xs:element ref="javac">
* &lt;/xs:choice>
* &lt;/xs:sequence>
* &lt;/xs:complexType>
* &lt;!-- XML Schema fragment --&gt;
* &lt;xs:element name="target" type="Target"&gt;
* &lt;xs:complexType name="Target"&gt;
* &lt;xs:sequence&gt;
* &lt;xs:choice maxOccurs="unbounded"&gt;
* &lt;xs:element ref="jar"&gt;
* &lt;xs:element ref="javac"&gt;
* &lt;/xs:choice&gt;
* &lt;/xs:sequence&gt;
* &lt;/xs:complexType&gt;
*
* </pre>
* <p>
@ -144,14 +144,14 @@ import static java.lang.annotation.ElementType.METHOD;
* </pre>
* will produce the following XML output:
* <pre>
* &lt;target>
* &lt;jar>
* &lt;target&gt;
* &lt;jar&gt;
* ....
* &lt;/jar>
* &lt;javac>
* &lt;/jar&gt;
* &lt;javac&gt;
* ....
* &lt;/javac>
* &lt;/target>
* &lt;/javac&gt;
* &lt;/target&gt;
* </pre>
* <p>
* It is not an error to have a class that extends <tt>Task</tt>
@ -182,17 +182,17 @@ import static java.lang.annotation.ElementType.METHOD;
* // substituted in the XML document.
* //
* &#64;XmlElementRef(type=JAXBElement.class,name="operator")
* JAXBElement&lt;? extends Operator> term;
* JAXBElement&lt;? extends Operator&gt; term;
* }
*
* &#64;XmlRegistry
* class ObjectFactory {
* &#64;XmlElementDecl(name="operator")
* JAXBElement&lt;Operator> createOperator(Operator o) {...}
* JAXBElement&lt;Operator&gt; createOperator(Operator o) {...}
* &#64;XmlElementDecl(name="add",substitutionHeadName="operator")
* JAXBElement&lt;Operator> createAdd(Operator o) {...}
* JAXBElement&lt;Operator&gt; createAdd(Operator o) {...}
* &#64;XmlElementDecl(name="sub",substitutionHeadName="operator")
* JAXBElement&lt;Operator> createSub(Operator o) {...}
* JAXBElement&lt;Operator&gt; createSub(Operator o) {...}
* }
*
* class Operator {
@ -208,9 +208,9 @@ import static java.lang.annotation.ElementType.METHOD;
* </pre>
* will produce the following XML output:
* <pre>
* &lt;math>
* &lt;add>...&lt;/add>
* &lt;/math>
* &lt;math&gt;
* &lt;add&gt;...&lt;/add&gt;
* &lt;/math&gt;
* </pre>
*
*

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2015, 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
@ -44,15 +44,15 @@ import java.lang.annotation.Target;
* int[] names;
*
* // XML Serialization Form 1 (Unwrapped collection)
* &lt;names> ... &lt;/names>
* &lt;names> ... &lt;/names>
* &lt;names&gt; ... &lt;/names&gt;
* &lt;names&gt; ... &lt;/names&gt;
*
* // XML Serialization Form 2 ( Wrapped collection )
* &lt;wrapperElement>
* &lt;names> value-of-item &lt;/names>
* &lt;names> value-of-item &lt;/names>
* &lt;wrapperElement&gt;
* &lt;names&gt; value-of-item &lt;/names&gt;
* &lt;names&gt; value-of-item &lt;/names&gt;
* ....
* &lt;/wrapperElement>
* &lt;/wrapperElement&gt;
* </pre>
*
* <p> The two serialized XML forms allow a null collection to be

Some files were not shown because too many files have changed in this diff Show More