mirror of
https://github.com/openjdk/jdk.git
synced 2026-04-10 23:18:45 +00:00
Merge
This commit is contained in:
commit
a8432ef7c5
2
.hgtags
2
.hgtags
@ -212,3 +212,5 @@ da9a4c9312816451884aa6db6f18be51a07bff13 jdk8-b86
|
||||
e517701a4d0e25ae9c7945bca6e1762a8c5d8aa6 jdk8-b88
|
||||
4dec41b3c5e3bb616f0c6f15830d940905aa5d16 jdk8-b89
|
||||
f09ab0c416185e3cba371e81bcb6a16060c90f44 jdk8-b90
|
||||
80b6c3172dc2cfceb022411292d290a967f9c728 jdk8-b91
|
||||
2fd6acba737b01e705e1f7c33588c922a3787f13 jdk8-b92
|
||||
|
||||
@ -212,3 +212,5 @@ b9415faa7066a4d3b16d466556d5428446918d95 jdk8-b87
|
||||
e1a929afcfc492470d50be0b6b0e8dc77d3760b9 jdk8-b88
|
||||
892a0196d10c67f3a12f0eefb0bb536e423d8868 jdk8-b89
|
||||
69b773a221b956a3386933ecdbfeccee0edeac47 jdk8-b90
|
||||
cb51fb4789ac0b8be4056482077ddfb8f3bd3805 jdk8-b91
|
||||
3a36c926a7aafa9d4a892a45ef3678e87ad8359b jdk8-b92
|
||||
|
||||
@ -23,14 +23,23 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Test if $1 is a valid argument to $3 (often is $JAVA passed as $3)
|
||||
# If so, then append $1 to $2\
|
||||
# Also set JVM_ARG_OK to true/false depending on outcome.
|
||||
AC_DEFUN([ADD_JVM_ARG_IF_OK],
|
||||
[
|
||||
# Test if $1 is a valid argument to $3 (often is $JAVA passed as $3)
|
||||
# If so, then append $1 to $2
|
||||
FOUND_WARN=`$3 $1 -version 2>&1 | grep -i warn`
|
||||
FOUND_VERSION=`$3 $1 -version 2>&1 | grep " version \""`
|
||||
$ECHO "Check if jvm arg is ok: $1" >&AS_MESSAGE_LOG_FD
|
||||
$ECHO "Command: $3 $1 -version" >&AS_MESSAGE_LOG_FD
|
||||
OUTPUT=`$3 $1 -version 2>&1`
|
||||
FOUND_WARN=`$ECHO "$OUTPUT" | grep -i warn`
|
||||
FOUND_VERSION=`$ECHO $OUTPUT | grep " version \""`
|
||||
if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
|
||||
$2="[$]$2 $1"
|
||||
JVM_ARG_OK=true
|
||||
else
|
||||
$ECHO "Arg failed:" >&AS_MESSAGE_LOG_FD
|
||||
$ECHO "$OUTPUT" >&AS_MESSAGE_LOG_FD
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
])
|
||||
|
||||
@ -51,16 +60,19 @@ AC_DEFUN([BASIC_FIXUP_PATH],
|
||||
else
|
||||
# We're on a posix platform. Hooray! :)
|
||||
path="[$]$1"
|
||||
|
||||
if test ! -f "$path" && test ! -d "$path"; then
|
||||
AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.])
|
||||
fi
|
||||
|
||||
has_space=`$ECHO "$path" | $GREP " "`
|
||||
if test "x$has_space" != x; then
|
||||
AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.])
|
||||
AC_MSG_ERROR([Spaces are not allowed in this path.])
|
||||
fi
|
||||
|
||||
# Use eval to expand a potential ~
|
||||
eval path="$path"
|
||||
if test ! -f "$path" && test ! -d "$path"; then
|
||||
AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.])
|
||||
fi
|
||||
|
||||
$1="`cd "$path"; $THEPWDCMD -L`"
|
||||
fi
|
||||
])
|
||||
|
||||
@ -157,10 +169,10 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
|
||||
COUNTER=0
|
||||
sym_link_dir=`$DIRNAME [$]$1`
|
||||
sym_link_file=`$BASENAME [$]$1`
|
||||
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||
cd $sym_link_dir
|
||||
cd `$THEPWDCMD`
|
||||
sym_link_dir=`$THEPWDCMD`
|
||||
# Use -P flag to resolve symlinks in directories.
|
||||
cd `$THEPWDCMD -P`
|
||||
sym_link_dir=`$THEPWDCMD -P`
|
||||
# Resolve file symlinks
|
||||
while test $COUNTER -lt 20; do
|
||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||
@ -171,7 +183,7 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
|
||||
# Again resolve directory symlinks since the target of the just found
|
||||
# link could be in a different directory
|
||||
cd `$DIRNAME $ISLINK`
|
||||
sym_link_dir=`$THEPWDCMD`
|
||||
sym_link_dir=`$THEPWDCMD -P`
|
||||
sym_link_file=`$BASENAME $ISLINK`
|
||||
let COUNTER=COUNTER+1
|
||||
done
|
||||
@ -252,7 +264,6 @@ BASIC_REQUIRE_PROG(MKDIR, mkdir)
|
||||
BASIC_REQUIRE_PROG(MKTEMP, mktemp)
|
||||
BASIC_REQUIRE_PROG(MV, mv)
|
||||
BASIC_REQUIRE_PROG(PRINTF, printf)
|
||||
BASIC_REQUIRE_PROG(THEPWDCMD, pwd)
|
||||
BASIC_REQUIRE_PROG(RM, rm)
|
||||
BASIC_REQUIRE_PROG(SH, sh)
|
||||
BASIC_REQUIRE_PROG(SORT, sort)
|
||||
@ -285,6 +296,10 @@ BASIC_CHECK_NONEMPTY(NAWK)
|
||||
# Always force rm.
|
||||
RM="$RM -f"
|
||||
|
||||
# pwd behaves differently on various platforms and some don't support the -L flag.
|
||||
# Always use the bash builtin pwd to get uniform behavior.
|
||||
THEPWDCMD=pwd
|
||||
|
||||
# These are not required on all platforms
|
||||
AC_PATH_PROG(CYGPATH, cygpath)
|
||||
AC_PATH_PROG(READLINK, readlink)
|
||||
@ -297,13 +312,12 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS],
|
||||
[
|
||||
# Locate the directory of this script.
|
||||
SCRIPT="[$]0"
|
||||
BASIC_REMOVE_SYMBOLIC_LINKS(SCRIPT)
|
||||
AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD`
|
||||
AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD -L`
|
||||
|
||||
# Where is the source? It is located two levels above the configure script.
|
||||
CURDIR="$PWD"
|
||||
cd "$AUTOCONF_DIR/../.."
|
||||
SRC_ROOT="`$THEPWDCMD`"
|
||||
SRC_ROOT="`$THEPWDCMD -L`"
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||
PATH_SEP=";"
|
||||
@ -362,13 +376,9 @@ AC_ARG_WITH(conf-name, [AS_HELP_STRING([--with-conf-name],
|
||||
[ CONF_NAME=${with_conf_name} ])
|
||||
|
||||
# Test from where we are running configure, in or outside of src root.
|
||||
# To enable comparison of directories, CURDIR needs to be symlink free
|
||||
# just like SRC_ROOT already is
|
||||
NOSYM_CURDIR="$CURDIR"
|
||||
BASIC_REMOVE_SYMBOLIC_LINKS(NOSYM_CURDIR)
|
||||
if test "x$NOSYM_CURDIR" = "x$SRC_ROOT" || test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common" \
|
||||
|| test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common/autoconf" \
|
||||
|| test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
|
||||
if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" \
|
||||
|| test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" \
|
||||
|| test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
|
||||
# We are running configure from the src root.
|
||||
# Create a default ./build/target-variant-debuglevel output root.
|
||||
if test "x${CONF_NAME}" = x; then
|
||||
@ -605,6 +615,20 @@ fi
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
|
||||
BASIC_REQUIRE_PROG(XATTR, xattr)
|
||||
AC_PATH_PROG(CODESIGN, codesign)
|
||||
if test "x$CODESIGN" != "x"; then
|
||||
# Verify that the openjdk_codesign certificate is present
|
||||
AC_MSG_CHECKING([if openjdk_codesign certificate is present])
|
||||
rm -f codesign-testfile
|
||||
touch codesign-testfile
|
||||
codesign -s openjdk_codesign codesign-testfile 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD || CODESIGN=
|
||||
rm -f codesign-testfile
|
||||
if test "x$CODESIGN" = x; then
|
||||
AC_MSG_RESULT([no])
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
@ -300,7 +300,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE_MSYS],
|
||||
# Setup basic configuration paths, and platform-specific stuff related to PATHs.
|
||||
AC_DEFUN([BASIC_CHECK_PATHS_WINDOWS],
|
||||
[
|
||||
SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m`
|
||||
SRC_ROOT_LENGTH=`$THEPWDCMD -L|$WC -m`
|
||||
if test $SRC_ROOT_LENGTH -gt 100; then
|
||||
AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported])
|
||||
fi
|
||||
|
||||
@ -145,6 +145,9 @@ AC_DEFUN_ONCE([BPERF_SETUP_BUILD_JOBS],
|
||||
if test "$JOBS" -gt "16"; then
|
||||
JOBS=16
|
||||
fi
|
||||
if test "$JOBS" -eq "0"; then
|
||||
JOBS=1
|
||||
fi
|
||||
AC_MSG_RESULT([$JOBS])
|
||||
else
|
||||
JOBS=$with_jobs
|
||||
@ -278,60 +281,37 @@ else
|
||||
fi
|
||||
AC_SUBST(SJAVAC_SERVER_JAVA)
|
||||
|
||||
AC_ARG_WITH(sjavac-server-cores, [AS_HELP_STRING([--with-sjavac-server-cores],
|
||||
[use at most this number of concurrent threads on the sjavac server @<:@probed@:>@])])
|
||||
if test "x$with_sjavac_server_cores" != x; then
|
||||
SJAVAC_SERVER_CORES="$with_sjavac_server_cores"
|
||||
else
|
||||
if test "$NUM_CORES" -gt 16; then
|
||||
# We set this arbitrary limit because we want to limit the heap
|
||||
# size of the javac server.
|
||||
# In the future we will make the javac compilers in the server
|
||||
# share more and more state, thus enabling us to use more and
|
||||
# more concurrent threads in the server.
|
||||
SJAVAC_SERVER_CORES="16"
|
||||
else
|
||||
SJAVAC_SERVER_CORES="$NUM_CORES"
|
||||
if test "$MEMORY_SIZE" -gt "2500"; then
|
||||
ADD_JVM_ARG_IF_OK([-d64],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
if test "$JVM_ARG_OK" = true; then
|
||||
JVM_64BIT=true
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$JVM_64BIT" = true; then
|
||||
if test "$MEMORY_SIZE" -gt "17000"; then
|
||||
MAX_HEAP_MEM=10000
|
||||
ADD_JVM_ARG_IF_OK([-d64],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
ADD_JVM_ARG_IF_OK([-Xms10G -Xmx10G],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
elif test "$MEMORY_SIZE" -gt "10000"; then
|
||||
MAX_HEAP_MEM=6000
|
||||
ADD_JVM_ARG_IF_OK([-d64],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
if test "$MEMORY_SIZE" -gt "10000" && test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms6G -Xmx6G],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
elif test "$MEMORY_SIZE" -gt "5000"; then
|
||||
MAX_HEAP_MEM=3000
|
||||
ADD_JVM_ARG_IF_OK([-d64],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
if test "$MEMORY_SIZE" -gt "5000" && test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms1G -Xmx3G],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
elif test "$MEMORY_SIZE" -gt "3800"; then
|
||||
MAX_HEAP_MEM=2500
|
||||
fi
|
||||
if test "$MEMORY_SIZE" -gt "3800" && test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms1G -Xmx2500M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
elif test "$MEMORY_SIZE" -gt "1900"; then
|
||||
MAX_HEAP_MEM=1200
|
||||
ADD_JVM_ARG_IF_OK([-Xms700M -Xmx1400M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
elif test "$MEMORY_SIZE" -gt "1000"; then
|
||||
MAX_HEAP_MEM=900
|
||||
ADD_JVM_ARG_IF_OK([-Xms400M -Xmx1100M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
else
|
||||
MAX_HEAP_MEM=512
|
||||
ADD_JVM_ARG_IF_OK([-Xms256M -Xmx512M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
|
||||
ADD_JVM_ARG_IF_OK([-XX:PermSize=32m],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
ADD_JVM_ARG_IF_OK([-XX:MaxPermSize=160m],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
ADD_JVM_ARG_IF_OK([-XX:ThreadStackSize=$STACK_SIZE],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
|
||||
MAX_COMPILERS_IN_HEAP=`expr $MAX_HEAP_MEM / 501`
|
||||
if test "$SJAVAC_SERVER_CORES" -gt "$MAX_COMPILERS_IN_HEAP"; then
|
||||
AC_MSG_CHECKING([if number of server cores must be reduced])
|
||||
SJAVAC_SERVER_CORES="$MAX_COMPILERS_IN_HEAP"
|
||||
AC_MSG_RESULT([yes, to $SJAVAC_SERVER_CORES with max heap size $MAX_HEAP_MEM MB])
|
||||
fi
|
||||
fi
|
||||
AC_SUBST(SJAVAC_SERVER_CORES)
|
||||
fi
|
||||
if test "$MEMORY_SIZE" -gt "2500" && test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms1000M -Xmx1500M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
if test "$MEMORY_SIZE" -gt "1000" && test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms400M -Xmx1100M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
if test "$JVM_ARG_OK" = false; then
|
||||
ADD_JVM_ARG_IF_OK([-Xms256M -Xmx512M],SJAVAC_SERVER_JAVA,[$SJAVAC_SERVER_JAVA])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([whether to use sjavac])
|
||||
AC_ARG_ENABLE([sjavac], [AS_HELP_STRING([--enable-sjavac],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -422,6 +422,14 @@ if test "x$MILESTONE" = x; then
|
||||
MILESTONE=internal
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(update-version, [AS_HELP_STRING([--with-update-version],
|
||||
[Set update version value for build @<:@b00@:>@])])
|
||||
if test "x$with_update_version" = xyes; then
|
||||
AC_MSG_ERROR([Update version must have a value])
|
||||
elif test "x$with_update_version" != x; then
|
||||
JDK_UPDATE_VERSION="$with_update_version"
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(build-number, [AS_HELP_STRING([--with-build-number],
|
||||
[Set build number value for build @<:@b00@:>@])])
|
||||
if test "x$with_build_number" = xyes; then
|
||||
|
||||
@ -478,6 +478,7 @@ CCACHE:=@CCACHE@
|
||||
# CD is going away, but remains to cater for legacy makefiles.
|
||||
CD:=cd
|
||||
CHMOD:=@CHMOD@
|
||||
CODESIGN:=@CODESIGN@
|
||||
COMM:=@COMM@
|
||||
CP:=@CP@
|
||||
CPIO:=@CPIO@
|
||||
@ -528,6 +529,8 @@ HG:=@HG@
|
||||
OBJCOPY:=@OBJCOPY@
|
||||
SETFILE:=@SETFILE@
|
||||
XATTR:=@XATTR@
|
||||
JT_HOME:=@JT_HOME@
|
||||
JTREGEXE:=@JTREGEXE@
|
||||
|
||||
FIXPATH:=@FIXPATH@
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
|
||||
$ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null
|
||||
if test $? -ne 0; then
|
||||
GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1`
|
||||
|
||||
|
||||
AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler.])
|
||||
AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_TEST" and with --version: "$GCC_VERSION_TEST"])
|
||||
AC_MSG_ERROR([Sun Studio compiler is required. Try setting --with-tools-dir.])
|
||||
@ -69,7 +69,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
|
||||
AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"])
|
||||
AC_MSG_ERROR([GCC compiler is required. Try setting --with-tools-dir.])
|
||||
fi
|
||||
|
||||
|
||||
# First line typically looks something like:
|
||||
# gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
|
||||
COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/p"`
|
||||
@ -142,7 +142,7 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
|
||||
BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER)
|
||||
AC_MSG_RESULT([$TEST_COMPILER])
|
||||
AC_MSG_CHECKING([if $1 is disguised ccache])
|
||||
|
||||
|
||||
COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"`
|
||||
if test "x$COMPILER_BASENAME" = "xccache"; then
|
||||
AC_MSG_RESULT([yes, trying to find proper $COMPILER_NAME compiler])
|
||||
@ -226,11 +226,11 @@ BDEPS_CHECK_MODULE(DEVKIT, devkit, xxx,
|
||||
],
|
||||
[])
|
||||
|
||||
if test "x$SYS_ROOT" != "x/" ; then
|
||||
if test "x$SYS_ROOT" != "x/" ; then
|
||||
CFLAGS="--sysroot=$SYS_ROOT $CFLAGS"
|
||||
CXXFLAGS="--sysroot=$SYS_ROOT $CXXFLAGS"
|
||||
OBJCFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
|
||||
OBJCXXFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
|
||||
OBJCFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
|
||||
OBJCXXFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
|
||||
CPPFLAGS="--sysroot=$SYS_ROOT $CPPFLAGS"
|
||||
LDFLAGS="--sysroot=$SYS_ROOT $LDFLAGS"
|
||||
fi
|
||||
@ -330,7 +330,7 @@ AC_SUBST(HOTSPOT_LD)
|
||||
COMPILER_NAME=gcc
|
||||
COMPILER_TYPE=CC
|
||||
AS_IF([test "x$OPENJDK_TARGET_OS" = xwindows], [
|
||||
# For now, assume that we are always compiling using cl.exe.
|
||||
# For now, assume that we are always compiling using cl.exe.
|
||||
CC_OUT_OPTION=-Fo
|
||||
EXE_OUT_OPTION=-out:
|
||||
LD_OUT_OPTION=-out:
|
||||
@ -479,6 +479,8 @@ if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
|
||||
BASIC_FIXUP_EXECUTABLE(LIPO)
|
||||
fi
|
||||
|
||||
TOOLCHAIN_SETUP_JTREG
|
||||
|
||||
# Restore old path without tools dir
|
||||
PATH="$OLD_PATH"
|
||||
])
|
||||
@ -489,7 +491,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_LIBS],
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# How to compile shared libraries.
|
||||
# How to compile shared libraries.
|
||||
#
|
||||
|
||||
if test "x$GCC" = xyes; then
|
||||
@ -523,7 +525,7 @@ if test "x$GCC" = xyes; then
|
||||
SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG"
|
||||
SHARED_LIBRARY_SUFFIX='.dylib'
|
||||
EXE_SUFFIX=''
|
||||
SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/[$]1'
|
||||
SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/[$]1'
|
||||
SET_SHARED_LIBRARY_MAPFILE=''
|
||||
SET_SHARED_LIBRARY_ORIGIN='-Xlinker -rpath -Xlinker @loader_path/.'
|
||||
SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN"
|
||||
@ -674,7 +676,7 @@ case $COMPILER_TYPE in
|
||||
# Use single precision floating point with 'float'
|
||||
CC_HIGHEST="$CC_HIGHEST -fsingle"
|
||||
# Assume memory references via basic pointer types do not alias
|
||||
# (Source with excessing pointer casting and data access with mixed
|
||||
# (Source with excessing pointer casting and data access with mixed
|
||||
# pointer types are not recommended)
|
||||
CC_HIGHEST="$CC_HIGHEST -xalias_level=basic"
|
||||
# Use intrinsic or inline versions for math/std functions
|
||||
@ -890,7 +892,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
|
||||
fi
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
|
||||
# Setting these parameters makes it an error to link to macosx APIs that are
|
||||
# Setting these parameters makes it an error to link to macosx APIs that are
|
||||
# newer than the given OS version and makes the linked binaries compatible even
|
||||
# if built on a newer version of the OS.
|
||||
# The expected format is X.Y.Z
|
||||
@ -938,12 +940,12 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
|
||||
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
|
||||
# is identical for client and server? Yes. Which is picked at runtime (client or server)?
|
||||
# Neither, since the chosen libjvm.so has already been loaded by the launcher, all the following
|
||||
# libraries will link to whatever is in memory. Yuck.
|
||||
# libraries will link to whatever is in memory. Yuck.
|
||||
#
|
||||
# Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh.
|
||||
if test "x$COMPILER_NAME" = xcl; then
|
||||
LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no"
|
||||
if test "x$OPENJDK_TARGET_CPU" = xx86; then
|
||||
if test "x$OPENJDK_TARGET_CPU" = xx86; then
|
||||
LDFLAGS_JDK="$LDFLAGS_JDK -safeseh"
|
||||
fi
|
||||
# TODO: make -debug optional "--disable-full-debug-symbols"
|
||||
@ -963,7 +965,7 @@ else
|
||||
if test -n "$HAS_GNU_HASH"; then
|
||||
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
|
||||
fi
|
||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||
# And since we now know that the linker is gnu, then add -z defs, to forbid
|
||||
# undefined symbols in object files.
|
||||
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
|
||||
@ -1004,7 +1006,7 @@ fi
|
||||
|
||||
# Adjust flags according to debug level.
|
||||
case $DEBUG_LEVEL in
|
||||
fastdebug )
|
||||
fastdebug )
|
||||
CFLAGS="$CFLAGS $D_FLAG"
|
||||
JAVAC_FLAGS="$JAVAC_FLAGS -g"
|
||||
;;
|
||||
@ -1016,9 +1018,9 @@ case $DEBUG_LEVEL in
|
||||
CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
|
||||
JAVAC_FLAGS="$JAVAC_FLAGS -g"
|
||||
;;
|
||||
esac
|
||||
esac
|
||||
|
||||
|
||||
|
||||
AC_SUBST(CFLAGS_JDKLIB)
|
||||
AC_SUBST(CFLAGS_JDKEXE)
|
||||
|
||||
@ -1089,3 +1091,46 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_MISC],
|
||||
[COMPILER_SUPPORTS_TARGET_BITS_FLAG=false])
|
||||
AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG)
|
||||
])
|
||||
|
||||
# Setup the JTREG paths
|
||||
AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG],
|
||||
[
|
||||
AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg],
|
||||
[Regression Test Harness @<:@probed@:>@])],
|
||||
[],
|
||||
[with_jtreg=no])
|
||||
|
||||
if test "x$with_jtreg" = xno; then
|
||||
# jtreg disabled
|
||||
AC_MSG_CHECKING([for jtreg])
|
||||
AC_MSG_RESULT(no)
|
||||
else
|
||||
if test "x$with_jtreg" != xyes; then
|
||||
# with path specified.
|
||||
JT_HOME="$with_jtreg"
|
||||
fi
|
||||
|
||||
if test "x$JT_HOME" != x; then
|
||||
AC_MSG_CHECKING([for jtreg])
|
||||
|
||||
# use JT_HOME enviroment var.
|
||||
BASIC_FIXUP_PATH([JT_HOME])
|
||||
|
||||
# jtreg win32 script works for everybody
|
||||
JTREGEXE="$JT_HOME/win32/bin/jtreg"
|
||||
|
||||
if test ! -f "$JTREGEXE"; then
|
||||
AC_MSG_ERROR([JTReg executable does not exist: $JTREGEXE])
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT($JTREGEXE)
|
||||
else
|
||||
# try to find jtreg on path
|
||||
BASIC_REQUIRE_PROG(JTREGEXE, jtreg)
|
||||
JT_HOME="`$DIRNAME $JTREGEXE`"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST(JT_HOME)
|
||||
AC_SUBST(JTREGEXE)
|
||||
])
|
||||
|
||||
@ -127,9 +127,21 @@ else
|
||||
ifdef ALT_JAVAFX_ZIP_DIR
|
||||
@$(ECHO) " --with-javafx-zip-dir=$(call UnixPath,$(ALT_JAVAFX_ZIP_DIR)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_JMC_ZIP_DIR
|
||||
@$(ECHO) " --with-jmc-zip-dir=$(call UnixPath,$(ALT_JMC_ZIP_DIR)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_WIXDIR
|
||||
@$(ECHO) " --with-wix=$(call UnixPath,$(ALT_WIXDIR)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_INSTALL_LZMA_PATH
|
||||
@$(ECHO) " --with-lzma-path=$(call UnixPath,$(ALT_INSTALL_LZMA_PATH)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_INSTALL_UPX_PATH
|
||||
@$(ECHO) " --with-upx-path=$(call UnixPath,$(ALT_INSTALL_UPX_PATH)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_INSTALL_UPX_FILENAME
|
||||
@$(ECHO) " --with-upx-filename=$(call UnixPath,$(ALT_INSTALL_UPX_FILENAME)) " >> $@.tmp
|
||||
endif
|
||||
ifdef ALT_CCSS_SIGNING_DIR
|
||||
@$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp
|
||||
endif
|
||||
|
||||
@ -183,7 +183,7 @@ bootcycle-images-only: start-make
|
||||
test: images test-only
|
||||
test-only: start-make
|
||||
@$(call TargetEnter)
|
||||
@($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 -k MAKEFLAGS= PRODUCT_HOME=$(JDK_IMAGE_DIR) JPRT_JAVA_HOME=$(JDK_IMAGE_DIR) ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
|
||||
@($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 -k JT_HOME=$(JT_HOME) MAKEFLAGS= PRODUCT_HOME=$(JDK_IMAGE_DIR) JPRT_JAVA_HOME=$(JDK_IMAGE_DIR) ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
|
||||
@$(call TargetExit)
|
||||
|
||||
# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
|
||||
|
||||
@ -361,8 +361,8 @@ $(eval $(call SetupLogging))
|
||||
|
||||
# This is to be called by all SetupFoo macros
|
||||
define LogSetupMacroEntry
|
||||
$(if $(26),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk))
|
||||
$(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25,$(if $($i),$(NEWLINE) $(strip [$i] $($i))))))
|
||||
$(if $(27),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk))
|
||||
$(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,$(if $($i),$(NEWLINE) $(strip [$i] $($i))))))
|
||||
endef
|
||||
|
||||
# Make directory without forking mkdir if not needed
|
||||
|
||||
@ -147,9 +147,9 @@ define SetupNativeCompilation
|
||||
# CC the compiler to use, default is $(CC)
|
||||
# LDEXE the linker to use for linking executables, default is $(LDEXE)
|
||||
# OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
|
||||
$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
|
||||
$(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25))
|
||||
$(if $(26),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
|
||||
$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
|
||||
$(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26))
|
||||
$(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
|
||||
|
||||
ifneq (,$$($1_BIN))
|
||||
$$(error BIN has been replaced with OBJECT_DIR)
|
||||
@ -567,6 +567,12 @@ define SetupNativeCompilation
|
||||
ifneq (,$$($1_GEN_MANIFEST))
|
||||
$(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
|
||||
endif
|
||||
|
||||
# This only works if the openjdk_codesign identity is present on the system. Let
|
||||
# silently fail otherwise.
|
||||
ifneq (,$(CODESIGN))
|
||||
ifneq (,$$($1_CODESIGN))
|
||||
$(CODESIGN) -s openjdk_codesign $$@
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
@ -212,3 +212,5 @@ f1709874d55a06bc3d5dfa02dbcdfbc59f4cba34 jdk8-b87
|
||||
4e3a881ebb1ee96ce0872508b0066d74f310dbfa jdk8-b88
|
||||
fe4150590ee597f4e125fea950aa3b352622cc2d jdk8-b89
|
||||
c8286839d0df04aba819ec4bef12b86babccf30e jdk8-b90
|
||||
8f7ffb296385f85a4a6d53f9f2d4a7b13a8fa1ff jdk8-b91
|
||||
717aa26f8e0a1c0e768aebb3a763aca56db0c83e jdk8-b92
|
||||
|
||||
@ -343,3 +343,6 @@ c4af77d2045476c56fbf3f914b336bb1b7cd18af hs25-b30
|
||||
69494caf57908ba2c8efa9eaaa472b4d1875588a hs25-b32
|
||||
1ae0472ff3a0117b5b019d380ad59fface2fde14 jdk8-b90
|
||||
b19517cecc2e91636d7c16ba2f35e3d3dc628099 hs25-b33
|
||||
7cbdf0e3725c0c56a2ff7540fc70b6d4b5890d04 jdk8-b91
|
||||
38da9f4f67096745f851318d792d6468aa1f6cf8 hs25-b34
|
||||
092018493d3bbeb1c24278fd8c40ff3d76e1fed7 jdk8-b92
|
||||
|
||||
@ -28,10 +28,10 @@ import java.io.*;
|
||||
import java.util.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.x86.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.windows.x86.*;
|
||||
import sun.jvm.hotspot.debugger.windows.amd64.*;
|
||||
import sun.jvm.hotspot.utilities.AddressOps;
|
||||
|
||||
class WindbgCDebugger implements CDebugger {
|
||||
@ -75,14 +75,14 @@ class WindbgCDebugger implements CDebugger {
|
||||
if (ebp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP);
|
||||
if (pc == null) return null;
|
||||
return new X86CFrame(this, ebp, pc);
|
||||
return new WindowsX86CFrame(dbg, ebp, pc);
|
||||
} else if (dbg.getCPU().equals("amd64")) {
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
|
||||
Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP);
|
||||
if (rbp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
|
||||
if (pc == null) return null;
|
||||
return new AMD64CFrame(this, rbp, pc);
|
||||
return new WindowsAMD64CFrame(dbg, rbp, pc);
|
||||
} else {
|
||||
// unsupported CPU!
|
||||
return null;
|
||||
|
||||
@ -22,26 +22,26 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.cdbg.basic.amd64;
|
||||
package sun.jvm.hotspot.debugger.windows.amd64;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
import sun.jvm.hotspot.debugger.windbg.*;
|
||||
|
||||
/** Basic AMD64 frame functionality providing sender() functionality. */
|
||||
|
||||
public class AMD64CFrame extends BasicCFrame {
|
||||
public class WindowsAMD64CFrame extends BasicCFrame {
|
||||
private Address rbp;
|
||||
private Address pc;
|
||||
|
||||
private static final int ADDRESS_SIZE = 8;
|
||||
|
||||
/** Constructor for topmost frame */
|
||||
public AMD64CFrame(CDebugger dbg, Address rbp, Address pc) {
|
||||
super(dbg);
|
||||
public WindowsAMD64CFrame(WindbgDebugger dbg, Address rbp, Address pc) {
|
||||
super(dbg.getCDebugger());
|
||||
this.rbp = rbp;
|
||||
this.pc = pc;
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
public CFrame sender(ThreadProxy thread) {
|
||||
@ -52,15 +52,20 @@ public class AMD64CFrame extends BasicCFrame {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check alignment of rbp
|
||||
if ( dbg.getAddressValue(rbp) % ADDRESS_SIZE != 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE);
|
||||
if (nextRBP == null) {
|
||||
if (nextRBP == null || nextRBP.lessThanOrEqual(rbp)) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new AMD64CFrame(dbg(), nextRBP, nextPC);
|
||||
return new WindowsAMD64CFrame(dbg, nextRBP, nextPC);
|
||||
}
|
||||
|
||||
public Address pc() {
|
||||
@ -70,4 +75,6 @@ public class AMD64CFrame extends BasicCFrame {
|
||||
public Address localVariableBase() {
|
||||
return rbp;
|
||||
}
|
||||
|
||||
private WindbgDebugger dbg;
|
||||
}
|
||||
@ -22,26 +22,26 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.cdbg.basic.x86;
|
||||
package sun.jvm.hotspot.debugger.windows.x86;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
import sun.jvm.hotspot.debugger.windbg.*;
|
||||
|
||||
/** Basic X86 frame functionality providing sender() functionality. */
|
||||
|
||||
public class X86CFrame extends BasicCFrame {
|
||||
public class WindowsX86CFrame extends BasicCFrame {
|
||||
private Address ebp;
|
||||
private Address pc;
|
||||
|
||||
private static final int ADDRESS_SIZE = 4;
|
||||
|
||||
/** Constructor for topmost frame */
|
||||
public X86CFrame(CDebugger dbg, Address ebp, Address pc) {
|
||||
super(dbg);
|
||||
public WindowsX86CFrame(WindbgDebugger dbg, Address ebp, Address pc) {
|
||||
super(dbg.getCDebugger());
|
||||
this.ebp = ebp;
|
||||
this.pc = pc;
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
public CFrame sender(ThreadProxy thread) {
|
||||
@ -52,15 +52,20 @@ public class X86CFrame extends BasicCFrame {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check alignment of ebp
|
||||
if ( dbg.getAddressValue(ebp) % ADDRESS_SIZE != 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE);
|
||||
if (nextEBP == null) {
|
||||
if (nextEBP == null || nextEBP.lessThanOrEqual(ebp)) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new X86CFrame(dbg(), nextEBP, nextPC);
|
||||
return new WindowsX86CFrame(dbg, nextEBP, nextPC);
|
||||
}
|
||||
|
||||
public Address pc() {
|
||||
@ -70,4 +75,6 @@ public class X86CFrame extends BasicCFrame {
|
||||
public Address localVariableBase() {
|
||||
return ebp;
|
||||
}
|
||||
|
||||
private WindbgDebugger dbg;
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2008, 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
|
||||
@ -24,6 +24,8 @@
|
||||
|
||||
Obj_Files += bsd_arm.o
|
||||
|
||||
LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
|
||||
ifneq ($(EXT_LIBS_PATH),)
|
||||
LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
|
||||
endif
|
||||
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
||||
|
||||
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
|
||||
|
||||
HS_MAJOR_VER=25
|
||||
HS_MINOR_VER=0
|
||||
HS_BUILD_NUMBER=33
|
||||
HS_BUILD_NUMBER=34
|
||||
|
||||
JDK_MAJOR_VER=1
|
||||
JDK_MINOR_VER=8
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2008, 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
|
||||
@ -24,6 +24,8 @@
|
||||
|
||||
Obj_Files += linux_arm.o
|
||||
|
||||
LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
|
||||
ifneq ($(EXT_LIBS_PATH),)
|
||||
LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
|
||||
endif
|
||||
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
||||
|
||||
@ -54,7 +54,7 @@ endif
|
||||
$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||
@echo Making signal interposition lib...
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||
$(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $< -ldl
|
||||
$(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) $(EXTRA_CFLAGS) -o $@ $< -ldl
|
||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||
$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJSIG_DEBUGINFO)
|
||||
$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@
|
||||
|
||||
@ -92,6 +92,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
|
||||
$(SASRCFILES) \
|
||||
$(SA_LFLAGS) \
|
||||
$(SA_DEBUG_CFLAGS) \
|
||||
$(EXTRA_CFLAGS) \
|
||||
-o $@ \
|
||||
-lthread_db
|
||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||
|
||||
@ -48,8 +48,6 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/dummy/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \
|
||||
@ -70,6 +68,8 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/g1/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/gc_implementation/parallelScavenge/*.java \
|
||||
|
||||
@ -1498,27 +1498,29 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ movptr(elem_klass, elem_klass_addr); // query the object klass
|
||||
generate_type_check(elem_klass, ckoff_arg, ckval_arg, temp,
|
||||
&L_store_element, NULL);
|
||||
// (On fall-through, we have failed the element type check.)
|
||||
// (On fall-through, we have failed the element type check.)
|
||||
// ======== end loop ========
|
||||
|
||||
// It was a real error; we must depend on the caller to finish the job.
|
||||
// Register "count" = -1 * number of *remaining* oops, length_arg = *total* oops.
|
||||
// Emit GC store barriers for the oops we have copied (length_arg + count),
|
||||
// and report their number to the caller.
|
||||
assert_different_registers(to, count, rax);
|
||||
Label L_post_barrier;
|
||||
__ addl(count, length_arg); // transfers = (length - remaining)
|
||||
__ movl2ptr(rax, count); // save the value
|
||||
__ notptr(rax); // report (-1^K) to caller
|
||||
__ movptr(to, to_arg); // reload
|
||||
assert_different_registers(to, count, rax);
|
||||
gen_write_ref_array_post_barrier(to, count);
|
||||
__ jmpb(L_done);
|
||||
__ notptr(rax); // report (-1^K) to caller (does not affect flags)
|
||||
__ jccb(Assembler::notZero, L_post_barrier);
|
||||
__ jmp(L_done); // K == 0, nothing was copied, skip post barrier
|
||||
|
||||
// Come here on success only.
|
||||
__ BIND(L_do_card_marks);
|
||||
__ xorptr(rax, rax); // return 0 on success
|
||||
__ movl2ptr(count, length_arg);
|
||||
__ movptr(to, to_arg); // reload
|
||||
|
||||
__ BIND(L_post_barrier);
|
||||
__ movptr(to, to_arg); // reload
|
||||
gen_write_ref_array_post_barrier(to, count);
|
||||
__ xorptr(rax, rax); // return 0 on success
|
||||
|
||||
// Common exit point (success or failure).
|
||||
__ BIND(L_done);
|
||||
|
||||
@ -1217,27 +1217,28 @@ class StubGenerator: public StubCodeGenerator {
|
||||
//
|
||||
// Input:
|
||||
// start - register containing starting address of destination array
|
||||
// end - register containing ending address of destination array
|
||||
// count - elements count
|
||||
// scratch - scratch register
|
||||
//
|
||||
// The input registers are overwritten.
|
||||
// The ending address is inclusive.
|
||||
void gen_write_ref_array_post_barrier(Register start, Register end, Register scratch) {
|
||||
assert_different_registers(start, end, scratch);
|
||||
//
|
||||
void gen_write_ref_array_post_barrier(Register start, Register count, Register scratch) {
|
||||
assert_different_registers(start, count, scratch);
|
||||
BarrierSet* bs = Universe::heap()->barrier_set();
|
||||
switch (bs->kind()) {
|
||||
case BarrierSet::G1SATBCT:
|
||||
case BarrierSet::G1SATBCTLogging:
|
||||
|
||||
{
|
||||
__ pusha(); // push registers (overkill)
|
||||
// must compute element count unless barrier set interface is changed (other platforms supply count)
|
||||
assert_different_registers(start, end, scratch);
|
||||
__ lea(scratch, Address(end, BytesPerHeapOop));
|
||||
__ subptr(scratch, start); // subtract start to get #bytes
|
||||
__ shrptr(scratch, LogBytesPerHeapOop); // convert to element count
|
||||
__ mov(c_rarg0, start);
|
||||
__ mov(c_rarg1, scratch);
|
||||
__ pusha(); // push registers (overkill)
|
||||
if (c_rarg0 == count) { // On win64 c_rarg0 == rcx
|
||||
assert_different_registers(c_rarg1, start);
|
||||
__ mov(c_rarg1, count);
|
||||
__ mov(c_rarg0, start);
|
||||
} else {
|
||||
assert_different_registers(c_rarg0, count);
|
||||
__ mov(c_rarg0, start);
|
||||
__ mov(c_rarg1, count);
|
||||
}
|
||||
__ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), 2);
|
||||
__ popa();
|
||||
}
|
||||
@ -1249,22 +1250,16 @@ class StubGenerator: public StubCodeGenerator {
|
||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||
|
||||
Label L_loop;
|
||||
const Register end = count;
|
||||
|
||||
__ shrptr(start, CardTableModRefBS::card_shift);
|
||||
__ addptr(end, BytesPerHeapOop);
|
||||
__ shrptr(end, CardTableModRefBS::card_shift);
|
||||
__ subptr(end, start); // number of bytes to copy
|
||||
__ leaq(end, Address(start, count, TIMES_OOP, 0)); // end == start+count*oop_size
|
||||
__ subptr(end, BytesPerHeapOop); // end - 1 to make inclusive
|
||||
__ shrptr(start, CardTableModRefBS::card_shift);
|
||||
__ shrptr(end, CardTableModRefBS::card_shift);
|
||||
__ subptr(end, start); // end --> cards count
|
||||
|
||||
intptr_t disp = (intptr_t) ct->byte_map_base;
|
||||
if (Assembler::is_simm32(disp)) {
|
||||
Address cardtable(noreg, noreg, Address::no_scale, disp);
|
||||
__ lea(scratch, cardtable);
|
||||
} else {
|
||||
ExternalAddress cardtable((address)disp);
|
||||
__ lea(scratch, cardtable);
|
||||
}
|
||||
|
||||
const Register count = end; // 'end' register contains bytes count now
|
||||
int64_t disp = (int64_t) ct->byte_map_base;
|
||||
__ mov64(scratch, disp);
|
||||
__ addptr(start, scratch);
|
||||
__ BIND(L_loop);
|
||||
__ movb(Address(start, count, Address::times_1), 0);
|
||||
@ -1916,8 +1911,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ BIND(L_exit);
|
||||
if (is_oop) {
|
||||
__ leaq(end_to, Address(saved_to, dword_count, Address::times_4, -4));
|
||||
gen_write_ref_array_post_barrier(saved_to, end_to, rax);
|
||||
gen_write_ref_array_post_barrier(saved_to, dword_count, rax);
|
||||
}
|
||||
restore_arg_regs();
|
||||
inc_counter_np(SharedRuntime::_jint_array_copy_ctr); // Update counter after rscratch1 is free
|
||||
@ -2012,12 +2006,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// Copy in multi-bytes chunks
|
||||
copy_bytes_backward(from, to, qword_count, rax, L_copy_bytes, L_copy_8_bytes);
|
||||
|
||||
__ bind(L_exit);
|
||||
if (is_oop) {
|
||||
Register end_to = rdx;
|
||||
__ leaq(end_to, Address(to, dword_count, Address::times_4, -4));
|
||||
gen_write_ref_array_post_barrier(to, end_to, rax);
|
||||
}
|
||||
__ BIND(L_exit);
|
||||
if (is_oop) {
|
||||
gen_write_ref_array_post_barrier(to, dword_count, rax);
|
||||
}
|
||||
restore_arg_regs();
|
||||
inc_counter_np(SharedRuntime::_jint_array_copy_ctr); // Update counter after rscratch1 is free
|
||||
__ xorptr(rax, rax); // return 0
|
||||
@ -2055,6 +2047,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
const Register end_from = from; // source array end address
|
||||
const Register end_to = rcx; // destination array end address
|
||||
const Register saved_to = to;
|
||||
const Register saved_count = r11;
|
||||
// End pointers are inclusive, and if count is not zero they point
|
||||
// to the last unit copied: end_to[0] := end_from[0]
|
||||
|
||||
@ -2072,6 +2065,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// r9 and r10 may be used to save non-volatile registers
|
||||
// 'from', 'to' and 'qword_count' are now valid
|
||||
if (is_oop) {
|
||||
// Save to and count for store barrier
|
||||
__ movptr(saved_count, qword_count);
|
||||
// no registers are destroyed by this call
|
||||
gen_write_ref_array_pre_barrier(to, qword_count, dest_uninitialized);
|
||||
}
|
||||
@ -2104,7 +2099,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
if (is_oop) {
|
||||
__ BIND(L_exit);
|
||||
gen_write_ref_array_post_barrier(saved_to, end_to, rax);
|
||||
gen_write_ref_array_post_barrier(saved_to, saved_count, rax);
|
||||
}
|
||||
restore_arg_regs();
|
||||
if (is_oop) {
|
||||
@ -2187,8 +2182,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
if (is_oop) {
|
||||
__ BIND(L_exit);
|
||||
__ lea(rcx, Address(to, saved_count, Address::times_8, -8));
|
||||
gen_write_ref_array_post_barrier(to, rcx, rax);
|
||||
gen_write_ref_array_post_barrier(to, saved_count, rax);
|
||||
}
|
||||
restore_arg_regs();
|
||||
if (is_oop) {
|
||||
@ -2375,20 +2369,20 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// Register rdx = -1 * number of *remaining* oops, r14 = *total* oops.
|
||||
// Emit GC store barriers for the oops we have copied (r14 + rdx),
|
||||
// and report their number to the caller.
|
||||
assert_different_registers(rax, r14_length, count, to, end_to, rcx);
|
||||
__ lea(end_to, to_element_addr);
|
||||
__ addptr(end_to, -heapOopSize); // make an inclusive end pointer
|
||||
gen_write_ref_array_post_barrier(to, end_to, rscratch1);
|
||||
__ movptr(rax, r14_length); // original oops
|
||||
__ addptr(rax, count); // K = (original - remaining) oops
|
||||
__ notptr(rax); // report (-1^K) to caller
|
||||
__ jmp(L_done);
|
||||
assert_different_registers(rax, r14_length, count, to, end_to, rcx, rscratch1);
|
||||
Label L_post_barrier;
|
||||
__ addptr(r14_length, count); // K = (original - remaining) oops
|
||||
__ movptr(rax, r14_length); // save the value
|
||||
__ notptr(rax); // report (-1^K) to caller (does not affect flags)
|
||||
__ jccb(Assembler::notZero, L_post_barrier);
|
||||
__ jmp(L_done); // K == 0, nothing was copied, skip post barrier
|
||||
|
||||
// Come here on success only.
|
||||
__ BIND(L_do_card_marks);
|
||||
__ addptr(end_to, -heapOopSize); // make an inclusive end pointer
|
||||
gen_write_ref_array_post_barrier(to, end_to, rscratch1);
|
||||
__ xorptr(rax, rax); // return 0 on success
|
||||
__ xorptr(rax, rax); // return 0 on success
|
||||
|
||||
__ BIND(L_post_barrier);
|
||||
gen_write_ref_array_post_barrier(to, r14_length, rscratch1);
|
||||
|
||||
// Common exit point (success or failure).
|
||||
__ BIND(L_done);
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
HotSpot PrintAssembly option.
|
||||
*/
|
||||
|
||||
#include <config.h> /* required by bfd.h */
|
||||
#include <libiberty.h>
|
||||
#include <bfd.h>
|
||||
#include <dis-asm.h>
|
||||
|
||||
@ -77,30 +77,42 @@ void Compiler::initialize() {
|
||||
}
|
||||
|
||||
|
||||
BufferBlob* Compiler::build_buffer_blob() {
|
||||
BufferBlob* Compiler::get_buffer_blob(ciEnv* env) {
|
||||
// Allocate buffer blob once at startup since allocation for each
|
||||
// compilation seems to be too expensive (at least on Intel win32).
|
||||
BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
|
||||
if (buffer_blob != NULL) {
|
||||
return buffer_blob;
|
||||
}
|
||||
|
||||
// setup CodeBuffer. Preallocate a BufferBlob of size
|
||||
// NMethodSizeLimit plus some extra space for constants.
|
||||
int code_buffer_size = Compilation::desired_max_code_buffer_size() +
|
||||
Compilation::desired_max_constant_size();
|
||||
BufferBlob* blob = BufferBlob::create("Compiler1 temporary CodeBuffer",
|
||||
code_buffer_size);
|
||||
guarantee(blob != NULL, "must create initial code buffer");
|
||||
return blob;
|
||||
|
||||
buffer_blob = BufferBlob::create("Compiler1 temporary CodeBuffer",
|
||||
code_buffer_size);
|
||||
if (buffer_blob == NULL) {
|
||||
CompileBroker::handle_full_code_cache();
|
||||
env->record_failure("CodeCache is full");
|
||||
} else {
|
||||
CompilerThread::current()->set_buffer_blob(buffer_blob);
|
||||
}
|
||||
|
||||
return buffer_blob;
|
||||
}
|
||||
|
||||
|
||||
void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) {
|
||||
// Allocate buffer blob once at startup since allocation for each
|
||||
// compilation seems to be too expensive (at least on Intel win32).
|
||||
BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
|
||||
BufferBlob* buffer_blob = Compiler::get_buffer_blob(env);
|
||||
if (buffer_blob == NULL) {
|
||||
buffer_blob = build_buffer_blob();
|
||||
CompilerThread::current()->set_buffer_blob(buffer_blob);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_initialized()) {
|
||||
initialize();
|
||||
}
|
||||
|
||||
// invoke compilation
|
||||
{
|
||||
// We are nested here because we need for the destructor
|
||||
|
||||
@ -46,7 +46,7 @@ class Compiler: public AbstractCompiler {
|
||||
|
||||
virtual bool is_c1() { return true; };
|
||||
|
||||
BufferBlob* build_buffer_blob();
|
||||
BufferBlob* get_buffer_blob(ciEnv* env);
|
||||
|
||||
// Missing feature tests
|
||||
virtual bool supports_native() { return true; }
|
||||
|
||||
@ -1719,15 +1719,28 @@ void ClassFileParser::parse_annotations(u1* buffer, int limit,
|
||||
coll->set_annotation(id);
|
||||
|
||||
if (id == AnnotationCollector::_sun_misc_Contended) {
|
||||
// @Contended can optionally specify the contention group.
|
||||
//
|
||||
// Contended group defines the equivalence class over the fields:
|
||||
// the fields within the same contended group are not treated distinct.
|
||||
// The only exception is default group, which does not incur the
|
||||
// equivalence. Naturally, contention group for classes is meaningless.
|
||||
//
|
||||
// While the contention group is specified as String, annotation
|
||||
// values are already interned, and we might as well use the constant
|
||||
// pool index as the group tag.
|
||||
//
|
||||
u2 group_index = 0; // default contended group
|
||||
if (count == 1
|
||||
&& s_size == (index - index0) // match size
|
||||
&& s_tag_val == *(abase + tag_off)
|
||||
&& member == vmSymbols::value_name()) {
|
||||
u2 group_index = Bytes::get_Java_u2(abase + s_con_off);
|
||||
coll->set_contended_group(group_index);
|
||||
} else {
|
||||
coll->set_contended_group(0); // default contended group
|
||||
group_index = Bytes::get_Java_u2(abase + s_con_off);
|
||||
if (_cp->symbol_at(group_index)->utf8_length() == 0) {
|
||||
group_index = 0; // default contended group
|
||||
}
|
||||
}
|
||||
coll->set_contended_group(group_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3108,10 +3121,6 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
FieldLayoutInfo* info,
|
||||
TRAPS) {
|
||||
|
||||
// get the padding width from the option
|
||||
// TODO: Ask VM about specific CPU we are running on
|
||||
int pad_size = ContendedPaddingWidth;
|
||||
|
||||
// Field size and offset computation
|
||||
int nonstatic_field_size = _super_klass() == NULL ? 0 : _super_klass()->nonstatic_field_size();
|
||||
int next_static_oop_offset;
|
||||
@ -3124,13 +3133,14 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
int next_nonstatic_word_offset;
|
||||
int next_nonstatic_short_offset;
|
||||
int next_nonstatic_byte_offset;
|
||||
int next_nonstatic_type_offset;
|
||||
int first_nonstatic_oop_offset;
|
||||
int first_nonstatic_field_offset;
|
||||
int next_nonstatic_field_offset;
|
||||
int next_nonstatic_padded_offset;
|
||||
|
||||
// Count the contended fields by type.
|
||||
//
|
||||
// We ignore static fields, because @Contended is not supported for them.
|
||||
// The layout code below will also ignore the static fields.
|
||||
int nonstatic_contended_count = 0;
|
||||
FieldAllocationCount fac_contended;
|
||||
for (AllFieldStream fs(_fields, _cp); !fs.done(); fs.next()) {
|
||||
@ -3162,16 +3172,17 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
next_static_byte_offset = next_static_short_offset +
|
||||
((fac->count[STATIC_SHORT]) * BytesPerShort);
|
||||
|
||||
first_nonstatic_field_offset = instanceOopDesc::base_offset_in_bytes() +
|
||||
nonstatic_field_size * heapOopSize;
|
||||
int nonstatic_fields_start = instanceOopDesc::base_offset_in_bytes() +
|
||||
nonstatic_field_size * heapOopSize;
|
||||
|
||||
// class is contended, pad before all the fields
|
||||
next_nonstatic_field_offset = nonstatic_fields_start;
|
||||
|
||||
// Class is contended, pad before all the fields
|
||||
if (parsed_annotations->is_contended()) {
|
||||
first_nonstatic_field_offset += pad_size;
|
||||
next_nonstatic_field_offset += ContendedPaddingWidth;
|
||||
}
|
||||
|
||||
next_nonstatic_field_offset = first_nonstatic_field_offset;
|
||||
|
||||
// Compute the non-contended fields count
|
||||
unsigned int nonstatic_double_count = fac->count[NONSTATIC_DOUBLE] - fac_contended.count[NONSTATIC_DOUBLE];
|
||||
unsigned int nonstatic_word_count = fac->count[NONSTATIC_WORD] - fac_contended.count[NONSTATIC_WORD];
|
||||
unsigned int nonstatic_short_count = fac->count[NONSTATIC_SHORT] - fac_contended.count[NONSTATIC_SHORT];
|
||||
@ -3229,6 +3240,7 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
compact_fields = false; // Don't compact fields
|
||||
}
|
||||
|
||||
// Rearrange fields for a given allocation style
|
||||
if( allocation_style == 0 ) {
|
||||
// Fields order: oops, longs/doubles, ints, shorts/chars, bytes, padded fields
|
||||
next_nonstatic_oop_offset = next_nonstatic_field_offset;
|
||||
@ -3269,6 +3281,8 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
int nonstatic_short_space_offset;
|
||||
int nonstatic_byte_space_offset;
|
||||
|
||||
// Try to squeeze some of the fields into the gaps due to
|
||||
// long/double alignment.
|
||||
if( nonstatic_double_count > 0 ) {
|
||||
int offset = next_nonstatic_double_offset;
|
||||
next_nonstatic_double_offset = align_size_up(offset, BytesPerLong);
|
||||
@ -3442,7 +3456,7 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
|
||||
// if there is at least one contended field, we need to have pre-padding for them
|
||||
if (nonstatic_contended_count > 0) {
|
||||
next_nonstatic_padded_offset += pad_size;
|
||||
next_nonstatic_padded_offset += ContendedPaddingWidth;
|
||||
}
|
||||
|
||||
// collect all contended groups
|
||||
@ -3521,7 +3535,7 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
// the fields within the same contended group are not inter-padded.
|
||||
// The only exception is default group, which does not incur the
|
||||
// equivalence, and so requires intra-padding.
|
||||
next_nonstatic_padded_offset += pad_size;
|
||||
next_nonstatic_padded_offset += ContendedPaddingWidth;
|
||||
}
|
||||
|
||||
fs.set_offset(real_offset);
|
||||
@ -3533,7 +3547,7 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
// subclass fields and/or adjacent object.
|
||||
// If this was the default group, the padding is already in place.
|
||||
if (current_group != 0) {
|
||||
next_nonstatic_padded_offset += pad_size;
|
||||
next_nonstatic_padded_offset += ContendedPaddingWidth;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3547,22 +3561,22 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
// This helps to alleviate memory contention effects for subclass fields
|
||||
// and/or adjacent object.
|
||||
if (parsed_annotations->is_contended()) {
|
||||
notaligned_offset += pad_size;
|
||||
notaligned_offset += ContendedPaddingWidth;
|
||||
}
|
||||
|
||||
int next_static_type_offset = align_size_up(next_static_byte_offset, wordSize);
|
||||
int static_field_size = (next_static_type_offset -
|
||||
InstanceMirrorKlass::offset_of_static_fields()) / wordSize;
|
||||
int nonstatic_fields_end = align_size_up(notaligned_offset, heapOopSize);
|
||||
int instance_end = align_size_up(notaligned_offset, wordSize);
|
||||
int static_fields_end = align_size_up(next_static_byte_offset, wordSize);
|
||||
|
||||
next_nonstatic_type_offset = align_size_up(notaligned_offset, heapOopSize );
|
||||
nonstatic_field_size = nonstatic_field_size + ((next_nonstatic_type_offset
|
||||
- first_nonstatic_field_offset)/heapOopSize);
|
||||
int static_field_size = (static_fields_end -
|
||||
InstanceMirrorKlass::offset_of_static_fields()) / wordSize;
|
||||
nonstatic_field_size = nonstatic_field_size +
|
||||
(nonstatic_fields_end - nonstatic_fields_start) / heapOopSize;
|
||||
|
||||
next_nonstatic_type_offset = align_size_up(notaligned_offset, wordSize );
|
||||
int instance_size = align_object_size(next_nonstatic_type_offset / wordSize);
|
||||
int instance_size = align_object_size(instance_end / wordSize);
|
||||
|
||||
assert(instance_size == align_object_size(align_size_up(
|
||||
(instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize + ((parsed_annotations->is_contended()) ? pad_size : 0)),
|
||||
(instanceOopDesc::base_offset_in_bytes() + nonstatic_field_size*heapOopSize),
|
||||
wordSize) / wordSize), "consistent layout helper value");
|
||||
|
||||
// Number of non-static oop map blocks allocated at end of klass.
|
||||
@ -3576,9 +3590,9 @@ void ClassFileParser::layout_fields(Handle class_loader,
|
||||
_fields,
|
||||
_cp,
|
||||
instance_size,
|
||||
first_nonstatic_field_offset,
|
||||
next_nonstatic_field_offset,
|
||||
next_static_type_offset);
|
||||
nonstatic_fields_start,
|
||||
nonstatic_fields_end,
|
||||
static_fields_end);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -35,7 +35,6 @@
|
||||
#include "oops/oop.inline2.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
#include "utilities/hashtable.inline.hpp"
|
||||
#include "utilities/numberSeq.hpp"
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
@ -451,21 +450,7 @@ void SymbolTable::verify() {
|
||||
}
|
||||
|
||||
void SymbolTable::dump(outputStream* st) {
|
||||
NumberSeq summary;
|
||||
for (int i = 0; i < the_table()->table_size(); ++i) {
|
||||
int count = 0;
|
||||
for (HashtableEntry<Symbol*, mtSymbol>* e = the_table()->bucket(i);
|
||||
e != NULL; e = e->next()) {
|
||||
count++;
|
||||
}
|
||||
summary.add((double)count);
|
||||
}
|
||||
st->print_cr("SymbolTable statistics:");
|
||||
st->print_cr("Number of buckets : %7d", summary.num());
|
||||
st->print_cr("Average bucket size : %7.0f", summary.avg());
|
||||
st->print_cr("Variance of bucket size : %7.0f", summary.variance());
|
||||
st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
|
||||
st->print_cr("Maximum bucket size : %7.0f", summary.maximum());
|
||||
the_table()->dump_table(st, "SymbolTable");
|
||||
}
|
||||
|
||||
|
||||
@ -814,21 +799,7 @@ void StringTable::verify() {
|
||||
}
|
||||
|
||||
void StringTable::dump(outputStream* st) {
|
||||
NumberSeq summary;
|
||||
for (int i = 0; i < the_table()->table_size(); ++i) {
|
||||
HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
|
||||
int count = 0;
|
||||
for ( ; p != NULL; p = p->next()) {
|
||||
count++;
|
||||
}
|
||||
summary.add((double)count);
|
||||
}
|
||||
st->print_cr("StringTable statistics:");
|
||||
st->print_cr("Number of buckets : %7d", summary.num());
|
||||
st->print_cr("Average bucket size : %7.0f", summary.avg());
|
||||
st->print_cr("Variance of bucket size : %7.0f", summary.variance());
|
||||
st->print_cr("Std. dev. of bucket size: %7.0f", summary.sd());
|
||||
st->print_cr("Maximum bucket size : %7.0f", summary.maximum());
|
||||
the_table()->dump_table(st, "StringTable");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -622,6 +622,15 @@ address CodeCache::last_address() {
|
||||
return (address)_heap->high();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the reverse free ratio. E.g., if 25% (1/4) of the code cache
|
||||
* is free, reverse_free_ratio() returns 4.
|
||||
*/
|
||||
double CodeCache::reverse_free_ratio() {
|
||||
double unallocated_capacity = (double)(CodeCache::unallocated_capacity() - CodeCacheMinimumFreeSpace);
|
||||
double max_capacity = (double)CodeCache::max_capacity();
|
||||
return max_capacity / unallocated_capacity;
|
||||
}
|
||||
|
||||
void icache_init();
|
||||
|
||||
|
||||
@ -163,6 +163,7 @@ class CodeCache : AllStatic {
|
||||
static size_t max_capacity() { return _heap->max_capacity(); }
|
||||
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
|
||||
static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; }
|
||||
static double reverse_free_ratio();
|
||||
|
||||
static bool needs_cache_clean() { return _needs_cache_clean; }
|
||||
static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
|
||||
|
||||
@ -50,14 +50,6 @@ AdaptiveFreeList<Chunk>::AdaptiveFreeList() : FreeList<Chunk>(), _hint(0) {
|
||||
init_statistics();
|
||||
}
|
||||
|
||||
template <class Chunk>
|
||||
AdaptiveFreeList<Chunk>::AdaptiveFreeList(Chunk* fc) : FreeList<Chunk>(fc), _hint(0) {
|
||||
init_statistics();
|
||||
#ifndef PRODUCT
|
||||
_allocation_stats.set_returned_bytes(size() * HeapWordSize);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class Chunk>
|
||||
void AdaptiveFreeList<Chunk>::initialize() {
|
||||
FreeList<Chunk>::initialize();
|
||||
|
||||
@ -55,7 +55,6 @@ class AdaptiveFreeList : public FreeList<Chunk> {
|
||||
public:
|
||||
|
||||
AdaptiveFreeList();
|
||||
AdaptiveFreeList(Chunk* fc);
|
||||
|
||||
using FreeList<Chunk>::assert_proper_lock_protection;
|
||||
#ifdef ASSERT
|
||||
|
||||
@ -153,8 +153,6 @@ CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs,
|
||||
_indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1
|
||||
"a freelist par lock",
|
||||
true);
|
||||
if (_indexedFreeListParLocks[i] == NULL)
|
||||
vm_exit_during_initialization("Could not allocate a par lock");
|
||||
DEBUG_ONLY(
|
||||
_indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]);
|
||||
)
|
||||
@ -285,6 +283,7 @@ void CompactibleFreeListSpace::reset(MemRegion mr) {
|
||||
_bt.verify_not_unallocated((HeapWord*)fc, fc->size());
|
||||
_indexedFreeList[mr.word_size()].return_chunk_at_head(fc);
|
||||
}
|
||||
coalBirth(mr.word_size());
|
||||
}
|
||||
_promoInfo.reset();
|
||||
_smallLinearAllocBlock._ptr = NULL;
|
||||
@ -1762,7 +1761,7 @@ CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats(
|
||||
}
|
||||
ec->set_size(size);
|
||||
debug_only(ec->mangleFreed(size));
|
||||
if (size < SmallForDictionary) {
|
||||
if (size < SmallForDictionary && ParallelGCThreads != 0) {
|
||||
lock = _indexedFreeListParLocks[size];
|
||||
}
|
||||
MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
|
||||
|
||||
@ -3381,7 +3381,6 @@ bool ConcurrentMarkSweepGeneration::grow_by(size_t bytes) {
|
||||
assert_locked_or_safepoint(Heap_lock);
|
||||
bool result = _virtual_space.expand_by(bytes);
|
||||
if (result) {
|
||||
HeapWord* old_end = _cmsSpace->end();
|
||||
size_t new_word_size =
|
||||
heap_word_size(_virtual_space.committed_size());
|
||||
MemRegion mr(_cmsSpace->bottom(), new_word_size);
|
||||
|
||||
@ -485,10 +485,6 @@ class CMSIsAliveClosure: public BoolObjectClosure {
|
||||
assert(!span.is_empty(), "Empty span could spell trouble");
|
||||
}
|
||||
|
||||
void do_object(oop obj) {
|
||||
assert(false, "not to be invoked");
|
||||
}
|
||||
|
||||
bool do_object_b(oop obj);
|
||||
};
|
||||
|
||||
@ -1536,9 +1532,6 @@ class ScanMarkedObjectsAgainClosure: public UpwardsObjectClosure {
|
||||
_bit_map(bit_map),
|
||||
_par_scan_closure(cl) { }
|
||||
|
||||
void do_object(oop obj) {
|
||||
guarantee(false, "Call do_object_b(oop, MemRegion) instead");
|
||||
}
|
||||
bool do_object_b(oop obj) {
|
||||
guarantee(false, "Call do_object_b(oop, MemRegion) form instead");
|
||||
return false;
|
||||
|
||||
@ -44,9 +44,6 @@ class G1CMIsAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
G1CMIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) { }
|
||||
|
||||
void do_object(oop obj) {
|
||||
ShouldNotCallThis();
|
||||
}
|
||||
bool do_object_b(oop obj);
|
||||
};
|
||||
|
||||
|
||||
@ -5090,7 +5090,6 @@ class G1AlwaysAliveClosure: public BoolObjectClosure {
|
||||
G1CollectedHeap* _g1;
|
||||
public:
|
||||
G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
|
||||
void do_object(oop p) { assert(false, "Do not call."); }
|
||||
bool do_object_b(oop p) {
|
||||
if (p != NULL) {
|
||||
return true;
|
||||
|
||||
@ -165,7 +165,6 @@ class G1STWIsAliveClosure: public BoolObjectClosure {
|
||||
G1CollectedHeap* _g1;
|
||||
public:
|
||||
G1STWIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
|
||||
void do_object(oop p) { assert(false, "Do not call."); }
|
||||
bool do_object_b(oop p);
|
||||
};
|
||||
|
||||
|
||||
@ -242,11 +242,13 @@ public:
|
||||
PerRegionTable* cur = _free_list;
|
||||
size_t res = 0;
|
||||
while (cur != NULL) {
|
||||
res += sizeof(PerRegionTable);
|
||||
res += cur->mem_size();
|
||||
cur = cur->next();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static void test_fl_mem_size();
|
||||
};
|
||||
|
||||
PerRegionTable* PerRegionTable::_free_list = NULL;
|
||||
@ -1149,6 +1151,19 @@ HeapRegionRemSet::finish_cleanup_task(HRRSCleanupTask* hrrs_cleanup_task) {
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void PerRegionTable::test_fl_mem_size() {
|
||||
PerRegionTable* dummy = alloc(NULL);
|
||||
free(dummy);
|
||||
guarantee(dummy->mem_size() == fl_mem_size(), "fl_mem_size() does not return the correct element size");
|
||||
// try to reset the state
|
||||
_free_list = NULL;
|
||||
delete dummy;
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::test_prt() {
|
||||
PerRegionTable::test_fl_mem_size();
|
||||
}
|
||||
|
||||
void HeapRegionRemSet::test() {
|
||||
os::sleep(Thread::current(), (jlong)5000, false);
|
||||
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
||||
|
||||
@ -338,6 +338,7 @@ public:
|
||||
|
||||
// Run unit tests.
|
||||
#ifndef PRODUCT
|
||||
static void test_prt();
|
||||
static void test();
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 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
|
||||
@ -54,18 +54,18 @@ ParMarkBitMap::initialize(MemRegion covered_region)
|
||||
const size_t raw_bytes = words * sizeof(idx_t);
|
||||
const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
|
||||
const size_t granularity = os::vm_allocation_granularity();
|
||||
const size_t bytes = align_size_up(raw_bytes, MAX2(page_sz, granularity));
|
||||
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
|
||||
|
||||
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
|
||||
MAX2(page_sz, granularity);
|
||||
ReservedSpace rs(bytes, rs_align, rs_align > 0);
|
||||
ReservedSpace rs(_reserved_byte_size, rs_align, rs_align > 0);
|
||||
os::trace_page_sizes("par bitmap", raw_bytes, raw_bytes, page_sz,
|
||||
rs.base(), rs.size());
|
||||
|
||||
MemTracker::record_virtual_memory_type((address)rs.base(), mtGC);
|
||||
|
||||
_virtual_space = new PSVirtualSpace(rs, page_sz);
|
||||
if (_virtual_space != NULL && _virtual_space->expand_by(bytes)) {
|
||||
if (_virtual_space != NULL && _virtual_space->expand_by(_reserved_byte_size)) {
|
||||
_region_start = covered_region.start();
|
||||
_region_size = covered_region.word_size();
|
||||
idx_t* map = (idx_t*)_virtual_space->reserved_low_addr();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 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
|
||||
@ -131,6 +131,8 @@ public:
|
||||
inline size_t region_size() const;
|
||||
inline size_t size() const;
|
||||
|
||||
size_t reserved_byte_size() const { return _reserved_byte_size; }
|
||||
|
||||
// Convert a heap address to/from a bit index.
|
||||
inline idx_t addr_to_bit(HeapWord* addr) const;
|
||||
inline HeapWord* bit_to_addr(idx_t bit) const;
|
||||
@ -176,10 +178,11 @@ private:
|
||||
BitMap _beg_bits;
|
||||
BitMap _end_bits;
|
||||
PSVirtualSpace* _virtual_space;
|
||||
size_t _reserved_byte_size;
|
||||
};
|
||||
|
||||
inline ParMarkBitMap::ParMarkBitMap():
|
||||
_beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL)
|
||||
_beg_bits(), _end_bits(), _region_start(NULL), _region_size(0), _virtual_space(NULL), _reserved_byte_size(0)
|
||||
{ }
|
||||
|
||||
inline void ParMarkBitMap::clear_range(idx_t beg, idx_t end)
|
||||
|
||||
@ -580,7 +580,6 @@ void PSMarkSweep::mark_sweep_phase2() {
|
||||
// This should be moved to the shared markSweep code!
|
||||
class PSAlwaysTrueClosure: public BoolObjectClosure {
|
||||
public:
|
||||
void do_object(oop p) { ShouldNotReachHere(); }
|
||||
bool do_object_b(oop p) { return true; }
|
||||
};
|
||||
static PSAlwaysTrueClosure always_true;
|
||||
|
||||
@ -356,6 +356,7 @@ ParallelCompactData::ParallelCompactData()
|
||||
_region_start = 0;
|
||||
|
||||
_region_vspace = 0;
|
||||
_reserved_byte_size = 0;
|
||||
_region_data = 0;
|
||||
_region_count = 0;
|
||||
}
|
||||
@ -382,11 +383,11 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
|
||||
const size_t raw_bytes = count * element_size;
|
||||
const size_t page_sz = os::page_size_for_region(raw_bytes, raw_bytes, 10);
|
||||
const size_t granularity = os::vm_allocation_granularity();
|
||||
const size_t bytes = align_size_up(raw_bytes, MAX2(page_sz, granularity));
|
||||
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
|
||||
|
||||
const size_t rs_align = page_sz == (size_t) os::vm_page_size() ? 0 :
|
||||
MAX2(page_sz, granularity);
|
||||
ReservedSpace rs(bytes, rs_align, rs_align > 0);
|
||||
ReservedSpace rs(_reserved_byte_size, rs_align, rs_align > 0);
|
||||
os::trace_page_sizes("par compact", raw_bytes, raw_bytes, page_sz, rs.base(),
|
||||
rs.size());
|
||||
|
||||
@ -394,7 +395,7 @@ ParallelCompactData::create_vspace(size_t count, size_t element_size)
|
||||
|
||||
PSVirtualSpace* vspace = new PSVirtualSpace(rs, page_sz);
|
||||
if (vspace != 0) {
|
||||
if (vspace->expand_by(bytes)) {
|
||||
if (vspace->expand_by(_reserved_byte_size)) {
|
||||
return vspace;
|
||||
}
|
||||
delete vspace;
|
||||
@ -781,7 +782,6 @@ ParallelCompactData PSParallelCompact::_summary_data;
|
||||
|
||||
PSParallelCompact::IsAliveClosure PSParallelCompact::_is_alive_closure;
|
||||
|
||||
void PSParallelCompact::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); }
|
||||
bool PSParallelCompact::IsAliveClosure::do_object_b(oop p) { return mark_bitmap()->is_marked(p); }
|
||||
|
||||
void PSParallelCompact::KeepAliveClosure::do_oop(oop* p) { PSParallelCompact::KeepAliveClosure::do_oop_work(p); }
|
||||
@ -841,14 +841,18 @@ bool PSParallelCompact::initialize() {
|
||||
initialize_dead_wood_limiter();
|
||||
|
||||
if (!_mark_bitmap.initialize(mr)) {
|
||||
vm_shutdown_during_initialization("Unable to allocate bit map for "
|
||||
"parallel garbage collection for the requested heap size.");
|
||||
vm_shutdown_during_initialization(
|
||||
err_msg("Unable to allocate " SIZE_FORMAT "KB bitmaps for parallel "
|
||||
"garbage collection for the requested " SIZE_FORMAT "KB heap.",
|
||||
_mark_bitmap.reserved_byte_size()/K, mr.byte_size()/K));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!_summary_data.initialize(mr)) {
|
||||
vm_shutdown_during_initialization("Unable to allocate tables for "
|
||||
"parallel garbage collection for the requested heap size.");
|
||||
vm_shutdown_during_initialization(
|
||||
err_msg("Unable to allocate " SIZE_FORMAT "KB card tables for parallel "
|
||||
"garbage collection for the requested " SIZE_FORMAT "KB heap.",
|
||||
_summary_data.reserved_byte_size()/K, mr.byte_size()/K));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2413,7 +2417,6 @@ void PSParallelCompact::adjust_class_loader(ParCompactionManager* cm,
|
||||
// This should be moved to the shared markSweep code!
|
||||
class PSAlwaysTrueClosure: public BoolObjectClosure {
|
||||
public:
|
||||
void do_object(oop p) { ShouldNotReachHere(); }
|
||||
bool do_object_b(oop p) { return true; }
|
||||
};
|
||||
static PSAlwaysTrueClosure always_true;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 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
|
||||
@ -347,6 +347,7 @@ public:
|
||||
bool initialize(MemRegion covered_region);
|
||||
|
||||
size_t region_count() const { return _region_count; }
|
||||
size_t reserved_byte_size() const { return _reserved_byte_size; }
|
||||
|
||||
// Convert region indices to/from RegionData pointers.
|
||||
inline RegionData* region(size_t region_idx) const;
|
||||
@ -420,6 +421,7 @@ private:
|
||||
#endif // #ifdef ASSERT
|
||||
|
||||
PSVirtualSpace* _region_vspace;
|
||||
size_t _reserved_byte_size;
|
||||
RegionData* _region_data;
|
||||
size_t _region_count;
|
||||
};
|
||||
@ -784,7 +786,6 @@ class PSParallelCompact : AllStatic {
|
||||
//
|
||||
class IsAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
virtual void do_object(oop p);
|
||||
virtual bool do_object_b(oop p);
|
||||
};
|
||||
|
||||
|
||||
@ -70,9 +70,6 @@ bool PSScavenge::_promotion_failed = false;
|
||||
// Define before use
|
||||
class PSIsAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
void do_object(oop p) {
|
||||
assert(false, "Do not call.");
|
||||
}
|
||||
bool do_object_b(oop p) {
|
||||
return (!PSScavenge::is_obj_in_young((HeapWord*) p)) || p->is_forwarded();
|
||||
}
|
||||
|
||||
@ -166,7 +166,6 @@ void MarkSweep::restore_marks() {
|
||||
|
||||
MarkSweep::IsAliveClosure MarkSweep::is_alive;
|
||||
|
||||
void MarkSweep::IsAliveClosure::do_object(oop p) { ShouldNotReachHere(); }
|
||||
bool MarkSweep::IsAliveClosure::do_object_b(oop p) { return p->is_gc_marked(); }
|
||||
|
||||
MarkSweep::KeepAliveClosure MarkSweep::keep_alive;
|
||||
|
||||
@ -88,7 +88,6 @@ class MarkSweep : AllStatic {
|
||||
// Used for java/lang/ref handling
|
||||
class IsAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
virtual void do_object(oop p);
|
||||
virtual bool do_object_b(oop p);
|
||||
};
|
||||
|
||||
|
||||
@ -50,9 +50,6 @@
|
||||
DefNewGeneration::IsAliveClosure::IsAliveClosure(Generation* g) : _g(g) {
|
||||
assert(g->level() == 0, "Optimized for youngest gen.");
|
||||
}
|
||||
void DefNewGeneration::IsAliveClosure::do_object(oop p) {
|
||||
assert(false, "Do not call.");
|
||||
}
|
||||
bool DefNewGeneration::IsAliveClosure::do_object_b(oop p) {
|
||||
return (HeapWord*)p >= _g->reserved().end() || p->is_forwarded();
|
||||
}
|
||||
|
||||
@ -150,7 +150,6 @@ protected:
|
||||
Generation* _g;
|
||||
public:
|
||||
IsAliveClosure(Generation* g);
|
||||
void do_object(oop p);
|
||||
bool do_object_b(oop p);
|
||||
};
|
||||
|
||||
|
||||
@ -54,17 +54,6 @@ FreeList<Chunk>::FreeList() :
|
||||
_count = 0;
|
||||
}
|
||||
|
||||
template <class Chunk>
|
||||
FreeList<Chunk>::FreeList(Chunk* fc) :
|
||||
_head(fc), _tail(fc)
|
||||
#ifdef ASSERT
|
||||
, _protecting_lock(NULL)
|
||||
#endif
|
||||
{
|
||||
_size = fc->size();
|
||||
_count = 1;
|
||||
}
|
||||
|
||||
template <class Chunk>
|
||||
void FreeList<Chunk>::link_head(Chunk* v) {
|
||||
assert_proper_lock_protection();
|
||||
|
||||
@ -80,8 +80,6 @@ class FreeList VALUE_OBJ_CLASS_SPEC {
|
||||
// Constructor
|
||||
// Construct a list without any entries.
|
||||
FreeList();
|
||||
// Construct a list with "fc" as the first (and lone) entry in the list.
|
||||
FreeList(Chunk_t* fc);
|
||||
|
||||
// Do initialization
|
||||
void initialize();
|
||||
@ -177,9 +175,6 @@ class FreeList VALUE_OBJ_CLASS_SPEC {
|
||||
// found. Return NULL if "fc" is not found.
|
||||
bool verify_chunk_in_free_list(Chunk_t* fc) const;
|
||||
|
||||
// Stats verification
|
||||
// void verify_stats() const { ShouldNotReachHere(); };
|
||||
|
||||
// Printing support
|
||||
static void print_labels_on(outputStream* st, const char* c);
|
||||
void print_on(outputStream* st, const char* c = NULL) const;
|
||||
|
||||
@ -158,7 +158,7 @@ class ObjectClosure : public Closure {
|
||||
};
|
||||
|
||||
|
||||
class BoolObjectClosure : public ObjectClosure {
|
||||
class BoolObjectClosure : public Closure {
|
||||
public:
|
||||
virtual bool do_object_b(oop obj) = 0;
|
||||
};
|
||||
|
||||
@ -562,6 +562,9 @@ class SpaceManager : public CHeapObj<mtClass> {
|
||||
// protects allocations and contains.
|
||||
Mutex* const _lock;
|
||||
|
||||
// Type of metadata allocated.
|
||||
Metaspace::MetadataType _mdtype;
|
||||
|
||||
// Chunk related size
|
||||
size_t _medium_chunk_bunch;
|
||||
|
||||
@ -606,6 +609,7 @@ class SpaceManager : public CHeapObj<mtClass> {
|
||||
return (BlockFreelist*) &_block_freelists;
|
||||
}
|
||||
|
||||
Metaspace::MetadataType mdtype() { return _mdtype; }
|
||||
VirtualSpaceList* vs_list() const { return _vs_list; }
|
||||
|
||||
Metachunk* current_chunk() const { return _current_chunk; }
|
||||
@ -626,7 +630,8 @@ class SpaceManager : public CHeapObj<mtClass> {
|
||||
void initialize();
|
||||
|
||||
public:
|
||||
SpaceManager(Mutex* lock,
|
||||
SpaceManager(Metaspace::MetadataType mdtype,
|
||||
Mutex* lock,
|
||||
VirtualSpaceList* vs_list);
|
||||
~SpaceManager();
|
||||
|
||||
@ -2032,9 +2037,11 @@ void SpaceManager::print_on(outputStream* st) const {
|
||||
}
|
||||
}
|
||||
|
||||
SpaceManager::SpaceManager(Mutex* lock,
|
||||
SpaceManager::SpaceManager(Metaspace::MetadataType mdtype,
|
||||
Mutex* lock,
|
||||
VirtualSpaceList* vs_list) :
|
||||
_vs_list(vs_list),
|
||||
_mdtype(mdtype),
|
||||
_allocated_blocks_words(0),
|
||||
_allocated_chunks_words(0),
|
||||
_allocated_chunks_count(0),
|
||||
@ -2050,27 +2057,27 @@ void SpaceManager::inc_size_metrics(size_t words) {
|
||||
_allocated_chunks_words = _allocated_chunks_words + words;
|
||||
_allocated_chunks_count++;
|
||||
// Global total of capacity in allocated Metachunks
|
||||
MetaspaceAux::inc_capacity(words);
|
||||
MetaspaceAux::inc_capacity(mdtype(), words);
|
||||
// Global total of allocated Metablocks.
|
||||
// used_words_slow() includes the overhead in each
|
||||
// Metachunk so include it in the used when the
|
||||
// Metachunk is first added (so only added once per
|
||||
// Metachunk).
|
||||
MetaspaceAux::inc_used(Metachunk::overhead());
|
||||
MetaspaceAux::inc_used(mdtype(), Metachunk::overhead());
|
||||
}
|
||||
|
||||
void SpaceManager::inc_used_metrics(size_t words) {
|
||||
// Add to the per SpaceManager total
|
||||
Atomic::add_ptr(words, &_allocated_blocks_words);
|
||||
// Add to the global total
|
||||
MetaspaceAux::inc_used(words);
|
||||
MetaspaceAux::inc_used(mdtype(), words);
|
||||
}
|
||||
|
||||
void SpaceManager::dec_total_from_size_metrics() {
|
||||
MetaspaceAux::dec_capacity(allocated_chunks_words());
|
||||
MetaspaceAux::dec_used(allocated_blocks_words());
|
||||
MetaspaceAux::dec_capacity(mdtype(), allocated_chunks_words());
|
||||
MetaspaceAux::dec_used(mdtype(), allocated_blocks_words());
|
||||
// Also deduct the overhead per Metachunk
|
||||
MetaspaceAux::dec_used(allocated_chunks_count() * Metachunk::overhead());
|
||||
MetaspaceAux::dec_used(mdtype(), allocated_chunks_count() * Metachunk::overhead());
|
||||
}
|
||||
|
||||
void SpaceManager::initialize() {
|
||||
@ -2470,8 +2477,8 @@ void SpaceManager::mangle_freed_chunks() {
|
||||
// MetaspaceAux
|
||||
|
||||
|
||||
size_t MetaspaceAux::_allocated_capacity_words = 0;
|
||||
size_t MetaspaceAux::_allocated_used_words = 0;
|
||||
size_t MetaspaceAux::_allocated_capacity_words[] = {0, 0};
|
||||
size_t MetaspaceAux::_allocated_used_words[] = {0, 0};
|
||||
|
||||
size_t MetaspaceAux::free_bytes() {
|
||||
size_t result = 0;
|
||||
@ -2484,40 +2491,40 @@ size_t MetaspaceAux::free_bytes() {
|
||||
return result;
|
||||
}
|
||||
|
||||
void MetaspaceAux::dec_capacity(size_t words) {
|
||||
void MetaspaceAux::dec_capacity(Metaspace::MetadataType mdtype, size_t words) {
|
||||
assert_lock_strong(SpaceManager::expand_lock());
|
||||
assert(words <= _allocated_capacity_words,
|
||||
assert(words <= allocated_capacity_words(mdtype),
|
||||
err_msg("About to decrement below 0: words " SIZE_FORMAT
|
||||
" is greater than _allocated_capacity_words " SIZE_FORMAT,
|
||||
words, _allocated_capacity_words));
|
||||
_allocated_capacity_words = _allocated_capacity_words - words;
|
||||
" is greater than _allocated_capacity_words[%u] " SIZE_FORMAT,
|
||||
words, mdtype, allocated_capacity_words(mdtype)));
|
||||
_allocated_capacity_words[mdtype] -= words;
|
||||
}
|
||||
|
||||
void MetaspaceAux::inc_capacity(size_t words) {
|
||||
void MetaspaceAux::inc_capacity(Metaspace::MetadataType mdtype, size_t words) {
|
||||
assert_lock_strong(SpaceManager::expand_lock());
|
||||
// Needs to be atomic
|
||||
_allocated_capacity_words = _allocated_capacity_words + words;
|
||||
_allocated_capacity_words[mdtype] += words;
|
||||
}
|
||||
|
||||
void MetaspaceAux::dec_used(size_t words) {
|
||||
assert(words <= _allocated_used_words,
|
||||
void MetaspaceAux::dec_used(Metaspace::MetadataType mdtype, size_t words) {
|
||||
assert(words <= allocated_used_words(mdtype),
|
||||
err_msg("About to decrement below 0: words " SIZE_FORMAT
|
||||
" is greater than _allocated_used_words " SIZE_FORMAT,
|
||||
words, _allocated_used_words));
|
||||
" is greater than _allocated_used_words[%u] " SIZE_FORMAT,
|
||||
words, mdtype, allocated_used_words(mdtype)));
|
||||
// For CMS deallocation of the Metaspaces occurs during the
|
||||
// sweep which is a concurrent phase. Protection by the expand_lock()
|
||||
// is not enough since allocation is on a per Metaspace basis
|
||||
// and protected by the Metaspace lock.
|
||||
jlong minus_words = (jlong) - (jlong) words;
|
||||
Atomic::add_ptr(minus_words, &_allocated_used_words);
|
||||
Atomic::add_ptr(minus_words, &_allocated_used_words[mdtype]);
|
||||
}
|
||||
|
||||
void MetaspaceAux::inc_used(size_t words) {
|
||||
void MetaspaceAux::inc_used(Metaspace::MetadataType mdtype, size_t words) {
|
||||
// _allocated_used_words tracks allocations for
|
||||
// each piece of metadata. Those allocations are
|
||||
// generally done concurrently by different application
|
||||
// threads so must be done atomically.
|
||||
Atomic::add_ptr(words, &_allocated_used_words);
|
||||
Atomic::add_ptr(words, &_allocated_used_words[mdtype]);
|
||||
}
|
||||
|
||||
size_t MetaspaceAux::used_bytes_slow(Metaspace::MetadataType mdtype) {
|
||||
@ -2619,21 +2626,19 @@ void MetaspaceAux::print_on(outputStream* out) {
|
||||
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
|
||||
" reserved " SIZE_FORMAT "K",
|
||||
allocated_capacity_bytes()/K, allocated_used_bytes()/K, reserved_in_bytes()/K);
|
||||
#if 0
|
||||
// The calls to capacity_bytes_slow() and used_bytes_slow() cause
|
||||
// lock ordering assertion failures with some collectors. Do
|
||||
// not include this code until the lock ordering is fixed.
|
||||
if (PrintGCDetails && Verbose) {
|
||||
out->print_cr(" data space "
|
||||
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
|
||||
" reserved " SIZE_FORMAT "K",
|
||||
capacity_bytes_slow(nct)/K, used_bytes_slow(nct)/K, reserved_in_bytes(nct)/K);
|
||||
out->print_cr(" class space "
|
||||
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
|
||||
" reserved " SIZE_FORMAT "K",
|
||||
capacity_bytes_slow(ct)/K, used_bytes_slow(ct)/K, reserved_in_bytes(ct)/K);
|
||||
}
|
||||
#endif
|
||||
|
||||
out->print_cr(" data space "
|
||||
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
|
||||
" reserved " SIZE_FORMAT "K",
|
||||
allocated_capacity_bytes(nct)/K,
|
||||
allocated_used_bytes(nct)/K,
|
||||
reserved_in_bytes(nct)/K);
|
||||
out->print_cr(" class space "
|
||||
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
|
||||
" reserved " SIZE_FORMAT "K",
|
||||
allocated_capacity_bytes(ct)/K,
|
||||
allocated_used_bytes(ct)/K,
|
||||
reserved_in_bytes(ct)/K);
|
||||
}
|
||||
|
||||
// Print information for class space and data space separately.
|
||||
@ -2717,24 +2722,42 @@ void MetaspaceAux::verify_free_chunks() {
|
||||
void MetaspaceAux::verify_capacity() {
|
||||
#ifdef ASSERT
|
||||
size_t running_sum_capacity_bytes = allocated_capacity_bytes();
|
||||
// For purposes of the running sum of used, verify against capacity
|
||||
// For purposes of the running sum of capacity, verify against capacity
|
||||
size_t capacity_in_use_bytes = capacity_bytes_slow();
|
||||
assert(running_sum_capacity_bytes == capacity_in_use_bytes,
|
||||
err_msg("allocated_capacity_words() * BytesPerWord " SIZE_FORMAT
|
||||
" capacity_bytes_slow()" SIZE_FORMAT,
|
||||
running_sum_capacity_bytes, capacity_in_use_bytes));
|
||||
for (Metaspace::MetadataType i = Metaspace::ClassType;
|
||||
i < Metaspace:: MetadataTypeCount;
|
||||
i = (Metaspace::MetadataType)(i + 1)) {
|
||||
size_t capacity_in_use_bytes = capacity_bytes_slow(i);
|
||||
assert(allocated_capacity_bytes(i) == capacity_in_use_bytes,
|
||||
err_msg("allocated_capacity_bytes(%u) " SIZE_FORMAT
|
||||
" capacity_bytes_slow(%u)" SIZE_FORMAT,
|
||||
i, allocated_capacity_bytes(i), i, capacity_in_use_bytes));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void MetaspaceAux::verify_used() {
|
||||
#ifdef ASSERT
|
||||
size_t running_sum_used_bytes = allocated_used_bytes();
|
||||
// For purposes of the running sum of used, verify against capacity
|
||||
// For purposes of the running sum of used, verify against used
|
||||
size_t used_in_use_bytes = used_bytes_slow();
|
||||
assert(allocated_used_bytes() == used_in_use_bytes,
|
||||
err_msg("allocated_used_bytes() " SIZE_FORMAT
|
||||
" used_bytes_slow()()" SIZE_FORMAT,
|
||||
" used_bytes_slow()" SIZE_FORMAT,
|
||||
allocated_used_bytes(), used_in_use_bytes));
|
||||
for (Metaspace::MetadataType i = Metaspace::ClassType;
|
||||
i < Metaspace:: MetadataTypeCount;
|
||||
i = (Metaspace::MetadataType)(i + 1)) {
|
||||
size_t used_in_use_bytes = used_bytes_slow(i);
|
||||
assert(allocated_used_bytes(i) == used_in_use_bytes,
|
||||
err_msg("allocated_used_bytes(%u) " SIZE_FORMAT
|
||||
" used_bytes_slow(%u)" SIZE_FORMAT,
|
||||
i, allocated_used_bytes(i), i, used_in_use_bytes));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2835,7 +2858,7 @@ void Metaspace::initialize(Mutex* lock,
|
||||
assert(space_list() != NULL,
|
||||
"Metadata VirtualSpaceList has not been initialized");
|
||||
|
||||
_vsm = new SpaceManager(lock, space_list());
|
||||
_vsm = new SpaceManager(Metaspace::NonClassType, lock, space_list());
|
||||
if (_vsm == NULL) {
|
||||
return;
|
||||
}
|
||||
@ -2849,7 +2872,7 @@ void Metaspace::initialize(Mutex* lock,
|
||||
"Class VirtualSpaceList has not been initialized");
|
||||
|
||||
// Allocate SpaceManager for classes.
|
||||
_class_vsm = new SpaceManager(lock, class_space_list());
|
||||
_class_vsm = new SpaceManager(Metaspace::ClassType, lock, class_space_list());
|
||||
if (_class_vsm == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -86,7 +86,10 @@ class Metaspace : public CHeapObj<mtClass> {
|
||||
friend class MetaspaceAux;
|
||||
|
||||
public:
|
||||
enum MetadataType {ClassType, NonClassType};
|
||||
enum MetadataType {ClassType = 0,
|
||||
NonClassType = ClassType + 1,
|
||||
MetadataTypeCount = ClassType + 2
|
||||
};
|
||||
enum MetaspaceType {
|
||||
StandardMetaspaceType,
|
||||
BootMetaspaceType,
|
||||
@ -184,20 +187,22 @@ class MetaspaceAux : AllStatic {
|
||||
public:
|
||||
// Running sum of space in all Metachunks that has been
|
||||
// allocated to a Metaspace. This is used instead of
|
||||
// iterating over all the classloaders
|
||||
static size_t _allocated_capacity_words;
|
||||
// iterating over all the classloaders. One for each
|
||||
// type of Metadata
|
||||
static size_t _allocated_capacity_words[Metaspace:: MetadataTypeCount];
|
||||
// Running sum of space in all Metachunks that have
|
||||
// are being used for metadata.
|
||||
static size_t _allocated_used_words;
|
||||
// are being used for metadata. One for each
|
||||
// type of Metadata.
|
||||
static size_t _allocated_used_words[Metaspace:: MetadataTypeCount];
|
||||
|
||||
public:
|
||||
// Decrement and increment _allocated_capacity_words
|
||||
static void dec_capacity(size_t words);
|
||||
static void inc_capacity(size_t words);
|
||||
static void dec_capacity(Metaspace::MetadataType type, size_t words);
|
||||
static void inc_capacity(Metaspace::MetadataType type, size_t words);
|
||||
|
||||
// Decrement and increment _allocated_used_words
|
||||
static void dec_used(size_t words);
|
||||
static void inc_used(size_t words);
|
||||
static void dec_used(Metaspace::MetadataType type, size_t words);
|
||||
static void inc_used(Metaspace::MetadataType type, size_t words);
|
||||
|
||||
// Total of space allocated to metadata in all Metaspaces.
|
||||
// This sums the space used in each Metachunk by
|
||||
@ -211,18 +216,32 @@ class MetaspaceAux : AllStatic {
|
||||
static size_t free_chunks_total();
|
||||
static size_t free_chunks_total_in_bytes();
|
||||
|
||||
static size_t allocated_capacity_words(Metaspace::MetadataType mdtype) {
|
||||
return _allocated_capacity_words[mdtype];
|
||||
}
|
||||
static size_t allocated_capacity_words() {
|
||||
return _allocated_capacity_words;
|
||||
return _allocated_capacity_words[Metaspace::ClassType] +
|
||||
_allocated_capacity_words[Metaspace::NonClassType];
|
||||
}
|
||||
static size_t allocated_capacity_bytes(Metaspace::MetadataType mdtype) {
|
||||
return allocated_capacity_words(mdtype) * BytesPerWord;
|
||||
}
|
||||
static size_t allocated_capacity_bytes() {
|
||||
return _allocated_capacity_words * BytesPerWord;
|
||||
return allocated_capacity_words() * BytesPerWord;
|
||||
}
|
||||
|
||||
static size_t allocated_used_words(Metaspace::MetadataType mdtype) {
|
||||
return _allocated_used_words[mdtype];
|
||||
}
|
||||
static size_t allocated_used_words() {
|
||||
return _allocated_used_words;
|
||||
return _allocated_used_words[Metaspace::ClassType] +
|
||||
_allocated_used_words[Metaspace::NonClassType];
|
||||
}
|
||||
static size_t allocated_used_bytes(Metaspace::MetadataType mdtype) {
|
||||
return allocated_used_words(mdtype) * BytesPerWord;
|
||||
}
|
||||
static size_t allocated_used_bytes() {
|
||||
return _allocated_used_words * BytesPerWord;
|
||||
return allocated_used_words() * BytesPerWord;
|
||||
}
|
||||
|
||||
static size_t free_bytes();
|
||||
|
||||
@ -252,7 +252,6 @@ uint ReferenceProcessor::count_jni_refs() {
|
||||
class AlwaysAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
virtual bool do_object_b(oop obj) { return true; }
|
||||
virtual void do_object(oop obj) { assert(false, "Don't call"); }
|
||||
};
|
||||
|
||||
class CountHandleClosure: public OopClosure {
|
||||
|
||||
@ -212,7 +212,6 @@ void SharedHeap::process_strong_roots(bool activate_scope,
|
||||
|
||||
class AlwaysTrueClosure: public BoolObjectClosure {
|
||||
public:
|
||||
void do_object(oop p) { ShouldNotReachHere(); }
|
||||
bool do_object_b(oop p) { return true; }
|
||||
};
|
||||
static AlwaysTrueClosure always_true;
|
||||
|
||||
@ -965,7 +965,7 @@ public:
|
||||
// Has use internal to the vector set (ie. not in a phi at the loop head)
|
||||
bool has_use_internal_to_set( Node* n, VectorSet& vset, IdealLoopTree *loop );
|
||||
// clone "n" for uses that are outside of loop
|
||||
void clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist );
|
||||
int clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist );
|
||||
// clone "n" for special uses that are in the not_peeled region
|
||||
void clone_for_special_use_inside_loop( IdealLoopTree *loop, Node* n,
|
||||
VectorSet& not_peel, Node_List& sink_list, Node_List& worklist );
|
||||
|
||||
@ -1939,8 +1939,8 @@ bool PhaseIdealLoop::has_use_internal_to_set( Node* n, VectorSet& vset, IdealLoo
|
||||
|
||||
//------------------------------ clone_for_use_outside_loop -------------------------------------
|
||||
// clone "n" for uses that are outside of loop
|
||||
void PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist ) {
|
||||
|
||||
int PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, Node_List& worklist ) {
|
||||
int cloned = 0;
|
||||
assert(worklist.size() == 0, "should be empty");
|
||||
for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
|
||||
Node* use = n->fast_out(j);
|
||||
@ -1960,6 +1960,7 @@ void PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, N
|
||||
// clone "n" and insert it between the inputs of "n" and the use outside the loop
|
||||
Node* n_clone = n->clone();
|
||||
_igvn.replace_input_of(use, j, n_clone);
|
||||
cloned++;
|
||||
Node* use_c;
|
||||
if (!use->is_Phi()) {
|
||||
use_c = has_ctrl(use) ? get_ctrl(use) : use->in(0);
|
||||
@ -1977,6 +1978,7 @@ void PhaseIdealLoop::clone_for_use_outside_loop( IdealLoopTree *loop, Node* n, N
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return cloned;
|
||||
}
|
||||
|
||||
|
||||
@ -2495,6 +2497,7 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
|
||||
|
||||
// Evacuate nodes in peel region into the not_peeled region if possible
|
||||
uint new_phi_cnt = 0;
|
||||
uint cloned_for_outside_use = 0;
|
||||
for (i = 0; i < peel_list.size();) {
|
||||
Node* n = peel_list.at(i);
|
||||
#if !defined(PRODUCT)
|
||||
@ -2513,8 +2516,7 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
|
||||
// if not pinned and not a load (which maybe anti-dependent on a store)
|
||||
// and not a CMove (Matcher expects only bool->cmove).
|
||||
if ( n->in(0) == NULL && !n->is_Load() && !n->is_CMove() ) {
|
||||
clone_for_use_outside_loop( loop, n, worklist );
|
||||
|
||||
cloned_for_outside_use += clone_for_use_outside_loop( loop, n, worklist );
|
||||
sink_list.push(n);
|
||||
peel >>= n->_idx; // delete n from peel set.
|
||||
not_peel <<= n->_idx; // add n to not_peel set.
|
||||
@ -2551,6 +2553,12 @@ bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
|
||||
// Inhibit more partial peeling on this loop
|
||||
assert(!head->is_partial_peel_loop(), "not partial peeled");
|
||||
head->mark_partial_peel_failed();
|
||||
if (cloned_for_outside_use > 0) {
|
||||
// Terminate this round of loop opts because
|
||||
// the graph outside this loop was changed.
|
||||
C->set_major_progress();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -5015,6 +5015,9 @@ _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
|
||||
#ifndef PRODUCT
|
||||
|
||||
#include "gc_interface/collectedHeap.hpp"
|
||||
#if INCLUDE_ALL_GCS
|
||||
#include "gc_implementation/g1/heapRegionRemSet.hpp"
|
||||
#endif
|
||||
#include "utilities/quickSort.hpp"
|
||||
#if INCLUDE_VM_STRUCTS
|
||||
#include "runtime/vmStructs.hpp"
|
||||
@ -5034,6 +5037,9 @@ void execute_internal_vm_tests() {
|
||||
run_unit_test(AltHashing::test_alt_hash());
|
||||
#if INCLUDE_VM_STRUCTS
|
||||
run_unit_test(VMStructs::test());
|
||||
#endif
|
||||
#if INCLUDE_ALL_GCS
|
||||
run_unit_test(HeapRegionRemSet::test_prt());
|
||||
#endif
|
||||
tty->print_cr("All internal VM tests passed");
|
||||
}
|
||||
|
||||
@ -1624,15 +1624,19 @@ void JvmtiExport::post_raw_field_modification(JavaThread *thread, Method* method
|
||||
}
|
||||
}
|
||||
|
||||
assert(sig_type != '[', "array should have sig_type == 'L'");
|
||||
bool handle_created = false;
|
||||
|
||||
// convert oop to JNI handle.
|
||||
if (sig_type == 'L' || sig_type == '[') {
|
||||
if (sig_type == 'L') {
|
||||
handle_created = true;
|
||||
value->l = (jobject)JNIHandles::make_local(thread, (oop)value->l);
|
||||
}
|
||||
|
||||
post_field_modification(thread, method, location, field_klass, object, field, sig_type, value);
|
||||
|
||||
// Destroy the JNI handle allocated above.
|
||||
if (sig_type == 'L') {
|
||||
if (handle_created) {
|
||||
JNIHandles::destroy_local(value->l);
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ void AdvancedThresholdPolicy::initialize() {
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
set_increase_threshold_at_ratio();
|
||||
set_start_time(os::javaTimeMillis());
|
||||
}
|
||||
|
||||
@ -205,6 +205,17 @@ double AdvancedThresholdPolicy::threshold_scale(CompLevel level, int feedback_k)
|
||||
double queue_size = CompileBroker::queue_size(level);
|
||||
int comp_count = compiler_count(level);
|
||||
double k = queue_size / (feedback_k * comp_count) + 1;
|
||||
|
||||
// Increase C1 compile threshold when the code cache is filled more
|
||||
// than specified by IncreaseFirstTierCompileThresholdAt percentage.
|
||||
// The main intention is to keep enough free space for C2 compiled code
|
||||
// to achieve peak performance if the code cache is under stress.
|
||||
if ((TieredStopAtLevel == CompLevel_full_optimization) && (level != CompLevel_full_optimization)) {
|
||||
double current_reverse_free_ratio = CodeCache::reverse_free_ratio();
|
||||
if (current_reverse_free_ratio > _increase_threshold_at_ratio) {
|
||||
k *= exp(current_reverse_free_ratio - _increase_threshold_at_ratio);
|
||||
}
|
||||
}
|
||||
return k;
|
||||
}
|
||||
|
||||
|
||||
@ -201,9 +201,12 @@ class AdvancedThresholdPolicy : public SimpleThresholdPolicy {
|
||||
// Is method profiled enough?
|
||||
bool is_method_profiled(Method* method);
|
||||
|
||||
double _increase_threshold_at_ratio;
|
||||
|
||||
protected:
|
||||
void print_specific(EventType type, methodHandle mh, methodHandle imh, int bci, CompLevel level);
|
||||
|
||||
void set_increase_threshold_at_ratio() { _increase_threshold_at_ratio = 100 / (100 - (double)IncreaseFirstTierCompileThresholdAt); }
|
||||
void set_start_time(jlong t) { _start_time = t; }
|
||||
jlong start_time() const { return _start_time; }
|
||||
|
||||
|
||||
@ -2629,6 +2629,16 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
FLAG_SET_CMDLINE(uintx, ReservedCodeCacheSize, (uintx)long_ReservedCodeCacheSize);
|
||||
//-XX:IncreaseFirstTierCompileThresholdAt=
|
||||
} else if (match_option(option, "-XX:IncreaseFirstTierCompileThresholdAt=", &tail)) {
|
||||
uintx uint_IncreaseFirstTierCompileThresholdAt = 0;
|
||||
if (!parse_uintx(tail, &uint_IncreaseFirstTierCompileThresholdAt, 0) || uint_IncreaseFirstTierCompileThresholdAt > 99) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Invalid value for IncreaseFirstTierCompileThresholdAt: %s. Should be between 0 and 99.\n",
|
||||
option->optionString);
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
FLAG_SET_CMDLINE(uintx, IncreaseFirstTierCompileThresholdAt, (uintx)uint_IncreaseFirstTierCompileThresholdAt);
|
||||
// -green
|
||||
} else if (match_option(option, "-green", &tail)) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
|
||||
@ -3436,6 +3436,10 @@ class CommandLineFlags {
|
||||
"Start profiling in interpreter if the counters exceed tier 3" \
|
||||
"thresholds by the specified percentage") \
|
||||
\
|
||||
product(uintx, IncreaseFirstTierCompileThresholdAt, 50, \
|
||||
"Increase the compile threshold for C1 compilation if the code" \
|
||||
"cache is filled by the specified percentage.") \
|
||||
\
|
||||
product(intx, TieredRateUpdateMinTime, 1, \
|
||||
"Minimum rate sampling interval (in milliseconds)") \
|
||||
\
|
||||
|
||||
@ -188,7 +188,6 @@ long JNIHandles::weak_global_handle_memory_usage() {
|
||||
class AlwaysAliveClosure: public BoolObjectClosure {
|
||||
public:
|
||||
bool do_object_b(oop obj) { return true; }
|
||||
void do_object(oop obj) { assert(false, "Don't call"); }
|
||||
};
|
||||
|
||||
class CountHandleClosure: public OopClosure {
|
||||
|
||||
@ -665,152 +665,4 @@ void help() {
|
||||
tty->print_cr(" ndebug() - undo debug");
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
// BobV's command parser for debugging on windows when nothing else works.
|
||||
|
||||
enum CommandID {
|
||||
CMDID_HELP,
|
||||
CMDID_QUIT,
|
||||
CMDID_HSFIND,
|
||||
CMDID_PSS,
|
||||
CMDID_PS,
|
||||
CMDID_PSF,
|
||||
CMDID_FINDM,
|
||||
CMDID_FINDNM,
|
||||
CMDID_PP,
|
||||
CMDID_BPT,
|
||||
CMDID_EXIT,
|
||||
CMDID_VERIFY,
|
||||
CMDID_THREADS,
|
||||
CMDID_ILLEGAL = 99
|
||||
};
|
||||
|
||||
struct CommandParser {
|
||||
char *name;
|
||||
CommandID code;
|
||||
char *description;
|
||||
};
|
||||
|
||||
struct CommandParser CommandList[] = {
|
||||
(char *)"help", CMDID_HELP, " Dump this list",
|
||||
(char *)"quit", CMDID_QUIT, " Return from this routine",
|
||||
(char *)"hsfind", CMDID_HSFIND, "Perform an hsfind on an address",
|
||||
(char *)"ps", CMDID_PS, " Print Current Thread Stack Trace",
|
||||
(char *)"pss", CMDID_PSS, " Print All Thread Stack Trace",
|
||||
(char *)"psf", CMDID_PSF, " Print All Stack Frames",
|
||||
(char *)"findm", CMDID_FINDM, " Find a Method* from a PC",
|
||||
(char *)"findnm", CMDID_FINDNM, "Find an nmethod from a PC",
|
||||
(char *)"pp", CMDID_PP, " Find out something about a pointer",
|
||||
(char *)"break", CMDID_BPT, " Execute a breakpoint",
|
||||
(char *)"exitvm", CMDID_EXIT, "Exit the VM",
|
||||
(char *)"verify", CMDID_VERIFY, "Perform a Heap Verify",
|
||||
(char *)"thread", CMDID_THREADS, "Dump Info on all Threads",
|
||||
(char *)0, CMDID_ILLEGAL
|
||||
};
|
||||
|
||||
|
||||
// get_debug_command()
|
||||
//
|
||||
// Read a command from standard input.
|
||||
// This is useful when you have a debugger
|
||||
// which doesn't support calling into functions.
|
||||
//
|
||||
void get_debug_command()
|
||||
{
|
||||
ssize_t count;
|
||||
int i,j;
|
||||
bool gotcommand;
|
||||
intptr_t addr;
|
||||
char buffer[256];
|
||||
nmethod *nm;
|
||||
Method* m;
|
||||
|
||||
tty->print_cr("You have entered the diagnostic command interpreter");
|
||||
tty->print("The supported commands are:\n");
|
||||
for ( i=0; ; i++ ) {
|
||||
if ( CommandList[i].code == CMDID_ILLEGAL )
|
||||
break;
|
||||
tty->print_cr(" %s \n", CommandList[i].name );
|
||||
}
|
||||
|
||||
while ( 1 ) {
|
||||
gotcommand = false;
|
||||
tty->print("Please enter a command: ");
|
||||
count = scanf("%s", buffer) ;
|
||||
if ( count >=0 ) {
|
||||
for ( i=0; ; i++ ) {
|
||||
if ( CommandList[i].code == CMDID_ILLEGAL ) {
|
||||
if (!gotcommand) tty->print("Invalid command, please try again\n");
|
||||
break;
|
||||
}
|
||||
if ( strcmp(buffer, CommandList[i].name) == 0 ) {
|
||||
gotcommand = true;
|
||||
switch ( CommandList[i].code ) {
|
||||
case CMDID_PS:
|
||||
ps();
|
||||
break;
|
||||
case CMDID_PSS:
|
||||
pss();
|
||||
break;
|
||||
case CMDID_PSF:
|
||||
psf();
|
||||
break;
|
||||
case CMDID_FINDM:
|
||||
tty->print("Please enter the hex addr to pass to findm: ");
|
||||
scanf("%I64X", &addr);
|
||||
m = (Method*)findm(addr);
|
||||
tty->print("findm(0x%I64X) returned 0x%I64X\n", addr, m);
|
||||
break;
|
||||
case CMDID_FINDNM:
|
||||
tty->print("Please enter the hex addr to pass to findnm: ");
|
||||
scanf("%I64X", &addr);
|
||||
nm = (nmethod*)findnm(addr);
|
||||
tty->print("findnm(0x%I64X) returned 0x%I64X\n", addr, nm);
|
||||
break;
|
||||
case CMDID_PP:
|
||||
tty->print("Please enter the hex addr to pass to pp: ");
|
||||
scanf("%I64X", &addr);
|
||||
pp((void*)addr);
|
||||
break;
|
||||
case CMDID_EXIT:
|
||||
exit(0);
|
||||
case CMDID_HELP:
|
||||
tty->print("Here are the supported commands: ");
|
||||
for ( j=0; ; j++ ) {
|
||||
if ( CommandList[j].code == CMDID_ILLEGAL )
|
||||
break;
|
||||
tty->print_cr(" %s -- %s\n", CommandList[j].name,
|
||||
CommandList[j].description );
|
||||
}
|
||||
break;
|
||||
case CMDID_QUIT:
|
||||
return;
|
||||
break;
|
||||
case CMDID_BPT:
|
||||
BREAKPOINT;
|
||||
break;
|
||||
case CMDID_VERIFY:
|
||||
verify();;
|
||||
break;
|
||||
case CMDID_THREADS:
|
||||
threads();;
|
||||
break;
|
||||
case CMDID_HSFIND:
|
||||
tty->print("Please enter the hex addr to pass to hsfind: ");
|
||||
scanf("%I64X", &addr);
|
||||
tty->print("Calling hsfind(0x%I64X)\n", addr);
|
||||
hsfind(addr);
|
||||
break;
|
||||
default:
|
||||
case CMDID_ILLEGAL:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // !PRODUCT
|
||||
|
||||
@ -33,6 +33,7 @@
|
||||
#include "utilities/dtrace.hpp"
|
||||
#include "utilities/hashtable.hpp"
|
||||
#include "utilities/hashtable.inline.hpp"
|
||||
#include "utilities/numberSeq.hpp"
|
||||
|
||||
|
||||
// This is a generic hashtable, designed to be used for the symbol
|
||||
@ -237,6 +238,57 @@ template <class T, MEMFLAGS F> void Hashtable<T, F>::reverse(void* boundary) {
|
||||
}
|
||||
}
|
||||
|
||||
template <class T, MEMFLAGS F> int Hashtable<T, F>::literal_size(Symbol *symbol) {
|
||||
return symbol->size() * HeapWordSize;
|
||||
}
|
||||
|
||||
template <class T, MEMFLAGS F> int Hashtable<T, F>::literal_size(oop oop) {
|
||||
// NOTE: this would over-count if (pre-JDK8) java_lang_Class::has_offset_field() is true,
|
||||
// and the String.value array is shared by several Strings. However, starting from JDK8,
|
||||
// the String.value array is not shared anymore.
|
||||
assert(oop != NULL && oop->klass() == SystemDictionary::String_klass(), "only strings are supported");
|
||||
return (oop->size() + java_lang_String::value(oop)->size()) * HeapWordSize;
|
||||
}
|
||||
|
||||
// Dump footprint and bucket length statistics
|
||||
//
|
||||
// Note: if you create a new subclass of Hashtable<MyNewType, F>, you will need to
|
||||
// add a new function Hashtable<T, F>::literal_size(MyNewType lit)
|
||||
|
||||
template <class T, MEMFLAGS F> void Hashtable<T, F>::dump_table(outputStream* st, const char *table_name) {
|
||||
NumberSeq summary;
|
||||
int literal_bytes = 0;
|
||||
for (int i = 0; i < this->table_size(); ++i) {
|
||||
int count = 0;
|
||||
for (HashtableEntry<T, F>* e = bucket(i);
|
||||
e != NULL; e = e->next()) {
|
||||
count++;
|
||||
literal_bytes += literal_size(e->literal());
|
||||
}
|
||||
summary.add((double)count);
|
||||
}
|
||||
double num_buckets = summary.num();
|
||||
double num_entries = summary.sum();
|
||||
|
||||
int bucket_bytes = (int)num_buckets * sizeof(bucket(0));
|
||||
int entry_bytes = (int)num_entries * sizeof(HashtableEntry<T, F>);
|
||||
int total_bytes = literal_bytes + bucket_bytes + entry_bytes;
|
||||
|
||||
double bucket_avg = (num_buckets <= 0) ? 0 : (bucket_bytes / num_buckets);
|
||||
double entry_avg = (num_entries <= 0) ? 0 : (entry_bytes / num_entries);
|
||||
double literal_avg = (num_entries <= 0) ? 0 : (literal_bytes / num_entries);
|
||||
|
||||
st->print_cr("%s statistics:", table_name);
|
||||
st->print_cr("Number of buckets : %9d = %9d bytes, avg %7.3f", (int)num_buckets, bucket_bytes, bucket_avg);
|
||||
st->print_cr("Number of entries : %9d = %9d bytes, avg %7.3f", (int)num_entries, entry_bytes, entry_avg);
|
||||
st->print_cr("Number of literals : %9d = %9d bytes, avg %7.3f", (int)num_entries, literal_bytes, literal_avg);
|
||||
st->print_cr("Total footprint : %9s = %9d bytes", "", total_bytes);
|
||||
st->print_cr("Average bucket size : %9.3f", summary.avg());
|
||||
st->print_cr("Variance of bucket size : %9.3f", summary.variance());
|
||||
st->print_cr("Std. dev. of bucket size: %9.3f", summary.sd());
|
||||
st->print_cr("Maximum bucket size : %9d", (int)summary.maximum());
|
||||
}
|
||||
|
||||
|
||||
// Dump the hash table buckets.
|
||||
|
||||
|
||||
@ -282,6 +282,19 @@ protected:
|
||||
static bool use_alternate_hashcode() { return _seed != 0; }
|
||||
static jint seed() { return _seed; }
|
||||
|
||||
static int literal_size(Symbol *symbol);
|
||||
static int literal_size(oop oop);
|
||||
|
||||
// The following two are currently not used, but are needed anyway because some
|
||||
// C++ compilers (MacOS and Solaris) force the instantiation of
|
||||
// Hashtable<ConstantPool*, mtClass>::dump_table() even though we never call this function
|
||||
// in the VM code.
|
||||
static int literal_size(ConstantPool *cp) {Unimplemented(); return 0;}
|
||||
static int literal_size(Klass *k) {Unimplemented(); return 0;}
|
||||
|
||||
public:
|
||||
void dump_table(outputStream* st, const char *table_name);
|
||||
|
||||
private:
|
||||
static jint _seed;
|
||||
};
|
||||
|
||||
153
hotspot/test/compiler/8010927/Test8010927.java
Normal file
153
hotspot/test/compiler/8010927/Test8010927.java
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8010927
|
||||
* @summary Kitchensink crashed with SIGSEGV, Problematic frame: v ~StubRoutines::checkcast_arraycopy
|
||||
* @library /testlibrary/whitebox /testlibrary
|
||||
* @build Test8010927
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
* @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. -Xmx64m -XX:NewSize=20971520 -XX:MaxNewSize=32m -XX:-UseTLAB -XX:-UseParNewGC -XX:-UseAdaptiveSizePolicy Test8010927
|
||||
*/
|
||||
|
||||
import sun.hotspot.WhiteBox;
|
||||
import java.lang.reflect.Field;
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
/**
|
||||
* The test creates uncommitted space between oldgen and young gen
|
||||
* by specifying MaxNewSize bigger than NewSize.
|
||||
* NewSize = 20971520 = (512*4K) * 10 for 4k pages
|
||||
* Then it tries to execute arraycopy() with elements type check
|
||||
* to the array at the end of survive space near unused space.
|
||||
*/
|
||||
|
||||
public class Test8010927 {
|
||||
|
||||
private static final Unsafe U;
|
||||
|
||||
static {
|
||||
try {
|
||||
Field unsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
unsafe.setAccessible(true);
|
||||
U = (Unsafe) unsafe.get(null);
|
||||
} catch (Exception e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static Object[] o;
|
||||
|
||||
public static final boolean debug = Boolean.getBoolean("debug");
|
||||
|
||||
// 2 different obect arrays but same element types
|
||||
static Test8010927[] masterA;
|
||||
static Object[] masterB;
|
||||
static final Test8010927 elem = new Test8010927();
|
||||
static final WhiteBox wb = WhiteBox.getWhiteBox();
|
||||
|
||||
static final int obj_header_size = U.ARRAY_OBJECT_BASE_OFFSET;
|
||||
static final int heap_oop_size = wb.getHeapOopSize();
|
||||
static final int card_size = 512;
|
||||
static final int one_card = (card_size - obj_header_size)/heap_oop_size;
|
||||
|
||||
static final int surv_size = 2112 * 1024;
|
||||
|
||||
// The size is big to not fit into survive space.
|
||||
static final Object[] cache = new Object[(surv_size / card_size)];
|
||||
|
||||
public static void main(String[] args) {
|
||||
masterA = new Test8010927[one_card];
|
||||
masterB = new Object[one_card];
|
||||
for (int i = 0; i < one_card; ++i) {
|
||||
masterA[i] = elem;
|
||||
masterB[i] = elem;
|
||||
}
|
||||
|
||||
// Move cache[] to the old gen.
|
||||
long low_limit = wb.getObjectAddress(cache);
|
||||
System.gc();
|
||||
// Move 'cache' to oldgen.
|
||||
long upper_limit = wb.getObjectAddress(cache);
|
||||
if ((low_limit - upper_limit) > 0) { // substaction works with unsigned values
|
||||
// OldGen is placed before youngger for ParallelOldGC.
|
||||
upper_limit = low_limit + 21000000l; // +20971520
|
||||
}
|
||||
// Each A[one_card] size is 512 bytes,
|
||||
// it will take about 40000 allocations to trigger GC.
|
||||
// cache[] has 8192 elements so GC should happen
|
||||
// each 5th iteration.
|
||||
for(long l = 0; l < 20; l++) {
|
||||
fill_heap();
|
||||
if (debug) {
|
||||
System.out.println("test oop_disjoint_arraycopy");
|
||||
}
|
||||
testA_arraycopy();
|
||||
if (debug) {
|
||||
System.out.println("test checkcast_arraycopy");
|
||||
}
|
||||
testB_arraycopy();
|
||||
// Execute arraycopy to the topmost array in young gen
|
||||
if (debug) {
|
||||
int top_index = get_top_address(low_limit, upper_limit);
|
||||
if (top_index >= 0) {
|
||||
long addr = wb.getObjectAddress(cache[top_index]);
|
||||
System.out.println("top_addr: 0x" + Long.toHexString(addr) + ", 0x" + Long.toHexString(addr + 512));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static void fill_heap() {
|
||||
for (int i = 0; i < cache.length; ++i) {
|
||||
o = new Test8010927[one_card];
|
||||
System.arraycopy(masterA, 0, o, 0, masterA.length);
|
||||
cache[i] = o;
|
||||
}
|
||||
for (long j = 0; j < 256; ++j) {
|
||||
o = new Long[10000]; // to trigger GC
|
||||
}
|
||||
}
|
||||
static void testA_arraycopy() {
|
||||
for (int i = 0; i < cache.length; ++i) {
|
||||
System.arraycopy(masterA, 0, cache[i], 0, masterA.length);
|
||||
}
|
||||
}
|
||||
static void testB_arraycopy() {
|
||||
for (int i = 0; i < cache.length; ++i) {
|
||||
System.arraycopy(masterB, 0, cache[i], 0, masterB.length);
|
||||
}
|
||||
}
|
||||
static int get_top_address(long min, long max) {
|
||||
int index = -1;
|
||||
long addr = min;
|
||||
for (int i = 0; i < cache.length; ++i) {
|
||||
long test = wb.getObjectAddress(cache[i]);
|
||||
if (((test - addr) > 0) && ((max - test) > 0)) { // substaction works with unsigned values
|
||||
addr = test;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
}
|
||||
@ -1,31 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
|
||||
##
|
||||
## @test Test7158804.sh
|
||||
## @bug 7158804
|
||||
## @summary Improve config file parsing
|
||||
## @run shell Test7158804.sh
|
||||
##
|
||||
if [ "${TESTSRC}" = "" ]
|
||||
then
|
||||
TESTSRC=${PWD}
|
||||
echo "TESTSRC not set. Using "${TESTSRC}" as default"
|
||||
fi
|
||||
echo "TESTSRC=${TESTSRC}"
|
||||
## Adding common setup Variables for running shell tests.
|
||||
. ${TESTSRC}/../../test_env.sh
|
||||
|
||||
rm -f .hotspotrc
|
||||
echo -XX:+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >.hotspotrc
|
||||
${TESTJAVA}/bin/java ${TESTVMOPTS} -XX:+IgnoreUnrecognizedVMOptions -XX:Flags=.hotspotrc -version
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Test Failed"
|
||||
exit 1
|
||||
fi
|
||||
rm -f .hotspotrc
|
||||
exit 0
|
||||
55
hotspot/test/runtime/CommandLine/ConfigFileParsing.java
Normal file
55
hotspot/test/runtime/CommandLine/ConfigFileParsing.java
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test ConfigFileParsing
|
||||
* @bug 7158804
|
||||
* @summary Improve config file parsing
|
||||
* @library /testlibrary
|
||||
*/
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import com.oracle.java.testlibrary.*;
|
||||
|
||||
public class ConfigFileParsing {
|
||||
public static void main(String[] args) throws Exception {
|
||||
String testFileName = ".hotspotrc";
|
||||
|
||||
// Create really long invalid option
|
||||
String reallyLongInvalidOption = "";
|
||||
for (int i=0; i<5000; i++)
|
||||
reallyLongInvalidOption+='a';
|
||||
|
||||
// Populate the options file with really long string
|
||||
PrintWriter pw = new PrintWriter(testFileName);
|
||||
pw.println("-XX:+" + reallyLongInvalidOption);
|
||||
pw.close();
|
||||
|
||||
// start VM
|
||||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
|
||||
"-XX:+IgnoreUnrecognizedVMOptions", "-XX:Flags=.hotspotrc", "-version");
|
||||
|
||||
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||
output.shouldHaveExitValue(0);
|
||||
}
|
||||
}
|
||||
@ -32,10 +32,10 @@ import com.oracle.java.testlibrary.*;
|
||||
* @library /testlibrary
|
||||
* @build Agent
|
||||
* @run main ClassFileInstaller Agent
|
||||
* @run main Test
|
||||
* @run main TestRedefineObject
|
||||
* @run main/othervm -javaagent:agent.jar Agent
|
||||
*/
|
||||
public class Test {
|
||||
public class TestRedefineObject {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
PrintWriter pw = new PrintWriter("MANIFEST.MF");
|
||||
|
||||
@ -43,9 +43,9 @@ import sun.misc.Contended;
|
||||
* @bug 8003985
|
||||
* @summary Support Contended Annotation - JEP 142
|
||||
*
|
||||
* @run main/othervm -XX:-RestrictContended Test8003985
|
||||
* @run main/othervm -XX:-RestrictContended Basic
|
||||
*/
|
||||
public class Test8003985 {
|
||||
public class Basic {
|
||||
|
||||
private static final Unsafe U;
|
||||
private static int ADDRESS_SIZE;
|
||||
185
hotspot/test/runtime/contended/DefaultValue.java
Normal file
185
hotspot/test/runtime/contended/DefaultValue.java
Normal file
@ -0,0 +1,185 @@
|
||||
/*
|
||||
* 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 java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.Class;
|
||||
import java.lang.String;
|
||||
import java.lang.System;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.RuntimeMXBean;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import sun.misc.Unsafe;
|
||||
import sun.misc.Contended;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8014509
|
||||
* @summary \@Contended: explicit default value behaves differently from the implicit value
|
||||
*
|
||||
* @run main/othervm -XX:-RestrictContended DefaultValue
|
||||
*/
|
||||
public class DefaultValue {
|
||||
|
||||
private static final Unsafe U;
|
||||
private static int ADDRESS_SIZE;
|
||||
private static int HEADER_SIZE;
|
||||
|
||||
static {
|
||||
// steal Unsafe
|
||||
try {
|
||||
Field unsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
unsafe.setAccessible(true);
|
||||
U = (Unsafe) unsafe.get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
|
||||
// When running with CompressedOops on 64-bit platform, the address size
|
||||
// reported by Unsafe is still 8, while the real reference fields are 4 bytes long.
|
||||
// Try to guess the reference field size with this naive trick.
|
||||
try {
|
||||
long off1 = U.objectFieldOffset(CompressedOopsClass.class.getField("obj1"));
|
||||
long off2 = U.objectFieldOffset(CompressedOopsClass.class.getField("obj2"));
|
||||
ADDRESS_SIZE = (int) Math.abs(off2 - off1);
|
||||
HEADER_SIZE = (int) Math.min(off1, off2);
|
||||
} catch (NoSuchFieldException e) {
|
||||
ADDRESS_SIZE = -1;
|
||||
}
|
||||
}
|
||||
|
||||
static class CompressedOopsClass {
|
||||
public Object obj1;
|
||||
public Object obj2;
|
||||
}
|
||||
|
||||
public static boolean arePaddedPairwise(Class klass, String field1, String field2) throws Exception {
|
||||
Field f1 = klass.getField(field1);
|
||||
Field f2 = klass.getField(field2);
|
||||
|
||||
int diff = offset(f1) - offset(f2);
|
||||
if (diff < 0) {
|
||||
// f1 is first
|
||||
return (offset(f2) - (offset(f1) + getSize(f1))) > 64;
|
||||
} else {
|
||||
// f2 is first
|
||||
return (offset(f1) - (offset(f2) + getSize(f2))) > 64;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean sameLayout(Class klass1, Class klass2) throws Exception {
|
||||
for (Field f1 : klass1.getDeclaredFields()) {
|
||||
Field f2 = klass2.getDeclaredField(f1.getName());
|
||||
if (offset(f1) != offset(f2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (Field f2 : klass1.getDeclaredFields()) {
|
||||
Field f1 = klass2.getDeclaredField(f2.getName());
|
||||
if (offset(f1) != offset(f2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isStatic(Field field) {
|
||||
return Modifier.isStatic(field.getModifiers());
|
||||
}
|
||||
|
||||
public static int offset(Field field) {
|
||||
if (isStatic(field)) {
|
||||
return (int) U.staticFieldOffset(field);
|
||||
} else {
|
||||
return (int) U.objectFieldOffset(field);
|
||||
}
|
||||
}
|
||||
|
||||
public static int getSize(Field field) {
|
||||
Class type = field.getType();
|
||||
if (type == byte.class) { return 1; }
|
||||
if (type == boolean.class) { return 1; }
|
||||
if (type == short.class) { return 2; }
|
||||
if (type == char.class) { return 2; }
|
||||
if (type == int.class) { return 4; }
|
||||
if (type == float.class) { return 4; }
|
||||
if (type == long.class) { return 8; }
|
||||
if (type == double.class) { return 8; }
|
||||
return ADDRESS_SIZE;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean endResult = true;
|
||||
|
||||
if (!arePaddedPairwise(R1.class, "int1", "int2")) {
|
||||
System.err.println("R1 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(R2.class, "int1", "int2")) {
|
||||
System.err.println("R2 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(R3.class, "int1", "int2")) {
|
||||
System.err.println("R3 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
System.out.println(endResult ? "Test PASSES" : "Test FAILS");
|
||||
if (!endResult) {
|
||||
throw new Error("Test failed");
|
||||
}
|
||||
}
|
||||
|
||||
public static class R1 {
|
||||
@Contended
|
||||
public int int1;
|
||||
@Contended
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class R2 {
|
||||
@Contended("")
|
||||
public int int1;
|
||||
@Contended("")
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class R3 {
|
||||
@Contended()
|
||||
public int int1;
|
||||
@Contended()
|
||||
public int int2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
248
hotspot/test/runtime/contended/Inheritance1.java
Normal file
248
hotspot/test/runtime/contended/Inheritance1.java
Normal file
@ -0,0 +1,248 @@
|
||||
/*
|
||||
* 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 java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.lang.Class;
|
||||
import java.lang.String;
|
||||
import java.lang.System;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.RuntimeMXBean;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import sun.misc.Unsafe;
|
||||
import sun.misc.Contended;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8012939
|
||||
* @summary \@Contended doesn't work correctly with inheritance
|
||||
*
|
||||
* @run main/othervm -XX:-RestrictContended Inheritance1
|
||||
*/
|
||||
public class Inheritance1 {
|
||||
|
||||
private static final Unsafe U;
|
||||
private static int ADDRESS_SIZE;
|
||||
private static int HEADER_SIZE;
|
||||
|
||||
static {
|
||||
// steal Unsafe
|
||||
try {
|
||||
Field unsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
unsafe.setAccessible(true);
|
||||
U = (Unsafe) unsafe.get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
|
||||
// When running with CompressedOops on 64-bit platform, the address size
|
||||
// reported by Unsafe is still 8, while the real reference fields are 4 bytes long.
|
||||
// Try to guess the reference field size with this naive trick.
|
||||
try {
|
||||
long off1 = U.objectFieldOffset(CompressedOopsClass.class.getField("obj1"));
|
||||
long off2 = U.objectFieldOffset(CompressedOopsClass.class.getField("obj2"));
|
||||
ADDRESS_SIZE = (int) Math.abs(off2 - off1);
|
||||
HEADER_SIZE = (int) Math.min(off1, off2);
|
||||
} catch (NoSuchFieldException e) {
|
||||
ADDRESS_SIZE = -1;
|
||||
}
|
||||
}
|
||||
|
||||
static class CompressedOopsClass {
|
||||
public Object obj1;
|
||||
public Object obj2;
|
||||
}
|
||||
|
||||
public static boolean arePaddedPairwise(Class klass, String field1, String field2) throws Exception {
|
||||
Field f1 = klass.getField(field1);
|
||||
Field f2 = klass.getField(field2);
|
||||
|
||||
int diff = offset(f1) - offset(f2);
|
||||
if (diff < 0) {
|
||||
// f1 is first
|
||||
return (offset(f2) - (offset(f1) + getSize(f1))) > 64;
|
||||
} else {
|
||||
// f2 is first
|
||||
return (offset(f1) - (offset(f2) + getSize(f2))) > 64;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean sameLayout(Class klass1, Class klass2) throws Exception {
|
||||
for (Field f1 : klass1.getDeclaredFields()) {
|
||||
Field f2 = klass2.getDeclaredField(f1.getName());
|
||||
if (offset(f1) != offset(f2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (Field f2 : klass1.getDeclaredFields()) {
|
||||
Field f1 = klass2.getDeclaredField(f2.getName());
|
||||
if (offset(f1) != offset(f2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isStatic(Field field) {
|
||||
return Modifier.isStatic(field.getModifiers());
|
||||
}
|
||||
|
||||
public static int offset(Field field) {
|
||||
if (isStatic(field)) {
|
||||
return (int) U.staticFieldOffset(field);
|
||||
} else {
|
||||
return (int) U.objectFieldOffset(field);
|
||||
}
|
||||
}
|
||||
|
||||
public static int getSize(Field field) {
|
||||
Class type = field.getType();
|
||||
if (type == byte.class) { return 1; }
|
||||
if (type == boolean.class) { return 1; }
|
||||
if (type == short.class) { return 2; }
|
||||
if (type == char.class) { return 2; }
|
||||
if (type == int.class) { return 4; }
|
||||
if (type == float.class) { return 4; }
|
||||
if (type == long.class) { return 8; }
|
||||
if (type == double.class) { return 8; }
|
||||
return ADDRESS_SIZE;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
boolean endResult = true;
|
||||
|
||||
// --------------- INSTANCE FIELDS ---------------------
|
||||
|
||||
if (!arePaddedPairwise(A2_R1.class, "int1", "int2")) {
|
||||
System.err.println("A2_R1 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A3_R1.class, "int1", "int2")) {
|
||||
System.err.println("A3_R1 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A1_R2.class, "int1", "int2")) {
|
||||
System.err.println("A1_R2 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A2_R2.class, "int1", "int2")) {
|
||||
System.err.println("A2_R2 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A3_R2.class, "int1", "int2")) {
|
||||
System.err.println("A3_R2 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A1_R3.class, "int1", "int2")) {
|
||||
System.err.println("A1_R3 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A2_R3.class, "int1", "int2")) {
|
||||
System.err.println("A2_R3 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
if (!arePaddedPairwise(A3_R3.class, "int1", "int2")) {
|
||||
System.err.println("A3_R3 failed");
|
||||
endResult &= false;
|
||||
}
|
||||
|
||||
System.out.println(endResult ? "Test PASSES" : "Test FAILS");
|
||||
if (!endResult) {
|
||||
throw new Error("Test failed");
|
||||
}
|
||||
}
|
||||
|
||||
public static class R1 {
|
||||
public int int1;
|
||||
}
|
||||
|
||||
public static class R2 {
|
||||
@Contended
|
||||
public int int1;
|
||||
}
|
||||
|
||||
@Contended
|
||||
public static class R3 {
|
||||
public int int1;
|
||||
}
|
||||
|
||||
public static class A1_R1 extends R1 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class A2_R1 extends R1 {
|
||||
@Contended
|
||||
public int int2;
|
||||
}
|
||||
|
||||
@Contended
|
||||
public static class A3_R1 extends R1 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class A1_R2 extends R2 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class A2_R2 extends R2 {
|
||||
@Contended
|
||||
public int int2;
|
||||
}
|
||||
|
||||
@Contended
|
||||
public static class A3_R2 extends R2 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class A1_R3 extends R3 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
public static class A2_R3 extends R3 {
|
||||
@Contended
|
||||
public int int2;
|
||||
}
|
||||
|
||||
@Contended
|
||||
public static class A3_R3 extends R3 {
|
||||
public int int2;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -212,3 +212,5 @@ eddbc8ad2435a89f64729512337c9f2669e4dd85 jdk8-b87
|
||||
7122f7bb0fcc8a39e5254402119b2ee3fa0ad313 jdk8-b88
|
||||
893d2ba8bbea3a8d090e51d8eaea285b390789ea jdk8-b89
|
||||
668acc0e1034bc1bec6d02be92e0dd4a63d0667e jdk8-b90
|
||||
e3065fb07877c7e96e8b93416fe2ab9a4c9eb2a5 jdk8-b91
|
||||
1ab5d8d6eab81e65c6c3cf21739474cd67a0e7cf jdk8-b92
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2006, 2013 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
@ -236,10 +236,6 @@ public class DocumentBuilderImpl extends DocumentBuilder
|
||||
String feature = (String) entry.getKey();
|
||||
boolean value = ((Boolean) entry.getValue()).booleanValue();
|
||||
domParser.setFeature(feature, value);
|
||||
if (feature.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) {
|
||||
domParser.setProperty(ACCESS_EXTERNAL_DTD, "");
|
||||
domParser.setProperty(ACCESS_EXTERNAL_SCHEMA, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -242,10 +242,6 @@ public class SAXParserImpl extends javax.xml.parsers.SAXParser
|
||||
String feature = (String) entry.getKey();
|
||||
boolean value = ((Boolean) entry.getValue()).booleanValue();
|
||||
xmlReader.setFeature0(feature, value);
|
||||
if (feature.equals(XMLConstants.FEATURE_SECURE_PROCESSING) && value) {
|
||||
xmlReader.setProperty0(ACCESS_EXTERNAL_DTD, "");
|
||||
xmlReader.setProperty0(ACCESS_EXTERNAL_SCHEMA, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,553 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2001-2005 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.xerces.internal.xinclude;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
import java.util.Properties;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
* It is package private and therefore is not exposed as part of the JAXP
|
||||
* API.
|
||||
* <p>
|
||||
* This code is designed to implement the JAXP 1.1 spec pluggability
|
||||
* feature and is designed to run on JDK version 1.1 and
|
||||
* later, and to compile on JDK 1.2 and onward.
|
||||
* The code also runs both as part of an unbundled jar file and
|
||||
* when bundled as part of the JDK.
|
||||
* <p>
|
||||
*
|
||||
*/
|
||||
final class ObjectFactory {
|
||||
|
||||
//
|
||||
// Constants
|
||||
//
|
||||
|
||||
// name of default properties file to look for in JDK's jre/lib directory
|
||||
private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";
|
||||
|
||||
/** Set to true for debugging */
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
/**
|
||||
* Default columns per line.
|
||||
*/
|
||||
private static final int DEFAULT_LINE_LENGTH = 80;
|
||||
|
||||
/** cache the contents of the xerces.properties file.
|
||||
* Until an attempt has been made to read this file, this will
|
||||
* be null; if the file does not exist or we encounter some other error
|
||||
* during the read, this will be empty.
|
||||
*/
|
||||
private static Properties fXercesProperties = null;
|
||||
|
||||
/***
|
||||
* Cache the time stamp of the xerces.properties file so
|
||||
* that we know if it's been modified and can invalidate
|
||||
* the cache when necessary.
|
||||
*/
|
||||
private static long fLastModified = -1;
|
||||
|
||||
//
|
||||
// static methods
|
||||
//
|
||||
|
||||
/**
|
||||
* Finds the implementation Class object in the specified order. The
|
||||
* specified order is the following:
|
||||
* <ol>
|
||||
* <li>query the system property using <code>System.getProperty</code>
|
||||
* <li>read <code>META-INF/services/<i>factoryId</i></code> file
|
||||
* <li>use fallback classname
|
||||
* </ol>
|
||||
*
|
||||
* @return Class object of factory, never null
|
||||
*
|
||||
* @param factoryId Name of the factory to find, same as
|
||||
* a property name
|
||||
* @param fallbackClassName Implementation class name, if nothing else
|
||||
* is found. Use null to mean no fallback.
|
||||
*
|
||||
* @exception ObjectFactory.ConfigurationError
|
||||
*/
|
||||
static Object createObject(String factoryId, String fallbackClassName)
|
||||
throws ConfigurationError {
|
||||
return createObject(factoryId, null, fallbackClassName);
|
||||
} // createObject(String,String):Object
|
||||
|
||||
/**
|
||||
* Finds the implementation Class object in the specified order. The
|
||||
* specified order is the following:
|
||||
* <ol>
|
||||
* <li>query the system property using <code>System.getProperty</code>
|
||||
* <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
|
||||
* <li>read <code>META-INF/services/<i>factoryId</i></code> file
|
||||
* <li>use fallback classname
|
||||
* </ol>
|
||||
*
|
||||
* @return Class object of factory, never null
|
||||
*
|
||||
* @param factoryId Name of the factory to find, same as
|
||||
* a property name
|
||||
* @param propertiesFilename The filename in the $java.home/lib directory
|
||||
* of the properties file. If none specified,
|
||||
* ${java.home}/lib/xerces.properties will be used.
|
||||
* @param fallbackClassName Implementation class name, if nothing else
|
||||
* is found. Use null to mean no fallback.
|
||||
*
|
||||
* @exception ObjectFactory.ConfigurationError
|
||||
*/
|
||||
static Object createObject(String factoryId,
|
||||
String propertiesFilename,
|
||||
String fallbackClassName)
|
||||
throws ConfigurationError
|
||||
{
|
||||
if (DEBUG) debugPrintln("debug is on");
|
||||
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
ClassLoader cl = findClassLoader();
|
||||
|
||||
// Use the system property first
|
||||
try {
|
||||
String systemProp = ss.getSystemProperty(factoryId);
|
||||
if (systemProp != null) {
|
||||
if (DEBUG) debugPrintln("found system property, value=" + systemProp);
|
||||
return newInstance(systemProp, cl, true);
|
||||
}
|
||||
} catch (SecurityException se) {
|
||||
// Ignore and continue w/ next location
|
||||
}
|
||||
|
||||
// JAXP specific change
|
||||
// always use fallback class to avoid the expense of constantly
|
||||
// "stat"ing a non-existent "xerces.properties" and jar SPI entry
|
||||
// see CR 6400863: Expensive creating of SAX parser in Mustang
|
||||
if (true) {
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);
|
||||
return newInstance(fallbackClassName, cl, true);
|
||||
}
|
||||
|
||||
// Try to read from propertiesFilename, or $java.home/lib/xerces.properties
|
||||
String factoryClassName = null;
|
||||
// no properties file name specified; use $JAVA_HOME/lib/xerces.properties:
|
||||
if (propertiesFilename == null) {
|
||||
File propertiesFile = null;
|
||||
boolean propertiesFileExists = false;
|
||||
try {
|
||||
String javah = ss.getSystemProperty("java.home");
|
||||
propertiesFilename = javah + File.separator +
|
||||
"lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;
|
||||
propertiesFile = new File(propertiesFilename);
|
||||
propertiesFileExists = ss.getFileExists(propertiesFile);
|
||||
} catch (SecurityException e) {
|
||||
// try again...
|
||||
fLastModified = -1;
|
||||
fXercesProperties = null;
|
||||
}
|
||||
|
||||
synchronized (ObjectFactory.class) {
|
||||
boolean loadProperties = false;
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
// file existed last time
|
||||
if(fLastModified >= 0) {
|
||||
if(propertiesFileExists &&
|
||||
(fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) {
|
||||
loadProperties = true;
|
||||
} else {
|
||||
// file has stopped existing...
|
||||
if(!propertiesFileExists) {
|
||||
fLastModified = -1;
|
||||
fXercesProperties = null;
|
||||
} // else, file wasn't modified!
|
||||
}
|
||||
} else {
|
||||
// file has started to exist:
|
||||
if(propertiesFileExists) {
|
||||
loadProperties = true;
|
||||
fLastModified = ss.getLastModified(propertiesFile);
|
||||
} // else, nothing's changed
|
||||
}
|
||||
if(loadProperties) {
|
||||
// must never have attempted to read xerces.properties before (or it's outdeated)
|
||||
fXercesProperties = new Properties();
|
||||
fis = ss.getFileInputStream(propertiesFile);
|
||||
fXercesProperties.load(fis);
|
||||
}
|
||||
} catch (Exception x) {
|
||||
fXercesProperties = null;
|
||||
fLastModified = -1;
|
||||
// assert(x instanceof FileNotFoundException
|
||||
// || x instanceof SecurityException)
|
||||
// In both cases, ignore and continue w/ next location
|
||||
}
|
||||
finally {
|
||||
// try to close the input stream if one was opened.
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(fXercesProperties != null) {
|
||||
factoryClassName = fXercesProperties.getProperty(factoryId);
|
||||
}
|
||||
} else {
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = ss.getFileInputStream(new File(propertiesFilename));
|
||||
Properties props = new Properties();
|
||||
props.load(fis);
|
||||
factoryClassName = props.getProperty(factoryId);
|
||||
} catch (Exception x) {
|
||||
// assert(x instanceof FileNotFoundException
|
||||
// || x instanceof SecurityException)
|
||||
// In both cases, ignore and continue w/ next location
|
||||
}
|
||||
finally {
|
||||
// try to close the input stream if one was opened.
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (factoryClassName != null) {
|
||||
if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" + factoryClassName);
|
||||
return newInstance(factoryClassName, cl, true);
|
||||
}
|
||||
|
||||
// Try Jar Service Provider Mechanism
|
||||
Object provider = findJarServiceProvider(factoryId);
|
||||
if (provider != null) {
|
||||
return provider;
|
||||
}
|
||||
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);
|
||||
return newInstance(fallbackClassName, cl, true);
|
||||
} // createObject(String,String,String):Object
|
||||
|
||||
//
|
||||
// Private static methods
|
||||
//
|
||||
|
||||
/** Prints a message to standard error if debugging is enabled. */
|
||||
private static void debugPrintln(String msg) {
|
||||
if (DEBUG) {
|
||||
System.err.println("JAXP: " + msg);
|
||||
}
|
||||
} // debugPrintln(String)
|
||||
|
||||
/**
|
||||
* Figure out which ClassLoader to use. For JDK 1.2 and later use
|
||||
* the context ClassLoader.
|
||||
*/
|
||||
static ClassLoader findClassLoader()
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
|
||||
// Figure out which ClassLoader to use for loading the provider
|
||||
// class. If there is a Context ClassLoader then use it.
|
||||
ClassLoader context = ss.getContextClassLoader();
|
||||
ClassLoader system = ss.getSystemClassLoader();
|
||||
|
||||
ClassLoader chain = system;
|
||||
while (true) {
|
||||
if (context == chain) {
|
||||
// Assert: we are on JDK 1.1 or we have no Context ClassLoader
|
||||
// or any Context ClassLoader in chain of system classloader
|
||||
// (including extension ClassLoader) so extend to widest
|
||||
// ClassLoader (always look in system ClassLoader if Xerces
|
||||
// is in boot/extension/system classpath and in current
|
||||
// ClassLoader otherwise); normal classloaders delegate
|
||||
// back to system ClassLoader first so this widening doesn't
|
||||
// change the fact that context ClassLoader will be consulted
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
|
||||
chain = system;
|
||||
while (true) {
|
||||
if (current == chain) {
|
||||
// Assert: Current ClassLoader in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return system;
|
||||
}
|
||||
if (chain == null) {
|
||||
break;
|
||||
}
|
||||
chain = ss.getParentClassLoader(chain);
|
||||
}
|
||||
|
||||
// Assert: Current ClassLoader not in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return current;
|
||||
}
|
||||
|
||||
if (chain == null) {
|
||||
// boot ClassLoader reached
|
||||
break;
|
||||
}
|
||||
|
||||
// Check for any extension ClassLoaders in chain up to
|
||||
// boot ClassLoader
|
||||
chain = ss.getParentClassLoader(chain);
|
||||
};
|
||||
|
||||
// Assert: Context ClassLoader not in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return context;
|
||||
} // findClassLoader():ClassLoader
|
||||
|
||||
/**
|
||||
* Create an instance of a class using the specified ClassLoader
|
||||
*/
|
||||
static Object newInstance(String className, ClassLoader cl,
|
||||
boolean doFallback)
|
||||
throws ConfigurationError
|
||||
{
|
||||
// assert(className != null);
|
||||
try{
|
||||
Class providerClass = findProviderClass(className, cl, doFallback);
|
||||
Object instance = providerClass.newInstance();
|
||||
if (DEBUG) debugPrintln("created new instance of " + providerClass +
|
||||
" using ClassLoader: " + cl);
|
||||
return instance;
|
||||
} catch (ClassNotFoundException x) {
|
||||
throw new ConfigurationError(
|
||||
"Provider " + className + " not found", x);
|
||||
} catch (Exception x) {
|
||||
throw new ConfigurationError(
|
||||
"Provider " + className + " could not be instantiated: " + x,
|
||||
x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a Class using the specified ClassLoader
|
||||
*/
|
||||
static Class findProviderClass(String className, ClassLoader cl,
|
||||
boolean doFallback)
|
||||
throws ClassNotFoundException, ConfigurationError
|
||||
{
|
||||
//throw security exception if the calling thread is not allowed to access the package
|
||||
//restrict the access to package as speicified in java.security policy
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
final int lastDot = className.lastIndexOf(".");
|
||||
String packageName = className;
|
||||
if (lastDot != -1) packageName = className.substring(0, lastDot);
|
||||
security.checkPackageAccess(packageName);
|
||||
}
|
||||
Class providerClass;
|
||||
if (cl == null) {
|
||||
// XXX Use the bootstrap ClassLoader. There is no way to
|
||||
// load a class using the bootstrap ClassLoader that works
|
||||
// in both JDK 1.1 and Java 2. However, this should still
|
||||
// work b/c the following should be true:
|
||||
//
|
||||
// (cl == null) iff current ClassLoader == null
|
||||
//
|
||||
// Thus Class.forName(String) will use the current
|
||||
// ClassLoader which will be the bootstrap ClassLoader.
|
||||
providerClass = Class.forName(className);
|
||||
} else {
|
||||
try {
|
||||
providerClass = cl.loadClass(className);
|
||||
} catch (ClassNotFoundException x) {
|
||||
if (doFallback) {
|
||||
// Fall back to current classloader
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
if (current == null) {
|
||||
providerClass = Class.forName(className);
|
||||
} else if (cl != current) {
|
||||
cl = current;
|
||||
providerClass = cl.loadClass(className);
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return providerClass;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to find provider using Jar Service Provider Mechanism
|
||||
*
|
||||
* @return instance of provider class if found or null
|
||||
*/
|
||||
private static Object findJarServiceProvider(String factoryId)
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
String serviceId = "META-INF/services/" + factoryId;
|
||||
InputStream is = null;
|
||||
|
||||
// First try the Context ClassLoader
|
||||
ClassLoader cl = findClassLoader();
|
||||
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
|
||||
// If no provider found then try the current ClassLoader
|
||||
if (is == null) {
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
if (cl != current) {
|
||||
cl = current;
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
}
|
||||
}
|
||||
|
||||
if (is == null) {
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("found jar resource=" + serviceId +
|
||||
" using ClassLoader: " + cl);
|
||||
|
||||
// Read the service provider name in UTF-8 as specified in
|
||||
// the jar spec. Unfortunately this fails in Microsoft
|
||||
// VJ++, which does not implement the UTF-8
|
||||
// encoding. Theoretically, we should simply let it fail in
|
||||
// that case, since the JVM is obviously broken if it
|
||||
// doesn't support such a basic standard. But since there
|
||||
// are still some users attempting to use VJ++ for
|
||||
// development, we have dropped in a fallback which makes a
|
||||
// second attempt using the platform's default encoding. In
|
||||
// VJ++ this is apparently ASCII, which is a subset of
|
||||
// UTF-8... and since the strings we'll be reading here are
|
||||
// also primarily limited to the 7-bit ASCII range (at
|
||||
// least, in English versions), this should work well
|
||||
// enough to keep us on the air until we're ready to
|
||||
// officially decommit from VJ++. [Edited comment from
|
||||
// jkesselm]
|
||||
BufferedReader rd;
|
||||
try {
|
||||
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
|
||||
} catch (java.io.UnsupportedEncodingException e) {
|
||||
rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
|
||||
}
|
||||
|
||||
String factoryClassName = null;
|
||||
try {
|
||||
// XXX Does not handle all possible input as specified by the
|
||||
// Jar Service Provider specification
|
||||
factoryClassName = rd.readLine();
|
||||
} catch (IOException x) {
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
finally {
|
||||
try {
|
||||
// try to close the reader.
|
||||
rd.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
|
||||
if (factoryClassName != null &&
|
||||
! "".equals(factoryClassName)) {
|
||||
if (DEBUG) debugPrintln("found in resource, value="
|
||||
+ factoryClassName);
|
||||
|
||||
// Note: here we do not want to fall back to the current
|
||||
// ClassLoader because we want to avoid the case where the
|
||||
// resource file was found using one ClassLoader and the
|
||||
// provider class was instantiated using a different one.
|
||||
return newInstance(factoryClassName, cl, false);
|
||||
}
|
||||
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
|
||||
//
|
||||
// Classes
|
||||
//
|
||||
|
||||
/**
|
||||
* A configuration error.
|
||||
*/
|
||||
static final class ConfigurationError
|
||||
extends Error {
|
||||
|
||||
/** Serialization version. */
|
||||
static final long serialVersionUID = 5061904944269807898L;
|
||||
|
||||
//
|
||||
// Data
|
||||
//
|
||||
|
||||
/** Exception. */
|
||||
private Exception exception;
|
||||
|
||||
//
|
||||
// Constructors
|
||||
//
|
||||
|
||||
/**
|
||||
* Construct a new instance with the specified detail string and
|
||||
* exception.
|
||||
*/
|
||||
ConfigurationError(String msg, Exception x) {
|
||||
super(msg);
|
||||
this.exception = x;
|
||||
} // <init>(String,Exception)
|
||||
|
||||
//
|
||||
// methods
|
||||
//
|
||||
|
||||
/** Returns the exception associated to this error. */
|
||||
Exception getException() {
|
||||
return exception;
|
||||
} // getException():Exception
|
||||
|
||||
} // class ConfigurationError
|
||||
|
||||
} // class ObjectFactory
|
||||
@ -1,553 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2001-2005 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.xml.internal.serialize;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
||||
import java.util.Properties;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
/**
|
||||
* This class is duplicated for each JAXP subpackage so keep it in sync.
|
||||
* It is package private and therefore is not exposed as part of the JAXP
|
||||
* API.
|
||||
* <p>
|
||||
* This code is designed to implement the JAXP 1.1 spec pluggability
|
||||
* feature and is designed to run on JDK version 1.1 and
|
||||
* later, and to compile on JDK 1.2 and onward.
|
||||
* The code also runs both as part of an unbundled jar file and
|
||||
* when bundled as part of the JDK.
|
||||
* <p>
|
||||
*
|
||||
*/
|
||||
final class ObjectFactory {
|
||||
|
||||
//
|
||||
// Constants
|
||||
//
|
||||
|
||||
// name of default properties file to look for in JDK's jre/lib directory
|
||||
private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";
|
||||
|
||||
/** Set to true for debugging */
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
/**
|
||||
* Default columns per line.
|
||||
*/
|
||||
private static final int DEFAULT_LINE_LENGTH = 80;
|
||||
|
||||
/** cache the contents of the xerces.properties file.
|
||||
* Until an attempt has been made to read this file, this will
|
||||
* be null; if the file does not exist or we encounter some other error
|
||||
* during the read, this will be empty.
|
||||
*/
|
||||
private static Properties fXercesProperties = null;
|
||||
|
||||
/***
|
||||
* Cache the time stamp of the xerces.properties file so
|
||||
* that we know if it's been modified and can invalidate
|
||||
* the cache when necessary.
|
||||
*/
|
||||
private static long fLastModified = -1;
|
||||
|
||||
//
|
||||
// static methods
|
||||
//
|
||||
|
||||
/**
|
||||
* Finds the implementation Class object in the specified order. The
|
||||
* specified order is the following:
|
||||
* <ol>
|
||||
* <li>query the system property using <code>System.getProperty</code>
|
||||
* <li>read <code>META-INF/services/<i>factoryId</i></code> file
|
||||
* <li>use fallback classname
|
||||
* </ol>
|
||||
*
|
||||
* @return Class object of factory, never null
|
||||
*
|
||||
* @param factoryId Name of the factory to find, same as
|
||||
* a property name
|
||||
* @param fallbackClassName Implementation class name, if nothing else
|
||||
* is found. Use null to mean no fallback.
|
||||
*
|
||||
* @exception ObjectFactory.ConfigurationError
|
||||
*/
|
||||
static Object createObject(String factoryId, String fallbackClassName)
|
||||
throws ConfigurationError {
|
||||
return createObject(factoryId, null, fallbackClassName);
|
||||
} // createObject(String,String):Object
|
||||
|
||||
/**
|
||||
* Finds the implementation Class object in the specified order. The
|
||||
* specified order is the following:
|
||||
* <ol>
|
||||
* <li>query the system property using <code>System.getProperty</code>
|
||||
* <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file
|
||||
* <li>read <code>META-INF/services/<i>factoryId</i></code> file
|
||||
* <li>use fallback classname
|
||||
* </ol>
|
||||
*
|
||||
* @return Class object of factory, never null
|
||||
*
|
||||
* @param factoryId Name of the factory to find, same as
|
||||
* a property name
|
||||
* @param propertiesFilename The filename in the $java.home/lib directory
|
||||
* of the properties file. If none specified,
|
||||
* ${java.home}/lib/xerces.properties will be used.
|
||||
* @param fallbackClassName Implementation class name, if nothing else
|
||||
* is found. Use null to mean no fallback.
|
||||
*
|
||||
* @exception ObjectFactory.ConfigurationError
|
||||
*/
|
||||
static Object createObject(String factoryId,
|
||||
String propertiesFilename,
|
||||
String fallbackClassName)
|
||||
throws ConfigurationError
|
||||
{
|
||||
if (DEBUG) debugPrintln("debug is on");
|
||||
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
ClassLoader cl = findClassLoader();
|
||||
|
||||
// Use the system property first
|
||||
try {
|
||||
String systemProp = ss.getSystemProperty(factoryId);
|
||||
if (systemProp != null) {
|
||||
if (DEBUG) debugPrintln("found system property, value=" + systemProp);
|
||||
return newInstance(systemProp, cl, true);
|
||||
}
|
||||
} catch (SecurityException se) {
|
||||
// Ignore and continue w/ next location
|
||||
}
|
||||
|
||||
// JAXP specific change
|
||||
// always use fallback class to avoid the expense of constantly
|
||||
// "stat"ing a non-existent "xerces.properties" and jar SPI entry
|
||||
// see CR 6400863: Expensive creating of SAX parser in Mustang
|
||||
if (true) {
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);
|
||||
return newInstance(fallbackClassName, cl, true);
|
||||
}
|
||||
|
||||
// Try to read from propertiesFilename, or $java.home/lib/xerces.properties
|
||||
String factoryClassName = null;
|
||||
// no properties file name specified; use $JAVA_HOME/lib/xerces.properties:
|
||||
if (propertiesFilename == null) {
|
||||
File propertiesFile = null;
|
||||
boolean propertiesFileExists = false;
|
||||
try {
|
||||
String javah = ss.getSystemProperty("java.home");
|
||||
propertiesFilename = javah + File.separator +
|
||||
"lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;
|
||||
propertiesFile = new File(propertiesFilename);
|
||||
propertiesFileExists = ss.getFileExists(propertiesFile);
|
||||
} catch (SecurityException e) {
|
||||
// try again...
|
||||
fLastModified = -1;
|
||||
fXercesProperties = null;
|
||||
}
|
||||
|
||||
synchronized (ObjectFactory.class) {
|
||||
boolean loadProperties = false;
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
// file existed last time
|
||||
if(fLastModified >= 0) {
|
||||
if(propertiesFileExists &&
|
||||
(fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) {
|
||||
loadProperties = true;
|
||||
} else {
|
||||
// file has stopped existing...
|
||||
if(!propertiesFileExists) {
|
||||
fLastModified = -1;
|
||||
fXercesProperties = null;
|
||||
} // else, file wasn't modified!
|
||||
}
|
||||
} else {
|
||||
// file has started to exist:
|
||||
if(propertiesFileExists) {
|
||||
loadProperties = true;
|
||||
fLastModified = ss.getLastModified(propertiesFile);
|
||||
} // else, nothing's changed
|
||||
}
|
||||
if(loadProperties) {
|
||||
// must never have attempted to read xerces.properties before (or it's outdeated)
|
||||
fXercesProperties = new Properties();
|
||||
fis = ss.getFileInputStream(propertiesFile);
|
||||
fXercesProperties.load(fis);
|
||||
}
|
||||
} catch (Exception x) {
|
||||
fXercesProperties = null;
|
||||
fLastModified = -1;
|
||||
// assert(x instanceof FileNotFoundException
|
||||
// || x instanceof SecurityException)
|
||||
// In both cases, ignore and continue w/ next location
|
||||
}
|
||||
finally {
|
||||
// try to close the input stream if one was opened.
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(fXercesProperties != null) {
|
||||
factoryClassName = fXercesProperties.getProperty(factoryId);
|
||||
}
|
||||
} else {
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = ss.getFileInputStream(new File(propertiesFilename));
|
||||
Properties props = new Properties();
|
||||
props.load(fis);
|
||||
factoryClassName = props.getProperty(factoryId);
|
||||
} catch (Exception x) {
|
||||
// assert(x instanceof FileNotFoundException
|
||||
// || x instanceof SecurityException)
|
||||
// In both cases, ignore and continue w/ next location
|
||||
}
|
||||
finally {
|
||||
// try to close the input stream if one was opened.
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (factoryClassName != null) {
|
||||
if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" + factoryClassName);
|
||||
return newInstance(factoryClassName, cl, true);
|
||||
}
|
||||
|
||||
// Try Jar Service Provider Mechanism
|
||||
Object provider = findJarServiceProvider(factoryId);
|
||||
if (provider != null) {
|
||||
return provider;
|
||||
}
|
||||
|
||||
if (fallbackClassName == null) {
|
||||
throw new ConfigurationError(
|
||||
"Provider for " + factoryId + " cannot be found", null);
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);
|
||||
return newInstance(fallbackClassName, cl, true);
|
||||
} // createObject(String,String,String):Object
|
||||
|
||||
//
|
||||
// Private static methods
|
||||
//
|
||||
|
||||
/** Prints a message to standard error if debugging is enabled. */
|
||||
private static void debugPrintln(String msg) {
|
||||
if (DEBUG) {
|
||||
System.err.println("JAXP: " + msg);
|
||||
}
|
||||
} // debugPrintln(String)
|
||||
|
||||
/**
|
||||
* Figure out which ClassLoader to use. For JDK 1.2 and later use
|
||||
* the context ClassLoader.
|
||||
*/
|
||||
static ClassLoader findClassLoader()
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
|
||||
// Figure out which ClassLoader to use for loading the provider
|
||||
// class. If there is a Context ClassLoader then use it.
|
||||
ClassLoader context = ss.getContextClassLoader();
|
||||
ClassLoader system = ss.getSystemClassLoader();
|
||||
|
||||
ClassLoader chain = system;
|
||||
while (true) {
|
||||
if (context == chain) {
|
||||
// Assert: we are on JDK 1.1 or we have no Context ClassLoader
|
||||
// or any Context ClassLoader in chain of system classloader
|
||||
// (including extension ClassLoader) so extend to widest
|
||||
// ClassLoader (always look in system ClassLoader if Xerces
|
||||
// is in boot/extension/system classpath and in current
|
||||
// ClassLoader otherwise); normal classloaders delegate
|
||||
// back to system ClassLoader first so this widening doesn't
|
||||
// change the fact that context ClassLoader will be consulted
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
|
||||
chain = system;
|
||||
while (true) {
|
||||
if (current == chain) {
|
||||
// Assert: Current ClassLoader in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return system;
|
||||
}
|
||||
if (chain == null) {
|
||||
break;
|
||||
}
|
||||
chain = ss.getParentClassLoader(chain);
|
||||
}
|
||||
|
||||
// Assert: Current ClassLoader not in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return current;
|
||||
}
|
||||
|
||||
if (chain == null) {
|
||||
// boot ClassLoader reached
|
||||
break;
|
||||
}
|
||||
|
||||
// Check for any extension ClassLoaders in chain up to
|
||||
// boot ClassLoader
|
||||
chain = ss.getParentClassLoader(chain);
|
||||
};
|
||||
|
||||
// Assert: Context ClassLoader not in chain of
|
||||
// boot/extension/system ClassLoaders
|
||||
return context;
|
||||
} // findClassLoader():ClassLoader
|
||||
|
||||
/**
|
||||
* Create an instance of a class using the specified ClassLoader
|
||||
*/
|
||||
static Object newInstance(String className, ClassLoader cl,
|
||||
boolean doFallback)
|
||||
throws ConfigurationError
|
||||
{
|
||||
// assert(className != null);
|
||||
try{
|
||||
Class providerClass = findProviderClass(className, cl, doFallback);
|
||||
Object instance = providerClass.newInstance();
|
||||
if (DEBUG) debugPrintln("created new instance of " + providerClass +
|
||||
" using ClassLoader: " + cl);
|
||||
return instance;
|
||||
} catch (ClassNotFoundException x) {
|
||||
throw new ConfigurationError(
|
||||
"Provider " + className + " not found", x);
|
||||
} catch (Exception x) {
|
||||
throw new ConfigurationError(
|
||||
"Provider " + className + " could not be instantiated: " + x,
|
||||
x);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a Class using the specified ClassLoader
|
||||
*/
|
||||
static Class findProviderClass(String className, ClassLoader cl,
|
||||
boolean doFallback)
|
||||
throws ClassNotFoundException, ConfigurationError
|
||||
{
|
||||
//throw security exception if the calling thread is not allowed to access the package
|
||||
//restrict the access to package as speicified in java.security policy
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
final int lastDot = className.lastIndexOf(".");
|
||||
String packageName = className;
|
||||
if (lastDot != -1) packageName = className.substring(0, lastDot);
|
||||
security.checkPackageAccess(packageName);
|
||||
}
|
||||
Class providerClass;
|
||||
if (cl == null) {
|
||||
// XXX Use the bootstrap ClassLoader. There is no way to
|
||||
// load a class using the bootstrap ClassLoader that works
|
||||
// in both JDK 1.1 and Java 2. However, this should still
|
||||
// work b/c the following should be true:
|
||||
//
|
||||
// (cl == null) iff current ClassLoader == null
|
||||
//
|
||||
// Thus Class.forName(String) will use the current
|
||||
// ClassLoader which will be the bootstrap ClassLoader.
|
||||
providerClass = Class.forName(className);
|
||||
} else {
|
||||
try {
|
||||
providerClass = cl.loadClass(className);
|
||||
} catch (ClassNotFoundException x) {
|
||||
if (doFallback) {
|
||||
// Fall back to current classloader
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
if (current == null) {
|
||||
providerClass = Class.forName(className);
|
||||
} else if (cl != current) {
|
||||
cl = current;
|
||||
providerClass = cl.loadClass(className);
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
} else {
|
||||
throw x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return providerClass;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to find provider using Jar Service Provider Mechanism
|
||||
*
|
||||
* @return instance of provider class if found or null
|
||||
*/
|
||||
private static Object findJarServiceProvider(String factoryId)
|
||||
throws ConfigurationError
|
||||
{
|
||||
SecuritySupport ss = SecuritySupport.getInstance();
|
||||
String serviceId = "META-INF/services/" + factoryId;
|
||||
InputStream is = null;
|
||||
|
||||
// First try the Context ClassLoader
|
||||
ClassLoader cl = findClassLoader();
|
||||
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
|
||||
// If no provider found then try the current ClassLoader
|
||||
if (is == null) {
|
||||
ClassLoader current = ObjectFactory.class.getClassLoader();
|
||||
if (cl != current) {
|
||||
cl = current;
|
||||
is = ss.getResourceAsStream(cl, serviceId);
|
||||
}
|
||||
}
|
||||
|
||||
if (is == null) {
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
|
||||
if (DEBUG) debugPrintln("found jar resource=" + serviceId +
|
||||
" using ClassLoader: " + cl);
|
||||
|
||||
// Read the service provider name in UTF-8 as specified in
|
||||
// the jar spec. Unfortunately this fails in Microsoft
|
||||
// VJ++, which does not implement the UTF-8
|
||||
// encoding. Theoretically, we should simply let it fail in
|
||||
// that case, since the JVM is obviously broken if it
|
||||
// doesn't support such a basic standard. But since there
|
||||
// are still some users attempting to use VJ++ for
|
||||
// development, we have dropped in a fallback which makes a
|
||||
// second attempt using the platform's default encoding. In
|
||||
// VJ++ this is apparently ASCII, which is a subset of
|
||||
// UTF-8... and since the strings we'll be reading here are
|
||||
// also primarily limited to the 7-bit ASCII range (at
|
||||
// least, in English versions), this should work well
|
||||
// enough to keep us on the air until we're ready to
|
||||
// officially decommit from VJ++. [Edited comment from
|
||||
// jkesselm]
|
||||
BufferedReader rd;
|
||||
try {
|
||||
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"), DEFAULT_LINE_LENGTH);
|
||||
} catch (java.io.UnsupportedEncodingException e) {
|
||||
rd = new BufferedReader(new InputStreamReader(is), DEFAULT_LINE_LENGTH);
|
||||
}
|
||||
|
||||
String factoryClassName = null;
|
||||
try {
|
||||
// XXX Does not handle all possible input as specified by the
|
||||
// Jar Service Provider specification
|
||||
factoryClassName = rd.readLine();
|
||||
} catch (IOException x) {
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
finally {
|
||||
try {
|
||||
// try to close the reader.
|
||||
rd.close();
|
||||
}
|
||||
// Ignore the exception.
|
||||
catch (IOException exc) {}
|
||||
}
|
||||
|
||||
if (factoryClassName != null &&
|
||||
! "".equals(factoryClassName)) {
|
||||
if (DEBUG) debugPrintln("found in resource, value="
|
||||
+ factoryClassName);
|
||||
|
||||
// Note: here we do not want to fall back to the current
|
||||
// ClassLoader because we want to avoid the case where the
|
||||
// resource file was found using one ClassLoader and the
|
||||
// provider class was instantiated using a different one.
|
||||
return newInstance(factoryClassName, cl, false);
|
||||
}
|
||||
|
||||
// No provider found
|
||||
return null;
|
||||
}
|
||||
|
||||
//
|
||||
// Classes
|
||||
//
|
||||
|
||||
/**
|
||||
* A configuration error.
|
||||
*/
|
||||
static final class ConfigurationError
|
||||
extends Error {
|
||||
|
||||
/** Serialization version. */
|
||||
static final long serialVersionUID = 937647395548533254L;
|
||||
|
||||
//
|
||||
// Data
|
||||
//
|
||||
|
||||
/** Exception. */
|
||||
private Exception exception;
|
||||
|
||||
//
|
||||
// Constructors
|
||||
//
|
||||
|
||||
/**
|
||||
* Construct a new instance with the specified detail string and
|
||||
* exception.
|
||||
*/
|
||||
ConfigurationError(String msg, Exception x) {
|
||||
super(msg);
|
||||
this.exception = x;
|
||||
} // <init>(String,Exception)
|
||||
|
||||
//
|
||||
// methods
|
||||
//
|
||||
|
||||
/** Returns the exception associated to this error. */
|
||||
Exception getException() {
|
||||
return exception;
|
||||
} // getException():Exception
|
||||
|
||||
} // class ConfigurationError
|
||||
|
||||
} // class ObjectFactory
|
||||
@ -212,3 +212,5 @@ a5e7c2f093c9996ab3419db1565094a07b059e9c jdk8-b86
|
||||
24fa5452e5d4e9df8b85196283275a6ca4b4adb4 jdk8-b88
|
||||
88838e08e4ef6a254867c8126070a1975683108d jdk8-b89
|
||||
3e5b9ea5ac35ea7096da484e24a863cf4552179f jdk8-b90
|
||||
0bb1a9fa56b037d072efdaae5f5b73a0f23c966c jdk8-b91
|
||||
a0f604766ca14818e2a7b1558cc399499caabf75 jdk8-b92
|
||||
|
||||
@ -212,3 +212,5 @@ d5228e624826a10ccc5b05f30ad8d839b58fe48d jdk8-b87
|
||||
8dbb4b159e04de3c447c9242c70505e71f8624c7 jdk8-b88
|
||||
845025546e35519fbb8970e79fc2a834063a5e19 jdk8-b89
|
||||
c63eda8f63008a4398d2c22ac8d72f7fef6f9238 jdk8-b90
|
||||
169451cf0cc53bde5af24f9820ea3f35ec4b4df4 jdk8-b91
|
||||
a2a2a91075ad85becbe10a39d7fd04ef9bea8df5 jdk8-b92
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 1999, 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
|
||||
@ -432,40 +432,3 @@ RC_FLAGS += -d "JDK_BUILD_ID=$(JDK_RC_BUILD_ID)" \
|
||||
-d "JDK_COPYRIGHT=$(JDK_RC_COPYRIGHT)" \
|
||||
-d "JDK_NAME=$(JDK_RC_NAME)" \
|
||||
-d "JDK_FVER=$(JDK_RC_FVER)"
|
||||
|
||||
# Enable 7-Zip LZMA file (de)compression for Java Kernel if it is available
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
ifneq ($(KERNEL), off)
|
||||
# This is a hack to use until 7-Zip (and UPX) bundles can be put
|
||||
# under /java/devtools.
|
||||
ifndef DEPLOY_TOPDIR
|
||||
DEPLOY_TOPDIR=$(JDK_TOPDIR)/../deploy
|
||||
endif
|
||||
# Uncomment this block to cause build failure if above assumption false
|
||||
#DCHK = $(shell if [ ! -d $(DEPLOY_TOPDIR) ] ; then \
|
||||
# $(ECHO) deploy_not_a_peer_of_j2se ; \
|
||||
#fi )
|
||||
#ifeq ($(DCHK), deploy_not_a_peer_of_j2se)
|
||||
# If a build failure points to control coming here it means
|
||||
# it means deploy is not in the same directory
|
||||
# as j2se. Java Kernel can't tolerate that for the time being.
|
||||
#endif
|
||||
EC_TMP = $(shell if [ -d $(DEPLOY_TOPDIR)/make/lzma ] ; then \
|
||||
$(ECHO) true ; \
|
||||
else \
|
||||
$(ECHO) false ; \
|
||||
fi )
|
||||
ifeq ($(EC_TMP), true)
|
||||
EXTRA_COMP_INSTALL_PATH = lib\\\\deploy\\\\lzma.dll
|
||||
# Crazy but true: deploy/make/plugin/jinstall/Makefile.jkernel does
|
||||
# not include deploy/make/common/Defs-windows.gmk, either directly
|
||||
# or indirectly. But it does include this file, so redundantly declare
|
||||
# these variables that are in deploy/make/common/Defs-windows.gmk for
|
||||
# the sake of the Java Kernel part of the deploy build. Whew!
|
||||
EXTRA_COMP_LIB_NAME = lzma.dll
|
||||
EXTRA_COMP_PATH = $(OUTPUTDIR)/tmp/deploy/lzma/win32/obj
|
||||
EXTRA_COMP_CMD_PATH = $(EXTRA_COMP_PATH)/lzma.exe
|
||||
EXTRA_COMP_LIB_PATH = $(EXTRA_COMP_PATH)/$(EXTRA_COMP_LIB_NAME)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -31,6 +31,8 @@ BUILDDIR = ../..
|
||||
LIBRARY = jdwp
|
||||
PRODUCT = jpda
|
||||
|
||||
LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS=1
|
||||
|
||||
FILES_m = mapfile-vers
|
||||
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
@ -171,3 +171,13 @@ FILES_NO_MOTIF_c = \
|
||||
GLXSurfaceData.c \
|
||||
AccelGlyphCache.c \
|
||||
CUPSfuncs.c
|
||||
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
FILES_NO_MOTIF_objc = \
|
||||
AWTFont.m \
|
||||
AWTStrike.m \
|
||||
CCharToGlyphMapper.m \
|
||||
CGGlyphImages.m \
|
||||
CGGlyphOutlines.m \
|
||||
CoreTextSupport.m
|
||||
endif # PLATFORM
|
||||
|
||||
@ -187,3 +187,14 @@ FILES_export2 = \
|
||||
java/awt/dnd/DnDConstants.java \
|
||||
sun/awt/CausedFocusEvent.java
|
||||
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
ifeq ($(HEADLESS), true)
|
||||
FILES_export += \
|
||||
sun/awt/SunHints.java \
|
||||
sun/font/CCharToGlyphMapper.java \
|
||||
sun/font/CFont.java \
|
||||
sun/font/CFontManager.java \
|
||||
sun/font/CStrike.java \
|
||||
sun/font/CStrikeDisposer.java
|
||||
endif # HEADLESS
|
||||
endif # PLATFORM
|
||||
|
||||
@ -43,6 +43,10 @@ include $(BUILDDIR)/sun/awt/FILES_export_unix.gmk
|
||||
# compiled based on the motif version.
|
||||
FILES_c = $(FILES_NO_MOTIF_c)
|
||||
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
FILES_objc = $(FILES_NO_MOTIF_objc)
|
||||
endif # PLATFORM
|
||||
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
ifneq ($(ARCH), amd64)
|
||||
FILES_reorder += reorder-$(ARCH)
|
||||
@ -97,6 +101,10 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe
|
||||
vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)/image
|
||||
vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/robot_child
|
||||
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
vpath %.m $(call NativeSrcDirList,,native/sun/font)
|
||||
endif # PLATFORM
|
||||
|
||||
#
|
||||
# Libraries to link in.
|
||||
#
|
||||
@ -192,13 +200,21 @@ CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/debug \
|
||||
$(EVENT_MODEL)
|
||||
|
||||
ifeq ($(PLATFORM), macosx)
|
||||
CPPFLAGS += -I$(CUPS_HEADERS_PATH)
|
||||
CPPFLAGS += -I$(CUPS_HEADERS_PATH) \
|
||||
$(call NativeSrcDirList,-I,native/sun/awt) \
|
||||
$(call NativeSrcDirList,-I,native/sun/font)
|
||||
|
||||
ifndef HEADLESS
|
||||
CPPFLAGS += -I$(MOTIF_DIR)/include \
|
||||
-I$(OPENWIN_HOME)/include
|
||||
LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB)
|
||||
|
||||
else
|
||||
LDFLAGS += -framework Accelerate \
|
||||
-framework ApplicationServices \
|
||||
-framework Cocoa \
|
||||
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport
|
||||
endif # !HEADLESS
|
||||
endif # PLATFORM
|
||||
|
||||
|
||||
@ -95,6 +95,9 @@ define SetupLauncher
|
||||
$1_PLIST_FILE:=Info-cmdline.plist
|
||||
ifneq ($(11),)
|
||||
$1_PLIST_FILE:=$(11)
|
||||
ifneq ($$(findstring privileged,$$($1_PLIST_FILE)),)
|
||||
$1_CODESIGN:=true
|
||||
endif
|
||||
endif
|
||||
|
||||
$1_LDFLAGS += -Wl,-all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \
|
||||
@ -174,7 +177,8 @@ define SetupLauncher
|
||||
-D "JDK_INTERNAL_NAME=$1" \
|
||||
-D "JDK_FTYPE=0x1L" \
|
||||
$7,\
|
||||
MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest)
|
||||
MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest,\
|
||||
CODESIGN:=$$($1_CODESIGN))
|
||||
|
||||
BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1)
|
||||
|
||||
|
||||
@ -1143,7 +1143,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\
|
||||
-D "JDK_INTERNAL_NAME=jdwp" \
|
||||
-D "JDK_FTYPE=0x2L",\
|
||||
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjdwp,\
|
||||
DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES)))
|
||||
DEBUG_SYMBOLS:=true))
|
||||
|
||||
$(BUILD_LIBJDWP) : $(BUILD_LIBJAVA)
|
||||
|
||||
@ -2314,6 +2314,10 @@ LIBAWT_HEADLESS_DIRS:=$(JDK_TOPDIR)/src/share/native/sun/font \
|
||||
$(JDK_TOPDIR)/src/solaris/native/sun/java2d/opengl \
|
||||
$(JDK_TOPDIR)/src/solaris/native/sun/java2d/x11
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS),macosx)
|
||||
LIBAWT_HEADLESS_DIRS+=$(JDK_TOPDIR)/src/macosx/native/sun/font
|
||||
endif
|
||||
|
||||
LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \
|
||||
-DX11_PATH=\"$(X11_PATH)\" -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" \
|
||||
$(CUPS_CFLAGS) \
|
||||
@ -2328,6 +2332,12 @@ LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \
|
||||
-I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/jdga \
|
||||
$(foreach dir,$(LIBAWT_HEADLESS_DIRS),-I$(dir))
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS),macosx)
|
||||
LIBAWT_HEADLESS_CFLAGS+=\
|
||||
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
|
||||
-F/System/Library/Frameworks/ApplicationServices.framework/Frameworks
|
||||
endif
|
||||
|
||||
LIBAWT_HEADLESS_FILES:=\
|
||||
awt_Font.c \
|
||||
HeadlessToolkit.c \
|
||||
@ -2356,6 +2366,16 @@ LIBAWT_HEADLESS_FILES:=\
|
||||
AccelGlyphCache.c \
|
||||
CUPSfuncs.c
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS),macosx)
|
||||
LIBAWT_HEADLESS_FILES+=\
|
||||
AWTFont.m \
|
||||
AWTStrike.m \
|
||||
CCharToGlyphMapper.m \
|
||||
CGGlyphImages.m \
|
||||
CGGlyphOutlines.m \
|
||||
CoreTextSupport.m
|
||||
endif
|
||||
|
||||
LIBAWT_HEADLESS_REORDER:=
|
||||
ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||
ifneq ($(OPENJDK_TARGET_CPU), x86_64)
|
||||
@ -2382,7 +2402,13 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\
|
||||
REORDER:=$(LIBAWT_HEADLESS_REORDER), \
|
||||
LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\
|
||||
LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\
|
||||
LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava,\
|
||||
LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava \
|
||||
-framework Accelerate \
|
||||
-framework ApplicationServices \
|
||||
-framework Cocoa \
|
||||
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport,\
|
||||
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless,\
|
||||
DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES)))
|
||||
|
||||
|
||||
@ -50,8 +50,6 @@ images:: jre-image jdk-image
|
||||
overlay-images: jre-overlay-image jdk-overlay-image
|
||||
|
||||
|
||||
-include $(CUSTOM_MAKE_DIR)/Images.gmk
|
||||
|
||||
|
||||
# Processing license files from source area to image area
|
||||
# These will be modified to have the platform specific EOL chars.
|
||||
@ -774,3 +772,5 @@ endif # Profile
|
||||
################################################################################
|
||||
|
||||
.PHONY: default images jre-image jdk-image
|
||||
|
||||
-include $(CUSTOM_MAKE_DIR)/Images.gmk
|
||||
|
||||
@ -44,7 +44,6 @@
|
||||
#include <Cocoa/Cocoa.h>
|
||||
#include <objc/objc-runtime.h>
|
||||
#include <objc/objc-auto.h>
|
||||
#include <dispatch/dispatch.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <spawn.h>
|
||||
@ -1001,6 +1000,32 @@ SetXStartOnFirstThreadArg()
|
||||
setenv(envVar, "1", 1);
|
||||
}
|
||||
|
||||
/* This class is made for performSelectorOnMainThread when java main
|
||||
* should be launched on main thread.
|
||||
* We cannot use dispatch_sync here, because it blocks the main dispatch queue
|
||||
* which is used inside Cocoa
|
||||
*/
|
||||
@interface JavaLaunchHelper : NSObject {
|
||||
int _returnValue;
|
||||
}
|
||||
- (void) launchJava:(NSValue*)argsValue;
|
||||
- (int) getReturnValue;
|
||||
@end
|
||||
|
||||
@implementation JavaLaunchHelper
|
||||
|
||||
- (void) launchJava:(NSValue*)argsValue
|
||||
{
|
||||
_returnValue = JavaMain([argsValue pointerValue]);
|
||||
}
|
||||
|
||||
- (int) getReturnValue
|
||||
{
|
||||
return _returnValue;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// MacOSX we may continue in the same thread
|
||||
int
|
||||
JVMInit(InvocationFunctions* ifn, jlong threadStackSize,
|
||||
@ -1010,16 +1035,22 @@ JVMInit(InvocationFunctions* ifn, jlong threadStackSize,
|
||||
JLI_TraceLauncher("In same thread\n");
|
||||
// need to block this thread against the main thread
|
||||
// so signals get caught correctly
|
||||
__block int rslt;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^(void) {
|
||||
JavaMainArgs args;
|
||||
args.argc = argc;
|
||||
args.argv = argv;
|
||||
args.mode = mode;
|
||||
args.what = what;
|
||||
args.ifn = *ifn;
|
||||
rslt = JavaMain((void*)&args);
|
||||
});
|
||||
JavaMainArgs args;
|
||||
args.argc = argc;
|
||||
args.argv = argv;
|
||||
args.mode = mode;
|
||||
args.what = what;
|
||||
args.ifn = *ifn;
|
||||
int rslt;
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
{
|
||||
JavaLaunchHelper* launcher = [[[JavaLaunchHelper alloc] init] autorelease];
|
||||
[launcher performSelectorOnMainThread:@selector(launchJava:)
|
||||
withObject:[NSValue valueWithPointer:(void*)&args]
|
||||
waitUntilDone:YES];
|
||||
rslt = [launcher getReturnValue];
|
||||
}
|
||||
[pool drain];
|
||||
return rslt;
|
||||
} else {
|
||||
return ContinueInNewThread(ifn, threadStackSize, argc, argv, mode, what, ret);
|
||||
|
||||
@ -38,7 +38,7 @@ final class CDropTargetContextPeer extends SunDropTargetContextPeer {
|
||||
private long fNativeDropTransfer = 0;
|
||||
private long fNativeDataAvailable = 0;
|
||||
private Object fNativeData = null;
|
||||
private boolean insideTarget = false;
|
||||
private boolean insideTarget = true;
|
||||
|
||||
Object awtLockAccess = new Object();
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -115,6 +115,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
|
||||
static final int RESIZABLE = 1 << 9; // both a style bit and prop bit
|
||||
static final int NONACTIVATING = 1 << 24;
|
||||
static final int IS_DIALOG = 1 << 25;
|
||||
static final int IS_MODAL = 1 << 26;
|
||||
|
||||
static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE;
|
||||
|
||||
@ -374,6 +376,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
}
|
||||
}
|
||||
|
||||
if (isDialog) {
|
||||
styleBits = SET(styleBits, IS_DIALOG, true);
|
||||
if (((Dialog) target).isModal()) {
|
||||
styleBits = SET(styleBits, IS_MODAL, true);
|
||||
}
|
||||
}
|
||||
|
||||
peer.setTextured(IS(TEXTURED, styleBits));
|
||||
|
||||
return styleBits;
|
||||
|
||||
@ -36,6 +36,7 @@ import java.security.PrivilegedAction;
|
||||
import javax.print.*;
|
||||
import javax.print.attribute.PrintRequestAttributeSet;
|
||||
import javax.print.attribute.HashPrintRequestAttributeSet;
|
||||
import javax.print.attribute.standard.PageRanges;
|
||||
|
||||
import sun.java2d.*;
|
||||
import sun.print.*;
|
||||
@ -173,6 +174,19 @@ public class CPrinterJob extends RasterPrinterJob {
|
||||
if (nsPrintInfo != null) {
|
||||
fNSPrintInfo = nsPrintInfo.getValue();
|
||||
}
|
||||
|
||||
PageRanges pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
|
||||
if (isSupportedValue(pageRangesAttr, attributes)) {
|
||||
SunPageSelection rangeSelect = (SunPageSelection)attributes.get(SunPageSelection.class);
|
||||
// If rangeSelect is not null, we are using AWT's print dialog that has
|
||||
// All, Selection, and Range radio buttons
|
||||
if (rangeSelect == null || rangeSelect == SunPageSelection.RANGE) {
|
||||
int[][] range = pageRangesAttr.getMembers();
|
||||
// setPageRange will set firstPage and lastPage as called in getFirstPage
|
||||
// and getLastPage
|
||||
setPageRange(range[0][0] - 1, range[0][1] - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
volatile boolean onEventThread;
|
||||
@ -225,7 +239,6 @@ public class CPrinterJob extends RasterPrinterJob {
|
||||
* the end of the document. Note that firstPage
|
||||
* and lastPage are 0 based page indices.
|
||||
*/
|
||||
int numPages = mDocument.getNumberOfPages();
|
||||
|
||||
int firstPage = getFirstPage();
|
||||
int lastPage = getLastPage();
|
||||
@ -242,42 +255,53 @@ public class CPrinterJob extends RasterPrinterJob {
|
||||
userCancelled = false;
|
||||
}
|
||||
|
||||
if (EventQueue.isDispatchThread()) {
|
||||
// This is an AWT EventQueue, and this print rendering loop needs to block it.
|
||||
//Add support for PageRange
|
||||
PageRanges pr = (attributes == null) ? null
|
||||
: (PageRanges)attributes.get(PageRanges.class);
|
||||
int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers();
|
||||
int loopi = 0;
|
||||
do {
|
||||
if (EventQueue.isDispatchThread()) {
|
||||
// This is an AWT EventQueue, and this print rendering loop needs to block it.
|
||||
|
||||
onEventThread = true;
|
||||
onEventThread = true;
|
||||
|
||||
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() {
|
||||
@Override
|
||||
public SecondaryLoop run() {
|
||||
return Toolkit.getDefaultToolkit()
|
||||
.getSystemEventQueue()
|
||||
.createSecondaryLoop();
|
||||
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() {
|
||||
@Override
|
||||
public SecondaryLoop run() {
|
||||
return Toolkit.getDefaultToolkit()
|
||||
.getSystemEventQueue()
|
||||
.createSecondaryLoop();
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
// Fire off the print rendering loop on the AppKit thread, and don't have
|
||||
// it wait and block this thread.
|
||||
if (printLoop(false, firstPage, lastPage)) {
|
||||
// Start a secondary loop on EDT until printing operation is finished or cancelled
|
||||
printingLoop.enter();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Fire off the print rendering loop on the AppKit, and block this thread
|
||||
// until it is done.
|
||||
// But don't actually block... we need to come back here!
|
||||
onEventThread = false;
|
||||
|
||||
try {
|
||||
// Fire off the print rendering loop on the AppKit thread, and don't have
|
||||
// it wait and block this thread.
|
||||
if (printLoop(false, firstPage, lastPage)) {
|
||||
// Start a secondary loop on EDT until printing operation is finished or cancelled
|
||||
printingLoop.enter();
|
||||
try {
|
||||
printLoop(true, firstPage, lastPage);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
// Fire off the print rendering loop on the AppKit, and block this thread
|
||||
// until it is done.
|
||||
// But don't actually block... we need to come back here!
|
||||
onEventThread = false;
|
||||
|
||||
try {
|
||||
printLoop(true, firstPage, lastPage);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
if (++loopi < prMembers.length) {
|
||||
firstPage = prMembers[loopi][0]-1;
|
||||
lastPage = prMembers[loopi][1] -1;
|
||||
}
|
||||
}
|
||||
} while (loopi < prMembers.length);
|
||||
} finally {
|
||||
synchronized (this) {
|
||||
// NOTE: Native code shouldn't allow exceptions out while
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -536,8 +536,12 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
- (void) windowDidBecomeKey: (NSNotification *) notification {
|
||||
AWT_ASSERT_APPKIT_THREAD;
|
||||
[AWTToolkit eventCountPlusPlus];
|
||||
[CMenuBar activate:self.javaMenuBar modallyDisabled:NO];
|
||||
AWTWindow *opposite = [AWTWindow lastKeyWindow];
|
||||
if (!IS(self.styleBits, IS_DIALOG)) {
|
||||
[CMenuBar activate:self.javaMenuBar modallyDisabled:NO];
|
||||
} else if (IS(self.styleBits, IS_MODAL)) {
|
||||
[CMenuBar activate:opposite->javaMenuBar modallyDisabled:YES];
|
||||
}
|
||||
[AWTWindow setLastKeyWindow:nil];
|
||||
|
||||
[self _deliverWindowFocusEvent:YES oppositeWindow: opposite];
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user