Merge
This commit is contained in:
commit
90cbbab800
.hgtags-top-repo
common
corba
hotspot
.hgtags
agent/src/share/classes/sun/jvm/hotspot/oops
make
src
cpu
sparc/vm
cppInterpreter_sparc.cppframe_sparc.cppinterp_masm_sparc.cppstubGenerator_sparc.cppstubRoutines_sparc.cpptemplateInterpreter_sparc.cpp
x86/vm
cppInterpreter_x86.cppframe_x86.cppinterp_masm_x86_32.cppinterp_masm_x86_64.cppstubGenerator_x86_32.cppstubGenerator_x86_64.cppstubRoutines_x86_32.cppstubRoutines_x86_64.cpp
zero/vm
os
bsd/vm
linux/vm
solaris/vm
mutex_solaris.cppmutex_solaris.inline.hppos_solaris.cppthreadCritical_solaris.cppthread_solaris.inline.hpp
windows/vm
os_cpu
bsd_x86/vm
bsd_zero/vm
linux_sparc/vm
linux_x86/vm
linux_zero/vm
solaris_sparc/vm
solaris_x86/vm
windows_x86/vm
share/vm
@ -187,3 +187,4 @@ e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60
|
|||||||
3229597524cab4239325bc3602df6c486397a511 jdk8-b63
|
3229597524cab4239325bc3602df6c486397a511 jdk8-b63
|
||||||
1c8370a55b305d35353346202bde042ba9e8a9fd jdk8-b64
|
1c8370a55b305d35353346202bde042ba9e8a9fd jdk8-b64
|
||||||
b772de306dc24c17f7bd1398531ddeb58723b804 jdk8-b65
|
b772de306dc24c17f7bd1398531ddeb58723b804 jdk8-b65
|
||||||
|
13bb8c326e7b7b0b19d78c8088033e3932e3f7ca jdk8-b66
|
||||||
|
@ -129,7 +129,7 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -141,20 +141,24 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
$1=`$READLINK -f [$]$1`
|
$1=`$READLINK -f [$]$1`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME [$]$1`
|
sym_link_dir=`$DIRNAME [$]$1`
|
||||||
sym_link_file=`$BASENAME [$]$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`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -286,7 +290,7 @@ AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD`
|
|||||||
# Where is the source? It is located two levels above the configure script.
|
# Where is the source? It is located two levels above the configure script.
|
||||||
CURDIR="$PWD"
|
CURDIR="$PWD"
|
||||||
cd "$AUTOCONF_DIR/../.."
|
cd "$AUTOCONF_DIR/../.."
|
||||||
SRC_ROOT="`pwd`"
|
SRC_ROOT="`$THEPWDCMD`"
|
||||||
|
|
||||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||||
PATH_SEP=";"
|
PATH_SEP=";"
|
||||||
|
@ -3672,7 +3672,7 @@ fi
|
|||||||
#CUSTOM_AUTOCONF_INCLUDE
|
#CUSTOM_AUTOCONF_INCLUDE
|
||||||
|
|
||||||
# Do not change or remove the following line, it is needed for consistency checks:
|
# Do not change or remove the following line, it is needed for consistency checks:
|
||||||
DATE_WHEN_GENERATED=1354106772
|
DATE_WHEN_GENERATED=1354721616
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
@ -6903,7 +6903,7 @@ SCRIPT="$0"
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -6915,20 +6915,24 @@ SCRIPT="$0"
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
SCRIPT=`$READLINK -f $SCRIPT`
|
SCRIPT=`$READLINK -f $SCRIPT`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $SCRIPT`
|
sym_link_dir=`$DIRNAME $SCRIPT`
|
||||||
sym_link_file=`$BASENAME $SCRIPT`
|
sym_link_file=`$BASENAME $SCRIPT`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -6944,7 +6948,7 @@ AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD`
|
|||||||
# Where is the source? It is located two levels above the configure script.
|
# Where is the source? It is located two levels above the configure script.
|
||||||
CURDIR="$PWD"
|
CURDIR="$PWD"
|
||||||
cd "$AUTOCONF_DIR/../.."
|
cd "$AUTOCONF_DIR/../.."
|
||||||
SRC_ROOT="`pwd`"
|
SRC_ROOT="`$THEPWDCMD`"
|
||||||
|
|
||||||
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
|
||||||
PATH_SEP=";"
|
PATH_SEP=";"
|
||||||
@ -7593,7 +7597,7 @@ NOSYM_CURDIR="$CURDIR"
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -7605,20 +7609,24 @@ NOSYM_CURDIR="$CURDIR"
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
NOSYM_CURDIR=`$READLINK -f $NOSYM_CURDIR`
|
NOSYM_CURDIR=`$READLINK -f $NOSYM_CURDIR`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $NOSYM_CURDIR`
|
sym_link_dir=`$DIRNAME $NOSYM_CURDIR`
|
||||||
sym_link_file=`$BASENAME $NOSYM_CURDIR`
|
sym_link_file=`$BASENAME $NOSYM_CURDIR`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -11707,7 +11715,7 @@ fi
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -11719,20 +11727,24 @@ fi
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
BINARY=`$READLINK -f $BINARY`
|
BINARY=`$READLINK -f $BINARY`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $BINARY`
|
sym_link_dir=`$DIRNAME $BINARY`
|
||||||
sym_link_file=`$BASENAME $BINARY`
|
sym_link_file=`$BASENAME $BINARY`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -15827,7 +15839,14 @@ $as_echo "$as_me: Please point to the VC/bin directory within the Visual Studio
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, lib dir is missing. Ignoring" >&5
|
||||||
|
$as_echo "$as_me: Warning: Installation is broken, lib dir is missing. Ignoring" >&6;}
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
@ -15862,7 +15881,14 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, lib dir is missing. Ignoring" >&5
|
||||||
|
$as_echo "$as_me: Warning: Installation is broken, lib dir is missing. Ignoring" >&6;}
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
@ -15897,7 +15923,14 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, lib dir is missing. Ignoring" >&5
|
||||||
|
$as_echo "$as_me: Warning: Installation is broken, lib dir is missing. Ignoring" >&6;}
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
@ -15931,7 +15964,14 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, lib dir is missing. Ignoring" >&5
|
||||||
|
$as_echo "$as_me: Warning: Installation is broken, lib dir is missing. Ignoring" >&6;}
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
@ -15964,7 +16004,14 @@ $as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignori
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, lib dir is missing. Ignoring" >&5
|
||||||
|
$as_echo "$as_me: Warning: Installation is broken, lib dir is missing. Ignoring" >&6;}
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5
|
||||||
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;}
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
@ -16434,8 +16481,9 @@ $as_echo "present but broken" >&6; }
|
|||||||
else
|
else
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
|
||||||
$as_echo "ok" >&6; }
|
$as_echo "ok" >&6; }
|
||||||
VS_INCLUDE="$INCLUDE"
|
# Remove any trailing \ from INCLUDE and LIB to avoid trouble in spec.gmk.
|
||||||
VS_LIB="$LIB"
|
VS_INCLUDE=`$ECHO "$INCLUDE" | $SED 's/\\\\$//'`
|
||||||
|
VS_LIB=`$ECHO "$LIB" | $SED 's/\\\\$//'`
|
||||||
VS_PATH="$PATH"
|
VS_PATH="$PATH"
|
||||||
|
|
||||||
|
|
||||||
@ -18082,7 +18130,7 @@ $as_echo_n "checking resolved symbolic links for CC... " >&6; }
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -18094,20 +18142,24 @@ $as_echo_n "checking resolved symbolic links for CC... " >&6; }
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
TEST_COMPILER=`$READLINK -f $TEST_COMPILER`
|
TEST_COMPILER=`$READLINK -f $TEST_COMPILER`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $TEST_COMPILER`
|
sym_link_dir=`$DIRNAME $TEST_COMPILER`
|
||||||
sym_link_file=`$BASENAME $TEST_COMPILER`
|
sym_link_file=`$BASENAME $TEST_COMPILER`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -18504,7 +18556,7 @@ $as_echo_n "checking for resolved symbolic links for CC... " >&6; }
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -18516,20 +18568,24 @@ $as_echo_n "checking for resolved symbolic links for CC... " >&6; }
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
PROPER_COMPILER_CC=`$READLINK -f $PROPER_COMPILER_CC`
|
PROPER_COMPILER_CC=`$READLINK -f $PROPER_COMPILER_CC`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $PROPER_COMPILER_CC`
|
sym_link_dir=`$DIRNAME $PROPER_COMPILER_CC`
|
||||||
sym_link_file=`$BASENAME $PROPER_COMPILER_CC`
|
sym_link_file=`$BASENAME $PROPER_COMPILER_CC`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -19565,7 +19621,7 @@ $as_echo_n "checking resolved symbolic links for CXX... " >&6; }
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -19577,20 +19633,24 @@ $as_echo_n "checking resolved symbolic links for CXX... " >&6; }
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
TEST_COMPILER=`$READLINK -f $TEST_COMPILER`
|
TEST_COMPILER=`$READLINK -f $TEST_COMPILER`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $TEST_COMPILER`
|
sym_link_dir=`$DIRNAME $TEST_COMPILER`
|
||||||
sym_link_file=`$BASENAME $TEST_COMPILER`
|
sym_link_file=`$BASENAME $TEST_COMPILER`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
@ -19987,7 +20047,7 @@ $as_echo_n "checking for resolved symbolic links for CXX... " >&6; }
|
|||||||
if test "x$READLINK_TESTED" != yes; then
|
if test "x$READLINK_TESTED" != yes; then
|
||||||
# On MacOSX there is a readlink tool with a different
|
# On MacOSX there is a readlink tool with a different
|
||||||
# purpose than the GNU readlink tool. Check the found readlink.
|
# purpose than the GNU readlink tool. Check the found readlink.
|
||||||
ISGNU=`$READLINK --help 2>&1 | $GREP GNU`
|
ISGNU=`$READLINK --version 2>&1 | $GREP GNU`
|
||||||
if test "x$ISGNU" = x; then
|
if test "x$ISGNU" = x; then
|
||||||
# A readlink that we do not know how to use.
|
# A readlink that we do not know how to use.
|
||||||
# Are there other non-GNU readlinks out there?
|
# Are there other non-GNU readlinks out there?
|
||||||
@ -19999,20 +20059,24 @@ $as_echo_n "checking for resolved symbolic links for CXX... " >&6; }
|
|||||||
if test "x$READLINK" != x; then
|
if test "x$READLINK" != x; then
|
||||||
PROPER_COMPILER_CXX=`$READLINK -f $PROPER_COMPILER_CXX`
|
PROPER_COMPILER_CXX=`$READLINK -f $PROPER_COMPILER_CXX`
|
||||||
else
|
else
|
||||||
|
# Save the current directory for restoring afterwards
|
||||||
STARTDIR=$PWD
|
STARTDIR=$PWD
|
||||||
COUNTER=0
|
COUNTER=0
|
||||||
sym_link_dir=`$DIRNAME $PROPER_COMPILER_CXX`
|
sym_link_dir=`$DIRNAME $PROPER_COMPILER_CXX`
|
||||||
sym_link_file=`$BASENAME $PROPER_COMPILER_CXX`
|
sym_link_file=`$BASENAME $PROPER_COMPILER_CXX`
|
||||||
|
# Use the system pwd and not the shell builtin to resolve directory symlinks
|
||||||
|
cd $sym_link_dir
|
||||||
|
cd `$THEPWDCMD`
|
||||||
|
sym_link_dir=`$THEPWDCMD`
|
||||||
|
# Resolve file symlinks
|
||||||
while test $COUNTER -lt 20; do
|
while test $COUNTER -lt 20; do
|
||||||
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
|
||||||
if test "x$ISLINK" == x; then
|
if test "x$ISLINK" == x; then
|
||||||
# This is not a symbolic link! We are done!
|
# This is not a symbolic link! We are done!
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
# The link might be relative! We have to use cd to travel safely.
|
# Again resolve directory symlinks since the target of the just found
|
||||||
cd $sym_link_dir
|
# link could be in a different directory
|
||||||
# ... and we must get the to the absolute path, not one using symbolic links.
|
|
||||||
cd `pwd -P`
|
|
||||||
cd `$DIRNAME $ISLINK`
|
cd `$DIRNAME $ISLINK`
|
||||||
sym_link_dir=`$THEPWDCMD`
|
sym_link_dir=`$THEPWDCMD`
|
||||||
sym_link_file=`$BASENAME $ISLINK`
|
sym_link_file=`$BASENAME $ISLINK`
|
||||||
|
@ -48,7 +48,12 @@ AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT],
|
|||||||
METHOD="$2"
|
METHOD="$2"
|
||||||
BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(WIN_SDK_BASE)
|
BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(WIN_SDK_BASE)
|
||||||
if test -d "$WIN_SDK_BASE"; then
|
if test -d "$WIN_SDK_BASE"; then
|
||||||
if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
# There have been cases of partial or broken SDK installations. A missing
|
||||||
|
# lib dir is not going to work.
|
||||||
|
if test ! -d "$WIN_SDK_BASE/../lib"; then
|
||||||
|
AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD])
|
||||||
|
AC_MSG_NOTICE([Warning: Installation is broken, lib dir is missing. Ignoring])
|
||||||
|
elif test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then
|
||||||
AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD])
|
AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD])
|
||||||
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd"
|
||||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||||
@ -200,8 +205,9 @@ AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV],
|
|||||||
AC_MSG_ERROR([Your VC command prompt seems broken, INCLUDE and/or LIB is missing.])
|
AC_MSG_ERROR([Your VC command prompt seems broken, INCLUDE and/or LIB is missing.])
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([ok])
|
AC_MSG_RESULT([ok])
|
||||||
VS_INCLUDE="$INCLUDE"
|
# Remove any trailing \ from INCLUDE and LIB to avoid trouble in spec.gmk.
|
||||||
VS_LIB="$LIB"
|
VS_INCLUDE=`$ECHO "$INCLUDE" | $SED 's/\\\\$//'`
|
||||||
|
VS_LIB=`$ECHO "$LIB" | $SED 's/\\\\$//'`
|
||||||
VS_PATH="$PATH"
|
VS_PATH="$PATH"
|
||||||
AC_SUBST(VS_INCLUDE)
|
AC_SUBST(VS_INCLUDE)
|
||||||
AC_SUBST(VS_LIB)
|
AC_SUBST(VS_LIB)
|
||||||
|
@ -149,7 +149,7 @@ define SetupArchive
|
|||||||
$$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES)) \
|
$$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES)) \
|
||||||
$$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES))))
|
$$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES))))
|
||||||
ifeq (,$$($1_SKIP_METAINF))
|
ifeq (,$$($1_SKIP_METAINF))
|
||||||
$1_DEPS+=$$(shell $(FIND) $$(addsuffix /META-INF,$$($1_SRCS)) -type f 2> /dev/null))
|
$1_DEPS+=$$(shell $(FIND) $$(addsuffix /META-INF,$$($1_SRCS)) -type f 2> /dev/null)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -187,3 +187,4 @@ d54dc53e223ed9ce7d5f4d2cd02ad9d5def3c2db jdk8-b59
|
|||||||
6ccbf67b68bfed1ab9c44ab8748a5bdc7df33506 jdk8-b63
|
6ccbf67b68bfed1ab9c44ab8748a5bdc7df33506 jdk8-b63
|
||||||
54d599a5b4aad83c235d590652fc81f41c2824fb jdk8-b64
|
54d599a5b4aad83c235d590652fc81f41c2824fb jdk8-b64
|
||||||
5132f7900a8f0c30c3ca7f7a32f9433f4fee7745 jdk8-b65
|
5132f7900a8f0c30c3ca7f7a32f9433f4fee7745 jdk8-b65
|
||||||
|
65771ad1ca557ca26e4979d4dc633cf685435cb8 jdk8-b66
|
||||||
|
@ -295,3 +295,5 @@ acabb5c282f59be7e3238920b2ea06b684ab68f7 jdk8-b63
|
|||||||
b4ee7b773144a88af8b6b92e4384dea82cb948d8 hs25-b09
|
b4ee7b773144a88af8b6b92e4384dea82cb948d8 hs25-b09
|
||||||
0f7290a03b24bd562583fa325d3566c21c51fb94 jdk8-b65
|
0f7290a03b24bd562583fa325d3566c21c51fb94 jdk8-b65
|
||||||
cfc5309f03b7bd6c1567618b63cf1fc74c0f2a8f hs25-b10
|
cfc5309f03b7bd6c1567618b63cf1fc74c0f2a8f hs25-b10
|
||||||
|
01684f7fee1b86222be69bc23841ec2a4416696c jdk8-b66
|
||||||
|
b61d9c88b759d1594b8af1655598e8fa00393672 hs25-b11
|
||||||
|
@ -48,6 +48,7 @@ public class ConstMethod extends VMObject {
|
|||||||
private static int HAS_CHECKED_EXCEPTIONS;
|
private static int HAS_CHECKED_EXCEPTIONS;
|
||||||
private static int HAS_LOCALVARIABLE_TABLE;
|
private static int HAS_LOCALVARIABLE_TABLE;
|
||||||
private static int HAS_EXCEPTION_TABLE;
|
private static int HAS_EXCEPTION_TABLE;
|
||||||
|
private static int HAS_GENERIC_SIGNATURE;
|
||||||
|
|
||||||
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
|
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
|
||||||
Type type = db.lookupType("ConstMethod");
|
Type type = db.lookupType("ConstMethod");
|
||||||
@ -60,13 +61,14 @@ public class ConstMethod extends VMObject {
|
|||||||
HAS_CHECKED_EXCEPTIONS = db.lookupIntConstant("ConstMethod::_has_checked_exceptions").intValue();
|
HAS_CHECKED_EXCEPTIONS = db.lookupIntConstant("ConstMethod::_has_checked_exceptions").intValue();
|
||||||
HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue();
|
HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue();
|
||||||
HAS_EXCEPTION_TABLE = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue();
|
HAS_EXCEPTION_TABLE = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue();
|
||||||
|
HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue();
|
||||||
|
|
||||||
// Size of Java bytecodes allocated immediately after ConstMethod*.
|
// Size of Java bytecodes allocated immediately after ConstMethod*.
|
||||||
codeSize = new CIntField(type.getCIntegerField("_code_size"), 0);
|
codeSize = new CIntField(type.getCIntegerField("_code_size"), 0);
|
||||||
nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0);
|
nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0);
|
||||||
signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0);
|
signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0);
|
||||||
genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"),0);
|
|
||||||
idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0);
|
idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0);
|
||||||
|
maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
|
||||||
|
|
||||||
// start of byte code
|
// start of byte code
|
||||||
bytecodeOffset = type.getSize();
|
bytecodeOffset = type.getSize();
|
||||||
@ -92,8 +94,8 @@ public class ConstMethod extends VMObject {
|
|||||||
private static CIntField codeSize;
|
private static CIntField codeSize;
|
||||||
private static CIntField nameIndex;
|
private static CIntField nameIndex;
|
||||||
private static CIntField signatureIndex;
|
private static CIntField signatureIndex;
|
||||||
private static CIntField genericSignatureIndex;
|
|
||||||
private static CIntField idnum;
|
private static CIntField idnum;
|
||||||
|
private static CIntField maxStack;
|
||||||
|
|
||||||
// start of bytecode
|
// start of bytecode
|
||||||
private static long bytecodeOffset;
|
private static long bytecodeOffset;
|
||||||
@ -134,13 +136,21 @@ public class ConstMethod extends VMObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public long getGenericSignatureIndex() {
|
public long getGenericSignatureIndex() {
|
||||||
return genericSignatureIndex.getValue(this);
|
if (hasGenericSignature()) {
|
||||||
|
return getAddress().getCIntegerAt(offsetOfGenericSignatureIndex(), 2, true);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getIdNum() {
|
public long getIdNum() {
|
||||||
return idnum.getValue(this);
|
return idnum.getValue(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getMaxStack() {
|
||||||
|
return maxStack.getValue(this);
|
||||||
|
}
|
||||||
|
|
||||||
public Symbol getName() {
|
public Symbol getName() {
|
||||||
return getMethod().getName();
|
return getMethod().getName();
|
||||||
}
|
}
|
||||||
@ -235,8 +245,8 @@ public class ConstMethod extends VMObject {
|
|||||||
visitor.doCInt(codeSize, true);
|
visitor.doCInt(codeSize, true);
|
||||||
visitor.doCInt(nameIndex, true);
|
visitor.doCInt(nameIndex, true);
|
||||||
visitor.doCInt(signatureIndex, true);
|
visitor.doCInt(signatureIndex, true);
|
||||||
visitor.doCInt(genericSignatureIndex, true);
|
|
||||||
visitor.doCInt(codeSize, true);
|
visitor.doCInt(codeSize, true);
|
||||||
|
visitor.doCInt(maxStack, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
@ -353,6 +363,10 @@ public class ConstMethod extends VMObject {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasGenericSignature() {
|
||||||
|
return (getFlags() & HAS_GENERIC_SIGNATURE) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Internals only below this point
|
// Internals only below this point
|
||||||
@ -377,10 +391,16 @@ public class ConstMethod extends VMObject {
|
|||||||
return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2;
|
return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
private long offsetOfCheckedExceptionsLength() {
|
// Offset of the generic signature index
|
||||||
|
private long offsetOfGenericSignatureIndex() {
|
||||||
return offsetOfLastU2Element();
|
return offsetOfLastU2Element();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private long offsetOfCheckedExceptionsLength() {
|
||||||
|
return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
|
||||||
|
offsetOfLastU2Element();
|
||||||
|
}
|
||||||
|
|
||||||
private int getCheckedExceptionsLength() {
|
private int getCheckedExceptionsLength() {
|
||||||
if (hasCheckedExceptions()) {
|
if (hasCheckedExceptions()) {
|
||||||
return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
|
return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
|
||||||
@ -431,7 +451,8 @@ public class ConstMethod extends VMObject {
|
|||||||
} else if (hasCheckedExceptions()) {
|
} else if (hasCheckedExceptions()) {
|
||||||
return offsetOfCheckedExceptions() - 2;
|
return offsetOfCheckedExceptions() - 2;
|
||||||
} else {
|
} else {
|
||||||
return offsetOfLastU2Element();
|
return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
|
||||||
|
offsetOfLastU2Element();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +481,8 @@ public class ConstMethod extends VMObject {
|
|||||||
if (hasCheckedExceptions()) {
|
if (hasCheckedExceptions()) {
|
||||||
return offsetOfCheckedExceptions() - 2;
|
return offsetOfCheckedExceptions() - 2;
|
||||||
} else {
|
} else {
|
||||||
return offsetOfLastU2Element();
|
return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
|
||||||
|
offsetOfLastU2Element();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@ public class Method extends Metadata {
|
|||||||
constMethod = type.getAddressField("_constMethod");
|
constMethod = type.getAddressField("_constMethod");
|
||||||
methodData = type.getAddressField("_method_data");
|
methodData = type.getAddressField("_method_data");
|
||||||
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
|
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
|
||||||
maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
|
|
||||||
maxLocals = new CIntField(type.getCIntegerField("_max_locals"), 0);
|
maxLocals = new CIntField(type.getCIntegerField("_max_locals"), 0);
|
||||||
sizeOfParameters = new CIntField(type.getCIntegerField("_size_of_parameters"), 0);
|
sizeOfParameters = new CIntField(type.getCIntegerField("_size_of_parameters"), 0);
|
||||||
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
|
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
|
||||||
@ -84,7 +83,6 @@ public class Method extends Metadata {
|
|||||||
private static AddressField constMethod;
|
private static AddressField constMethod;
|
||||||
private static AddressField methodData;
|
private static AddressField methodData;
|
||||||
private static CIntField methodSize;
|
private static CIntField methodSize;
|
||||||
private static CIntField maxStack;
|
|
||||||
private static CIntField maxLocals;
|
private static CIntField maxLocals;
|
||||||
private static CIntField sizeOfParameters;
|
private static CIntField sizeOfParameters;
|
||||||
private static CIntField accessFlags;
|
private static CIntField accessFlags;
|
||||||
@ -135,7 +133,7 @@ public class Method extends Metadata {
|
|||||||
}
|
}
|
||||||
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
|
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
|
||||||
public long getMethodSize() { return methodSize.getValue(this); }
|
public long getMethodSize() { return methodSize.getValue(this); }
|
||||||
public long getMaxStack() { return maxStack.getValue(this); }
|
public long getMaxStack() { return getConstMethod().getMaxStack(); }
|
||||||
public long getMaxLocals() { return maxLocals.getValue(this); }
|
public long getMaxLocals() { return maxLocals.getValue(this); }
|
||||||
public long getSizeOfParameters() { return sizeOfParameters.getValue(this); }
|
public long getSizeOfParameters() { return sizeOfParameters.getValue(this); }
|
||||||
public long getNameIndex() { return getConstMethod().getNameIndex(); }
|
public long getNameIndex() { return getConstMethod().getNameIndex(); }
|
||||||
@ -284,7 +282,6 @@ public class Method extends Metadata {
|
|||||||
|
|
||||||
public void iterateFields(MetadataVisitor visitor) {
|
public void iterateFields(MetadataVisitor visitor) {
|
||||||
visitor.doCInt(methodSize, true);
|
visitor.doCInt(methodSize, true);
|
||||||
visitor.doCInt(maxStack, true);
|
|
||||||
visitor.doCInt(maxLocals, true);
|
visitor.doCInt(maxLocals, true);
|
||||||
visitor.doCInt(sizeOfParameters, true);
|
visitor.doCInt(sizeOfParameters, true);
|
||||||
visitor.doCInt(accessFlags, true);
|
visitor.doCInt(accessFlags, true);
|
||||||
|
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012
|
|||||||
|
|
||||||
HS_MAJOR_VER=25
|
HS_MAJOR_VER=25
|
||||||
HS_MINOR_VER=0
|
HS_MINOR_VER=0
|
||||||
HS_BUILD_NUMBER=10
|
HS_BUILD_NUMBER=11
|
||||||
|
|
||||||
JDK_MAJOR_VER=1
|
JDK_MAJOR_VER=1
|
||||||
JDK_MINOR_VER=8
|
JDK_MINOR_VER=8
|
||||||
|
@ -1048,7 +1048,6 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
|
|||||||
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
|
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
|
||||||
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
|
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
|
||||||
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
|
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
|
||||||
const Address max_stack (G5_method, 0, in_bytes(Method::max_stack_offset()));
|
|
||||||
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
|
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
|
||||||
|
|
||||||
// slop factor is two extra slots on the expression stack so that
|
// slop factor is two extra slots on the expression stack so that
|
||||||
@ -1070,7 +1069,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
|
|||||||
__ lduh( size_of_parameters, Gtmp );
|
__ lduh( size_of_parameters, Gtmp );
|
||||||
__ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words
|
__ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words
|
||||||
} else {
|
} else {
|
||||||
__ lduh(max_stack, Gtmp); // Full size expression stack
|
// Full size expression stack
|
||||||
|
__ ld_ptr(constMethod, Gtmp);
|
||||||
|
__ lduh(Gtmp, in_bytes(ConstMethod::max_stack_offset()), Gtmp);
|
||||||
}
|
}
|
||||||
__ add(Gtmp, fixed_size, Gtmp); // plus the fixed portion
|
__ add(Gtmp, fixed_size, Gtmp); // plus the fixed portion
|
||||||
|
|
||||||
@ -1206,7 +1207,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
|
|||||||
__ sub(O2, wordSize, O2); // prepush
|
__ sub(O2, wordSize, O2); // prepush
|
||||||
__ st_ptr(O2, XXX_STATE(_stack)); // PREPUSH
|
__ st_ptr(O2, XXX_STATE(_stack)); // PREPUSH
|
||||||
|
|
||||||
__ lduh(max_stack, O3); // Full size expression stack
|
// Full size expression stack
|
||||||
|
__ ld_ptr(constMethod, O3);
|
||||||
|
__ lduh(O3, in_bytes(ConstMethod::max_stack_offset()), O3);
|
||||||
guarantee(!EnableInvokeDynamic, "no support yet for java.lang.invoke.MethodHandle"); //6815692
|
guarantee(!EnableInvokeDynamic, "no support yet for java.lang.invoke.MethodHandle"); //6815692
|
||||||
//6815692//if (EnableInvokeDynamic)
|
//6815692//if (EnableInvokeDynamic)
|
||||||
//6815692// __ inc(O3, Method::extra_stack_entries());
|
//6815692// __ inc(O3, Method::extra_stack_entries());
|
||||||
@ -1539,7 +1542,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
|||||||
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
|
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
|
||||||
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
|
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
|
||||||
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
|
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
|
||||||
const Address max_stack (G5_method, 0, in_bytes(Method::max_stack_offset()));
|
|
||||||
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
|
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
|
||||||
|
|
||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
@ -648,7 +648,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
|
|||||||
Method* m = *interpreter_frame_method_addr();
|
Method* m = *interpreter_frame_method_addr();
|
||||||
|
|
||||||
// validate the method we'd find in this potential sender
|
// validate the method we'd find in this potential sender
|
||||||
if (!Universe::heap()->is_valid_method(m)) return false;
|
if (!m->is_valid_method()) return false;
|
||||||
|
|
||||||
// stack frames shouldn't be much larger than max_stack elements
|
// stack frames shouldn't be much larger than max_stack elements
|
||||||
|
|
||||||
|
@ -36,12 +36,7 @@
|
|||||||
#include "runtime/basicLock.hpp"
|
#include "runtime/basicLock.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CC_INTERP
|
#ifndef CC_INTERP
|
||||||
#ifndef FAST_DISPATCH
|
#ifndef FAST_DISPATCH
|
||||||
@ -523,7 +518,8 @@ void InterpreterMacroAssembler::empty_expression_stack() {
|
|||||||
delayed()->nop();
|
delayed()->nop();
|
||||||
|
|
||||||
// Compute max expression stack+register save area
|
// Compute max expression stack+register save area
|
||||||
lduh(Lmethod, in_bytes(Method::max_stack_offset()), Gframe_size); // Load max stack.
|
ld_ptr(Lmethod, in_bytes(Method::const_offset()), Gframe_size);
|
||||||
|
lduh(Gframe_size, in_bytes(ConstMethod::max_stack_offset()), Gframe_size); // Load max stack.
|
||||||
add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size );
|
add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size );
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -37,13 +37,8 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
#include "opto/runtime.hpp"
|
#include "opto/runtime.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,12 +26,7 @@
|
|||||||
#include "runtime/deoptimization.hpp"
|
#include "runtime/deoptimization.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Implementation of the platform-specific part of StubRoutines - for
|
// Implementation of the platform-specific part of StubRoutines - for
|
||||||
// a description of how to extend it, see the stubRoutines.hpp file.
|
// a description of how to extend it, see the stubRoutines.hpp file.
|
||||||
|
@ -496,7 +496,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
|
|
||||||
const Address size_of_parameters(G5_method, Method::size_of_parameters_offset());
|
const Address size_of_parameters(G5_method, Method::size_of_parameters_offset());
|
||||||
const Address size_of_locals (G5_method, Method::size_of_locals_offset());
|
const Address size_of_locals (G5_method, Method::size_of_locals_offset());
|
||||||
const Address max_stack (G5_method, Method::max_stack_offset());
|
const Address constMethod (G5_method, Method::const_offset());
|
||||||
int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong );
|
int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong );
|
||||||
|
|
||||||
const int extra_space =
|
const int extra_space =
|
||||||
@ -538,7 +538,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
// see if the frame is greater than one page in size. If so,
|
// see if the frame is greater than one page in size. If so,
|
||||||
// then we need to verify there is enough stack space remaining
|
// then we need to verify there is enough stack space remaining
|
||||||
// Frame_size = (max_stack + extra_space) * BytesPerWord;
|
// Frame_size = (max_stack + extra_space) * BytesPerWord;
|
||||||
__ lduh( max_stack, Gframe_size );
|
__ ld_ptr( constMethod, Gframe_size );
|
||||||
|
__ lduh( Gframe_size, in_bytes(ConstMethod::max_stack_offset()), Gframe_size );
|
||||||
__ add( Gframe_size, extra_space, Gframe_size );
|
__ add( Gframe_size, extra_space, Gframe_size );
|
||||||
__ round_to( Gframe_size, WordsPerLong );
|
__ round_to( Gframe_size, WordsPerLong );
|
||||||
__ sll( Gframe_size, Interpreter::logStackElementSize, Gframe_size);
|
__ sll( Gframe_size, Interpreter::logStackElementSize, Gframe_size);
|
||||||
|
@ -538,9 +538,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
|
|||||||
|
|
||||||
// compute full expression stack limit
|
// compute full expression stack limit
|
||||||
|
|
||||||
const Address size_of_stack (rbx, Method::max_stack_offset());
|
|
||||||
const int extra_stack = 0; //6815692//Method::extra_stack_words();
|
const int extra_stack = 0; //6815692//Method::extra_stack_words();
|
||||||
__ load_unsigned_short(rdx, size_of_stack); // get size of expression stack in words
|
__ movptr(rdx, Address(rbx, Method::const_offset()));
|
||||||
|
__ load_unsigned_short(rdx, Address(rdx, ConstMethod::max_stack_offset())); // get size of expression stack in words
|
||||||
__ negptr(rdx); // so we can subtract in next step
|
__ negptr(rdx); // so we can subtract in next step
|
||||||
// Allocate expression stack
|
// Allocate expression stack
|
||||||
__ lea(rsp, Address(rsp, rdx, Address::times_ptr, -extra_stack));
|
__ lea(rsp, Address(rsp, rdx, Address::times_ptr, -extra_stack));
|
||||||
@ -682,12 +682,12 @@ void InterpreterGenerator::generate_stack_overflow_check(void) {
|
|||||||
const Address stack_size(thread, Thread::stack_size_offset());
|
const Address stack_size(thread, Thread::stack_size_offset());
|
||||||
|
|
||||||
// locals + overhead, in bytes
|
// locals + overhead, in bytes
|
||||||
const Address size_of_stack (rbx, Method::max_stack_offset());
|
// Always give one monitor to allow us to start interp if sync method.
|
||||||
// Always give one monitor to allow us to start interp if sync method.
|
// Any additional monitors need a check when moving the expression stack
|
||||||
// Any additional monitors need a check when moving the expression stack
|
const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize;
|
||||||
const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize;
|
const int extra_stack = 0; //6815692//Method::extra_stack_entries();
|
||||||
const int extra_stack = 0; //6815692//Method::extra_stack_entries();
|
__ movptr(rax, Address(rbx, Method::const_offset()));
|
||||||
__ load_unsigned_short(rax, size_of_stack); // get size of expression stack in words
|
__ load_unsigned_short(rax, Address(rax, ConstMethod::max_stack_offset())); // get size of expression stack in words
|
||||||
__ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), extra_stack + one_monitor));
|
__ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), extra_stack + one_monitor));
|
||||||
__ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size));
|
__ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size));
|
||||||
|
|
||||||
|
@ -534,7 +534,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
|
|||||||
Method* m = *interpreter_frame_method_addr();
|
Method* m = *interpreter_frame_method_addr();
|
||||||
|
|
||||||
// validate the method we'd find in this potential sender
|
// validate the method we'd find in this potential sender
|
||||||
if (!Universe::heap()->is_valid_method(m)) return false;
|
if (!m->is_valid_method()) return false;
|
||||||
|
|
||||||
// stack frames shouldn't be much larger than max_stack elements
|
// stack frames shouldn't be much larger than max_stack elements
|
||||||
|
|
||||||
|
@ -36,18 +36,7 @@
|
|||||||
#include "runtime/basicLock.hpp"
|
#include "runtime/basicLock.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Implementation of InterpreterMacroAssembler
|
// Implementation of InterpreterMacroAssembler
|
||||||
|
@ -36,18 +36,7 @@
|
|||||||
#include "runtime/basicLock.hpp"
|
#include "runtime/basicLock.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Implementation of InterpreterMacroAssembler
|
// Implementation of InterpreterMacroAssembler
|
||||||
|
@ -37,19 +37,8 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
#include "opto/runtime.hpp"
|
#include "opto/runtime.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -37,19 +37,8 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
#include "opto/runtime.hpp"
|
#include "opto/runtime.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,18 +26,7 @@
|
|||||||
#include "runtime/deoptimization.hpp"
|
#include "runtime/deoptimization.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Implementation of the platform-specific part of StubRoutines - for
|
// Implementation of the platform-specific part of StubRoutines - for
|
||||||
// a description of how to extend it, see the stubRoutines.hpp file.
|
// a description of how to extend it, see the stubRoutines.hpp file.
|
||||||
|
@ -26,18 +26,7 @@
|
|||||||
#include "runtime/deoptimization.hpp"
|
#include "runtime/deoptimization.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Implementation of the platform-specific part of StubRoutines - for
|
// Implementation of the platform-specific part of StubRoutines - for
|
||||||
// a description of how to extend it, see the stubRoutines.hpp file.
|
// a description of how to extend it, see the stubRoutines.hpp file.
|
||||||
|
@ -37,11 +37,6 @@
|
|||||||
#include "runtime/basicLock.hpp"
|
#include "runtime/basicLock.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This file is intentionally empty
|
// This file is intentionally empty
|
||||||
|
@ -38,14 +38,9 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubCodeGenerator.hpp"
|
#include "runtime/stubCodeGenerator.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "stack_zero.inline.hpp"
|
#include "stack_zero.inline.hpp"
|
||||||
#include "utilities/top.hpp"
|
#include "utilities/top.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
#include "opto/runtime.hpp"
|
#include "opto/runtime.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,9 +27,4 @@
|
|||||||
#include "runtime/deoptimization.hpp"
|
#include "runtime/deoptimization.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "mutex_bsd.inline.hpp"
|
#include "mutex_bsd.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "os_bsd.inline.hpp"
|
#include "os_bsd.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
|
|
||||||
// Reconciliation History
|
// Reconciliation History
|
||||||
|
@ -52,11 +52,11 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/statSampler.hpp"
|
#include "runtime/statSampler.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/runtimeService.hpp"
|
#include "services/runtimeService.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
#include "utilities/decoder.hpp"
|
#include "utilities/decoder.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
# include <pthread.h>
|
# include <pthread.h>
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
#ifndef OS_BSD_VM_THREAD_BSD_INLINE_HPP
|
#ifndef OS_BSD_VM_THREAD_BSD_INLINE_HPP
|
||||||
#define OS_BSD_VM_THREAD_BSD_INLINE_HPP
|
#define OS_BSD_VM_THREAD_BSD_INLINE_HPP
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
||||||
|
#error "This file should only be included from thread.inline.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/prefetch.hpp"
|
#include "runtime/prefetch.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "mutex_linux.inline.hpp"
|
#include "mutex_linux.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "os_linux.inline.hpp"
|
#include "os_linux.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
|
|
||||||
// Reconciliation History
|
// Reconciliation History
|
||||||
|
@ -52,11 +52,11 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/statSampler.hpp"
|
#include "runtime/statSampler.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/runtimeService.hpp"
|
#include "services/runtimeService.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
#include "utilities/decoder.hpp"
|
#include "utilities/decoder.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
# include <pthread.h>
|
# include <pthread.h>
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
#ifndef OS_LINUX_VM_THREAD_LINUX_INLINE_HPP
|
#ifndef OS_LINUX_VM_THREAD_LINUX_INLINE_HPP
|
||||||
#define OS_LINUX_VM_THREAD_LINUX_INLINE_HPP
|
#define OS_LINUX_VM_THREAD_LINUX_INLINE_HPP
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
||||||
|
#error "This file should only be included from thread.inline.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/prefetch.hpp"
|
#include "runtime/prefetch.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "mutex_solaris.inline.hpp"
|
#include "mutex_solaris.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
|
||||||
// Solaris-specific include, therefore not in includeDB_*
|
// Solaris-specific include, therefore not in includeDB_*
|
||||||
|
@ -27,6 +27,6 @@
|
|||||||
|
|
||||||
#include "os_solaris.inline.hpp"
|
#include "os_solaris.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
#endif // OS_SOLARIS_VM_MUTEX_SOLARIS_INLINE_HPP
|
#endif // OS_SOLARIS_VM_MUTEX_SOLARIS_INLINE_HPP
|
||||||
|
@ -52,12 +52,12 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/statSampler.hpp"
|
#include "runtime/statSampler.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/memTracker.hpp"
|
#include "services/memTracker.hpp"
|
||||||
#include "services/runtimeService.hpp"
|
#include "services/runtimeService.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
#include "utilities/decoder.hpp"
|
#include "utilities/decoder.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
|
|
||||||
// OS-includes here
|
// OS-includes here
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
#ifndef OS_SOLARIS_VM_THREAD_SOLARIS_INLINE_HPP
|
#ifndef OS_SOLARIS_VM_THREAD_SOLARIS_INLINE_HPP
|
||||||
#define OS_SOLARIS_VM_THREAD_SOLARIS_INLINE_HPP
|
#define OS_SOLARIS_VM_THREAD_SOLARIS_INLINE_HPP
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
||||||
|
#error "This file should only be included from thread.inline.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/prefetch.hpp"
|
#include "runtime/prefetch.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "mutex_windows.inline.hpp"
|
#include "mutex_windows.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
|
||||||
// put OS-includes here
|
// put OS-includes here
|
||||||
|
@ -27,6 +27,6 @@
|
|||||||
|
|
||||||
#include "os_windows.inline.hpp"
|
#include "os_windows.inline.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
#endif // OS_WINDOWS_VM_MUTEX_WINDOWS_INLINE_HPP
|
#endif // OS_WINDOWS_VM_MUTEX_WINDOWS_INLINE_HPP
|
||||||
|
@ -55,11 +55,11 @@
|
|||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/statSampler.hpp"
|
#include "runtime/statSampler.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "services/attachListener.hpp"
|
#include "services/attachListener.hpp"
|
||||||
#include "services/runtimeService.hpp"
|
#include "services/runtimeService.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
|
||||||
#include "utilities/decoder.hpp"
|
#include "utilities/decoder.hpp"
|
||||||
#include "utilities/defaultStream.hpp"
|
#include "utilities/defaultStream.hpp"
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadCritical.hpp"
|
#include "runtime/threadCritical.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
|
||||||
|
|
||||||
// OS-includes here
|
// OS-includes here
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
|
@ -25,6 +25,10 @@
|
|||||||
#ifndef OS_WINDOWS_VM_THREAD_WINDOWS_INLINE_HPP
|
#ifndef OS_WINDOWS_VM_THREAD_WINDOWS_INLINE_HPP
|
||||||
#define OS_WINDOWS_VM_THREAD_WINDOWS_INLINE_HPP
|
#define OS_WINDOWS_VM_THREAD_WINDOWS_INLINE_HPP
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE
|
||||||
|
#error "This file should only be included from thread.inline.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/prefetch.hpp"
|
#include "runtime/prefetch.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.hpp"
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
|
|
||||||
// Map stack pointer (%esp) to thread pointer for faster TLS access
|
// Map stack pointer (%esp) to thread pointer for faster TLS access
|
||||||
//
|
//
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -54,8 +54,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
|
||||||
|
|
||||||
void ThreadLocalStorage::generate_code_for_get_thread() {
|
void ThreadLocalStorage::generate_code_for_get_thread() {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_bsd.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
void JavaThread::cache_global_variables() {
|
void JavaThread::cache_global_variables() {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
|
|
||||||
void ThreadLocalStorage::generate_code_for_get_thread() {
|
void ThreadLocalStorage::generate_code_for_get_thread() {
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
|
|
||||||
// Map stack pointer (%esp) to thread pointer for faster TLS access
|
// Map stack pointer (%esp) to thread pointer for faster TLS access
|
||||||
//
|
//
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -49,8 +49,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
|
||||||
|
|
||||||
void ThreadLocalStorage::generate_code_for_get_thread() {
|
void ThreadLocalStorage::generate_code_for_get_thread() {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_linux.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
void JavaThread::cache_global_variables() {
|
void JavaThread::cache_global_variables() {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
|
|
||||||
// Provides an entry point we can link against and
|
// Provides an entry point we can link against and
|
||||||
// a buffer we can emit code into. The buffer is
|
// a buffer we can emit code into. The buffer is
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
|
||||||
|
|
||||||
#ifdef AMD64
|
#ifdef AMD64
|
||||||
extern "C" Thread* fs_load(ptrdiff_t tlsOffset);
|
extern "C" Thread* fs_load(ptrdiff_t tlsOffset);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_solaris.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
#include "runtime/osThread.hpp"
|
#include "runtime/osThread.hpp"
|
||||||
#include "runtime/sharedRuntime.hpp"
|
#include "runtime/sharedRuntime.hpp"
|
||||||
#include "runtime/stubRoutines.hpp"
|
#include "runtime/stubRoutines.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/timer.hpp"
|
#include "runtime/timer.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
|
||||||
#include "utilities/events.hpp"
|
#include "utilities/events.hpp"
|
||||||
#include "utilities/vmError.hpp"
|
#include "utilities/vmError.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/threadLocalStorage.hpp"
|
#include "runtime/threadLocalStorage.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
|
||||||
|
|
||||||
// Provides an entry point we can link against and
|
// Provides an entry point we can link against and
|
||||||
// a buffer we can emit code into. The buffer is
|
// a buffer we can emit code into. The buffer is
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "runtime/frame.inline.hpp"
|
#include "runtime/frame.inline.hpp"
|
||||||
#include "thread_windows.inline.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
// For Forte Analyzer AsyncGetCallTrace profiling support - thread is
|
||||||
// currently interrupted by SIGPROF
|
// currently interrupted by SIGPROF
|
||||||
|
@ -492,6 +492,26 @@ void CodeBuffer::compute_final_layout(CodeBuffer* dest) const {
|
|||||||
dest->verify_section_allocation();
|
dest->verify_section_allocation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Anonymous classes need mirror to keep the metadata alive but
|
||||||
|
// for regular classes, the class_loader is sufficient.
|
||||||
|
static void append_oop_references(GrowableArray<oop>* oops, Klass* k) {
|
||||||
|
if (k->oop_is_instance()) {
|
||||||
|
InstanceKlass* ik = InstanceKlass::cast(k);
|
||||||
|
if (ik->is_anonymous()) {
|
||||||
|
oop o = ik->java_mirror();
|
||||||
|
assert (o != NULL, "should have a mirror");
|
||||||
|
if (!oops->contains(o)) {
|
||||||
|
oops->append(o);
|
||||||
|
}
|
||||||
|
return; // only need the mirror
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oop cl = k->class_loader();
|
||||||
|
if (cl != NULL && !oops->contains(cl)) {
|
||||||
|
oops->append(cl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
||||||
No_Safepoint_Verifier nsv;
|
No_Safepoint_Verifier nsv;
|
||||||
|
|
||||||
@ -509,7 +529,6 @@ void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
|||||||
if (md->metadata_is_immediate()) {
|
if (md->metadata_is_immediate()) {
|
||||||
Metadata* m = md->metadata_value();
|
Metadata* m = md->metadata_value();
|
||||||
if (oop_recorder()->is_real(m)) {
|
if (oop_recorder()->is_real(m)) {
|
||||||
oop o = NULL;
|
|
||||||
if (m->is_methodData()) {
|
if (m->is_methodData()) {
|
||||||
m = ((MethodData*)m)->method();
|
m = ((MethodData*)m)->method();
|
||||||
}
|
}
|
||||||
@ -517,16 +536,13 @@ void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
|||||||
m = ((Method*)m)->method_holder();
|
m = ((Method*)m)->method_holder();
|
||||||
}
|
}
|
||||||
if (m->is_klass()) {
|
if (m->is_klass()) {
|
||||||
o = ((Klass*)m)->class_loader();
|
append_oop_references(&oops, (Klass*)m);
|
||||||
} else {
|
} else {
|
||||||
// XXX This will currently occur for MDO which don't
|
// XXX This will currently occur for MDO which don't
|
||||||
// have a backpointer. This has to be fixed later.
|
// have a backpointer. This has to be fixed later.
|
||||||
m->print();
|
m->print();
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
if (o != NULL && oops.find(o) == -1) {
|
|
||||||
oops.append(o);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -537,7 +553,6 @@ void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
|||||||
for (int i = 0; i < oop_recorder()->metadata_count(); i++) {
|
for (int i = 0; i < oop_recorder()->metadata_count(); i++) {
|
||||||
Metadata* m = oop_recorder()->metadata_at(i);
|
Metadata* m = oop_recorder()->metadata_at(i);
|
||||||
if (oop_recorder()->is_real(m)) {
|
if (oop_recorder()->is_real(m)) {
|
||||||
oop o = NULL;
|
|
||||||
if (m->is_methodData()) {
|
if (m->is_methodData()) {
|
||||||
m = ((MethodData*)m)->method();
|
m = ((MethodData*)m)->method();
|
||||||
}
|
}
|
||||||
@ -545,24 +560,18 @@ void CodeBuffer::finalize_oop_references(methodHandle mh) {
|
|||||||
m = ((Method*)m)->method_holder();
|
m = ((Method*)m)->method_holder();
|
||||||
}
|
}
|
||||||
if (m->is_klass()) {
|
if (m->is_klass()) {
|
||||||
o = ((Klass*)m)->class_loader();
|
append_oop_references(&oops, (Klass*)m);
|
||||||
} else {
|
} else {
|
||||||
m->print();
|
m->print();
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
if (o != NULL && oops.find(o) == -1) {
|
|
||||||
oops.append(o);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the class loader of Method* for the nmethod itself
|
// Add the class loader of Method* for the nmethod itself
|
||||||
oop cl = mh->method_holder()->class_loader();
|
append_oop_references(&oops, mh->method_holder());
|
||||||
if (cl != NULL) {
|
|
||||||
oops.append(cl);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add any oops that we've found
|
// Add any oops that we've found
|
||||||
Thread* thread = Thread::current();
|
Thread* thread = Thread::current();
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
#include "utilities/copy.hpp"
|
#include "utilities/copy.hpp"
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifndef PRODUCT
|
||||||
|
|
||||||
// ciReplay
|
// ciReplay
|
||||||
|
|
||||||
@ -939,4 +939,4 @@ bool ciReplay::is_loaded(Method* method) {
|
|||||||
ciMethodRecord* rec = replay_state->find_ciMethodRecord(method);
|
ciMethodRecord* rec = replay_state->find_ciMethodRecord(method);
|
||||||
return rec != NULL;
|
return rec != NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // PRODUCT
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
class ciReplay {
|
class ciReplay {
|
||||||
CI_PACKAGE_ACCESS
|
CI_PACKAGE_ACCESS
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifndef PRODUCT
|
||||||
private:
|
private:
|
||||||
static int replay_impl(TRAPS);
|
static int replay_impl(TRAPS);
|
||||||
|
|
||||||
|
@ -2184,7 +2184,7 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
Method* m = Method::allocate(
|
Method* m = Method::allocate(
|
||||||
loader_data, code_length, access_flags, linenumber_table_length,
|
loader_data, code_length, access_flags, linenumber_table_length,
|
||||||
total_lvt_length, exception_table_length, checked_exceptions_length,
|
total_lvt_length, exception_table_length, checked_exceptions_length,
|
||||||
ConstMethod::NORMAL, CHECK_(nullHandle));
|
generic_signature_index, ConstMethod::NORMAL, CHECK_(nullHandle));
|
||||||
|
|
||||||
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
|
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
|
||||||
|
|
||||||
@ -2192,7 +2192,6 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
|
|||||||
m->set_constants(cp());
|
m->set_constants(cp());
|
||||||
m->set_name_index(name_index);
|
m->set_name_index(name_index);
|
||||||
m->set_signature_index(signature_index);
|
m->set_signature_index(signature_index);
|
||||||
m->set_generic_signature_index(generic_signature_index);
|
|
||||||
#ifdef CC_INTERP
|
#ifdef CC_INTERP
|
||||||
// hmm is there a gc issue here??
|
// hmm is there a gc issue here??
|
||||||
ResultTypeFinder rtf(cp->symbol_at(signature_index));
|
ResultTypeFinder rtf(cp->symbol_at(signature_index));
|
||||||
@ -2950,7 +2949,7 @@ static void parseAndPrintGenericSignatures(
|
|||||||
|
|
||||||
|
|
||||||
instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
||||||
Handle class_loader,
|
ClassLoaderData* loader_data,
|
||||||
Handle protection_domain,
|
Handle protection_domain,
|
||||||
KlassHandle host_klass,
|
KlassHandle host_klass,
|
||||||
GrowableArray<Handle>* cp_patches,
|
GrowableArray<Handle>* cp_patches,
|
||||||
@ -2964,7 +2963,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
// original class bytes.
|
// original class bytes.
|
||||||
unsigned char *cached_class_file_bytes = NULL;
|
unsigned char *cached_class_file_bytes = NULL;
|
||||||
jint cached_class_file_length;
|
jint cached_class_file_length;
|
||||||
ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader());
|
Handle class_loader(THREAD, loader_data->class_loader());
|
||||||
bool has_default_methods = false;
|
bool has_default_methods = false;
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
|
|
||||||
@ -3005,7 +3004,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
|
|||||||
unsigned char* ptr = cfs->buffer();
|
unsigned char* ptr = cfs->buffer();
|
||||||
unsigned char* end_ptr = cfs->buffer() + cfs->length();
|
unsigned char* end_ptr = cfs->buffer() + cfs->length();
|
||||||
|
|
||||||
JvmtiExport::post_class_file_load_hook(name, class_loader, protection_domain,
|
JvmtiExport::post_class_file_load_hook(name, class_loader(), protection_domain,
|
||||||
&ptr, &end_ptr,
|
&ptr, &end_ptr,
|
||||||
&cached_class_file_bytes,
|
&cached_class_file_bytes,
|
||||||
&cached_class_file_length);
|
&cached_class_file_length);
|
||||||
@ -4004,8 +4003,7 @@ void ClassFileParser::set_precomputed_flags(instanceKlassHandle k) {
|
|||||||
assert(k->size_helper() > 0, "layout_helper is initialized");
|
assert(k->size_helper() > 0, "layout_helper is initialized");
|
||||||
if ((!RegisterFinalizersAtInit && k->has_finalizer())
|
if ((!RegisterFinalizersAtInit && k->has_finalizer())
|
||||||
|| k->is_abstract() || k->is_interface()
|
|| k->is_abstract() || k->is_interface()
|
||||||
|| (k->name() == vmSymbols::java_lang_Class()
|
|| (k->name() == vmSymbols::java_lang_Class() && k->class_loader() == NULL)
|
||||||
&& k->class_loader_data()->is_the_null_class_loader_data())
|
|
||||||
|| k->size_helper() >= FastAllocateSizeLimit) {
|
|| k->size_helper() >= FastAllocateSizeLimit) {
|
||||||
// Forbid fast-path allocation.
|
// Forbid fast-path allocation.
|
||||||
jint lh = Klass::instance_layout_helper(k->size_helper(), true);
|
jint lh = Klass::instance_layout_helper(k->size_helper(), true);
|
||||||
|
@ -363,16 +363,16 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
// "parsed_name" is updated by this method, and is the name found
|
// "parsed_name" is updated by this method, and is the name found
|
||||||
// while parsing the stream.
|
// while parsing the stream.
|
||||||
instanceKlassHandle parseClassFile(Symbol* name,
|
instanceKlassHandle parseClassFile(Symbol* name,
|
||||||
Handle class_loader,
|
ClassLoaderData* loader_data,
|
||||||
Handle protection_domain,
|
Handle protection_domain,
|
||||||
TempNewSymbol& parsed_name,
|
TempNewSymbol& parsed_name,
|
||||||
bool verify,
|
bool verify,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
KlassHandle no_host_klass;
|
KlassHandle no_host_klass;
|
||||||
return parseClassFile(name, class_loader, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD);
|
return parseClassFile(name, loader_data, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD);
|
||||||
}
|
}
|
||||||
instanceKlassHandle parseClassFile(Symbol* name,
|
instanceKlassHandle parseClassFile(Symbol* name,
|
||||||
Handle class_loader,
|
ClassLoaderData* loader_data,
|
||||||
Handle protection_domain,
|
Handle protection_domain,
|
||||||
KlassHandle host_klass,
|
KlassHandle host_klass,
|
||||||
GrowableArray<Handle>* cp_patches,
|
GrowableArray<Handle>* cp_patches,
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "classfile/classFileParser.hpp"
|
#include "classfile/classFileParser.hpp"
|
||||||
#include "classfile/classFileStream.hpp"
|
#include "classfile/classFileStream.hpp"
|
||||||
#include "classfile/classLoader.hpp"
|
#include "classfile/classLoader.hpp"
|
||||||
|
#include "classfile/classLoaderData.inline.hpp"
|
||||||
#include "classfile/javaClasses.hpp"
|
#include "classfile/javaClasses.hpp"
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#include "classfile/vmSymbols.hpp"
|
#include "classfile/vmSymbols.hpp"
|
||||||
@ -910,11 +911,11 @@ instanceKlassHandle ClassLoader::load_classfile(Symbol* h_name, TRAPS) {
|
|||||||
|
|
||||||
// class file found, parse it
|
// class file found, parse it
|
||||||
ClassFileParser parser(stream);
|
ClassFileParser parser(stream);
|
||||||
Handle class_loader;
|
ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
|
||||||
Handle protection_domain;
|
Handle protection_domain;
|
||||||
TempNewSymbol parsed_name = NULL;
|
TempNewSymbol parsed_name = NULL;
|
||||||
instanceKlassHandle result = parser.parseClassFile(h_name,
|
instanceKlassHandle result = parser.parseClassFile(h_name,
|
||||||
class_loader,
|
loader_data,
|
||||||
protection_domain,
|
protection_domain,
|
||||||
parsed_name,
|
parsed_name,
|
||||||
false,
|
false,
|
||||||
|
@ -65,13 +65,19 @@
|
|||||||
ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
|
ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
|
||||||
|
|
||||||
ClassLoaderData::ClassLoaderData(Handle h_class_loader) : _class_loader(h_class_loader()),
|
ClassLoaderData::ClassLoaderData(Handle h_class_loader) : _class_loader(h_class_loader()),
|
||||||
_metaspace(NULL), _unloading(false), _klasses(NULL),
|
_metaspace(NULL), _unloading(false), _keep_alive(false), _klasses(NULL),
|
||||||
_claimed(0), _jmethod_ids(NULL), _handles(NULL),
|
_claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
|
||||||
_deallocate_list(NULL), _next(NULL),
|
_next(NULL), _dependencies(NULL),
|
||||||
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
|
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassLoaderData::init_dependencies(TRAPS) {
|
||||||
|
// Create empty dependencies array to add to. CMS requires this to be
|
||||||
|
// an oop so that it can track additions via card marks. We think.
|
||||||
|
_dependencies = (oop)oopFactory::new_objectArray(2, CHECK);
|
||||||
|
}
|
||||||
|
|
||||||
bool ClassLoaderData::claim() {
|
bool ClassLoaderData::claim() {
|
||||||
if (_claimed == 1) {
|
if (_claimed == 1) {
|
||||||
return false;
|
return false;
|
||||||
@ -86,6 +92,7 @@ void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool m
|
|||||||
}
|
}
|
||||||
|
|
||||||
f->do_oop(&_class_loader);
|
f->do_oop(&_class_loader);
|
||||||
|
f->do_oop(&_dependencies);
|
||||||
_handles->oops_do(f);
|
_handles->oops_do(f);
|
||||||
if (klass_closure != NULL) {
|
if (klass_closure != NULL) {
|
||||||
classes_do(klass_closure);
|
classes_do(klass_closure);
|
||||||
@ -110,69 +117,99 @@ void ClassLoaderData::record_dependency(Klass* k, TRAPS) {
|
|||||||
ClassLoaderData * const from_cld = this;
|
ClassLoaderData * const from_cld = this;
|
||||||
ClassLoaderData * const to_cld = k->class_loader_data();
|
ClassLoaderData * const to_cld = k->class_loader_data();
|
||||||
|
|
||||||
// Records dependency between non-null class loaders only.
|
// Dependency to the null class loader data doesn't need to be recorded
|
||||||
if (to_cld->is_the_null_class_loader_data() || from_cld->is_the_null_class_loader_data()) {
|
// because the null class loader data never goes away.
|
||||||
|
if (to_cld->is_the_null_class_loader_data()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check that this dependency isn't from the same or parent class_loader
|
oop to;
|
||||||
oop to = to_cld->class_loader();
|
if (to_cld->is_anonymous()) {
|
||||||
oop from = from_cld->class_loader();
|
// Anonymous class dependencies are through the mirror.
|
||||||
|
to = k->java_mirror();
|
||||||
|
} else {
|
||||||
|
to = to_cld->class_loader();
|
||||||
|
|
||||||
oop curr = from;
|
// If from_cld is anonymous, even if it's class_loader is a parent of 'to'
|
||||||
while (curr != NULL) {
|
// we still have to add it. The class_loader won't keep from_cld alive.
|
||||||
if (curr == to) {
|
if (!from_cld->is_anonymous()) {
|
||||||
return; // this class loader is in the parent list, no need to add it.
|
// Check that this dependency isn't from the same or parent class_loader
|
||||||
|
oop from = from_cld->class_loader();
|
||||||
|
|
||||||
|
oop curr = from;
|
||||||
|
while (curr != NULL) {
|
||||||
|
if (curr == to) {
|
||||||
|
return; // this class loader is in the parent list, no need to add it.
|
||||||
|
}
|
||||||
|
curr = java_lang_ClassLoader::parent(curr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
curr = java_lang_ClassLoader::parent(curr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// It's a dependency we won't find through GC, add it. This is relatively rare
|
// It's a dependency we won't find through GC, add it. This is relatively rare
|
||||||
from_cld->add_dependency(to_cld, CHECK);
|
// Must handle over GC point.
|
||||||
|
Handle dependency(THREAD, to);
|
||||||
|
from_cld->add_dependency(dependency, CHECK);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClassLoaderData::has_dependency(ClassLoaderData* dependency) {
|
|
||||||
oop loader = dependency->class_loader();
|
|
||||||
|
|
||||||
// Get objArrayOop out of the class_loader oop and see if this dependency
|
void ClassLoaderData::add_dependency(Handle dependency, TRAPS) {
|
||||||
// is there. Don't safepoint! These are all oops.
|
// Check first if this dependency is already in the list.
|
||||||
// Dependency list is (oop class_loader, objArrayOop next)
|
// Save a pointer to the last to add to under the lock.
|
||||||
objArrayOop ok = (objArrayOop)java_lang_ClassLoader::dependencies(class_loader());
|
objArrayOop ok = (objArrayOop)_dependencies;
|
||||||
|
objArrayOop last = NULL;
|
||||||
while (ok != NULL) {
|
while (ok != NULL) {
|
||||||
if (ok->obj_at(0) == loader) {
|
last = ok;
|
||||||
return true;
|
if (ok->obj_at(0) == dependency()) {
|
||||||
|
// Don't need to add it
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
ok = (objArrayOop)ok->obj_at(1);
|
ok = (objArrayOop)ok->obj_at(1);
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClassLoaderData::add_dependency(ClassLoaderData* dependency, TRAPS) {
|
// Create a new dependency node with fields for (class_loader or mirror, next)
|
||||||
// Minimize the number of duplicates in the list.
|
|
||||||
if (has_dependency(dependency)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new dependency node with fields for (class_loader, next)
|
|
||||||
objArrayOop deps = oopFactory::new_objectArray(2, CHECK);
|
objArrayOop deps = oopFactory::new_objectArray(2, CHECK);
|
||||||
deps->obj_at_put(0, dependency->class_loader());
|
deps->obj_at_put(0, dependency());
|
||||||
|
|
||||||
// Add this lock free, using compare and exchange, need barriers for GC
|
// Must handle over more GC points
|
||||||
// Do the barrier first.
|
objArrayHandle new_dependency(THREAD, deps);
|
||||||
HeapWord* addr = java_lang_ClassLoader::dependencies_addr(class_loader());
|
|
||||||
while (true) {
|
|
||||||
oop old_dependency = java_lang_ClassLoader::dependencies(class_loader());
|
|
||||||
deps->obj_at_put(1, old_dependency);
|
|
||||||
|
|
||||||
oop newold = oopDesc::atomic_compare_exchange_oop((oop)deps, addr, old_dependency, true);
|
// Add the dependency under lock
|
||||||
if (newold == old_dependency) {
|
assert (last != NULL, "dependencies should be initialized");
|
||||||
update_barrier_set((void*)addr, (oop)deps);
|
objArrayHandle last_handle(THREAD, last);
|
||||||
// we won the race to add this dependency
|
locked_add_dependency(last_handle, new_dependency);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassLoaderData::locked_add_dependency(objArrayHandle last_handle,
|
||||||
|
objArrayHandle new_dependency) {
|
||||||
|
|
||||||
|
// Have to lock and put the new dependency on the end of the dependency
|
||||||
|
// array so the card mark for CMS sees that this dependency is new.
|
||||||
|
// Can probably do this lock free with some effort.
|
||||||
|
MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
||||||
|
|
||||||
|
oop loader_or_mirror = new_dependency->obj_at(0);
|
||||||
|
|
||||||
|
// Since the dependencies are only added, add to the end.
|
||||||
|
objArrayOop end = last_handle();
|
||||||
|
objArrayOop last = NULL;
|
||||||
|
while (end != NULL) {
|
||||||
|
last = end;
|
||||||
|
// check again if another thread added it to the end.
|
||||||
|
if (end->obj_at(0) == loader_or_mirror) {
|
||||||
|
// Don't need to add it
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
end = (objArrayOop)end->obj_at(1);
|
||||||
|
}
|
||||||
|
assert (last != NULL, "dependencies should be initialized");
|
||||||
|
// fill in the first element with the oop in new_dependency.
|
||||||
|
if (last->obj_at(0) == NULL) {
|
||||||
|
last->obj_at_put(0, new_dependency->obj_at(0));
|
||||||
|
} else {
|
||||||
|
last->obj_at_put(1, new_dependency());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ClassLoaderDataGraph::clear_claimed_marks() {
|
void ClassLoaderDataGraph::clear_claimed_marks() {
|
||||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||||
@ -187,7 +224,7 @@ void ClassLoaderData::add_class(Klass* k) {
|
|||||||
// link the new item into the list
|
// link the new item into the list
|
||||||
_klasses = k;
|
_klasses = k;
|
||||||
|
|
||||||
if (TraceClassLoaderData && k->class_loader_data() != NULL) {
|
if (TraceClassLoaderData && Verbose && k->class_loader_data() != NULL) {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
tty->print_cr("[TraceClassLoaderData] Adding k: " PTR_FORMAT " %s to CLD: "
|
tty->print_cr("[TraceClassLoaderData] Adding k: " PTR_FORMAT " %s to CLD: "
|
||||||
PTR_FORMAT " loader: " PTR_FORMAT " %s",
|
PTR_FORMAT " loader: " PTR_FORMAT " %s",
|
||||||
@ -195,8 +232,7 @@ void ClassLoaderData::add_class(Klass* k) {
|
|||||||
k->external_name(),
|
k->external_name(),
|
||||||
k->class_loader_data(),
|
k->class_loader_data(),
|
||||||
k->class_loader(),
|
k->class_loader(),
|
||||||
k->class_loader() != NULL ? k->class_loader()->klass()->external_name() : "NULL"
|
loader_name());
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,6 +257,38 @@ void ClassLoaderData::remove_class(Klass* scratch_class) {
|
|||||||
ShouldNotReachHere(); // should have found this class!!
|
ShouldNotReachHere(); // should have found this class!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ClassLoaderData::is_anonymous() const {
|
||||||
|
Klass* k = _klasses;
|
||||||
|
return (_keep_alive || (k != NULL && k->oop_is_instance() &&
|
||||||
|
InstanceKlass::cast(k)->is_anonymous()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClassLoaderData::unload() {
|
||||||
|
_unloading = true;
|
||||||
|
|
||||||
|
if (TraceClassLoaderData) {
|
||||||
|
ResourceMark rm;
|
||||||
|
tty->print("[ClassLoaderData: unload loader data "PTR_FORMAT, this);
|
||||||
|
tty->print(" for instance "PTR_FORMAT" of %s", class_loader(),
|
||||||
|
loader_name());
|
||||||
|
if (is_anonymous()) {
|
||||||
|
tty->print(" for anonymous class "PTR_FORMAT " ", _klasses);
|
||||||
|
}
|
||||||
|
tty->print_cr("]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const {
|
||||||
|
bool alive =
|
||||||
|
is_anonymous() ?
|
||||||
|
is_alive_closure->do_object_b(_klasses->java_mirror()) :
|
||||||
|
class_loader() == NULL || is_alive_closure->do_object_b(class_loader());
|
||||||
|
assert(!alive || claimed(), "must be claimed");
|
||||||
|
return alive;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ClassLoaderData::~ClassLoaderData() {
|
ClassLoaderData::~ClassLoaderData() {
|
||||||
Metaspace *m = _metaspace;
|
Metaspace *m = _metaspace;
|
||||||
if (m != NULL) {
|
if (m != NULL) {
|
||||||
@ -263,8 +331,8 @@ Metaspace* ClassLoaderData::metaspace_non_null() {
|
|||||||
if (_metaspace != NULL) {
|
if (_metaspace != NULL) {
|
||||||
return _metaspace;
|
return _metaspace;
|
||||||
}
|
}
|
||||||
if (class_loader() == NULL) {
|
if (this == the_null_class_loader_data()) {
|
||||||
assert(this == the_null_class_loader_data(), "Must be");
|
assert (class_loader() == NULL, "Must be");
|
||||||
size_t word_size = Metaspace::first_chunk_word_size();
|
size_t word_size = Metaspace::first_chunk_word_size();
|
||||||
set_metaspace(new Metaspace(_metaspace_lock, word_size));
|
set_metaspace(new Metaspace(_metaspace_lock, word_size));
|
||||||
} else {
|
} else {
|
||||||
@ -325,12 +393,19 @@ void ClassLoaderData::free_deallocate_list() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
// These anonymous class loaders are to contain classes used for JSR292
|
||||||
void ClassLoaderData::print_loader(ClassLoaderData *loader_data, outputStream* out) {
|
ClassLoaderData* ClassLoaderData::anonymous_class_loader_data(oop loader, TRAPS) {
|
||||||
oop class_loader = loader_data->class_loader();
|
// Add a new class loader data to the graph.
|
||||||
out->print("%s", SystemDictionary::loader_name(class_loader));
|
ClassLoaderData* cld = ClassLoaderDataGraph::add(NULL, loader, CHECK_NULL);
|
||||||
|
return cld;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* ClassLoaderData::loader_name() {
|
||||||
|
// Handles null class loader
|
||||||
|
return SystemDictionary::loader_name(class_loader());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
// Define to dump klasses
|
// Define to dump klasses
|
||||||
#undef CLD_DUMP_KLASSES
|
#undef CLD_DUMP_KLASSES
|
||||||
|
|
||||||
@ -338,8 +413,7 @@ void ClassLoaderData::dump(outputStream * const out) {
|
|||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {",
|
out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {",
|
||||||
this, class_loader(),
|
this, class_loader(),
|
||||||
class_loader() != NULL ? class_loader()->klass() : NULL,
|
class_loader() != NULL ? class_loader()->klass() : NULL, loader_name());
|
||||||
class_loader() != NULL ? class_loader()->klass()->external_name() : "NULL");
|
|
||||||
if (claimed()) out->print(" claimed ");
|
if (claimed()) out->print(" claimed ");
|
||||||
if (is_unloading()) out->print(" unloading ");
|
if (is_unloading()) out->print(" unloading ");
|
||||||
out->print(" handles " INTPTR_FORMAT, handles());
|
out->print(" handles " INTPTR_FORMAT, handles());
|
||||||
@ -373,8 +447,8 @@ void ClassLoaderData::dump(outputStream * const out) {
|
|||||||
void ClassLoaderData::verify() {
|
void ClassLoaderData::verify() {
|
||||||
oop cl = class_loader();
|
oop cl = class_loader();
|
||||||
|
|
||||||
guarantee(this == class_loader_data(cl), "Must be the same");
|
guarantee(this == class_loader_data(cl) || is_anonymous(), "Must be the same");
|
||||||
guarantee(cl != NULL || this == ClassLoaderData::the_null_class_loader_data(), "must be");
|
guarantee(cl != NULL || this == ClassLoaderData::the_null_class_loader_data() || is_anonymous(), "must be");
|
||||||
|
|
||||||
// Verify the integrity of the allocated space.
|
// Verify the integrity of the allocated space.
|
||||||
if (metaspace_or_null() != NULL) {
|
if (metaspace_or_null() != NULL) {
|
||||||
@ -387,6 +461,7 @@ void ClassLoaderData::verify() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// GC root of class loader data created.
|
// GC root of class loader data created.
|
||||||
ClassLoaderData* ClassLoaderDataGraph::_head = NULL;
|
ClassLoaderData* ClassLoaderDataGraph::_head = NULL;
|
||||||
ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL;
|
ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL;
|
||||||
@ -395,19 +470,25 @@ ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL;
|
|||||||
|
|
||||||
// Add a new class loader data node to the list. Assign the newly created
|
// Add a new class loader data node to the list. Assign the newly created
|
||||||
// ClassLoaderData into the java/lang/ClassLoader object as a hidden field
|
// ClassLoaderData into the java/lang/ClassLoader object as a hidden field
|
||||||
ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle loader_data) {
|
ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle loader, TRAPS) {
|
||||||
// Not assigned a class loader data yet.
|
// Not assigned a class loader data yet.
|
||||||
// Create one.
|
// Create one.
|
||||||
ClassLoaderData* *list_head = &_head;
|
ClassLoaderData* *list_head = &_head;
|
||||||
ClassLoaderData* next = _head;
|
ClassLoaderData* next = _head;
|
||||||
ClassLoaderData* cld = new ClassLoaderData(loader_data);
|
ClassLoaderData* cld = new ClassLoaderData(loader);
|
||||||
|
|
||||||
// First, Atomically set it.
|
if (cld_addr != NULL) {
|
||||||
ClassLoaderData* old = (ClassLoaderData*) Atomic::cmpxchg_ptr(cld, cld_addr, NULL);
|
// First, Atomically set it
|
||||||
if (old != NULL) {
|
ClassLoaderData* old = (ClassLoaderData*) Atomic::cmpxchg_ptr(cld, cld_addr, NULL);
|
||||||
delete cld;
|
if (old != NULL) {
|
||||||
// Returns the data.
|
delete cld;
|
||||||
return old;
|
// Returns the data.
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Disallow unloading for this CLD during initialization if there is no
|
||||||
|
// class_loader oop to link this to.
|
||||||
|
cld->set_keep_alive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We won the race, and therefore the task of adding the data to the list of
|
// We won the race, and therefore the task of adding the data to the list of
|
||||||
@ -417,16 +498,22 @@ ClassLoaderData* ClassLoaderDataGraph::add(ClassLoaderData** cld_addr, Handle lo
|
|||||||
ClassLoaderData* exchanged = (ClassLoaderData*)Atomic::cmpxchg_ptr(cld, list_head, next);
|
ClassLoaderData* exchanged = (ClassLoaderData*)Atomic::cmpxchg_ptr(cld, list_head, next);
|
||||||
if (exchanged == next) {
|
if (exchanged == next) {
|
||||||
if (TraceClassLoaderData) {
|
if (TraceClassLoaderData) {
|
||||||
|
ResourceMark rm;
|
||||||
tty->print("[ClassLoaderData: ");
|
tty->print("[ClassLoaderData: ");
|
||||||
tty->print("create class loader data "PTR_FORMAT, cld);
|
tty->print("create class loader data "PTR_FORMAT, cld);
|
||||||
tty->print(" for instance "PTR_FORMAT" of ", cld->class_loader());
|
tty->print(" for instance "PTR_FORMAT" of %s", cld->class_loader(),
|
||||||
loader_data->klass()->name()->print_symbol_on(tty);
|
cld->loader_name());
|
||||||
tty->print_cr("]");
|
tty->print_cr("]");
|
||||||
}
|
}
|
||||||
|
// Create dependencies after the CLD is added to the list. Otherwise,
|
||||||
|
// the GC GC will not find the CLD and the _class_loader field will
|
||||||
|
// not be updated.
|
||||||
|
cld->init_dependencies(CHECK_NULL);
|
||||||
return cld;
|
return cld;
|
||||||
}
|
}
|
||||||
next = exchanged;
|
next = exchanged;
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClassLoaderDataGraph::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
|
void ClassLoaderDataGraph::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
|
||||||
@ -435,9 +522,19 @@ void ClassLoaderDataGraph::oops_do(OopClosure* f, KlassClosure* klass_closure, b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassLoaderDataGraph::keep_alive_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
|
||||||
|
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||||
|
if (cld->keep_alive()) {
|
||||||
|
cld->oops_do(f, klass_closure, must_claim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
|
void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
|
||||||
if (ClassUnloading) {
|
if (ClassUnloading) {
|
||||||
ClassLoaderData::the_null_class_loader_data()->oops_do(f, klass_closure, must_claim);
|
ClassLoaderData::the_null_class_loader_data()->oops_do(f, klass_closure, must_claim);
|
||||||
|
// keep any special CLDs alive.
|
||||||
|
ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim);
|
||||||
} else {
|
} else {
|
||||||
ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
|
ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
|
||||||
}
|
}
|
||||||
@ -516,9 +613,10 @@ bool ClassLoaderDataGraph::contains_loader_data(ClassLoaderData* loader_data) {
|
|||||||
}
|
}
|
||||||
#endif // PRODUCT
|
#endif // PRODUCT
|
||||||
|
|
||||||
|
|
||||||
// Move class loader data from main list to the unloaded list for unloading
|
// Move class loader data from main list to the unloaded list for unloading
|
||||||
// and deallocation later.
|
// and deallocation later.
|
||||||
bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive) {
|
bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
|
||||||
ClassLoaderData* data = _head;
|
ClassLoaderData* data = _head;
|
||||||
ClassLoaderData* prev = NULL;
|
ClassLoaderData* prev = NULL;
|
||||||
bool seen_dead_loader = false;
|
bool seen_dead_loader = false;
|
||||||
@ -527,8 +625,7 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive) {
|
|||||||
bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
|
bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
|
||||||
MetadataOnStackMark md_on_stack;
|
MetadataOnStackMark md_on_stack;
|
||||||
while (data != NULL) {
|
while (data != NULL) {
|
||||||
if (data->class_loader() == NULL || is_alive->do_object_b(data->class_loader())) {
|
if (data->keep_alive() || data->is_alive(is_alive_closure)) {
|
||||||
assert(data->claimed(), "class loader data must have been claimed");
|
|
||||||
if (has_redefined_a_class) {
|
if (has_redefined_a_class) {
|
||||||
data->classes_do(InstanceKlass::purge_previous_versions);
|
data->classes_do(InstanceKlass::purge_previous_versions);
|
||||||
}
|
}
|
||||||
@ -539,13 +636,7 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive) {
|
|||||||
}
|
}
|
||||||
seen_dead_loader = true;
|
seen_dead_loader = true;
|
||||||
ClassLoaderData* dead = data;
|
ClassLoaderData* dead = data;
|
||||||
dead->mark_for_unload();
|
dead->unload();
|
||||||
if (TraceClassLoaderData) {
|
|
||||||
tty->print("[ClassLoaderData: unload loader data "PTR_FORMAT, dead);
|
|
||||||
tty->print(" for instance "PTR_FORMAT" of ", dead->class_loader());
|
|
||||||
dead->class_loader()->klass()->name()->print_symbol_on(tty);
|
|
||||||
tty->print_cr("]");
|
|
||||||
}
|
|
||||||
data = data->next();
|
data = data->next();
|
||||||
// Remove from loader list.
|
// Remove from loader list.
|
||||||
if (prev != NULL) {
|
if (prev != NULL) {
|
||||||
|
@ -62,13 +62,14 @@ class ClassLoaderDataGraph : public AllStatic {
|
|||||||
// CMS support.
|
// CMS support.
|
||||||
static ClassLoaderData* _saved_head;
|
static ClassLoaderData* _saved_head;
|
||||||
|
|
||||||
static ClassLoaderData* add(ClassLoaderData** loader_data_addr, Handle class_loader);
|
static ClassLoaderData* add(ClassLoaderData** loader_data_addr, Handle class_loader, TRAPS);
|
||||||
public:
|
public:
|
||||||
static ClassLoaderData* find_or_create(Handle class_loader);
|
static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
|
||||||
static void purge();
|
static void purge();
|
||||||
static void clear_claimed_marks();
|
static void clear_claimed_marks();
|
||||||
static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
|
static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
|
||||||
static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
|
static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
|
||||||
|
static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
|
||||||
static void classes_do(KlassClosure* klass_closure);
|
static void classes_do(KlassClosure* klass_closure);
|
||||||
static bool do_unloading(BoolObjectClosure* is_alive);
|
static bool do_unloading(BoolObjectClosure* is_alive);
|
||||||
|
|
||||||
@ -101,10 +102,13 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
|
|
||||||
oop _class_loader; // oop used to uniquely identify a class loader
|
oop _class_loader; // oop used to uniquely identify a class loader
|
||||||
// class loader or a canonical class path
|
// class loader or a canonical class path
|
||||||
|
oop _dependencies; // oop to hold dependencies from this class loader
|
||||||
|
// data to others.
|
||||||
Metaspace * _metaspace; // Meta-space where meta-data defined by the
|
Metaspace * _metaspace; // Meta-space where meta-data defined by the
|
||||||
// classes in the class loader are allocated.
|
// classes in the class loader are allocated.
|
||||||
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
|
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
|
||||||
bool _unloading; // true if this class loader goes away
|
bool _unloading; // true if this class loader goes away
|
||||||
|
bool _keep_alive; // if this CLD can be unloaded for anonymous loaders
|
||||||
volatile int _claimed; // true if claimed, for example during GC traces.
|
volatile int _claimed; // true if claimed, for example during GC traces.
|
||||||
// To avoid applying oop closure more than once.
|
// To avoid applying oop closure more than once.
|
||||||
// Has to be an int because we cas it.
|
// Has to be an int because we cas it.
|
||||||
@ -129,8 +133,8 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
static Metaspace* _ro_metaspace;
|
static Metaspace* _ro_metaspace;
|
||||||
static Metaspace* _rw_metaspace;
|
static Metaspace* _rw_metaspace;
|
||||||
|
|
||||||
bool has_dependency(ClassLoaderData* cld);
|
void add_dependency(Handle dependency, TRAPS);
|
||||||
void add_dependency(ClassLoaderData* to_loader_data, TRAPS);
|
void locked_add_dependency(objArrayHandle last, objArrayHandle new_dependency);
|
||||||
|
|
||||||
void set_next(ClassLoaderData* next) { _next = next; }
|
void set_next(ClassLoaderData* next) { _next = next; }
|
||||||
ClassLoaderData* next() const { return _next; }
|
ClassLoaderData* next() const { return _next; }
|
||||||
@ -150,7 +154,9 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
bool claimed() const { return _claimed == 1; }
|
bool claimed() const { return _claimed == 1; }
|
||||||
bool claim();
|
bool claim();
|
||||||
|
|
||||||
void mark_for_unload() { _unloading = true; }
|
void unload();
|
||||||
|
bool keep_alive() const { return _keep_alive; }
|
||||||
|
bool is_alive(BoolObjectClosure* is_alive_closure) const;
|
||||||
|
|
||||||
void classes_do(void f(InstanceKlass*));
|
void classes_do(void f(InstanceKlass*));
|
||||||
|
|
||||||
@ -168,6 +174,8 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
return _the_null_class_loader_data;
|
return _the_null_class_loader_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_anonymous() const;
|
||||||
|
|
||||||
static void init_null_class_loader_data() {
|
static void init_null_class_loader_data() {
|
||||||
assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
|
assert(_the_null_class_loader_data == NULL, "cannot initialize twice");
|
||||||
assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
|
assert(ClassLoaderDataGraph::_head == NULL, "cannot initialize twice");
|
||||||
@ -194,6 +202,9 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
assert(!(is_the_null_class_loader_data() && _unloading), "The null class loader can never be unloaded");
|
assert(!(is_the_null_class_loader_data() && _unloading), "The null class loader can never be unloaded");
|
||||||
return _unloading;
|
return _unloading;
|
||||||
}
|
}
|
||||||
|
// Anonymous class loader data doesn't have anything to keep them from
|
||||||
|
// being unloaded during parsing the anonymous class.
|
||||||
|
void set_keep_alive(bool value) { _keep_alive = value; }
|
||||||
|
|
||||||
unsigned int identity_hash() {
|
unsigned int identity_hash() {
|
||||||
return _class_loader == NULL ? 0 : _class_loader->identity_hash();
|
return _class_loader == NULL ? 0 : _class_loader->identity_hash();
|
||||||
@ -211,15 +222,18 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||||||
void print_value_on(outputStream* out) const PRODUCT_RETURN;
|
void print_value_on(outputStream* out) const PRODUCT_RETURN;
|
||||||
void dump(outputStream * const out) PRODUCT_RETURN;
|
void dump(outputStream * const out) PRODUCT_RETURN;
|
||||||
void verify();
|
void verify();
|
||||||
|
const char* loader_name();
|
||||||
|
|
||||||
jobject add_handle(Handle h);
|
jobject add_handle(Handle h);
|
||||||
void add_class(Klass* k);
|
void add_class(Klass* k);
|
||||||
void remove_class(Klass* k);
|
void remove_class(Klass* k);
|
||||||
void record_dependency(Klass* to, TRAPS);
|
void record_dependency(Klass* to, TRAPS);
|
||||||
|
void init_dependencies(TRAPS);
|
||||||
|
|
||||||
void add_to_deallocate_list(Metadata* m);
|
void add_to_deallocate_list(Metadata* m);
|
||||||
|
|
||||||
static ClassLoaderData* class_loader_data(oop loader);
|
static ClassLoaderData* class_loader_data(oop loader);
|
||||||
|
static ClassLoaderData* anonymous_class_loader_data(oop loader, TRAPS);
|
||||||
static void print_loader(ClassLoaderData *loader_data, outputStream *out);
|
static void print_loader(ClassLoaderData *loader_data, outputStream *out);
|
||||||
|
|
||||||
// CDS support
|
// CDS support
|
||||||
|
@ -33,7 +33,7 @@ inline ClassLoaderData* ClassLoaderData::class_loader_data(oop loader) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline ClassLoaderData *ClassLoaderDataGraph::find_or_create(Handle loader) {
|
inline ClassLoaderData *ClassLoaderDataGraph::find_or_create(Handle loader, TRAPS) {
|
||||||
assert(loader() != NULL,"Must be a class loader");
|
assert(loader() != NULL,"Must be a class loader");
|
||||||
// Gets the class loader data out of the java/lang/ClassLoader object, if non-null
|
// Gets the class loader data out of the java/lang/ClassLoader object, if non-null
|
||||||
// it's already in the loader_data, so no need to add
|
// it's already in the loader_data, so no need to add
|
||||||
@ -42,5 +42,5 @@ inline ClassLoaderData *ClassLoaderDataGraph::find_or_create(Handle loader) {
|
|||||||
if (loader_data_id) {
|
if (loader_data_id) {
|
||||||
return loader_data_id;
|
return loader_data_id;
|
||||||
}
|
}
|
||||||
return ClassLoaderDataGraph::add(loader_data_addr, loader);
|
return ClassLoaderDataGraph::add(loader_data_addr, loader, THREAD);
|
||||||
}
|
}
|
||||||
|
@ -1148,12 +1148,11 @@ static Method* new_method(
|
|||||||
int code_length = bytecodes->length();
|
int code_length = bytecodes->length();
|
||||||
|
|
||||||
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
|
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
|
||||||
code_length, flags, 0, 0, 0, 0, mt, CHECK_NULL);
|
code_length, flags, 0, 0, 0, 0, 0, mt, CHECK_NULL);
|
||||||
|
|
||||||
m->set_constants(NULL); // This will get filled in later
|
m->set_constants(NULL); // This will get filled in later
|
||||||
m->set_name_index(cp->utf8(name));
|
m->set_name_index(cp->utf8(name));
|
||||||
m->set_signature_index(cp->utf8(sig));
|
m->set_signature_index(cp->utf8(sig));
|
||||||
m->set_generic_signature_index(0);
|
|
||||||
#ifdef CC_INTERP
|
#ifdef CC_INTERP
|
||||||
ResultTypeFinder rtf(sig);
|
ResultTypeFinder rtf(sig);
|
||||||
m->set_result_index(rtf.type());
|
m->set_result_index(rtf.type());
|
||||||
|
@ -580,7 +580,7 @@ void Dictionary::verify() {
|
|||||||
// class loader must be present; a null class loader is the
|
// class loader must be present; a null class loader is the
|
||||||
// boostrap loader
|
// boostrap loader
|
||||||
guarantee(loader_data != NULL || DumpSharedSpaces ||
|
guarantee(loader_data != NULL || DumpSharedSpaces ||
|
||||||
loader_data->is_the_null_class_loader_data() ||
|
loader_data->class_loader() == NULL ||
|
||||||
loader_data->class_loader()->is_instance(),
|
loader_data->class_loader()->is_instance(),
|
||||||
"checking type of class_loader");
|
"checking type of class_loader");
|
||||||
e->verify();
|
e->verify();
|
||||||
|
@ -47,20 +47,9 @@
|
|||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
#include "runtime/javaCalls.hpp"
|
#include "runtime/javaCalls.hpp"
|
||||||
#include "runtime/safepoint.hpp"
|
#include "runtime/safepoint.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/vframe.hpp"
|
#include "runtime/vframe.hpp"
|
||||||
#include "utilities/preserveException.hpp"
|
#include "utilities/preserveException.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
|
#define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \
|
||||||
klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
|
klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
|
||||||
@ -2555,8 +2544,8 @@ Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
|
|||||||
|
|
||||||
void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
|
void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
|
||||||
assert(is_instance(mname), "wrong type");
|
assert(is_instance(mname), "wrong type");
|
||||||
#ifdef ASSERT
|
|
||||||
// check the type of the vmtarget
|
// check the type of the vmtarget
|
||||||
|
oop dependency = NULL;
|
||||||
if (ref != NULL) {
|
if (ref != NULL) {
|
||||||
switch (flags(mname) & (MN_IS_METHOD |
|
switch (flags(mname) & (MN_IS_METHOD |
|
||||||
MN_IS_CONSTRUCTOR |
|
MN_IS_CONSTRUCTOR |
|
||||||
@ -2564,28 +2553,21 @@ void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
|
|||||||
case MN_IS_METHOD:
|
case MN_IS_METHOD:
|
||||||
case MN_IS_CONSTRUCTOR:
|
case MN_IS_CONSTRUCTOR:
|
||||||
assert(ref->is_method(), "should be a method");
|
assert(ref->is_method(), "should be a method");
|
||||||
|
dependency = ((Method*)ref)->method_holder()->java_mirror();
|
||||||
break;
|
break;
|
||||||
case MN_IS_FIELD:
|
case MN_IS_FIELD:
|
||||||
assert(ref->is_klass(), "should be a class");
|
assert(ref->is_klass(), "should be a class");
|
||||||
|
dependency = ((Klass*)ref)->java_mirror();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif //ASSERT
|
|
||||||
mname->address_field_put(_vmtarget_offset, (address)ref);
|
mname->address_field_put(_vmtarget_offset, (address)ref);
|
||||||
oop loader = NULL;
|
// Add a reference to the loader (actually mirror because anonymous classes will not have
|
||||||
if (ref != NULL) {
|
// distinct loaders) to ensure the metadata is kept alive
|
||||||
if (ref->is_klass()) {
|
// This mirror may be different than the one in clazz field.
|
||||||
loader = ((Klass*)ref)->class_loader();
|
mname->obj_field_put(_vmloader_offset, dependency);
|
||||||
} else if (ref->is_method()) {
|
|
||||||
loader = ((Method*)ref)->method_holder()->class_loader();
|
|
||||||
} else {
|
|
||||||
ShouldNotReachHere();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add a reference to the loader to ensure the metadata is kept alive
|
|
||||||
mname->obj_field_put(_vmloader_offset, loader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
|
intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
|
||||||
@ -2750,7 +2732,6 @@ oop java_security_AccessControlContext::create(objArrayHandle context, bool isPr
|
|||||||
|
|
||||||
bool java_lang_ClassLoader::offsets_computed = false;
|
bool java_lang_ClassLoader::offsets_computed = false;
|
||||||
int java_lang_ClassLoader::_loader_data_offset = -1;
|
int java_lang_ClassLoader::_loader_data_offset = -1;
|
||||||
int java_lang_ClassLoader::_dependencies_offset = -1;
|
|
||||||
int java_lang_ClassLoader::parallelCapable_offset = -1;
|
int java_lang_ClassLoader::parallelCapable_offset = -1;
|
||||||
|
|
||||||
ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) {
|
ClassLoaderData** java_lang_ClassLoader::loader_data_addr(oop loader) {
|
||||||
@ -2762,18 +2743,6 @@ ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) {
|
|||||||
return *java_lang_ClassLoader::loader_data_addr(loader);
|
return *java_lang_ClassLoader::loader_data_addr(loader);
|
||||||
}
|
}
|
||||||
|
|
||||||
oop java_lang_ClassLoader::dependencies(oop loader) {
|
|
||||||
return loader->obj_field(_dependencies_offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapWord* java_lang_ClassLoader::dependencies_addr(oop loader) {
|
|
||||||
if (UseCompressedOops) {
|
|
||||||
return (HeapWord*)loader->obj_field_addr<narrowOop>(_dependencies_offset);
|
|
||||||
} else {
|
|
||||||
return (HeapWord*)loader->obj_field_addr<oop>(_dependencies_offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void java_lang_ClassLoader::compute_offsets() {
|
void java_lang_ClassLoader::compute_offsets() {
|
||||||
assert(!offsets_computed, "offsets should be initialized only once");
|
assert(!offsets_computed, "offsets should be initialized only once");
|
||||||
offsets_computed = true;
|
offsets_computed = true;
|
||||||
|
@ -1125,8 +1125,7 @@ class java_security_AccessControlContext: AllStatic {
|
|||||||
// Interface to java.lang.ClassLoader objects
|
// Interface to java.lang.ClassLoader objects
|
||||||
|
|
||||||
#define CLASSLOADER_INJECTED_FIELDS(macro) \
|
#define CLASSLOADER_INJECTED_FIELDS(macro) \
|
||||||
macro(java_lang_ClassLoader, loader_data, intptr_signature, false) \
|
macro(java_lang_ClassLoader, loader_data, intptr_signature, false)
|
||||||
macro(java_lang_ClassLoader, dependencies, object_signature, false)
|
|
||||||
|
|
||||||
class java_lang_ClassLoader : AllStatic {
|
class java_lang_ClassLoader : AllStatic {
|
||||||
private:
|
private:
|
||||||
@ -1135,7 +1134,6 @@ class java_lang_ClassLoader : AllStatic {
|
|||||||
hc_parent_offset = 0
|
hc_parent_offset = 0
|
||||||
};
|
};
|
||||||
static int _loader_data_offset;
|
static int _loader_data_offset;
|
||||||
static int _dependencies_offset;
|
|
||||||
static bool offsets_computed;
|
static bool offsets_computed;
|
||||||
static int parent_offset;
|
static int parent_offset;
|
||||||
static int parallelCapable_offset;
|
static int parallelCapable_offset;
|
||||||
@ -1146,9 +1144,6 @@ class java_lang_ClassLoader : AllStatic {
|
|||||||
static ClassLoaderData** loader_data_addr(oop loader);
|
static ClassLoaderData** loader_data_addr(oop loader);
|
||||||
static ClassLoaderData* loader_data(oop loader);
|
static ClassLoaderData* loader_data(oop loader);
|
||||||
|
|
||||||
static oop dependencies(oop loader);
|
|
||||||
static HeapWord* dependencies_addr(oop loader);
|
|
||||||
|
|
||||||
static oop parent(oop loader);
|
static oop parent(oop loader);
|
||||||
static bool isAncestor(oop loader, oop cl);
|
static bool isAncestor(oop loader, oop cl);
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ void LoaderConstraintTable::purge_loader_constraints() {
|
|||||||
probe->name()->as_C_string());
|
probe->name()->as_C_string());
|
||||||
for (int i = 0; i < probe->num_loaders(); i++) {
|
for (int i = 0; i < probe->num_loaders(); i++) {
|
||||||
tty->print_cr("[ [%d]: %s", i,
|
tty->print_cr("[ [%d]: %s", i,
|
||||||
SystemDictionary::loader_name(probe->loader_data(i)));
|
probe->loader_data(i)->loader_name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ void LoaderConstraintTable::purge_loader_constraints() {
|
|||||||
if (TraceLoaderConstraints) {
|
if (TraceLoaderConstraints) {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
tty->print_cr("[Purging loader %s from constraint for name %s",
|
tty->print_cr("[Purging loader %s from constraint for name %s",
|
||||||
SystemDictionary::loader_name(probe->loader_data(n)),
|
probe->loader_data(n)->loader_name(),
|
||||||
probe->name()->as_C_string()
|
probe->name()->as_C_string()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -145,7 +145,7 @@ void LoaderConstraintTable::purge_loader_constraints() {
|
|||||||
tty->print_cr("[New loader list:");
|
tty->print_cr("[New loader list:");
|
||||||
for (int i = 0; i < probe->num_loaders(); i++) {
|
for (int i = 0; i < probe->num_loaders(); i++) {
|
||||||
tty->print_cr("[ [%d]: %s", i,
|
tty->print_cr("[ [%d]: %s", i,
|
||||||
SystemDictionary::loader_name(probe->loader_data(i)));
|
probe->loader_data(i)->loader_name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,7 +400,7 @@ void LoaderConstraintTable::merge_loader_constraints(
|
|||||||
|
|
||||||
for (int i = 0; i < p1->num_loaders(); i++) {
|
for (int i = 0; i < p1->num_loaders(); i++) {
|
||||||
tty->print_cr("[ [%d]: %s", i,
|
tty->print_cr("[ [%d]: %s", i,
|
||||||
SystemDictionary::loader_name(p1->loader_data(i)));
|
p1->loader_data(i)->loader_name());
|
||||||
}
|
}
|
||||||
if (p1->klass() == NULL) {
|
if (p1->klass() == NULL) {
|
||||||
tty->print_cr("[... and setting class object]");
|
tty->print_cr("[... and setting class object]");
|
||||||
|
@ -106,9 +106,9 @@ void SystemDictionary::compute_java_system_loader(TRAPS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ClassLoaderData* SystemDictionary::register_loader(Handle class_loader) {
|
ClassLoaderData* SystemDictionary::register_loader(Handle class_loader, TRAPS) {
|
||||||
if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
|
if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
|
||||||
return ClassLoaderDataGraph::find_or_create(class_loader);
|
return ClassLoaderDataGraph::find_or_create(class_loader, CHECK_NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -591,7 +591,7 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle cla
|
|||||||
// UseNewReflection
|
// UseNewReflection
|
||||||
// Fix for 4474172; see evaluation for more details
|
// Fix for 4474172; see evaluation for more details
|
||||||
class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
|
class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
|
||||||
ClassLoaderData *loader_data = register_loader(class_loader);
|
ClassLoaderData *loader_data = register_loader(class_loader, CHECK_NULL);
|
||||||
|
|
||||||
// Do lookup to see if class already exist and the protection domain
|
// Do lookup to see if class already exist and the protection domain
|
||||||
// has the right access
|
// has the right access
|
||||||
@ -888,7 +888,7 @@ Klass* SystemDictionary::find(Symbol* class_name,
|
|||||||
// of the call to resolve_instance_class_or_null().
|
// of the call to resolve_instance_class_or_null().
|
||||||
// See evaluation 6790209 and 4474172 for more details.
|
// See evaluation 6790209 and 4474172 for more details.
|
||||||
class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
|
class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
|
||||||
ClassLoaderData* loader_data = register_loader(class_loader);
|
ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL);
|
||||||
|
|
||||||
unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
|
unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
|
||||||
int d_index = dictionary()->hash_to_index(d_hash);
|
int d_index = dictionary()->hash_to_index(d_hash);
|
||||||
@ -948,6 +948,18 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
|
|||||||
TRAPS) {
|
TRAPS) {
|
||||||
TempNewSymbol parsed_name = NULL;
|
TempNewSymbol parsed_name = NULL;
|
||||||
|
|
||||||
|
ClassLoaderData* loader_data;
|
||||||
|
if (host_klass.not_null()) {
|
||||||
|
// Create a new CLD for anonymous class, that uses the same class loader
|
||||||
|
// as the host_klass
|
||||||
|
assert(EnableInvokeDynamic, "");
|
||||||
|
guarantee(host_klass->class_loader() == class_loader(), "should be the same");
|
||||||
|
loader_data = ClassLoaderData::anonymous_class_loader_data(class_loader(), CHECK_NULL);
|
||||||
|
loader_data->record_dependency(host_klass(), CHECK_NULL);
|
||||||
|
} else {
|
||||||
|
loader_data = ClassLoaderData::class_loader_data(class_loader());
|
||||||
|
}
|
||||||
|
|
||||||
// Parse the stream. Note that we do this even though this klass might
|
// Parse the stream. Note that we do this even though this klass might
|
||||||
// already be present in the SystemDictionary, otherwise we would not
|
// already be present in the SystemDictionary, otherwise we would not
|
||||||
// throw potential ClassFormatErrors.
|
// throw potential ClassFormatErrors.
|
||||||
@ -959,7 +971,7 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
|
|||||||
// java.lang.Object through resolve_or_fail, not this path.
|
// java.lang.Object through resolve_or_fail, not this path.
|
||||||
|
|
||||||
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
|
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
|
||||||
class_loader,
|
loader_data,
|
||||||
protection_domain,
|
protection_domain,
|
||||||
host_klass,
|
host_klass,
|
||||||
cp_patches,
|
cp_patches,
|
||||||
@ -973,8 +985,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
|
|||||||
// Parsed name could be null if we threw an error before we got far
|
// Parsed name could be null if we threw an error before we got far
|
||||||
// enough along to parse it -- in that case, there is nothing to clean up.
|
// enough along to parse it -- in that case, there is nothing to clean up.
|
||||||
if (parsed_name != NULL) {
|
if (parsed_name != NULL) {
|
||||||
ClassLoaderData* loader_data = class_loader_data(class_loader);
|
|
||||||
|
|
||||||
unsigned int p_hash = placeholders()->compute_hash(parsed_name,
|
unsigned int p_hash = placeholders()->compute_hash(parsed_name,
|
||||||
loader_data);
|
loader_data);
|
||||||
int p_index = placeholders()->hash_to_index(p_hash);
|
int p_index = placeholders()->hash_to_index(p_hash);
|
||||||
@ -987,9 +997,8 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
|
|||||||
|
|
||||||
if (host_klass.not_null() && k.not_null()) {
|
if (host_klass.not_null() && k.not_null()) {
|
||||||
assert(EnableInvokeDynamic, "");
|
assert(EnableInvokeDynamic, "");
|
||||||
// If it's anonymous, initialize it now, since nobody else will.
|
|
||||||
k->class_loader_data()->record_dependency(host_klass(), CHECK_NULL);
|
|
||||||
k->set_host_klass(host_klass());
|
k->set_host_klass(host_klass());
|
||||||
|
// If it's anonymous, initialize it now, since nobody else will.
|
||||||
|
|
||||||
{
|
{
|
||||||
MutexLocker mu_r(Compile_lock, THREAD);
|
MutexLocker mu_r(Compile_lock, THREAD);
|
||||||
@ -1002,11 +1011,11 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite and patch constant pool here.
|
// Rewrite and patch constant pool here.
|
||||||
k->link_class(THREAD);
|
k->link_class(CHECK_NULL);
|
||||||
if (cp_patches != NULL) {
|
if (cp_patches != NULL) {
|
||||||
k->constants()->patch_resolved_references(cp_patches);
|
k->constants()->patch_resolved_references(cp_patches);
|
||||||
}
|
}
|
||||||
k->eager_initialize(THREAD);
|
k->eager_initialize(CHECK_NULL);
|
||||||
|
|
||||||
// notify jvmti
|
// notify jvmti
|
||||||
if (JvmtiExport::should_post_class_load()) {
|
if (JvmtiExport::should_post_class_load()) {
|
||||||
@ -1039,7 +1048,7 @@ Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
|
|||||||
DoObjectLock = false;
|
DoObjectLock = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassLoaderData* loader_data = register_loader(class_loader);
|
ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL);
|
||||||
|
|
||||||
// Make sure we are synchronized on the class loader before we proceed
|
// Make sure we are synchronized on the class loader before we proceed
|
||||||
Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
|
Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
|
||||||
@ -1059,7 +1068,7 @@ Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
|
|||||||
// java.lang.Object through resolve_or_fail, not this path.
|
// java.lang.Object through resolve_or_fail, not this path.
|
||||||
|
|
||||||
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
|
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
|
||||||
class_loader,
|
loader_data,
|
||||||
protection_domain,
|
protection_domain,
|
||||||
parsed_name,
|
parsed_name,
|
||||||
verify,
|
verify,
|
||||||
@ -2343,6 +2352,7 @@ methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid
|
|||||||
|
|
||||||
// Helper for unpacking the return value from linkMethod and linkCallSite.
|
// Helper for unpacking the return value from linkMethod and linkCallSite.
|
||||||
static methodHandle unpack_method_and_appendix(Handle mname,
|
static methodHandle unpack_method_and_appendix(Handle mname,
|
||||||
|
KlassHandle accessing_klass,
|
||||||
objArrayHandle appendix_box,
|
objArrayHandle appendix_box,
|
||||||
Handle* appendix_result,
|
Handle* appendix_result,
|
||||||
TRAPS) {
|
TRAPS) {
|
||||||
@ -2361,6 +2371,12 @@ static methodHandle unpack_method_and_appendix(Handle mname,
|
|||||||
#endif //PRODUCT
|
#endif //PRODUCT
|
||||||
}
|
}
|
||||||
(*appendix_result) = Handle(THREAD, appendix);
|
(*appendix_result) = Handle(THREAD, appendix);
|
||||||
|
// the target is stored in the cpCache and if a reference to this
|
||||||
|
// MethodName is dropped we need a way to make sure the
|
||||||
|
// class_loader containing this method is kept alive.
|
||||||
|
// FIXME: the appendix might also preserve this dependency.
|
||||||
|
ClassLoaderData* this_key = InstanceKlass::cast(accessing_klass())->class_loader_data();
|
||||||
|
this_key->record_dependency(m->method_holder(), CHECK_NULL); // Can throw OOM
|
||||||
return methodHandle(THREAD, m);
|
return methodHandle(THREAD, m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2405,7 +2421,7 @@ methodHandle SystemDictionary::find_method_handle_invoker(Symbol* name,
|
|||||||
&args, CHECK_(empty));
|
&args, CHECK_(empty));
|
||||||
Handle mname(THREAD, (oop) result.get_jobject());
|
Handle mname(THREAD, (oop) result.get_jobject());
|
||||||
(*method_type_result) = method_type;
|
(*method_type_result) = method_type;
|
||||||
return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
|
return unpack_method_and_appendix(mname, accessing_klass, appendix_box, appendix_result, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2596,7 +2612,7 @@ methodHandle SystemDictionary::find_dynamic_call_site_invoker(KlassHandle caller
|
|||||||
&args, CHECK_(empty));
|
&args, CHECK_(empty));
|
||||||
Handle mname(THREAD, (oop) result.get_jobject());
|
Handle mname(THREAD, (oop) result.get_jobject());
|
||||||
(*method_type_result) = method_type;
|
(*method_type_result) = method_type;
|
||||||
return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
|
return unpack_method_and_appendix(mname, caller, appendix_box, appendix_result, THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since the identity hash code for symbols changes when the symbols are
|
// Since the identity hash code for symbols changes when the symbols are
|
||||||
|
@ -471,7 +471,7 @@ public:
|
|||||||
static void compute_java_system_loader(TRAPS);
|
static void compute_java_system_loader(TRAPS);
|
||||||
|
|
||||||
// Register a new class loader
|
// Register a new class loader
|
||||||
static ClassLoaderData* register_loader(Handle class_loader);
|
static ClassLoaderData* register_loader(Handle class_loader, TRAPS);
|
||||||
private:
|
private:
|
||||||
// Mirrors for primitive classes (created eagerly)
|
// Mirrors for primitive classes (created eagerly)
|
||||||
static oop check_mirror(oop m) {
|
static oop check_mirror(oop m) {
|
||||||
@ -531,7 +531,7 @@ public:
|
|||||||
InstanceKlass::cast((loader)->klass())->name()->as_C_string() );
|
InstanceKlass::cast((loader)->klass())->name()->as_C_string() );
|
||||||
}
|
}
|
||||||
static const char* loader_name(ClassLoaderData* loader_data) {
|
static const char* loader_name(ClassLoaderData* loader_data) {
|
||||||
return (loader_data->is_the_null_class_loader_data() ? "<bootloader>" :
|
return (loader_data->class_loader() == NULL ? "<bootloader>" :
|
||||||
InstanceKlass::cast((loader_data->class_loader())->klass())->name()->as_C_string() );
|
InstanceKlass::cast((loader_data->class_loader())->klass())->name()->as_C_string() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,10 +269,12 @@ void CompileTask::initialize(int compile_id,
|
|||||||
const char* comment,
|
const char* comment,
|
||||||
bool is_blocking) {
|
bool is_blocking) {
|
||||||
assert(!_lock->is_locked(), "bad locking");
|
assert(!_lock->is_locked(), "bad locking");
|
||||||
|
InstanceKlass* holder = method->method_holder();
|
||||||
|
|
||||||
_compile_id = compile_id;
|
_compile_id = compile_id;
|
||||||
_method = method();
|
_method = method();
|
||||||
_method_loader = JNIHandles::make_global(_method->method_holder()->class_loader());
|
_method_holder = JNIHandles::make_global(
|
||||||
|
holder->is_anonymous() ? holder->java_mirror(): holder->class_loader());
|
||||||
_osr_bci = osr_bci;
|
_osr_bci = osr_bci;
|
||||||
_is_blocking = is_blocking;
|
_is_blocking = is_blocking;
|
||||||
_comp_level = comp_level;
|
_comp_level = comp_level;
|
||||||
@ -283,7 +285,7 @@ void CompileTask::initialize(int compile_id,
|
|||||||
_code_handle = NULL;
|
_code_handle = NULL;
|
||||||
|
|
||||||
_hot_method = NULL;
|
_hot_method = NULL;
|
||||||
_hot_method_loader = NULL;
|
_hot_method_holder = NULL;
|
||||||
_hot_count = hot_count;
|
_hot_count = hot_count;
|
||||||
_time_queued = 0; // tidy
|
_time_queued = 0; // tidy
|
||||||
_comment = comment;
|
_comment = comment;
|
||||||
@ -295,8 +297,12 @@ void CompileTask::initialize(int compile_id,
|
|||||||
_hot_method = _method;
|
_hot_method = _method;
|
||||||
} else {
|
} else {
|
||||||
_hot_method = hot_method();
|
_hot_method = hot_method();
|
||||||
|
// only add loader or mirror if different from _method_holder
|
||||||
|
InstanceKlass* hot_holder = hot_method->method_holder();
|
||||||
|
_hot_method_holder = JNIHandles::make_global(
|
||||||
|
hot_holder->is_anonymous() ? hot_holder->java_mirror() :
|
||||||
|
hot_holder->class_loader());
|
||||||
}
|
}
|
||||||
_hot_method_loader = JNIHandles::make_global(_hot_method->method_holder()->class_loader());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,8 +327,8 @@ void CompileTask::set_code(nmethod* nm) {
|
|||||||
void CompileTask::free() {
|
void CompileTask::free() {
|
||||||
set_code(NULL);
|
set_code(NULL);
|
||||||
assert(!_lock->is_locked(), "Should not be locked when freed");
|
assert(!_lock->is_locked(), "Should not be locked when freed");
|
||||||
JNIHandles::destroy_global(_method_loader);
|
JNIHandles::destroy_global(_method_holder);
|
||||||
JNIHandles::destroy_global(_hot_method_loader);
|
JNIHandles::destroy_global(_hot_method_holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class CompileTask : public CHeapObj<mtCompiler> {
|
|||||||
Monitor* _lock;
|
Monitor* _lock;
|
||||||
uint _compile_id;
|
uint _compile_id;
|
||||||
Method* _method;
|
Method* _method;
|
||||||
jobject _method_loader;
|
jobject _method_holder;
|
||||||
int _osr_bci;
|
int _osr_bci;
|
||||||
bool _is_complete;
|
bool _is_complete;
|
||||||
bool _is_success;
|
bool _is_success;
|
||||||
@ -56,7 +56,7 @@ class CompileTask : public CHeapObj<mtCompiler> {
|
|||||||
// Fields used for logging why the compilation was initiated:
|
// Fields used for logging why the compilation was initiated:
|
||||||
jlong _time_queued; // in units of os::elapsed_counter()
|
jlong _time_queued; // in units of os::elapsed_counter()
|
||||||
Method* _hot_method; // which method actually triggered this task
|
Method* _hot_method; // which method actually triggered this task
|
||||||
jobject _hot_method_loader;
|
jobject _hot_method_holder;
|
||||||
int _hot_count; // information about its invocation counter
|
int _hot_count; // information about its invocation counter
|
||||||
const char* _comment; // more info about the task
|
const char* _comment; // more info about the task
|
||||||
|
|
||||||
|
@ -40,19 +40,8 @@
|
|||||||
#include "runtime/globals_extension.hpp"
|
#include "runtime/globals_extension.hpp"
|
||||||
#include "runtime/handles.inline.hpp"
|
#include "runtime/handles.inline.hpp"
|
||||||
#include "runtime/java.hpp"
|
#include "runtime/java.hpp"
|
||||||
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "runtime/vmThread.hpp"
|
#include "runtime/vmThread.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ConcurrentMarkSweepPolicy methods
|
// ConcurrentMarkSweepPolicy methods
|
||||||
|
@ -27,18 +27,7 @@
|
|||||||
|
|
||||||
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp"
|
#include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp"
|
||||||
#include "gc_implementation/shared/concurrentGCThread.hpp"
|
#include "gc_implementation/shared/concurrentGCThread.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class ConcurrentMarkSweepGeneration;
|
class ConcurrentMarkSweepGeneration;
|
||||||
class CMSCollector;
|
class CMSCollector;
|
||||||
|
@ -65,8 +65,7 @@ typedef BinaryTreeDictionary<FreeChunk, AdaptiveFreeList> AFLBinaryTreeDictionar
|
|||||||
declare_toplevel_type(AFLBinaryTreeDictionary*) \
|
declare_toplevel_type(AFLBinaryTreeDictionary*) \
|
||||||
declare_toplevel_type(LinearAllocBlock) \
|
declare_toplevel_type(LinearAllocBlock) \
|
||||||
declare_toplevel_type(FreeBlockDictionary<FreeChunk>) \
|
declare_toplevel_type(FreeBlockDictionary<FreeChunk>) \
|
||||||
declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary<FreeChunk>) \
|
declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary<FreeChunk>)
|
||||||
declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary<FreeChunk>) \
|
|
||||||
|
|
||||||
#define VM_INT_CONSTANTS_CMS(declare_constant) \
|
#define VM_INT_CONSTANTS_CMS(declare_constant) \
|
||||||
declare_constant(Generation::ConcurrentMarkSweep) \
|
declare_constant(Generation::ConcurrentMarkSweep) \
|
||||||
|
@ -28,20 +28,8 @@
|
|||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
#include "runtime/safepoint.hpp"
|
#include "runtime/safepoint.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#include "utilities/workgroup.hpp"
|
#include "utilities/workgroup.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl,
|
bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl,
|
||||||
bool consume,
|
bool consume,
|
||||||
|
@ -302,16 +302,28 @@ void G1BlockOffsetArray::check_all_cards(size_t start_card, size_t end_card) con
|
|||||||
for (size_t c = start_card + 1; c <= end_card; c++ /* yeah! */) {
|
for (size_t c = start_card + 1; c <= end_card; c++ /* yeah! */) {
|
||||||
u_char entry = _array->offset_array(c);
|
u_char entry = _array->offset_array(c);
|
||||||
if (c - start_card > BlockOffsetArray::power_to_cards_back(1)) {
|
if (c - start_card > BlockOffsetArray::power_to_cards_back(1)) {
|
||||||
guarantee(entry > N_words, "Should be in logarithmic region");
|
guarantee(entry > N_words,
|
||||||
|
err_msg("Should be in logarithmic region - "
|
||||||
|
"entry: " UINT32_FORMAT ", "
|
||||||
|
"_array->offset_array(c): " UINT32_FORMAT ", "
|
||||||
|
"N_words: " UINT32_FORMAT,
|
||||||
|
entry, _array->offset_array(c), N_words));
|
||||||
}
|
}
|
||||||
size_t backskip = BlockOffsetArray::entry_to_cards_back(entry);
|
size_t backskip = BlockOffsetArray::entry_to_cards_back(entry);
|
||||||
size_t landing_card = c - backskip;
|
size_t landing_card = c - backskip;
|
||||||
guarantee(landing_card >= (start_card - 1), "Inv");
|
guarantee(landing_card >= (start_card - 1), "Inv");
|
||||||
if (landing_card >= start_card) {
|
if (landing_card >= start_card) {
|
||||||
guarantee(_array->offset_array(landing_card) <= entry, "monotonicity");
|
guarantee(_array->offset_array(landing_card) <= entry,
|
||||||
|
err_msg("Monotonicity - landing_card offset: " UINT32_FORMAT ", "
|
||||||
|
"entry: " UINT32_FORMAT,
|
||||||
|
_array->offset_array(landing_card), entry));
|
||||||
} else {
|
} else {
|
||||||
guarantee(landing_card == start_card - 1, "Tautology");
|
guarantee(landing_card == start_card - 1, "Tautology");
|
||||||
guarantee(_array->offset_array(landing_card) <= N_words, "Offset value");
|
// Note that N_words is the maximum offset value
|
||||||
|
guarantee(_array->offset_array(landing_card) <= N_words,
|
||||||
|
err_msg("landing card offset: " UINT32_FORMAT ", "
|
||||||
|
"N_words: " UINT32_FORMAT,
|
||||||
|
_array->offset_array(landing_card), N_words));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -536,17 +548,27 @@ void G1BlockOffsetArray::alloc_block_work2(HeapWord** threshold_, size_t* index_
|
|||||||
// The offset can be 0 if the block starts on a boundary. That
|
// The offset can be 0 if the block starts on a boundary. That
|
||||||
// is checked by an assertion above.
|
// is checked by an assertion above.
|
||||||
size_t start_index = _array->index_for(blk_start);
|
size_t start_index = _array->index_for(blk_start);
|
||||||
HeapWord* boundary = _array->address_for_index(start_index);
|
HeapWord* boundary = _array->address_for_index(start_index);
|
||||||
assert((_array->offset_array(orig_index) == 0 &&
|
assert((_array->offset_array(orig_index) == 0 &&
|
||||||
blk_start == boundary) ||
|
blk_start == boundary) ||
|
||||||
(_array->offset_array(orig_index) > 0 &&
|
(_array->offset_array(orig_index) > 0 &&
|
||||||
_array->offset_array(orig_index) <= N_words),
|
_array->offset_array(orig_index) <= N_words),
|
||||||
"offset array should have been set");
|
err_msg("offset array should have been set - "
|
||||||
|
"orig_index offset: " UINT32_FORMAT ", "
|
||||||
|
"blk_start: " PTR_FORMAT ", "
|
||||||
|
"boundary: " PTR_FORMAT,
|
||||||
|
_array->offset_array(orig_index),
|
||||||
|
blk_start, boundary));
|
||||||
for (size_t j = orig_index + 1; j <= end_index; j++) {
|
for (size_t j = orig_index + 1; j <= end_index; j++) {
|
||||||
assert(_array->offset_array(j) > 0 &&
|
assert(_array->offset_array(j) > 0 &&
|
||||||
_array->offset_array(j) <=
|
_array->offset_array(j) <=
|
||||||
(u_char) (N_words+BlockOffsetArray::N_powers-1),
|
(u_char) (N_words+BlockOffsetArray::N_powers-1),
|
||||||
"offset array should have been set");
|
err_msg("offset array should have been set - "
|
||||||
|
UINT32_FORMAT " not > 0 OR "
|
||||||
|
UINT32_FORMAT " not <= " UINT32_FORMAT,
|
||||||
|
_array->offset_array(j),
|
||||||
|
_array->offset_array(j),
|
||||||
|
(u_char) (N_words+BlockOffsetArray::N_powers-1)));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,9 @@ public:
|
|||||||
virtual void resize(size_t new_word_size) = 0;
|
virtual void resize(size_t new_word_size) = 0;
|
||||||
|
|
||||||
virtual void set_bottom(HeapWord* new_bottom) {
|
virtual void set_bottom(HeapWord* new_bottom) {
|
||||||
assert(new_bottom <= _end, "new_bottom > _end");
|
assert(new_bottom <= _end,
|
||||||
|
err_msg("new_bottom (" PTR_FORMAT ") > _end (" PTR_FORMAT ")",
|
||||||
|
new_bottom, _end));
|
||||||
_bottom = new_bottom;
|
_bottom = new_bottom;
|
||||||
resize(pointer_delta(_end, _bottom));
|
resize(pointer_delta(_end, _bottom));
|
||||||
}
|
}
|
||||||
@ -134,29 +136,42 @@ private:
|
|||||||
VirtualSpace _vs;
|
VirtualSpace _vs;
|
||||||
u_char* _offset_array; // byte array keeping backwards offsets
|
u_char* _offset_array; // byte array keeping backwards offsets
|
||||||
|
|
||||||
|
void check_index(size_t index, const char* msg) const {
|
||||||
|
assert(index < _vs.committed_size(),
|
||||||
|
err_msg("%s - "
|
||||||
|
"index: " SIZE_FORMAT ", _vs.committed_size: " SIZE_FORMAT,
|
||||||
|
msg, index, _vs.committed_size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_offset(size_t offset, const char* msg) const {
|
||||||
|
assert(offset <= N_words,
|
||||||
|
err_msg("%s - "
|
||||||
|
"offset: " UINT32_FORMAT", N_words: " UINT32_FORMAT,
|
||||||
|
msg, offset, N_words));
|
||||||
|
}
|
||||||
|
|
||||||
// Bounds checking accessors:
|
// Bounds checking accessors:
|
||||||
// For performance these have to devolve to array accesses in product builds.
|
// For performance these have to devolve to array accesses in product builds.
|
||||||
u_char offset_array(size_t index) const {
|
u_char offset_array(size_t index) const {
|
||||||
assert(index < _vs.committed_size(), "index out of range");
|
check_index(index, "index out of range");
|
||||||
return _offset_array[index];
|
return _offset_array[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_offset_array(size_t index, u_char offset) {
|
void set_offset_array(size_t index, u_char offset) {
|
||||||
assert(index < _vs.committed_size(), "index out of range");
|
check_index(index, "index out of range");
|
||||||
assert(offset <= N_words, "offset too large");
|
check_offset(offset, "offset too large");
|
||||||
_offset_array[index] = offset;
|
_offset_array[index] = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
|
void set_offset_array(size_t index, HeapWord* high, HeapWord* low) {
|
||||||
assert(index < _vs.committed_size(), "index out of range");
|
check_index(index, "index out of range");
|
||||||
assert(high >= low, "addresses out of order");
|
assert(high >= low, "addresses out of order");
|
||||||
assert(pointer_delta(high, low) <= N_words, "offset too large");
|
check_offset(pointer_delta(high, low), "offset too large");
|
||||||
_offset_array[index] = (u_char) pointer_delta(high, low);
|
_offset_array[index] = (u_char) pointer_delta(high, low);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) {
|
void set_offset_array(HeapWord* left, HeapWord* right, u_char offset) {
|
||||||
assert(index_for(right - 1) < _vs.committed_size(),
|
check_index(index_for(right - 1), "right address out of range");
|
||||||
"right address out of range");
|
|
||||||
assert(left < right, "Heap addresses out of order");
|
assert(left < right, "Heap addresses out of order");
|
||||||
size_t num_cards = pointer_delta(right, left) >> LogN_words;
|
size_t num_cards = pointer_delta(right, left) >> LogN_words;
|
||||||
if (UseMemSetInBOT) {
|
if (UseMemSetInBOT) {
|
||||||
@ -171,7 +186,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void set_offset_array(size_t left, size_t right, u_char offset) {
|
void set_offset_array(size_t left, size_t right, u_char offset) {
|
||||||
assert(right < _vs.committed_size(), "right address out of range");
|
check_index(right, "right index out of range");
|
||||||
assert(left <= right, "indexes out of order");
|
assert(left <= right, "indexes out of order");
|
||||||
size_t num_cards = right - left + 1;
|
size_t num_cards = right - left + 1;
|
||||||
if (UseMemSetInBOT) {
|
if (UseMemSetInBOT) {
|
||||||
@ -186,11 +201,10 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
|
void check_offset_array(size_t index, HeapWord* high, HeapWord* low) const {
|
||||||
assert(index < _vs.committed_size(), "index out of range");
|
check_index(index, "index out of range");
|
||||||
assert(high >= low, "addresses out of order");
|
assert(high >= low, "addresses out of order");
|
||||||
assert(pointer_delta(high, low) <= N_words, "offset too large");
|
check_offset(pointer_delta(high, low), "offset too large");
|
||||||
assert(_offset_array[index] == pointer_delta(high, low),
|
assert(_offset_array[index] == pointer_delta(high, low), "Wrong offset");
|
||||||
"Wrong offset");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_card_boundary(HeapWord* p) const;
|
bool is_card_boundary(HeapWord* p) const;
|
||||||
@ -481,7 +495,6 @@ class G1BlockOffsetArrayContigSpace: public G1BlockOffsetArray {
|
|||||||
blk_start, blk_end);
|
blk_start, blk_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1BlockOffsetArrayContigSpace(G1BlockOffsetSharedArray* array, MemRegion mr);
|
G1BlockOffsetArrayContigSpace(G1BlockOffsetSharedArray* array, MemRegion mr);
|
||||||
|
|
||||||
|
@ -49,16 +49,17 @@ inline size_t G1BlockOffsetSharedArray::index_for(const void* p) const {
|
|||||||
char* pc = (char*)p;
|
char* pc = (char*)p;
|
||||||
assert(pc >= (char*)_reserved.start() &&
|
assert(pc >= (char*)_reserved.start() &&
|
||||||
pc < (char*)_reserved.end(),
|
pc < (char*)_reserved.end(),
|
||||||
"p not in range.");
|
err_msg("p (" PTR_FORMAT ") not in reserved [" PTR_FORMAT ", " PTR_FORMAT ")",
|
||||||
|
p, (char*)_reserved.start(), (char*)_reserved.end()));
|
||||||
size_t delta = pointer_delta(pc, _reserved.start(), sizeof(char));
|
size_t delta = pointer_delta(pc, _reserved.start(), sizeof(char));
|
||||||
size_t result = delta >> LogN;
|
size_t result = delta >> LogN;
|
||||||
assert(result < _vs.committed_size(), "bad index from address");
|
check_index(result, "bad index from address");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline HeapWord*
|
inline HeapWord*
|
||||||
G1BlockOffsetSharedArray::address_for_index(size_t index) const {
|
G1BlockOffsetSharedArray::address_for_index(size_t index) const {
|
||||||
assert(index < _vs.committed_size(), "bad index");
|
check_index(index, "index out of range");
|
||||||
HeapWord* result = _reserved.start() + (index << LogN_words);
|
HeapWord* result = _reserved.start() + (index << LogN_words);
|
||||||
assert(result >= _reserved.start() && result < _reserved.end(),
|
assert(result >= _reserved.start() && result < _reserved.end(),
|
||||||
err_msg("bad address from index result " PTR_FORMAT
|
err_msg("bad address from index result " PTR_FORMAT
|
||||||
|
@ -27,19 +27,7 @@
|
|||||||
#include "gc_implementation/g1/heapRegion.hpp"
|
#include "gc_implementation/g1/heapRegion.hpp"
|
||||||
#include "gc_implementation/g1/satbQueue.hpp"
|
#include "gc_implementation/g1/satbQueue.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap,
|
G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap,
|
||||||
int max_covered_regions) :
|
int max_covered_regions) :
|
||||||
|
@ -28,18 +28,7 @@
|
|||||||
#include "memory/allocation.inline.hpp"
|
#include "memory/allocation.inline.hpp"
|
||||||
#include "runtime/mutex.hpp"
|
#include "runtime/mutex.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
#ifdef TARGET_OS_FAMILY_linux
|
#include "runtime/thread.inline.hpp"
|
||||||
# include "thread_linux.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_solaris
|
|
||||||
# include "thread_solaris.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_windows
|
|
||||||
# include "thread_windows.inline.hpp"
|
|
||||||
#endif
|
|
||||||
#ifdef TARGET_OS_FAMILY_bsd
|
|
||||||
# include "thread_bsd.inline.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
|
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
|
||||||
_qset(qset), _buf(NULL), _index(0), _active(active),
|
_qset(qset), _buf(NULL), _index(0), _active(active),
|
||||||
|
@ -52,14 +52,22 @@ void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
|
|||||||
PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
|
PrintGCDetails && TraceParallelOldGCTasks, true, gclog_or_tty));
|
||||||
ParCompactionManager* cm =
|
ParCompactionManager* cm =
|
||||||
ParCompactionManager::gc_thread_compaction_manager(which);
|
ParCompactionManager::gc_thread_compaction_manager(which);
|
||||||
|
|
||||||
PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
|
PSParallelCompact::MarkAndPushClosure mark_and_push_closure(cm);
|
||||||
|
CLDToOopClosure mark_and_push_from_clds(&mark_and_push_closure, true);
|
||||||
CodeBlobToOopClosure mark_and_push_in_blobs(&mark_and_push_closure, /*do_marking=*/ true);
|
CodeBlobToOopClosure mark_and_push_in_blobs(&mark_and_push_closure, /*do_marking=*/ true);
|
||||||
|
|
||||||
if (_java_thread != NULL)
|
if (_java_thread != NULL)
|
||||||
_java_thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
|
_java_thread->oops_do(
|
||||||
|
&mark_and_push_closure,
|
||||||
|
&mark_and_push_from_clds,
|
||||||
|
&mark_and_push_in_blobs);
|
||||||
|
|
||||||
if (_vm_thread != NULL)
|
if (_vm_thread != NULL)
|
||||||
_vm_thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
|
_vm_thread->oops_do(
|
||||||
|
&mark_and_push_closure,
|
||||||
|
&mark_and_push_from_clds,
|
||||||
|
&mark_and_push_in_blobs);
|
||||||
|
|
||||||
// Do the real work
|
// Do the real work
|
||||||
cm->follow_marking_stacks();
|
cm->follow_marking_stacks();
|
||||||
@ -89,7 +97,8 @@ void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
|
|||||||
{
|
{
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
CodeBlobToOopClosure each_active_code_blob(&mark_and_push_closure, /*do_marking=*/ true);
|
CodeBlobToOopClosure each_active_code_blob(&mark_and_push_closure, /*do_marking=*/ true);
|
||||||
Threads::oops_do(&mark_and_push_closure, &each_active_code_blob);
|
CLDToOopClosure mark_and_push_from_cld(&mark_and_push_closure);
|
||||||
|
Threads::oops_do(&mark_and_push_closure, &mark_and_push_from_cld, &each_active_code_blob);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -495,8 +495,9 @@ void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
|
|||||||
ParallelScavengeHeap::ParStrongRootsScope psrs;
|
ParallelScavengeHeap::ParStrongRootsScope psrs;
|
||||||
Universe::oops_do(mark_and_push_closure());
|
Universe::oops_do(mark_and_push_closure());
|
||||||
JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
|
JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
|
||||||
|
CLDToOopClosure mark_and_push_from_cld(mark_and_push_closure());
|
||||||
CodeBlobToOopClosure each_active_code_blob(mark_and_push_closure(), /*do_marking=*/ true);
|
CodeBlobToOopClosure each_active_code_blob(mark_and_push_closure(), /*do_marking=*/ true);
|
||||||
Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
|
Threads::oops_do(mark_and_push_closure(), &mark_and_push_from_cld, &each_active_code_blob);
|
||||||
ObjectSynchronizer::oops_do(mark_and_push_closure());
|
ObjectSynchronizer::oops_do(mark_and_push_closure());
|
||||||
FlatProfiler::oops_do(mark_and_push_closure());
|
FlatProfiler::oops_do(mark_and_push_closure());
|
||||||
Management::oops_do(mark_and_push_closure());
|
Management::oops_do(mark_and_push_closure());
|
||||||
@ -584,7 +585,8 @@ void PSMarkSweep::mark_sweep_phase3() {
|
|||||||
// General strong roots.
|
// General strong roots.
|
||||||
Universe::oops_do(adjust_root_pointer_closure());
|
Universe::oops_do(adjust_root_pointer_closure());
|
||||||
JNIHandles::oops_do(adjust_root_pointer_closure()); // Global (strong) JNI handles
|
JNIHandles::oops_do(adjust_root_pointer_closure()); // Global (strong) JNI handles
|
||||||
Threads::oops_do(adjust_root_pointer_closure(), NULL);
|
CLDToOopClosure adjust_from_cld(adjust_root_pointer_closure());
|
||||||
|
Threads::oops_do(adjust_root_pointer_closure(), &adjust_from_cld, NULL);
|
||||||
ObjectSynchronizer::oops_do(adjust_root_pointer_closure());
|
ObjectSynchronizer::oops_do(adjust_root_pointer_closure());
|
||||||
FlatProfiler::oops_do(adjust_root_pointer_closure());
|
FlatProfiler::oops_do(adjust_root_pointer_closure());
|
||||||
Management::oops_do(adjust_root_pointer_closure());
|
Management::oops_do(adjust_root_pointer_closure());
|
||||||
|
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