--- a/.hgtags-top-repo Tue Apr 16 15:00:19 2013 -0700
+++ b/.hgtags-top-repo Wed Jul 05 18:49:58 2017 +0200
@@ -206,3 +206,4 @@
29153d0df68f84162ffe8c2cf4f402a3f2245e85 jdk8-b82
466685ba01bfb7bc1e1ac61490fd8c0f3cc18763 jdk8-b83
01f631f89fa392b4e484d0812c40ea8f9d2353aa jdk8-b84
+7fc358f5943676b82f1dccd3152b1ac07d92e38b jdk8-b85
--- a/common/autoconf/compare.sh.in Tue Apr 16 15:00:19 2013 -0700
+++ b/common/autoconf/compare.sh.in Wed Jul 05 18:49:58 2017 +0200
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
--- a/common/bin/compare.sh Tue Apr 16 15:00:19 2013 -0700
+++ b/common/bin/compare.sh Wed Jul 05 18:49:58 2017 +0200
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
--- a/common/bin/hgforest.sh Tue Apr 16 15:00:19 2013 -0700
+++ b/common/bin/hgforest.sh Wed Jul 05 18:49:58 2017 +0200
@@ -30,7 +30,7 @@
# Python always buffers stdout significantly, thus we will not see any output from hg clone jdk,
# until a lot of time has passed! By passing -u to python, we get incremental updates
# on stdout. Much nicer.
-whichhg="`which hg`"
+whichhg="`which hg 2> /dev/null | grep -v '^no hg in'`"
if [ "${whichhg}" = "" ] ; then
echo Cannot find hg!
@@ -51,7 +51,7 @@
bpython="`basename "$python"`"
fi
-if [ "python" = "$bpython" -a -x "$python" ] ; then
+if [ -x "$python" -a ! -d "$python" -a "`${python} -V 2>&1 | cut -f 1 -d ' '`" = "Python" ] ; then
hg="${python} -u ${whichhg}"
else
echo Cannot find python from hg launcher. Running plain hg, which probably has buffered stdout.
--- a/common/makefiles/Main.gmk Tue Apr 16 15:00:19 2013 -0700
+++ b/common/makefiles/Main.gmk Wed Jul 05 18:49:58 2017 +0200
@@ -196,7 +196,7 @@
# Remove everything, except the output from configure.
-clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-nashorn clean-images clean-overlay-images clean-bootcycle-build clean-docs
+clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-nashorn clean-images clean-overlay-images clean-bootcycle-build clean-docs clean-test
@($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log* build-trace*.log*)
@$(ECHO) Cleaned all build artifacts.
@@ -237,6 +237,8 @@
clean-docs:
$(call CleanComponent,docs)
$(call CleanComponent,docstemp)
+clean-test:
+ $(call CleanComponent,testoutput)
.PHONY: langtools corba jaxp jaxws hotspot jdk nashorn images overlay-images install
.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only nashorn-only images-only overlay-images-only install-only
--- a/hotspot/.hgtags Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/.hgtags Wed Jul 05 18:49:58 2017 +0200
@@ -330,3 +330,6 @@
8d0f263a370c5f3e61791bb06054560804117288 hs25-b25
af788b85010ebabbc1e8f52c6766e08c7a95cf99 jdk8-b84
a947f40fb536e5b9e0aa210cf26abb430f80887a hs25-b26
+42fe530cd478744a4d12a0cbf803f0fc804bab1a jdk8-b85
+09b0d3e9ba6cdf7da07d4010d2d1df14596f6864 hs25-b27
+6d88a566d369f6a1f86912cad7d0912686b2fda1 hs25-b28
--- a/hotspot/make/bsd/makefiles/fastdebug.make Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/make/bsd/makefiles/fastdebug.make Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2012 Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
--- a/hotspot/make/hotspot_version Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/make/hotspot_version Wed Jul 05 18:49:58 2017 +0200
@@ -35,7 +35,7 @@
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=26
+HS_BUILD_NUMBER=28
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
--- a/hotspot/make/linux/makefiles/gcc.make Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 18:49:58 2017 +0200
@@ -126,14 +126,12 @@
# Compiler warnings are treated as errors
WARNINGS_ARE_ERRORS = -Werror
-# Except for a few acceptable ones
+WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef -Wunused-function
+
# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
-# conversions which might affect the values. To avoid that, we need to turn
-# it off explicitly.
-ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
-WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
-else
-WARNING_FLAGS = -Wpointer-arith -Wconversion -Wsign-compare -Wundef
+# conversions which might affect the values. Only enable it in earlier versions.
+ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+WARNING_FLAGS += -Wconversion
endif
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(WARNING_FLAGS)
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -214,14 +214,6 @@
return enc;
}
-static int encode(XMMRegister r) {
- int enc = r->encoding();
- if (enc >= 8) {
- enc -= 8;
- }
- return enc;
-}
-
void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
assert(dst->has_byte_register(), "must have byte register");
assert(isByte(op1) && isByte(op2), "wrong opcode");
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -41,11 +41,6 @@
#define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
-// Workaround for C++ overloading nastiness on '0' for RegisterOrConstant.
-static RegisterOrConstant constant(int value) {
- return RegisterOrConstant(value);
-}
-
void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg) {
if (VerifyMethodHandles)
verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class),
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 05 18:49:58 2017 +0200
@@ -1693,17 +1693,6 @@
return PTR_RBP_REG_mask();
}
-static Address build_address(int b, int i, int s, int d) {
- Register index = as_Register(i);
- Address::ScaleFactor scale = (Address::ScaleFactor)s;
- if (index == rsp) {
- index = noreg;
- scale = Address::no_scale;
- }
- Address addr(as_Register(b), index, scale, d);
- return addr;
-}
-
%}
//----------ENCODING BLOCK-----------------------------------------------------
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -152,7 +152,6 @@
// utility functions
static int SR_initialize();
-static int SR_finalize();
julong os::available_memory() {
return Bsd::available_memory();
@@ -1200,6 +1199,9 @@
} else if (strchr(pname, *os::path_separator()) != NULL) {
int n;
char** pelements = split_path(pname, &n);
+ if (pelements == NULL) {
+ return false;
+ }
for (int i = 0 ; i < n ; i++) {
// Really shouldn't be NULL, but check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
@@ -2766,10 +2768,6 @@
return 0;
}
-static int SR_finalize() {
- return 0;
-}
-
// returns true on success and false on error - really an error is fatal
// but this seems the normal response to library errors
@@ -3578,16 +3576,6 @@
////////////////////////////////////////////////////////////////////////////////
// debug support
-static address same_page(address x, address y) {
- int page_bits = -os::vm_page_size();
- if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
- return x;
- else if (x > y)
- return (address)(intptr_t(y) | ~page_bits) + 1;
- else
- return (address)(intptr_t(y) & page_bits);
-}
-
bool os::find(address addr, outputStream* st) {
Dl_info dlinfo;
memset(&dlinfo, 0, sizeof(dlinfo));
@@ -3611,8 +3599,8 @@
if (Verbose) {
// decode some bytes around the PC
- address begin = same_page(addr-40, addr);
- address end = same_page(addr+40, addr);
+ address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
+ address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
address lowest = (address) dlinfo.dli_sname;
if (!lowest) lowest = (address) dlinfo.dli_fbase;
if (begin < lowest) begin = lowest;
--- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -672,15 +672,15 @@
RESTARTABLE(::open(filename, oflags), result);
if (result == OS_ERR) {
if (errno == ENOENT) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Process not found");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Process not found", OS_ERR);
}
else if (errno == EACCES) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Permission denied");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Permission denied", OS_ERR);
}
else {
- THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno));
+ THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
@@ -828,7 +828,7 @@
char* mapAddress;
int result;
int fd;
- size_t size;
+ size_t size = 0;
const char* luser = NULL;
int mmap_prot;
@@ -899,9 +899,12 @@
if (*sizep == 0) {
size = sharedmem_filesize(fd, CHECK);
- assert(size != 0, "unexpected size");
+ } else {
+ size = *sizep;
}
+ assert(size > 0, "unexpected size <= 0");
+
mapAddress = (char*)::mmap((char*)0, size, mmap_prot, MAP_SHARED, fd, 0);
// attempt to close the file - restart if it gets interrupted,
--- a/hotspot/src/os/linux/vm/os_linux.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -176,7 +176,6 @@
// utility functions
static int SR_initialize();
-static int SR_finalize();
julong os::available_memory() {
return Linux::available_memory();
@@ -1633,6 +1632,9 @@
} else if (strchr(pname, *os::path_separator()) != NULL) {
int n;
char** pelements = split_path(pname, &n);
+ if (pelements == NULL) {
+ return false;
+ }
for (int i = 0 ; i < n ; i++) {
// Really shouldn't be NULL, but check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
@@ -3655,10 +3657,6 @@
return 0;
}
-static int SR_finalize() {
- return 0;
-}
-
// returns true on success and false on error - really an error is fatal
// but this seems the normal response to library errors
@@ -4500,16 +4498,6 @@
////////////////////////////////////////////////////////////////////////////////
// debug support
-static address same_page(address x, address y) {
- int page_bits = -os::vm_page_size();
- if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
- return x;
- else if (x > y)
- return (address)(intptr_t(y) | ~page_bits) + 1;
- else
- return (address)(intptr_t(y) & page_bits);
-}
-
bool os::find(address addr, outputStream* st) {
Dl_info dlinfo;
memset(&dlinfo, 0, sizeof(dlinfo));
@@ -4533,8 +4521,8 @@
if (Verbose) {
// decode some bytes around the PC
- address begin = same_page(addr-40, addr);
- address end = same_page(addr+40, addr);
+ address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
+ address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
address lowest = (address) dlinfo.dli_sname;
if (!lowest) lowest = (address) dlinfo.dli_fbase;
if (begin < lowest) begin = lowest;
--- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -672,15 +672,15 @@
RESTARTABLE(::open(filename, oflags), result);
if (result == OS_ERR) {
if (errno == ENOENT) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Process not found");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Process not found", OS_ERR);
}
else if (errno == EACCES) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Permission denied");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Permission denied", OS_ERR);
}
else {
- THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno));
+ THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
@@ -828,7 +828,7 @@
char* mapAddress;
int result;
int fd;
- size_t size;
+ size_t size = 0;
const char* luser = NULL;
int mmap_prot;
@@ -899,9 +899,12 @@
if (*sizep == 0) {
size = sharedmem_filesize(fd, CHECK);
- assert(size != 0, "unexpected size");
+ } else {
+ size = *sizep;
}
+ assert(size > 0, "unexpected size <= 0");
+
mapAddress = (char*)::mmap((char*)0, size, mmap_prot, MAP_SHARED, fd, 0);
// attempt to close the file - restart if it gets interrupted,
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1885,6 +1885,9 @@
} else if (strchr(pname, *os::path_separator()) != NULL) {
int n;
char** pelements = split_path(pname, &n);
+ if (pelements == NULL) {
+ return false;
+ }
for (int i = 0 ; i < n ; i++) {
// really shouldn't be NULL but what the heck, check can't hurt
if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
@@ -5787,16 +5790,6 @@
//---------------------------------------------------------------------------------
-static address same_page(address x, address y) {
- intptr_t page_bits = -os::vm_page_size();
- if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits))
- return x;
- else if (x > y)
- return (address)(intptr_t(y) | ~page_bits) + 1;
- else
- return (address)(intptr_t(y) & page_bits);
-}
-
bool os::find(address addr, outputStream* st) {
Dl_info dlinfo;
memset(&dlinfo, 0, sizeof(dlinfo));
@@ -5822,8 +5815,8 @@
if (Verbose) {
// decode some bytes around the PC
- address begin = same_page(addr-40, addr);
- address end = same_page(addr+40, addr);
+ address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size());
+ address end = clamp_address_in_page(addr+40, addr, os::vm_page_size());
address lowest = (address) dlinfo.dli_sname;
if (!lowest) lowest = (address) dlinfo.dli_fbase;
if (begin < lowest) begin = lowest;
--- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -687,15 +687,15 @@
RESTARTABLE(::open(filename, oflags), result);
if (result == OS_ERR) {
if (errno == ENOENT) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Process not found");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Process not found", OS_ERR);
}
else if (errno == EACCES) {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- "Permission denied");
+ THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
+ "Permission denied", OS_ERR);
}
else {
- THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno));
+ THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
@@ -843,7 +843,7 @@
char* mapAddress;
int result;
int fd;
- size_t size;
+ size_t size = 0;
const char* luser = NULL;
int mmap_prot;
@@ -914,9 +914,12 @@
if (*sizep == 0) {
size = sharedmem_filesize(fd, CHECK);
- assert(size != 0, "unexpected size");
+ } else {
+ size = *sizep;
}
+ assert(size > 0, "unexpected size <= 0");
+
mapAddress = (char*)::mmap((char*)0, size, mmap_prot, MAP_SHARED, fd, 0);
// attempt to close the file - restart if it gets interrupted,
--- a/hotspot/src/os/windows/vm/os_windows.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1182,6 +1182,9 @@
} else if (strchr(pname, *os::path_separator()) != NULL) {
int n;
char** pelements = split_path(pname, &n);
+ if (pelements == NULL) {
+ return false;
+ }
for (int i = 0 ; i < n ; i++) {
char* path = pelements[i];
// Really shouldn't be NULL, but check can't hurt
--- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1581,7 +1581,7 @@
ResourceMark rm;
void *mapAddress = 0;
- size_t size;
+ size_t size = 0;
HANDLE fmh;
DWORD ofm_access;
DWORD mv_access;
@@ -1652,9 +1652,12 @@
if (*sizep == 0) {
size = sharedmem_filesize(rfilename, CHECK);
- assert(size != 0, "unexpected size");
+ } else {
+ size = *sizep;
}
+ assert(size > 0, "unexpected size <= 0");
+
// Open the file mapping object with the given name
fmh = open_sharedmem_object(robjectname, ofm_access, CHECK);
--- a/hotspot/src/share/tools/launcher/wildcard.c Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/tools/launcher/wildcard.c Wed Jul 05 18:49:58 2017 +0200
@@ -368,8 +368,10 @@
const char *basename;
FileList fl = FileList_new(16);
WildcardIterator it = WildcardIterator_for(wildcard);
- if (it == NULL)
+ if (it == NULL) {
+ FileList_free(fl);
return NULL;
+ }
while ((basename = WildcardIterator_next(it)) != NULL)
if (isJarFileName(basename))
FileList_add(fl, wildcardConcat(wildcard, basename));
--- a/hotspot/src/share/vm/adlc/output_c.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/adlc/output_c.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -63,11 +63,10 @@
RegDef *reg_def = NULL;
RegDef *next = NULL;
registers->reset_RegDefs();
- for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
+ for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
next = registers->iter_RegDefs();
const char *comma = (next != NULL) ? "," : " // no trailing comma";
- fprintf(fp," \"%s\"%s\n",
- reg_def->_regname, comma );
+ fprintf(fp," \"%s\"%s\n", reg_def->_regname, comma);
}
// Finish defining enumeration
@@ -79,10 +78,10 @@
reg_def = NULL;
next = NULL;
registers->reset_RegDefs();
- for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
+ for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
next = registers->iter_RegDefs();
const char *comma = (next != NULL) ? "," : " // no trailing comma";
- fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma );
+ fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma);
}
// Finish defining array
fprintf(fp,"\t};\n");
@@ -104,19 +103,17 @@
RegDef *reg_def = NULL;
RegDef *next = NULL;
registers->reset_RegDefs();
- for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
+ for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
next = registers->iter_RegDefs();
const char* register_encode = reg_def->register_encode();
const char *comma = (next != NULL) ? "," : " // no trailing comma";
int encval;
if (!ADLParser::is_int_token(register_encode, encval)) {
- fprintf(fp," %s%s // %s\n",
- register_encode, comma, reg_def->_regname );
+ fprintf(fp," %s%s // %s\n", register_encode, comma, reg_def->_regname);
} else {
// Output known constants in hex char format (backward compatibility).
assert(encval < 256, "Exceeded supported width for register encoding");
- fprintf(fp," (unsigned char)'\\x%X'%s // %s\n",
- encval, comma, reg_def->_regname );
+ fprintf(fp," (unsigned char)'\\x%X'%s // %s\n", encval, comma, reg_def->_regname);
}
}
// Finish defining enumeration
@@ -133,9 +130,10 @@
fprintf(fp,"// Enumeration of register class names\n");
fprintf(fp, "enum machRegisterClass {\n");
registers->_rclasses.reset();
- for( const char *class_name = NULL;
- (class_name = registers->_rclasses.iter()) != NULL; ) {
- fprintf(fp," %s,\n", toUpper( class_name ));
+ for (const char *class_name = NULL; (class_name = registers->_rclasses.iter()) != NULL;) {
+ const char * class_name_to_upper = toUpper(class_name);
+ fprintf(fp," %s,\n", class_name_to_upper);
+ delete[] class_name_to_upper;
}
// Finish defining enumeration
fprintf(fp, " _last_Mach_Reg_Class\n");
@@ -148,7 +146,7 @@
void ArchDesc::declare_register_masks(FILE *fp_hpp) {
const char *rc_name;
- if( _register ) {
+ if (_register) {
// Build enumeration of user-defined register classes.
defineRegClassEnum(fp_hpp, _register);
@@ -156,24 +154,27 @@
fprintf(fp_hpp,"\n");
fprintf(fp_hpp,"// Register masks, one for each register class.\n");
_register->_rclasses.reset();
- for( rc_name = NULL;
- (rc_name = _register->_rclasses.iter()) != NULL; ) {
- const char *prefix = "";
- RegClass *reg_class = _register->getRegClass(rc_name);
- assert( reg_class, "Using an undefined register class");
+ for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
+ const char *prefix = "";
+ RegClass *reg_class = _register->getRegClass(rc_name);
+ assert(reg_class, "Using an undefined register class");
+
+ const char* rc_name_to_upper = toUpper(rc_name);
if (reg_class->_user_defined == NULL) {
- fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) );
- fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ));
+ fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, rc_name_to_upper);
+ fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
} else {
- fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined);
+ fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, rc_name_to_upper, reg_class->_user_defined);
}
- if( reg_class->_stack_or_reg ) {
+ if (reg_class->_stack_or_reg) {
assert(reg_class->_user_defined == NULL, "no user defined reg class here");
- fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) );
- fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) );
+ fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, rc_name_to_upper);
+ fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
}
+ delete[] rc_name_to_upper;
+
}
}
}
@@ -183,34 +184,41 @@
void ArchDesc::build_register_masks(FILE *fp_cpp) {
const char *rc_name;
- if( _register ) {
+ if (_register) {
// Generate a list of register masks, one for each class.
fprintf(fp_cpp,"\n");
fprintf(fp_cpp,"// Register masks, one for each register class.\n");
_register->_rclasses.reset();
- for( rc_name = NULL;
- (rc_name = _register->_rclasses.iter()) != NULL; ) {
- const char *prefix = "";
- RegClass *reg_class = _register->getRegClass(rc_name);
- assert( reg_class, "Using an undefined register class");
-
- if (reg_class->_user_defined != NULL) continue;
+ for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
+ const char *prefix = "";
+ RegClass *reg_class = _register->getRegClass(rc_name);
+ assert(reg_class, "Using an undefined register class");
+
+ if (reg_class->_user_defined != NULL) {
+ continue;
+ }
int len = RegisterForm::RegMask_Size();
- fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) );
- { int i;
- for( i = 0; i < len-1; i++ )
- fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false));
- fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false));
+ const char* rc_name_to_upper = toUpper(rc_name);
+ fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, rc_name_to_upper);
+
+ {
+ int i;
+ for(i = 0; i < len - 1; i++) {
+ fprintf(fp_cpp," 0x%x,", reg_class->regs_in_word(i, false));
+ }
+ fprintf(fp_cpp," 0x%x );\n", reg_class->regs_in_word(i, false));
}
- if( reg_class->_stack_or_reg ) {
+ if (reg_class->_stack_or_reg) {
int i;
- fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) );
- for( i = 0; i < len-1; i++ )
- fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true));
- fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true));
+ fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, rc_name_to_upper);
+ for(i = 0; i < len - 1; i++) {
+ fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i, true));
+ }
+ fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i, true));
}
+ delete[] rc_name_to_upper;
}
}
}
@@ -2676,7 +2684,9 @@
if (strcmp(first_reg_class, "stack_slots") == 0) {
fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n");
} else {
- fprintf(fp," return &%s_mask();\n", toUpper(first_reg_class));
+ const char* first_reg_class_to_upper = toUpper(first_reg_class);
+ fprintf(fp," return &%s_mask();\n", first_reg_class_to_upper);
+ delete[] first_reg_class_to_upper;
}
} else {
// Build a switch statement to return the desired mask.
@@ -2688,7 +2698,9 @@
if( !strcmp(reg_class, "stack_slots") ) {
fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index);
} else {
- fprintf(fp, " case %d: return &%s_mask();\n", index, toUpper(reg_class));
+ const char* reg_class_to_upper = toUpper(reg_class);
+ fprintf(fp, " case %d: return &%s_mask();\n", index, reg_class_to_upper);
+ delete[] reg_class_to_upper;
}
}
fprintf(fp," }\n");
--- a/hotspot/src/share/vm/adlc/output_h.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/adlc/output_h.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -2069,9 +2069,21 @@
void closing() { fprintf(_cpp, " _LAST_MACH_OPER\n");
OutputMap::closing();
}
- void map(OpClassForm &opc) { fprintf(_cpp, " %s", _AD.machOperEnum(opc._ident) ); }
- void map(OperandForm &oper) { fprintf(_cpp, " %s", _AD.machOperEnum(oper._ident) ); }
- void map(char *name) { fprintf(_cpp, " %s", _AD.machOperEnum(name)); }
+ void map(OpClassForm &opc) {
+ const char* opc_ident_to_upper = _AD.machOperEnum(opc._ident);
+ fprintf(_cpp, " %s", opc_ident_to_upper);
+ delete[] opc_ident_to_upper;
+ }
+ void map(OperandForm &oper) {
+ const char* oper_ident_to_upper = _AD.machOperEnum(oper._ident);
+ fprintf(_cpp, " %s", oper_ident_to_upper);
+ delete[] oper_ident_to_upper;
+ }
+ void map(char *name) {
+ const char* name_to_upper = _AD.machOperEnum(name);
+ fprintf(_cpp, " %s", name_to_upper);
+ delete[] name_to_upper;
+ }
bool do_instructions() { return false; }
void map(InstructForm &inst){ assert( false, "ShouldNotCallThis()"); }
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -711,25 +711,6 @@
}
}
-static Value maxvalue(IfOp* ifop) {
- switch (ifop->cond()) {
- case If::eql: return NULL;
- case If::neq: return NULL;
- case If::lss: // x < y ? x : y
- case If::leq: // x <= y ? x : y
- if (ifop->x() == ifop->tval() &&
- ifop->y() == ifop->fval()) return ifop->y();
- return NULL;
-
- case If::gtr: // x > y ? y : x
- case If::geq: // x >= y ? y : x
- if (ifop->x() == ifop->tval() &&
- ifop->y() == ifop->fval()) return ifop->y();
- return NULL;
-
- }
-}
-
static ciType* phi_declared_type(Phi* phi) {
ciType* t = phi->operand_at(0)->declared_type();
if (t == NULL) {
--- a/hotspot/src/share/vm/c1/c1_ValueMap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -316,6 +316,7 @@
ShortLoopOptimizer* _short_loop_optimizer;
Instruction* _insertion_point;
ValueStack * _state;
+ bool _insert_is_pred;
void set_invariant(Value v) const { _gvn->set_processed(v); }
bool is_invariant(Value v) const { return _gvn->is_processed(v); }
@@ -339,6 +340,7 @@
assert(insertion_block->end()->as_Base() == NULL, "cannot insert into entry block");
_insertion_point = insertion_block->end()->prev();
+ _insert_is_pred = loop_header->is_predecessor(insertion_block);
BlockEnd *block_end = insertion_block->end();
_state = block_end->state_before();
@@ -379,13 +381,13 @@
} else if (cur->as_LoadField() != NULL) {
LoadField* lf = (LoadField*)cur;
// deoptimizes on NullPointerException
- cur_invariant = !lf->needs_patching() && !lf->field()->is_volatile() && !_short_loop_optimizer->has_field_store(lf->field()->type()->basic_type()) && is_invariant(lf->obj());
+ cur_invariant = !lf->needs_patching() && !lf->field()->is_volatile() && !_short_loop_optimizer->has_field_store(lf->field()->type()->basic_type()) && is_invariant(lf->obj()) && _insert_is_pred;
} else if (cur->as_ArrayLength() != NULL) {
ArrayLength *length = cur->as_ArrayLength();
cur_invariant = is_invariant(length->array());
} else if (cur->as_LoadIndexed() != NULL) {
LoadIndexed *li = (LoadIndexed *)cur->as_LoadIndexed();
- cur_invariant = !_short_loop_optimizer->has_indexed_store(as_BasicType(cur->type())) && is_invariant(li->array()) && is_invariant(li->index());
+ cur_invariant = !_short_loop_optimizer->has_indexed_store(as_BasicType(cur->type())) && is_invariant(li->array()) && is_invariant(li->index()) && _insert_is_pred;
}
if (cur_invariant) {
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1723,9 +1723,6 @@
} else {
coll->set_contended_group(0); // default contended group
}
- coll->set_contended(true);
- } else {
- coll->set_contended(false);
}
}
}
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -150,7 +150,6 @@
void set_contended_group(u2 group) { _contended_group = group; }
u2 contended_group() { return _contended_group; }
- void set_contended(bool contended) { set_annotation(_sun_misc_Contended); }
bool is_contended() { return has_annotation(_sun_misc_Contended); }
};
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -70,15 +70,19 @@
_is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially
_metaspace(NULL), _unloading(false), _klasses(NULL),
_claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
- _next(NULL), _dependencies(NULL),
+ _next(NULL), _dependencies(),
_metaspace_lock(new Mutex(Monitor::leaf+1, "Metaspace allocation lock", true)) {
// empty
}
void ClassLoaderData::init_dependencies(TRAPS) {
+ _dependencies.init(CHECK);
+}
+
+void ClassLoaderData::Dependencies::init(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);
+ _list_head = oopFactory::new_objectArray(2, CHECK);
}
bool ClassLoaderData::claim() {
@@ -95,13 +99,17 @@
}
f->do_oop(&_class_loader);
- f->do_oop(&_dependencies);
+ _dependencies.oops_do(f);
_handles->oops_do(f);
if (klass_closure != NULL) {
classes_do(klass_closure);
}
}
+void ClassLoaderData::Dependencies::oops_do(OopClosure* f) {
+ f->do_oop((oop*)&_list_head);
+}
+
void ClassLoaderData::classes_do(KlassClosure* klass_closure) {
for (Klass* k = _klasses; k != NULL; k = k->next_link()) {
klass_closure->do_klass(k);
@@ -154,14 +162,14 @@
// It's a dependency we won't find through GC, add it. This is relatively rare
// Must handle over GC point.
Handle dependency(THREAD, to);
- from_cld->add_dependency(dependency, CHECK);
+ from_cld->_dependencies.add(dependency, CHECK);
}
-void ClassLoaderData::add_dependency(Handle dependency, TRAPS) {
+void ClassLoaderData::Dependencies::add(Handle dependency, TRAPS) {
// Check first if this dependency is already in the list.
// Save a pointer to the last to add to under the lock.
- objArrayOop ok = (objArrayOop)_dependencies;
+ objArrayOop ok = _list_head;
objArrayOop last = NULL;
while (ok != NULL) {
last = ok;
@@ -184,16 +192,17 @@
objArrayHandle new_dependency(THREAD, deps);
// Add the dependency under lock
- locked_add_dependency(last_handle, new_dependency);
+ locked_add(last_handle, new_dependency, THREAD);
}
-void ClassLoaderData::locked_add_dependency(objArrayHandle last_handle,
- objArrayHandle new_dependency) {
+void ClassLoaderData::Dependencies::locked_add(objArrayHandle last_handle,
+ objArrayHandle new_dependency,
+ Thread* THREAD) {
// 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);
+ ObjectLocker ol(Handle(THREAD, _list_head), THREAD);
oop loader_or_mirror = new_dependency->obj_at(0);
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -93,6 +93,18 @@
class ClassLoaderData : public CHeapObj<mtClass> {
friend class VMStructs;
private:
+ class Dependencies VALUE_OBJ_CLASS_SPEC {
+ objArrayOop _list_head;
+ void locked_add(objArrayHandle last,
+ objArrayHandle new_dependency,
+ Thread* THREAD);
+ public:
+ Dependencies() : _list_head(NULL) {}
+ void add(Handle dependency, TRAPS);
+ void init(TRAPS);
+ void oops_do(OopClosure* f);
+ };
+
friend class ClassLoaderDataGraph;
friend class ClassLoaderDataGraphMetaspaceIterator;
friend class MetaDataFactory;
@@ -100,10 +112,11 @@
static ClassLoaderData * _the_null_class_loader_data;
- oop _class_loader; // oop used to uniquely identify a class loader
- // class loader or a canonical class path
- oop _dependencies; // oop to hold dependencies from this class loader
- // data to others.
+ oop _class_loader; // oop used to uniquely identify a class loader
+ // class loader or a canonical class path
+ Dependencies _dependencies; // holds dependencies from this class loader
+ // data to others.
+
Metaspace * _metaspace; // Meta-space where meta-data defined by the
// classes in the class loader are allocated.
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
@@ -134,9 +147,6 @@
static Metaspace* _ro_metaspace;
static Metaspace* _rw_metaspace;
- void add_dependency(Handle dependency, TRAPS);
- void locked_add_dependency(objArrayHandle last, objArrayHandle new_dependency);
-
void set_next(ClassLoaderData* next) { _next = next; }
ClassLoaderData* next() const { return _next; }
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1592,9 +1592,10 @@
// Used for assertions and verification only
Klass* SystemDictionary::find_class(Symbol* class_name, ClassLoaderData* loader_data) {
#ifndef ASSERT
- guarantee(VerifyBeforeGC ||
- VerifyDuringGC ||
- VerifyBeforeExit ||
+ guarantee(VerifyBeforeGC ||
+ VerifyDuringGC ||
+ VerifyBeforeExit ||
+ VerifyDuringStartup ||
VerifyAfterGC, "too expensive");
#endif
assert_locked_or_safepoint(SystemDictionary_lock);
--- a/hotspot/src/share/vm/classfile/verifier.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -63,6 +63,7 @@
#define NOFAILOVER_MAJOR_VERSION 51
#define NONZERO_PADDING_BYTES_IN_SWITCH_MAJOR_VERSION 51
+#define STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION 52
// Access to external entry for VerifyClassCodes - old byte code verifier
@@ -2320,6 +2321,11 @@
types = (1 << JVM_CONSTANT_InterfaceMethodref) |
(1 << JVM_CONSTANT_Methodref);
break;
+ case Bytecodes::_invokestatic:
+ types = (_klass->major_version() < STATIC_METHOD_IN_INTERFACE_MAJOR_VERSION) ?
+ (1 << JVM_CONSTANT_Methodref) :
+ ((1 << JVM_CONSTANT_InterfaceMethodref) | (1 << JVM_CONSTANT_Methodref));
+ break;
default:
types = 1 << JVM_CONSTANT_Methodref;
}
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1206,11 +1206,8 @@
assert(osr_bci == InvocationEntryBci || (0 <= osr_bci && osr_bci < method->code_size()), "bci out of range");
assert(!method->is_abstract() && (osr_bci == InvocationEntryBci || !method->is_native()), "cannot compile abstract/native methods");
assert(!method->method_holder()->is_not_initialized(), "method holder must be initialized");
-
- if (!TieredCompilation) {
- comp_level = CompLevel_highest_tier;
- }
-
+ // allow any levels for WhiteBox
+ assert(WhiteBoxAPI || TieredCompilation || comp_level == CompLevel_highest_tier, "only CompLevel_highest_tier must be used in non-tiered");
// return quickly if possible
// lock, make sure that the compilation
--- a/hotspot/src/share/vm/compiler/compileLog.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compileLog.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -60,28 +60,6 @@
}
-// Advance kind up to a null or space, return this tail.
-// Make sure kind is null-terminated, not space-terminated.
-// Use the buffer if necessary.
-static const char* split_attrs(const char* &kind, char* buffer) {
- const char* attrs = strchr(kind, ' ');
- // Tease apart the first word from the rest:
- if (attrs == NULL) {
- return ""; // no attrs, no split
- } else if (kind == buffer) {
- ((char*) attrs)[-1] = 0;
- return attrs;
- } else {
- // park it in the buffer, so we can put a null on the end
- assert(!(kind >= buffer && kind < buffer+100), "not obviously in buffer");
- int klen = attrs - kind;
- strncpy(buffer, kind, klen);
- buffer[klen] = 0;
- kind = buffer; // return by reference
- return attrs;
- }
-}
-
// see_tag, pop_tag: Override the default do-nothing methods on xmlStream.
// These methods provide a hook for managing the the extra context markup.
void CompileLog::see_tag(const char* tag, bool push) {
--- a/hotspot/src/share/vm/compiler/compilerOracle.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -237,13 +237,6 @@
"help"
};
-static const char * command_name(OracleCommand command) {
- if (command < OracleFirstCommand || command >= OracleCommandCount) {
- return "unknown command";
- }
- return command_names[command];
-}
-
class MethodMatcher;
static MethodMatcher* lists[OracleCommandCount] = { 0, };
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -48,6 +48,7 @@
#include "memory/iterator.hpp"
#include "memory/referencePolicy.hpp"
#include "memory/resourceArea.hpp"
+#include "memory/tenuredGeneration.hpp"
#include "oops/oop.inline.hpp"
#include "prims/jvmtiExport.hpp"
#include "runtime/globals_extension.hpp"
@@ -916,7 +917,31 @@
return;
}
- size_t expand_bytes = 0;
+ // Compute some numbers about the state of the heap.
+ const size_t used_after_gc = used();
+ const size_t capacity_after_gc = capacity();
+
+ CardGeneration::compute_new_size();
+
+ // Reset again after a possible resizing
+ cmsSpace()->reset_after_compaction();
+
+ assert(used() == used_after_gc && used_after_gc <= capacity(),
+ err_msg("used: " SIZE_FORMAT " used_after_gc: " SIZE_FORMAT
+ " capacity: " SIZE_FORMAT, used(), used_after_gc, capacity()));
+}
+
+void ConcurrentMarkSweepGeneration::compute_new_size_free_list() {
+ assert_locked_or_safepoint(Heap_lock);
+
+ // If incremental collection failed, we just want to expand
+ // to the limit.
+ if (incremental_collection_failed()) {
+ clear_incremental_collection_failed();
+ grow_to_reserved();
+ return;
+ }
+
double free_percentage = ((double) free()) / capacity();
double desired_free_percentage = (double) MinHeapFreeRatio / 100;
double maximum_free_percentage = (double) MaxHeapFreeRatio / 100;
@@ -925,9 +950,7 @@
if (free_percentage < desired_free_percentage) {
size_t desired_capacity = (size_t)(used() / ((double) 1 - desired_free_percentage));
assert(desired_capacity >= capacity(), "invalid expansion size");
- expand_bytes = MAX2(desired_capacity - capacity(), MinHeapDeltaBytes);
- }
- if (expand_bytes > 0) {
+ size_t expand_bytes = MAX2(desired_capacity - capacity(), MinHeapDeltaBytes);
if (PrintGCDetails && Verbose) {
size_t desired_capacity = (size_t)(used() / ((double) 1 - desired_free_percentage));
gclog_or_tty->print_cr("\nFrom compute_new_size: ");
@@ -961,6 +984,14 @@
gclog_or_tty->print_cr(" Expanded free fraction %f",
((double) free()) / capacity());
}
+ } else {
+ size_t desired_capacity = (size_t)(used() / ((double) 1 - desired_free_percentage));
+ assert(desired_capacity <= capacity(), "invalid expansion size");
+ size_t shrink_bytes = capacity() - desired_capacity;
+ // Don't shrink unless the delta is greater than the minimum shrink we want
+ if (shrink_bytes >= MinHeapDeltaBytes) {
+ shrink_free_list_by(shrink_bytes);
+ }
}
}
@@ -1872,7 +1903,7 @@
assert_locked_or_safepoint(Heap_lock);
FreelistLocker z(this);
MetaspaceGC::compute_new_size();
- _cmsGen->compute_new_size();
+ _cmsGen->compute_new_size_free_list();
}
// A work method used by foreground collection to determine
@@ -2601,6 +2632,10 @@
}
void ConcurrentMarkSweepGeneration::gc_prologue(bool full) {
+
+ _capacity_at_prologue = capacity();
+ _used_at_prologue = used();
+
// Delegate to CMScollector which knows how to coordinate between
// this and any other CMS generations that it is responsible for
// collecting.
@@ -2774,6 +2809,23 @@
}
}
+
+void
+CMSCollector::print_on_error(outputStream* st) {
+ CMSCollector* collector = ConcurrentMarkSweepGeneration::_collector;
+ if (collector != NULL) {
+ CMSBitMap* bitmap = &collector->_markBitMap;
+ st->print_cr("Marking Bits: (CMSBitMap*) " PTR_FORMAT, bitmap);
+ bitmap->print_on_error(st, " Bits: ");
+
+ st->cr();
+
+ CMSBitMap* mut_bitmap = &collector->_modUnionTable;
+ st->print_cr("Mod Union Table: (CMSBitMap*) " PTR_FORMAT, mut_bitmap);
+ mut_bitmap->print_on_error(st, " Bits: ");
+ }
+}
+
////////////////////////////////////////////////////////
// CMS Verification Support
////////////////////////////////////////////////////////
@@ -3300,6 +3352,26 @@
}
+void ConcurrentMarkSweepGeneration::shrink_by(size_t bytes) {
+ assert_locked_or_safepoint(ExpandHeap_lock);
+ // Shrink committed space
+ _virtual_space.shrink_by(bytes);
+ // Shrink space; this also shrinks the space's BOT
+ _cmsSpace->set_end((HeapWord*) _virtual_space.high());
+ size_t new_word_size = heap_word_size(_cmsSpace->capacity());
+ // Shrink the shared block offset array
+ _bts->resize(new_word_size);
+ MemRegion mr(_cmsSpace->bottom(), new_word_size);
+ // Shrink the card table
+ Universe::heap()->barrier_set()->resize_covered_region(mr);
+
+ if (Verbose && PrintGC) {
+ size_t new_mem_size = _virtual_space.committed_size();
+ size_t old_mem_size = new_mem_size + bytes;
+ gclog_or_tty->print_cr("Shrinking %s from " SIZE_FORMAT "K to " SIZE_FORMAT "K",
+ name(), old_mem_size/K, new_mem_size/K);
+ }
+}
void ConcurrentMarkSweepGeneration::shrink(size_t bytes) {
assert_locked_or_safepoint(Heap_lock);
@@ -3351,7 +3423,7 @@
return success;
}
-void ConcurrentMarkSweepGeneration::shrink_by(size_t bytes) {
+void ConcurrentMarkSweepGeneration::shrink_free_list_by(size_t bytes) {
assert_locked_or_safepoint(Heap_lock);
assert_lock_strong(freelistLock());
// XXX Fix when compaction is implemented.
@@ -6476,6 +6548,10 @@
}
}
+void CMSBitMap::print_on_error(outputStream* st, const char* prefix) const {
+ _bm.print_on_error(st, prefix);
+}
+
#ifndef PRODUCT
void CMSBitMap::assert_locked() const {
CMSLockVerifier::assert_locked(lock());
@@ -9074,51 +9150,6 @@
}
}
-// The desired expansion delta is computed so that:
-// . desired free percentage or greater is used
-void ASConcurrentMarkSweepGeneration::compute_new_size() {
- assert_locked_or_safepoint(Heap_lock);
-
- GenCollectedHeap* gch = (GenCollectedHeap*) GenCollectedHeap::heap();
-
- // If incremental collection failed, we just want to expand
- // to the limit.
- if (incremental_collection_failed()) {
- clear_incremental_collection_failed();
- grow_to_reserved();
- return;
- }
-
- assert(UseAdaptiveSizePolicy, "Should be using adaptive sizing");
-
- assert(gch->kind() == CollectedHeap::GenCollectedHeap,
- "Wrong type of heap");
- int prev_level = level() - 1;
- assert(prev_level >= 0, "The cms generation is the lowest generation");
- Generation* prev_gen = gch->get_gen(prev_level);
- assert(prev_gen->kind() == Generation::ASParNew,
- "Wrong type of young generation");
- ParNewGeneration* younger_gen = (ParNewGeneration*) prev_gen;
- size_t cur_eden = younger_gen->eden()->capacity();
- CMSAdaptiveSizePolicy* size_policy = cms_size_policy();
- size_t cur_promo = free();
- size_policy->compute_tenured_generation_free_space(cur_promo,
- max_available(),
- cur_eden);
- resize(cur_promo, size_policy->promo_size());
-
- // Record the new size of the space in the cms generation
- // that is available for promotions. This is temporary.
- // It should be the desired promo size.
- size_policy->avg_cms_promo()->sample(free());
- size_policy->avg_old_live()->sample(used());
-
- if (UsePerfData) {
- CMSGCAdaptivePolicyCounters* counters = gc_adaptive_policy_counters();
- counters->update_cms_capacity_counter(capacity());
- }
-}
-
void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) {
assert_locked_or_safepoint(Heap_lock);
assert_lock_strong(freelistLock());
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -60,6 +60,7 @@
class FreeChunk;
class PromotionInfo;
class ScanMarkedObjectsAgainCarefullyClosure;
+class TenuredGeneration;
// A generic CMS bit map. It's the basis for both the CMS marking bit map
// as well as for the mod union table (in each case only a subset of the
@@ -150,6 +151,8 @@
size_t heapWordToOffset(HeapWord* addr) const;
size_t heapWordDiffToOffsetDiff(size_t diff) const;
+ void print_on_error(outputStream* st, const char* prefix) const;
+
// debugging
// is this address range covered by the bit-map?
NOT_PRODUCT(
@@ -810,9 +813,6 @@
// used regions of each generation to limit the extent of sweep
void save_sweep_limits();
- // Resize the generations included in the collector.
- void compute_new_size();
-
// A work method used by foreground collection to determine
// what type of collection (compacting or not, continuing or fresh)
// it should do.
@@ -909,6 +909,9 @@
void releaseFreelistLocks() const;
bool haveFreelistLocks() const;
+ // Adjust size of underlying generation
+ void compute_new_size();
+
// GC prologue and epilogue
void gc_prologue(bool full);
void gc_epilogue(bool full);
@@ -983,6 +986,8 @@
CMSAdaptiveSizePolicy* size_policy();
CMSGCAdaptivePolicyCounters* gc_adaptive_policy_counters();
+ static void print_on_error(outputStream* st);
+
// debugging
void verify();
bool verify_after_remark();
@@ -1082,7 +1087,7 @@
protected:
// Shrink generation by specified size (returns false if unable to shrink)
- virtual void shrink_by(size_t bytes);
+ void shrink_free_list_by(size_t bytes);
// Update statistics for GC
virtual void update_gc_stats(int level, bool full);
@@ -1233,6 +1238,7 @@
CMSExpansionCause::Cause cause);
virtual bool expand(size_t bytes, size_t expand_bytes);
void shrink(size_t bytes);
+ void shrink_by(size_t bytes);
HeapWord* expand_and_par_lab_allocate(CMSParGCThreadState* ps, size_t word_sz);
bool expand_and_ensure_spooling_space(PromotionInfo* promo);
@@ -1293,7 +1299,13 @@
bool must_be_youngest() const { return false; }
bool must_be_oldest() const { return true; }
- void compute_new_size();
+ // Resize the generation after a compacting GC. The
+ // generation can be treated as a contiguous space
+ // after the compaction.
+ virtual void compute_new_size();
+ // Resize the generation after a non-compacting
+ // collection.
+ void compute_new_size_free_list();
CollectionTypes debug_collection_type() { return _debug_collection_type; }
void rotate_debug_collection_type();
@@ -1315,7 +1327,6 @@
virtual void shrink_by(size_t bytes);
public:
- virtual void compute_new_size();
ASConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
int level, CardTableRS* ct,
bool use_adaptive_freelists,
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -101,6 +101,10 @@
}
#endif
+void CMBitMapRO::print_on_error(outputStream* st, const char* prefix) const {
+ _bm.print_on_error(st, prefix);
+}
+
bool CMBitMap::allocate(ReservedSpace heap_rs) {
_bmStartWord = (HeapWord*)(heap_rs.base());
_bmWordSize = heap_rs.size()/HeapWordSize; // heap_rs.size() is in bytes
@@ -3277,6 +3281,13 @@
}
}
+void ConcurrentMark::print_on_error(outputStream* st) const {
+ st->print_cr("Marking Bits (Prev, Next): (CMBitMap*) " PTR_FORMAT ", (CMBitMap*) " PTR_FORMAT,
+ _prevMarkBitMap, _nextMarkBitMap);
+ _prevMarkBitMap->print_on_error(st, " Prev Bits: ");
+ _nextMarkBitMap->print_on_error(st, " Next Bits: ");
+}
+
// We take a break if someone is trying to stop the world.
bool ConcurrentMark::do_yield_check(uint worker_id) {
if (should_yield()) {
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -113,6 +113,8 @@
return res;
}
+ void print_on_error(outputStream* st, const char* prefix) const;
+
// debugging
NOT_PRODUCT(bool covers(ReservedSpace rs) const;)
};
@@ -829,6 +831,8 @@
void print_worker_threads_on(outputStream* st) const;
+ void print_on_error(outputStream* st) const;
+
// The following indicate whether a given verbose level has been
// set. Notice that anything above stats is conditional to
// _MARKING_VERBOSE_ having been set to 1
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -3427,6 +3427,15 @@
heap_region_iterate(&blk);
}
+void G1CollectedHeap::print_on_error(outputStream* st) const {
+ this->CollectedHeap::print_on_error(st);
+
+ if (_cm != NULL) {
+ st->cr();
+ _cm->print_on_error(st);
+ }
+}
+
void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
if (G1CollectedHeap::use_parallel_gc_threads()) {
workers()->print_worker_threads_on(st);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -1575,6 +1575,7 @@
virtual void verify(bool silent);
virtual void print_on(outputStream* st) const;
virtual void print_extended_on(outputStream* st) const;
+ virtual void print_on_error(outputStream* st) const;
virtual void print_gc_threads_on(outputStream* st) const;
virtual void gc_threads_do(ThreadClosure* tc) const;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1359,18 +1359,6 @@
#endif // PRODUCT
}
-#ifndef PRODUCT
-// for debugging, bit of a hack...
-static char*
-region_num_to_mbs(int length) {
- static char buffer[64];
- double bytes = (double) (length * HeapRegion::GrainBytes);
- double mbs = bytes / (double) (1024 * 1024);
- sprintf(buffer, "%7.2lfMB", mbs);
- return buffer;
-}
-#endif // PRODUCT
-
uint G1CollectorPolicy::max_regions(int purpose) {
switch (purpose) {
case GCAllocForSurvived:
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -53,15 +53,6 @@
}
-static int byte_index_to_index(int ind) {
- assert((ind % oopSize) == 0, "Invariant.");
- return ind / oopSize;
-}
-
-static int index_to_byte_index(int byte_ind) {
- return byte_ind * oopSize;
-}
-
void PtrQueue::enqueue_known_active(void* ptr) {
assert(0 <= _index && _index <= _sz, "Invariant.");
assert(_index == 0 || _buf != NULL, "invariant");
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -173,6 +173,12 @@
void reset_counters();
#endif // #ifndef PRODUCT
+ void print_on_error(outputStream* st) const {
+ st->print_cr("Marking Bits: (ParMarkBitMap*) " PTR_FORMAT, this);
+ _beg_bits.print_on_error(st, " Begin Bits: ");
+ _end_bits.print_on_error(st, " End Bits: ");
+ }
+
#ifdef ASSERT
void verify_clear() const;
inline void verify_bit(idx_t bit) const;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -648,6 +648,15 @@
MetaspaceAux::print_on(st);
}
+void ParallelScavengeHeap::print_on_error(outputStream* st) const {
+ this->CollectedHeap::print_on_error(st);
+
+ if (UseParallelOldGC) {
+ st->cr();
+ PSParallelCompact::print_on_error(st);
+ }
+}
+
void ParallelScavengeHeap::gc_threads_do(ThreadClosure* tc) const {
PSScavenge::gc_task_manager()->threads_do(tc);
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -220,6 +220,7 @@
void prepare_for_verify();
virtual void print_on(outputStream* st) const;
+ virtual void print_on_error(outputStream* st) const;
virtual void print_gc_threads_on(outputStream* st) const;
virtual void gc_threads_do(ThreadClosure* tc) const;
virtual void print_tracing_info() const;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -165,6 +165,10 @@
#endif // #ifdef ASSERT
+void PSParallelCompact::print_on_error(outputStream* st) {
+ _mark_bitmap.print_on_error(st);
+}
+
#ifndef PRODUCT
const char* PSParallelCompact::space_names[] = {
"old ", "eden", "from", "to "
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -1163,6 +1163,8 @@
// Time since last full gc (in milliseconds).
static jlong millis_since_last_gc();
+ static void print_on_error(outputStream* st);
+
#ifndef PRODUCT
// Debugging support.
static const char* space_names[last_space_id];
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -567,6 +567,14 @@
print_on(st);
}
+ virtual void print_on_error(outputStream* st) const {
+ st->print_cr("Heap:");
+ print_extended_on(st);
+ st->cr();
+
+ _barrier_set->print_on(st);
+ }
+
// Print all GC threads (other than the VM thread)
// used by this heap.
virtual void print_gc_threads_on(outputStream* st) const = 0;
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -557,11 +557,6 @@
// be shared by method invocation and synchronized blocks.
//%note synchronization_3
-static void trace_locking(Handle& h_locking_obj, bool is_locking) {
- ObjectSynchronizer::trace_locking(h_locking_obj, false, true, is_locking);
-}
-
-
//%note monitor_1
IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorenter(JavaThread* thread, BasicObjectLock* elem))
#ifdef ASSERT
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -217,6 +217,7 @@
TRAPS) {
vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
if (TraceMethodHandles) {
+ ResourceMark rm(THREAD);
tty->print_cr("lookup_polymorphic_method iid=%s %s.%s%s",
vmIntrinsics::name_at(iid), klass->external_name(),
name->as_C_string(), full_signature->as_C_string());
@@ -231,6 +232,7 @@
TempNewSymbol basic_signature =
MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
if (TraceMethodHandles) {
+ ResourceMark rm(THREAD);
tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
name->as_C_string(),
full_signature->as_C_string(),
@@ -283,6 +285,8 @@
}
if (result.not_null()) {
#ifdef ASSERT
+ ResourceMark rm(THREAD);
+
TempNewSymbol basic_signature =
MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
int actual_size_of_params = result->size_of_parameters();
@@ -1222,8 +1226,10 @@
Symbol* method_signature = NULL;
KlassHandle current_klass;
resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
- if (TraceMethodHandles)
+ if (TraceMethodHandles) {
+ ResourceMark rm(THREAD);
tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
+ }
resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
}
--- a/hotspot/src/share/vm/memory/allocation.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/allocation.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -611,4 +611,23 @@
void check() PRODUCT_RETURN;
};
+// Helper class to allocate arrays that may become large.
+// Uses the OS malloc for allocations smaller than ArrayAllocatorMallocLimit
+// and uses mapped memory for larger allocations.
+// Most OS mallocs do something similar but Solaris malloc does not revert
+// to mapped memory for large allocations. By default ArrayAllocatorMallocLimit
+// is set so that we always use malloc except for Solaris where we set the
+// limit to get mapped memory.
+template <class E, MEMFLAGS F>
+class ArrayAllocator : StackObj {
+ char* _addr;
+ bool _use_malloc;
+ size_t _size;
+ public:
+ ArrayAllocator() : _addr(NULL), _use_malloc(false), _size(0) { }
+ ~ArrayAllocator() { free(); }
+ E* allocate(size_t length);
+ void free();
+};
+
#endif // SHARE_VM_MEMORY_ALLOCATION_HPP
--- a/hotspot/src/share/vm/memory/allocation.inline.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/allocation.inline.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -108,5 +108,49 @@
FreeHeap(p, F);
}
+template <class E, MEMFLAGS F>
+E* ArrayAllocator<E, F>::allocate(size_t length) {
+ assert(_addr == NULL, "Already in use");
+
+ _size = sizeof(E) * length;
+ _use_malloc = _size < ArrayAllocatorMallocLimit;
+
+ if (_use_malloc) {
+ _addr = AllocateHeap(_size, F);
+ if (_addr == NULL && _size >= (size_t)os::vm_allocation_granularity()) {
+ // malloc failed let's try with mmap instead
+ _use_malloc = false;
+ } else {
+ return (E*)_addr;
+ }
+ }
+
+ int alignment = os::vm_allocation_granularity();
+ _size = align_size_up(_size, alignment);
+
+ _addr = os::reserve_memory(_size, NULL, alignment);
+ if (_addr == NULL) {
+ vm_exit_out_of_memory(_size, "Allocator (reserve)");
+ }
+
+ bool success = os::commit_memory(_addr, _size, false /* executable */);
+ if (!success) {
+ vm_exit_out_of_memory(_size, "Allocator (commit)");
+ }
+
+ return (E*)_addr;
+}
+
+template<class E, MEMFLAGS F>
+void ArrayAllocator<E, F>::free() {
+ if (_addr != NULL) {
+ if (_use_malloc) {
+ FreeHeap(_addr, F);
+ } else {
+ os::release_memory(_addr, _size);
+ }
+ _addr = NULL;
+ }
+}
#endif // SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP
--- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -819,12 +819,13 @@
// Returns "TRUE" iff "p" points into the committed areas of the heap.
bool GenCollectedHeap::is_in(const void* p) const {
#ifndef ASSERT
- guarantee(VerifyBeforeGC ||
- VerifyDuringGC ||
- VerifyBeforeExit ||
- PrintAssembly ||
- tty->count() != 0 || // already printing
- VerifyAfterGC ||
+ guarantee(VerifyBeforeGC ||
+ VerifyDuringGC ||
+ VerifyBeforeExit ||
+ VerifyDuringStartup ||
+ PrintAssembly ||
+ tty->count() != 0 || // already printing
+ VerifyAfterGC ||
VMError::fatal_error_in_progress(), "too expensive");
#endif
@@ -1132,6 +1133,17 @@
#endif // INCLUDE_ALL_GCS
}
+void GenCollectedHeap::print_on_error(outputStream* st) const {
+ this->CollectedHeap::print_on_error(st);
+
+#if INCLUDE_ALL_GCS
+ if (UseConcMarkSweepGC) {
+ st->cr();
+ CMSCollector::print_on_error(st);
+ }
+#endif // INCLUDE_ALL_GCS
+}
+
void GenCollectedHeap::print_tracing_info() const {
if (TraceGen0Time) {
get_gen(0)->print_summary_info();
--- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -344,6 +344,7 @@
virtual void print_gc_threads_on(outputStream* st) const;
virtual void gc_threads_do(ThreadClosure* tc) const;
virtual void print_tracing_info() const;
+ virtual void print_on_error(outputStream* st) const;
// PrintGC, PrintGCDetails support
void print_heap_change(size_t prev_used) const;
--- a/hotspot/src/share/vm/memory/generation.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/generation.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -382,7 +382,9 @@
CardGeneration::CardGeneration(ReservedSpace rs, size_t initial_byte_size,
int level,
GenRemSet* remset) :
- Generation(rs, initial_byte_size, level), _rs(remset)
+ Generation(rs, initial_byte_size, level), _rs(remset),
+ _shrink_factor(0), _min_heap_delta_bytes(), _capacity_at_prologue(),
+ _used_at_prologue()
{
HeapWord* start = (HeapWord*)rs.base();
size_t reserved_byte_size = rs.size();
@@ -406,6 +408,9 @@
// the end if we try.
guarantee(_rs->is_aligned(reserved_mr.end()), "generation must be card aligned");
}
+ _min_heap_delta_bytes = MinHeapDeltaBytes;
+ _capacity_at_prologue = initial_byte_size;
+ _used_at_prologue = 0;
}
bool CardGeneration::expand(size_t bytes, size_t expand_bytes) {
@@ -457,6 +462,160 @@
}
+void CardGeneration::compute_new_size() {
+ assert(_shrink_factor <= 100, "invalid shrink factor");
+ size_t current_shrink_factor = _shrink_factor;
+ _shrink_factor = 0;
+
+ // We don't have floating point command-line arguments
+ // Note: argument processing ensures that MinHeapFreeRatio < 100.
+ const double minimum_free_percentage = MinHeapFreeRatio / 100.0;
+ const double maximum_used_percentage = 1.0 - minimum_free_percentage;
+
+ // Compute some numbers about the state of the heap.
+ const size_t used_after_gc = used();
+ const size_t capacity_after_gc = capacity();
+
+ const double min_tmp = used_after_gc / maximum_used_percentage;
+ size_t minimum_desired_capacity = (size_t)MIN2(min_tmp, double(max_uintx));
+ // Don't shrink less than the initial generation size
+ minimum_desired_capacity = MAX2(minimum_desired_capacity,
+ spec()->init_size());
+ assert(used_after_gc <= minimum_desired_capacity, "sanity check");
+
+ if (PrintGC && Verbose) {
+ const size_t free_after_gc = free();
+ const double free_percentage = ((double)free_after_gc) / capacity_after_gc;
+ gclog_or_tty->print_cr("TenuredGeneration::compute_new_size: ");
+ gclog_or_tty->print_cr(" "
+ " minimum_free_percentage: %6.2f"
+ " maximum_used_percentage: %6.2f",
+ minimum_free_percentage,
+ maximum_used_percentage);
+ gclog_or_tty->print_cr(" "
+ " free_after_gc : %6.1fK"
+ " used_after_gc : %6.1fK"
+ " capacity_after_gc : %6.1fK",
+ free_after_gc / (double) K,
+ used_after_gc / (double) K,
+ capacity_after_gc / (double) K);
+ gclog_or_tty->print_cr(" "
+ " free_percentage: %6.2f",
+ free_percentage);
+ }
+
+ if (capacity_after_gc < minimum_desired_capacity) {
+ // If we have less free space than we want then expand
+ size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
+ // Don't expand unless it's significant
+ if (expand_bytes >= _min_heap_delta_bytes) {
+ expand(expand_bytes, 0); // safe if expansion fails
+ }
+ if (PrintGC && Verbose) {
+ gclog_or_tty->print_cr(" expanding:"
+ " minimum_desired_capacity: %6.1fK"
+ " expand_bytes: %6.1fK"
+ " _min_heap_delta_bytes: %6.1fK",
+ minimum_desired_capacity / (double) K,
+ expand_bytes / (double) K,
+ _min_heap_delta_bytes / (double) K);
+ }
+ return;
+ }
+
+ // No expansion, now see if we want to shrink
+ size_t shrink_bytes = 0;
+ // We would never want to shrink more than this
+ size_t max_shrink_bytes = capacity_after_gc - minimum_desired_capacity;
+
+ if (MaxHeapFreeRatio < 100) {
+ const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
+ const double minimum_used_percentage = 1.0 - maximum_free_percentage;
+ const double max_tmp = used_after_gc / minimum_used_percentage;
+ size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
+ maximum_desired_capacity = MAX2(maximum_desired_capacity,
+ spec()->init_size());
+ if (PrintGC && Verbose) {
+ gclog_or_tty->print_cr(" "
+ " maximum_free_percentage: %6.2f"
+ " minimum_used_percentage: %6.2f",
+ maximum_free_percentage,
+ minimum_used_percentage);
+ gclog_or_tty->print_cr(" "
+ " _capacity_at_prologue: %6.1fK"
+ " minimum_desired_capacity: %6.1fK"
+ " maximum_desired_capacity: %6.1fK",
+ _capacity_at_prologue / (double) K,
+ minimum_desired_capacity / (double) K,
+ maximum_desired_capacity / (double) K);
+ }
+ assert(minimum_desired_capacity <= maximum_desired_capacity,
+ "sanity check");
+
+ if (capacity_after_gc > maximum_desired_capacity) {
+ // Capacity too large, compute shrinking size
+ shrink_bytes = capacity_after_gc - maximum_desired_capacity;
+ // We don't want shrink all the way back to initSize if people call
+ // System.gc(), because some programs do that between "phases" and then
+ // we'd just have to grow the heap up again for the next phase. So we
+ // damp the shrinking: 0% on the first call, 10% on the second call, 40%
+ // on the third call, and 100% by the fourth call. But if we recompute
+ // size without shrinking, it goes back to 0%.
+ shrink_bytes = shrink_bytes / 100 * current_shrink_factor;
+ assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
+ if (current_shrink_factor == 0) {
+ _shrink_factor = 10;
+ } else {
+ _shrink_factor = MIN2(current_shrink_factor * 4, (size_t) 100);
+ }
+ if (PrintGC && Verbose) {
+ gclog_or_tty->print_cr(" "
+ " shrinking:"
+ " initSize: %.1fK"
+ " maximum_desired_capacity: %.1fK",
+ spec()->init_size() / (double) K,
+ maximum_desired_capacity / (double) K);
+ gclog_or_tty->print_cr(" "
+ " shrink_bytes: %.1fK"
+ " current_shrink_factor: %d"
+ " new shrink factor: %d"
+ " _min_heap_delta_bytes: %.1fK",
+ shrink_bytes / (double) K,
+ current_shrink_factor,
+ _shrink_factor,
+ _min_heap_delta_bytes / (double) K);
+ }
+ }
+ }
+
+ if (capacity_after_gc > _capacity_at_prologue) {
+ // We might have expanded for promotions, in which case we might want to
+ // take back that expansion if there's room after GC. That keeps us from
+ // stretching the heap with promotions when there's plenty of room.
+ size_t expansion_for_promotion = capacity_after_gc - _capacity_at_prologue;
+ expansion_for_promotion = MIN2(expansion_for_promotion, max_shrink_bytes);
+ // We have two shrinking computations, take the largest
+ shrink_bytes = MAX2(shrink_bytes, expansion_for_promotion);
+ assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
+ if (PrintGC && Verbose) {
+ gclog_or_tty->print_cr(" "
+ " aggressive shrinking:"
+ " _capacity_at_prologue: %.1fK"
+ " capacity_after_gc: %.1fK"
+ " expansion_for_promotion: %.1fK"
+ " shrink_bytes: %.1fK",
+ capacity_after_gc / (double) K,
+ _capacity_at_prologue / (double) K,
+ expansion_for_promotion / (double) K,
+ shrink_bytes / (double) K);
+ }
+ }
+ // Don't shrink unless it's significant
+ if (shrink_bytes >= _min_heap_delta_bytes) {
+ shrink(shrink_bytes);
+ }
+}
+
// Currently nothing to do.
void CardGeneration::prepare_for_verify() {}
--- a/hotspot/src/share/vm/memory/generation.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/generation.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -634,6 +634,17 @@
// This is local to this generation.
BlockOffsetSharedArray* _bts;
+ // current shrinking effect: this damps shrinking when the heap gets empty.
+ size_t _shrink_factor;
+
+ size_t _min_heap_delta_bytes; // Minimum amount to expand.
+
+ // Some statistics from before gc started.
+ // These are gathered in the gc_prologue (and should_collect)
+ // to control growing/shrinking policy in spite of promotions.
+ size_t _capacity_at_prologue;
+ size_t _used_at_prologue;
+
CardGeneration(ReservedSpace rs, size_t initial_byte_size, int level,
GenRemSet* remset);
@@ -644,6 +655,11 @@
// necessarily the full "bytes") was done.
virtual bool expand(size_t bytes, size_t expand_bytes);
+ // Shrink generation with specified size (returns false if unable to shrink)
+ virtual void shrink(size_t bytes) = 0;
+
+ virtual void compute_new_size();
+
virtual void clear_remembered_set();
virtual void invalidate_remembered_set();
@@ -667,7 +683,6 @@
friend class VM_PopulateDumpSharedSpace;
protected:
- size_t _min_heap_delta_bytes; // Minimum amount to expand.
ContiguousSpace* _the_space; // actual space holding objects
WaterMark _last_gc; // watermark between objects allocated before
// and after last GC.
@@ -688,11 +703,10 @@
public:
OneContigSpaceCardGeneration(ReservedSpace rs, size_t initial_byte_size,
- size_t min_heap_delta_bytes,
int level, GenRemSet* remset,
ContiguousSpace* space) :
CardGeneration(rs, initial_byte_size, level, remset),
- _the_space(space), _min_heap_delta_bytes(min_heap_delta_bytes)
+ _the_space(space)
{}
inline bool is_in(const void* p) const;
--- a/hotspot/src/share/vm/memory/heap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/heap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -79,13 +79,6 @@
}
-static size_t align_to_allocation_size(size_t size) {
- const size_t alignment = (size_t)os::vm_allocation_granularity();
- assert(is_power_of_2(alignment), "no kidding ???");
- return (size + alignment - 1) & ~(alignment - 1);
-}
-
-
void CodeHeap::on_code_mapping(char* base, size_t size) {
#ifdef LINUX
extern void linux_wrap_code(char* base, size_t size);
--- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -39,7 +39,7 @@
size_t initial_byte_size, int level,
GenRemSet* remset) :
OneContigSpaceCardGeneration(rs, initial_byte_size,
- MinHeapDeltaBytes, level, remset, NULL)
+ level, remset, NULL)
{
HeapWord* bottom = (HeapWord*) _virtual_space.low();
HeapWord* end = (HeapWord*) _virtual_space.high();
@@ -86,162 +86,6 @@
return "tenured generation";
}
-void TenuredGeneration::compute_new_size() {
- assert(_shrink_factor <= 100, "invalid shrink factor");
- size_t current_shrink_factor = _shrink_factor;
- _shrink_factor = 0;
-
- // We don't have floating point command-line arguments
- // Note: argument processing ensures that MinHeapFreeRatio < 100.
- const double minimum_free_percentage = MinHeapFreeRatio / 100.0;
- const double maximum_used_percentage = 1.0 - minimum_free_percentage;
-
- // Compute some numbers about the state of the heap.
- const size_t used_after_gc = used();
- const size_t capacity_after_gc = capacity();
-
- const double min_tmp = used_after_gc / maximum_used_percentage;
- size_t minimum_desired_capacity = (size_t)MIN2(min_tmp, double(max_uintx));
- // Don't shrink less than the initial generation size
- minimum_desired_capacity = MAX2(minimum_desired_capacity,
- spec()->init_size());
- assert(used_after_gc <= minimum_desired_capacity, "sanity check");
-
- if (PrintGC && Verbose) {
- const size_t free_after_gc = free();
- const double free_percentage = ((double)free_after_gc) / capacity_after_gc;
- gclog_or_tty->print_cr("TenuredGeneration::compute_new_size: ");
- gclog_or_tty->print_cr(" "
- " minimum_free_percentage: %6.2f"
- " maximum_used_percentage: %6.2f",
- minimum_free_percentage,
- maximum_used_percentage);
- gclog_or_tty->print_cr(" "
- " free_after_gc : %6.1fK"
- " used_after_gc : %6.1fK"
- " capacity_after_gc : %6.1fK",
- free_after_gc / (double) K,
- used_after_gc / (double) K,
- capacity_after_gc / (double) K);
- gclog_or_tty->print_cr(" "
- " free_percentage: %6.2f",
- free_percentage);
- }
-
- if (capacity_after_gc < minimum_desired_capacity) {
- // If we have less free space than we want then expand
- size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
- // Don't expand unless it's significant
- if (expand_bytes >= _min_heap_delta_bytes) {
- expand(expand_bytes, 0); // safe if expansion fails
- }
- if (PrintGC && Verbose) {
- gclog_or_tty->print_cr(" expanding:"
- " minimum_desired_capacity: %6.1fK"
- " expand_bytes: %6.1fK"
- " _min_heap_delta_bytes: %6.1fK",
- minimum_desired_capacity / (double) K,
- expand_bytes / (double) K,
- _min_heap_delta_bytes / (double) K);
- }
- return;
- }
-
- // No expansion, now see if we want to shrink
- size_t shrink_bytes = 0;
- // We would never want to shrink more than this
- size_t max_shrink_bytes = capacity_after_gc - minimum_desired_capacity;
-
- if (MaxHeapFreeRatio < 100) {
- const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
- const double minimum_used_percentage = 1.0 - maximum_free_percentage;
- const double max_tmp = used_after_gc / minimum_used_percentage;
- size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
- maximum_desired_capacity = MAX2(maximum_desired_capacity,
- spec()->init_size());
- if (PrintGC && Verbose) {
- gclog_or_tty->print_cr(" "
- " maximum_free_percentage: %6.2f"
- " minimum_used_percentage: %6.2f",
- maximum_free_percentage,
- minimum_used_percentage);
- gclog_or_tty->print_cr(" "
- " _capacity_at_prologue: %6.1fK"
- " minimum_desired_capacity: %6.1fK"
- " maximum_desired_capacity: %6.1fK",
- _capacity_at_prologue / (double) K,
- minimum_desired_capacity / (double) K,
- maximum_desired_capacity / (double) K);
- }
- assert(minimum_desired_capacity <= maximum_desired_capacity,
- "sanity check");
-
- if (capacity_after_gc > maximum_desired_capacity) {
- // Capacity too large, compute shrinking size
- shrink_bytes = capacity_after_gc - maximum_desired_capacity;
- // We don't want shrink all the way back to initSize if people call
- // System.gc(), because some programs do that between "phases" and then
- // we'd just have to grow the heap up again for the next phase. So we
- // damp the shrinking: 0% on the first call, 10% on the second call, 40%
- // on the third call, and 100% by the fourth call. But if we recompute
- // size without shrinking, it goes back to 0%.
- shrink_bytes = shrink_bytes / 100 * current_shrink_factor;
- assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
- if (current_shrink_factor == 0) {
- _shrink_factor = 10;
- } else {
- _shrink_factor = MIN2(current_shrink_factor * 4, (size_t) 100);
- }
- if (PrintGC && Verbose) {
- gclog_or_tty->print_cr(" "
- " shrinking:"
- " initSize: %.1fK"
- " maximum_desired_capacity: %.1fK",
- spec()->init_size() / (double) K,
- maximum_desired_capacity / (double) K);
- gclog_or_tty->print_cr(" "
- " shrink_bytes: %.1fK"
- " current_shrink_factor: %d"
- " new shrink factor: %d"
- " _min_heap_delta_bytes: %.1fK",
- shrink_bytes / (double) K,
- current_shrink_factor,
- _shrink_factor,
- _min_heap_delta_bytes / (double) K);
- }
- }
- }
-
- if (capacity_after_gc > _capacity_at_prologue) {
- // We might have expanded for promotions, in which case we might want to
- // take back that expansion if there's room after GC. That keeps us from
- // stretching the heap with promotions when there's plenty of room.
- size_t expansion_for_promotion = capacity_after_gc - _capacity_at_prologue;
- expansion_for_promotion = MIN2(expansion_for_promotion, max_shrink_bytes);
- // We have two shrinking computations, take the largest
- shrink_bytes = MAX2(shrink_bytes, expansion_for_promotion);
- assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size");
- if (PrintGC && Verbose) {
- gclog_or_tty->print_cr(" "
- " aggressive shrinking:"
- " _capacity_at_prologue: %.1fK"
- " capacity_after_gc: %.1fK"
- " expansion_for_promotion: %.1fK"
- " shrink_bytes: %.1fK",
- capacity_after_gc / (double) K,
- _capacity_at_prologue / (double) K,
- expansion_for_promotion / (double) K,
- shrink_bytes / (double) K);
- }
- }
- // Don't shrink unless it's significant
- if (shrink_bytes >= _min_heap_delta_bytes) {
- shrink(shrink_bytes);
- }
- assert(used() == used_after_gc && used_after_gc <= capacity(),
- "sanity check");
-}
-
void TenuredGeneration::gc_prologue(bool full) {
_capacity_at_prologue = capacity();
_used_at_prologue = used();
@@ -312,6 +156,19 @@
size, is_tlab);
}
+void TenuredGeneration::compute_new_size() {
+ assert_locked_or_safepoint(Heap_lock);
+
+ // Compute some numbers about the state of the heap.
+ const size_t used_after_gc = used();
+ const size_t capacity_after_gc = capacity();
+
+ CardGeneration::compute_new_size();
+
+ assert(used() == used_after_gc && used_after_gc <= capacity(),
+ err_msg("used: " SIZE_FORMAT " used_after_gc: " SIZE_FORMAT
+ " capacity: " SIZE_FORMAT, used(), used_after_gc, capacity()));
+}
void TenuredGeneration::update_gc_stats(int current_level,
bool full) {
// If the next lower level(s) has been collected, gather any statistics
--- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -38,13 +38,6 @@
class TenuredGeneration: public OneContigSpaceCardGeneration {
friend class VMStructs;
protected:
- // current shrinking effect: this damps shrinking when the heap gets empty.
- size_t _shrink_factor;
- // Some statistics from before gc started.
- // These are gathered in the gc_prologue (and should_collect)
- // to control growing/shrinking policy in spite of promotions.
- size_t _capacity_at_prologue;
- size_t _used_at_prologue;
#if INCLUDE_ALL_GCS
// To support parallel promotion: an array of parallel allocation
@@ -80,9 +73,6 @@
return !CollectGen0First;
}
- // Mark sweep support
- void compute_new_size();
-
virtual void gc_prologue(bool full);
virtual void gc_epilogue(bool full);
bool should_collect(bool full,
@@ -93,6 +83,7 @@
bool clear_all_soft_refs,
size_t size,
bool is_tlab);
+ virtual void compute_new_size();
#if INCLUDE_ALL_GCS
// Overrides.
--- a/hotspot/src/share/vm/memory/universe.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/memory/universe.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1326,6 +1326,8 @@
static uintptr_t _verify_klass_data[2] = {0, (uintptr_t)-1};
+#ifndef PRODUCT
+
static void calculate_verify_data(uintptr_t verify_data[2],
HeapWord* low_boundary,
HeapWord* high_boundary) {
@@ -1360,9 +1362,7 @@
verify_data[1] = bits;
}
-
// Oop verification (see MacroAssembler::verify_oop)
-#ifndef PRODUCT
uintptr_t Universe::verify_oop_mask() {
MemRegion m = heap()->reserved_region();
--- a/hotspot/src/share/vm/oops/constantPool.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/oops/constantPool.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1378,12 +1378,13 @@
// JVMTI GetConstantPool support
-// For temporary use until code is stable.
-#define DBG(code)
+// For debugging of constant pool
+const bool debug_cpool = false;
-static const char* WARN_MSG = "Must not be such entry!";
+#define DBG(code) do { if (debug_cpool) { (code); } } while(0)
static void print_cpool_bytes(jint cnt, u1 *bytes) {
+ const char* WARN_MSG = "Must not be such entry!";
jint size = 0;
u2 idx1, idx2;
@@ -1669,8 +1670,7 @@
idx1 = tbl->symbol_to_value(sym);
assert(idx1 != 0, "Have not found a hashtable entry");
Bytes::put_Java_u2((address) (bytes+1), idx1);
- DBG(char *str = sym->as_utf8());
- DBG(printf("JVM_CONSTANT_String: idx=#%03hd, %s", idx1, str));
+ DBG(printf("JVM_CONSTANT_String: idx=#%03hd, %s", idx1, sym->as_utf8()));
break;
}
case JVM_CONSTANT_Fieldref:
@@ -1745,6 +1745,8 @@
return (int)(bytes - start_bytes);
} /* end copy_cpool_bytes */
+#undef DBG
+
void ConstantPool::set_on_stack(const bool value) {
if (value) {
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -3157,7 +3157,7 @@
Array<int>* method_ordering = this->method_ordering();
int length = method_ordering->length();
if (JvmtiExport::can_maintain_original_method_order() ||
- (UseSharedSpaces && length != 0)) {
+ ((UseSharedSpaces || DumpSharedSpaces) && length != 0)) {
guarantee(length == methods()->length(), "invalid method ordering length");
jlong sum = 0;
for (int j = 0; j < length; j++) {
--- a/hotspot/src/share/vm/oops/method.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/oops/method.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -758,15 +758,19 @@
void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
public:
- bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
- void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
- bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); }
- void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); }
+ bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
+ void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
+ void clear_not_c1_compilable() { _access_flags.clear_not_c1_compilable(); }
+ bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); }
+ void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); }
+ void clear_not_c2_compilable() { _access_flags.clear_not_c2_compilable(); }
- bool is_not_c1_osr_compilable() const { return is_not_c1_compilable(); } // don't waste an accessFlags bit
- void set_not_c1_osr_compilable() { set_not_c1_compilable(); } // don't waste an accessFlags bit
- bool is_not_c2_osr_compilable() const { return access_flags().is_not_c2_osr_compilable(); }
- void set_not_c2_osr_compilable() { _access_flags.set_not_c2_osr_compilable(); }
+ bool is_not_c1_osr_compilable() const { return is_not_c1_compilable(); } // don't waste an accessFlags bit
+ void set_not_c1_osr_compilable() { set_not_c1_compilable(); } // don't waste an accessFlags bit
+ void clear_not_c1_osr_compilable() { clear_not_c1_compilable(); } // don't waste an accessFlags bit
+ bool is_not_c2_osr_compilable() const { return access_flags().is_not_c2_osr_compilable(); }
+ void set_not_c2_osr_compilable() { _access_flags.set_not_c2_osr_compilable(); }
+ void clear_not_c2_osr_compilable() { _access_flags.clear_not_c2_osr_compilable(); }
// Background compilation support
bool queued_for_compilation() const { return access_flags().queued_for_compilation(); }
--- a/hotspot/src/share/vm/oops/methodData.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/oops/methodData.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -660,29 +660,9 @@
// Set the method back-pointer.
_method = method();
- _invocation_counter.init();
- _backedge_counter.init();
- _invocation_counter_start = 0;
- _backedge_counter_start = 0;
- _num_loops = 0;
- _num_blocks = 0;
- _highest_comp_level = 0;
- _highest_osr_comp_level = 0;
- _would_profile = true;
+ init();
set_creation_mileage(mileage_of(method()));
- // Initialize flags and trap history.
- _nof_decompiles = 0;
- _nof_overflow_recompiles = 0;
- _nof_overflow_traps = 0;
- _eflags = 0;
- _arg_local = 0;
- _arg_stack = 0;
- _arg_returned = 0;
- assert(sizeof(_trap_hist) % sizeof(HeapWord) == 0, "align");
- Copy::zero_to_words((HeapWord*) &_trap_hist,
- sizeof(_trap_hist) / sizeof(HeapWord));
-
// Go through the bytecodes and allocate and initialize the
// corresponding data cells.
int data_size = 0;
@@ -721,7 +701,27 @@
post_initialize(&stream);
set_size(object_size);
+}
+void MethodData::init() {
+ _invocation_counter.init();
+ _backedge_counter.init();
+ _invocation_counter_start = 0;
+ _backedge_counter_start = 0;
+ _num_loops = 0;
+ _num_blocks = 0;
+ _highest_comp_level = 0;
+ _highest_osr_comp_level = 0;
+ _would_profile = true;
+
+ // Initialize flags and trap history.
+ _nof_decompiles = 0;
+ _nof_overflow_recompiles = 0;
+ _nof_overflow_traps = 0;
+ clear_escape_info();
+ assert(sizeof(_trap_hist) % sizeof(HeapWord) == 0, "align");
+ Copy::zero_to_words((HeapWord*) &_trap_hist,
+ sizeof(_trap_hist) / sizeof(HeapWord));
}
// Get a measure of how much mileage the method has on it.
--- a/hotspot/src/share/vm/oops/methodData.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/oops/methodData.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -1284,8 +1284,8 @@
return bytecode_cell_count(code) != no_profile_data;
}
- // Perform initialization of a new MethodData*
- void initialize(methodHandle method);
+ // reset into original state
+ void init();
// My size
int size_in_bytes() const { return _size; }
@@ -1365,6 +1365,7 @@
intx arg_stack() { return _arg_stack; }
intx arg_returned() { return _arg_returned; }
uint arg_modified(int a) { ArgInfoData *aid = arg_info();
+ assert(aid != NULL, "arg_info must be not null");
assert(a >= 0 && a < aid->number_of_args(), "valid argument number");
return aid->arg_modified(a); }
@@ -1373,8 +1374,8 @@
void set_arg_stack(intx v) { _arg_stack = v; }
void set_arg_returned(intx v) { _arg_returned = v; }
void set_arg_modified(int a, uint v) { ArgInfoData *aid = arg_info();
+ assert(aid != NULL, "arg_info must be not null");
assert(a >= 0 && a < aid->number_of_args(), "valid argument number");
-
aid->set_arg_modified(a, v); }
void clear_escape_info() { _eflags = _arg_local = _arg_stack = _arg_returned = 0; }
--- a/hotspot/src/share/vm/opto/block.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/opto/block.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1028,26 +1028,6 @@
}
#ifndef PRODUCT
-static void edge_dump(GrowableArray<CFGEdge *> *edges) {
- tty->print_cr("---- Edges ----");
- for (int i = 0; i < edges->length(); i++) {
- CFGEdge *e = edges->at(i);
- if (e != NULL) {
- edges->at(i)->dump();
- }
- }
-}
-
-static void trace_dump(Trace *traces[], int count) {
- tty->print_cr("---- Traces ----");
- for (int i = 0; i < count; i++) {
- Trace *tr = traces[i];
- if (tr != NULL) {
- tr->dump();
- }
- }
-}
-
void Trace::dump( ) const {
tty->print_cr("Trace (freq %f)", first_block()->_freq);
for (Block *b = first_block(); b != NULL; b = next(b)) {
--- a/hotspot/src/share/vm/opto/compile.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -2326,12 +2326,14 @@
int get_inner_loop_count() const { return _inner_loop_count; }
};
+#ifdef ASSERT
static bool oop_offset_is_sane(const TypeInstPtr* tp) {
ciInstanceKlass *k = tp->klass()->as_instance_klass();
// Make sure the offset goes inside the instance layout.
return k->contains_field_offset(tp->offset());
// Note that OffsetBot and OffsetTop are very negative.
}
+#endif
// Eliminate trivially redundant StoreCMs and accumulate their
// precedence edges.
--- a/hotspot/src/share/vm/opto/connode.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/opto/connode.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -465,29 +465,6 @@
return (phase->type(in(1)) == phase->type(this)) ? in(1) : this;
}
-// Determine whether "n" is a node which can cause an alias of one of its inputs. Node types
-// which can create aliases are: CheckCastPP, Phi, and any store (if there is also a load from
-// the location.)
-// Note: this checks for aliases created in this compilation, not ones which may
-// be potentially created at call sites.
-static bool can_cause_alias(Node *n, PhaseTransform *phase) {
- bool possible_alias = false;
-
- if (n->is_Store()) {
- possible_alias = !n->as_Store()->value_never_loaded(phase);
- } else {
- int opc = n->Opcode();
- possible_alias = n->is_Phi() ||
- opc == Op_CheckCastPP ||
- opc == Op_StorePConditional ||
- opc == Op_CompareAndSwapP ||
- opc == Op_CompareAndSwapN ||
- opc == Op_GetAndSetP ||
- opc == Op_GetAndSetN;
- }
- return possible_alias;
-}
-
//------------------------------Value------------------------------------------
// Take 'join' of input and cast-up type, unless working with an Interface
const Type *CheckCastPPNode::Value( PhaseTransform *phase ) const {
--- a/hotspot/src/share/vm/opto/subnode.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/opto/subnode.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1078,16 +1078,6 @@
return (_test._test == b->_test._test);
}
-//------------------------------clone_cmp--------------------------------------
-// Clone a compare/bool tree
-static Node *clone_cmp( Node *cmp, Node *cmp1, Node *cmp2, PhaseGVN *gvn, BoolTest::mask test ) {
- Node *ncmp = cmp->clone();
- ncmp->set_req(1,cmp1);
- ncmp->set_req(2,cmp2);
- ncmp = gvn->transform( ncmp );
- return new (gvn->C) BoolNode( ncmp, test );
-}
-
//-------------------------------make_predicate--------------------------------
Node* BoolNode::make_predicate(Node* test_value, PhaseGVN* phase) {
if (test_value->is_Con()) return test_value;
--- a/hotspot/src/share/vm/prims/jni.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1289,32 +1289,6 @@
JNI_NONVIRTUAL
};
-static methodHandle jni_resolve_interface_call(Handle recv, methodHandle method, TRAPS) {
- assert(!method.is_null() , "method should not be null");
-
- KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
- if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
- KlassHandle spec_klass (THREAD, method->method_holder());
- Symbol* name = method->name();
- Symbol* signature = method->signature();
- CallInfo info;
- LinkResolver::resolve_interface_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
- return info.selected_method();
-}
-
-static methodHandle jni_resolve_virtual_call(Handle recv, methodHandle method, TRAPS) {
- assert(!method.is_null() , "method should not be null");
-
- KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc)
- if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass());
- KlassHandle spec_klass (THREAD, method->method_holder());
- Symbol* name = method->name();
- Symbol* signature = method->signature();
- CallInfo info;
- LinkResolver::resolve_virtual_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle()));
- return info.selected_method();
-}
-
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
@@ -5053,6 +5027,7 @@
void execute_internal_vm_tests() {
if (ExecuteInternalVMTests) {
tty->print_cr("Running internal VM tests");
+ run_unit_test(GlobalDefinitions::test_globals());
run_unit_test(arrayOopDesc::test_max_array_length());
run_unit_test(CollectedHeap::test_is_in());
run_unit_test(QuickSort::test_quick_sort());
--- a/hotspot/src/share/vm/prims/jniCheck.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/prims/jniCheck.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -33,7 +33,7 @@
// within IN_VM macro), one to be called when in NATIVE state.
// When in VM state:
- static void ReportJNIFatalError(JavaThread* thr, const char *msg) {
+ static inline void ReportJNIFatalError(JavaThread* thr, const char *msg) {
tty->print_cr("FATAL ERROR in native method: %s", msg);
thr->print_stack();
os::abort(true);
--- a/hotspot/src/share/vm/prims/whitebox.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -49,6 +49,7 @@
#endif // INCLUDE_NMT
#include "compiler/compileBroker.hpp"
+#include "runtime/compilationPolicy.hpp"
bool WhiteBox::_used = false;
@@ -118,45 +119,46 @@
#endif // INCLUDE_ALL_GCS
#ifdef INCLUDE_NMT
-// Keep track of the 3 allocations in NMTAllocTest so we can free them later
-// on and verify that they're not visible anymore
-static void* nmtMtTest1 = NULL, *nmtMtTest2 = NULL, *nmtMtTest3 = NULL;
-
// Alloc memory using the test memory type so that we can use that to see if
// NMT picks it up correctly
-WB_ENTRY(jboolean, WB_NMTAllocTest(JNIEnv* env))
- void *mem;
+WB_ENTRY(jlong, WB_NMTMalloc(JNIEnv* env, jobject o, jlong size))
+ jlong addr = 0;
- if (!MemTracker::is_on() || MemTracker::shutdown_in_progress()) {
- return false;
+ if (MemTracker::is_on() && !MemTracker::shutdown_in_progress()) {
+ addr = (jlong)(uintptr_t)os::malloc(size, mtTest);
}
- // Allocate 2 * 128k + 256k + 1024k and free the 1024k one to make sure we track
- // everything correctly. Total should be 512k held alive.
- nmtMtTest1 = os::malloc(128 * 1024, mtTest);
- mem = os::malloc(1024 * 1024, mtTest);
- nmtMtTest2 = os::malloc(256 * 1024, mtTest);
- os::free(mem, mtTest);
- nmtMtTest3 = os::malloc(128 * 1024, mtTest);
-
- return true;
+ return addr;
WB_END
// Free the memory allocated by NMTAllocTest
-WB_ENTRY(jboolean, WB_NMTFreeTestMemory(JNIEnv* env))
+WB_ENTRY(void, WB_NMTFree(JNIEnv* env, jobject o, jlong mem))
+ os::free((void*)(uintptr_t)mem, mtTest);
+WB_END
- if (nmtMtTest1 == NULL || nmtMtTest2 == NULL || nmtMtTest3 == NULL) {
- return false;
+WB_ENTRY(jlong, WB_NMTReserveMemory(JNIEnv* env, jobject o, jlong size))
+ jlong addr = 0;
+
+ if (MemTracker::is_on() && !MemTracker::shutdown_in_progress()) {
+ addr = (jlong)(uintptr_t)os::reserve_memory(size);
+ MemTracker::record_virtual_memory_type((address)addr, mtTest);
}
- os::free(nmtMtTest1, mtTest);
- nmtMtTest1 = NULL;
- os::free(nmtMtTest2, mtTest);
- nmtMtTest2 = NULL;
- os::free(nmtMtTest3, mtTest);
- nmtMtTest3 = NULL;
+ return addr;
+WB_END
+
- return true;
+WB_ENTRY(void, WB_NMTCommitMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
+ os::commit_memory((char *)(uintptr_t)addr, size);
+ MemTracker::record_virtual_memory_type((address)(uintptr_t)addr, mtTest);
+WB_END
+
+WB_ENTRY(void, WB_NMTUncommitMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
+ os::uncommit_memory((char *)(uintptr_t)addr, size);
+WB_END
+
+WB_ENTRY(void, WB_NMTReleaseMemory(JNIEnv* env, jobject o, jlong addr, jlong size))
+ os::release_memory((char *)(uintptr_t)addr, size);
WB_END
// Block until the current generation of NMT data to be merged, used to reliably test the NMT feature
@@ -213,11 +215,11 @@
return (code->is_alive() && !code->is_marked_for_deoptimization());
WB_END
-WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method))
+WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method, jint comp_level))
jmethodID jmid = reflected_method_to_jmid(thread, env, method);
MutexLockerEx mu(Compile_lock);
methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
- return !mh->is_not_compilable();
+ return CompilationPolicy::can_be_compiled(mh, comp_level);
WB_END
WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
@@ -241,7 +243,7 @@
mh->set_not_compilable();
WB_END
-WB_ENTRY(jboolean, WB_SetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
+WB_ENTRY(jboolean, WB_TestSetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
jmethodID jmid = reflected_method_to_jmid(thread, env, method);
methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
bool result = mh->dont_inline();
@@ -254,6 +256,54 @@
CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
WB_END
+
+WB_ENTRY(jboolean, WB_TestSetForceInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ bool result = mh->force_inline();
+ mh->set_force_inline(value == JNI_TRUE);
+ return result;
+WB_END
+
+WB_ENTRY(jboolean, WB_EnqueueMethodForCompilation(JNIEnv* env, jobject o, jobject method, jint comp_level))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ nmethod* nm = CompileBroker::compile_method(mh, InvocationEntryBci, comp_level, mh, mh->invocation_count(), "WhiteBox", THREAD);
+ MutexLockerEx mu(Compile_lock);
+ return (mh->queued_for_compilation() || nm != NULL);
+WB_END
+
+WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ MutexLockerEx mu(Compile_lock);
+ MethodData* mdo = mh->method_data();
+
+ if (mdo != NULL) {
+ mdo->init();
+ ResourceMark rm;
+ int arg_count = mdo->method()->size_of_parameters();
+ for (int i = 0; i < arg_count; i++) {
+ mdo->set_arg_modified(i, 0);
+ }
+ }
+
+ mh->backedge_counter()->init();
+ mh->invocation_counter()->init();
+ mh->set_interpreter_invocation_count(0);
+ mh->set_interpreter_throwout_count(0);
+ mh->clear_not_c1_compilable();
+ mh->clear_not_c2_compilable();
+ mh->clear_not_c2_osr_compilable();
+ NOT_PRODUCT(mh->set_compiled_invocation_count(0));
+
+#ifdef TIERED
+ mh->set_rate(0.0F);
+ mh->set_prev_event_count(0);
+ mh->set_prev_time(0);
+#endif
+WB_END
+
WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
ResourceMark rm(THREAD);
int len;
@@ -271,7 +321,6 @@
Universe::heap()->collect(GCCause::_last_ditch_collection);
WB_END
-
//Some convenience methods to deal with objects from java
int WhiteBox::offset_for_field(const char* field_name, oop object,
Symbol* signature_symbol) {
@@ -340,27 +389,37 @@
{CC"g1RegionSize", CC"()I", (void*)&WB_G1RegionSize },
#endif // INCLUDE_ALL_GCS
#ifdef INCLUDE_NMT
- {CC"NMTAllocTest", CC"()Z", (void*)&WB_NMTAllocTest },
- {CC"NMTFreeTestMemory", CC"()Z", (void*)&WB_NMTFreeTestMemory },
- {CC"NMTWaitForDataMerge",CC"()Z", (void*)&WB_NMTWaitForDataMerge},
+ {CC"NMTMalloc", CC"(J)J", (void*)&WB_NMTMalloc },
+ {CC"NMTFree", CC"(J)V", (void*)&WB_NMTFree },
+ {CC"NMTReserveMemory", CC"(J)J", (void*)&WB_NMTReserveMemory },
+ {CC"NMTCommitMemory", CC"(JJ)V", (void*)&WB_NMTCommitMemory },
+ {CC"NMTUncommitMemory", CC"(JJ)V", (void*)&WB_NMTUncommitMemory },
+ {CC"NMTReleaseMemory", CC"(JJ)V", (void*)&WB_NMTReleaseMemory },
+ {CC"NMTWaitForDataMerge", CC"()Z", (void*)&WB_NMTWaitForDataMerge},
#endif // INCLUDE_NMT
{CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
{CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Method;)I",
(void*)&WB_DeoptimizeMethod },
{CC"isMethodCompiled", CC"(Ljava/lang/reflect/Method;)Z",
(void*)&WB_IsMethodCompiled },
- {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;)Z",
+ {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;I)Z",
(void*)&WB_IsMethodCompilable},
{CC"isMethodQueuedForCompilation",
CC"(Ljava/lang/reflect/Method;)Z", (void*)&WB_IsMethodQueuedForCompilation},
{CC"makeMethodNotCompilable",
CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_MakeMethodNotCompilable},
- {CC"setDontInlineMethod",
- CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_SetDontInlineMethod},
+ {CC"testSetDontInlineMethod",
+ CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_TestSetDontInlineMethod},
{CC"getMethodCompilationLevel",
CC"(Ljava/lang/reflect/Method;)I", (void*)&WB_GetMethodCompilationLevel},
{CC"getCompileQueuesSize",
CC"()I", (void*)&WB_GetCompileQueuesSize},
+ {CC"testSetForceInlineMethod",
+ CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_TestSetForceInlineMethod},
+ {CC"enqueueMethodForCompilation",
+ CC"(Ljava/lang/reflect/Method;I)Z", (void*)&WB_EnqueueMethodForCompilation},
+ {CC"clearMethodState",
+ CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_ClearMethodState},
{CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
};
--- a/hotspot/src/share/vm/runtime/arguments.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1754,11 +1754,15 @@
return false;
}
+#if !INCLUDE_ALL_GCS
+#ifdef ASSERT
static bool verify_serial_gc_flags() {
return (UseSerialGC &&
!(UseParNewGC || (UseConcMarkSweepGC || CMSIncrementalMode) || UseG1GC ||
UseParallelGC || UseParallelOldGC));
}
+#endif // ASSERT
+#endif // INCLUDE_ALL_GCS
// check if do gclog rotation
// +UseGCLogFileRotation is a must,
@@ -2006,11 +2010,12 @@
// than just disable the lock verification. This will be fixed under
// bug 4788986.
if (UseConcMarkSweepGC && FLSVerifyAllHeapReferences) {
- if (VerifyGCStartAt == 0) {
+ if (VerifyDuringStartup) {
warning("Heap verification at start-up disabled "
"(due to current incompatibility with FLSVerifyAllHeapReferences)");
- VerifyGCStartAt = 1; // Disable verification at start-up
+ VerifyDuringStartup = false; // Disable verification at start-up
}
+
if (VerifyBeforeExit) {
warning("Heap verification at shutdown disabled "
"(due to current incompatibility with FLSVerifyAllHeapReferences)");
@@ -3092,6 +3097,7 @@
} \
} while(0)
+#if !INCLUDE_ALL_GCS
static void force_serial_gc() {
FLAG_SET_DEFAULT(UseSerialGC, true);
FLAG_SET_DEFAULT(CMSIncrementalMode, false); // special CMS suboption
@@ -3101,6 +3107,7 @@
UNSUPPORTED_GC_OPTION(UseConcMarkSweepGC);
UNSUPPORTED_GC_OPTION(UseParNewGC);
}
+#endif // INCLUDE_ALL_GCS
// Parse entry point called from JNI_CreateJavaVM
--- a/hotspot/src/share/vm/runtime/compilationPolicy.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -123,9 +123,10 @@
}
if (comp_level == CompLevel_all) {
return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization);
- } else {
+ } else if (is_compile(comp_level)) {
return !m->is_not_compilable(comp_level);
}
+ return false;
}
bool CompilationPolicy::is_compilation_enabled() {
--- a/hotspot/src/share/vm/runtime/compilationPolicy.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/compilationPolicy.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -96,7 +96,7 @@
void reset_counter_for_back_branch_event(methodHandle method);
public:
NonTieredCompPolicy() : _compiler_count(0) { }
- virtual CompLevel initial_compile_level() { return CompLevel_initial_compile; }
+ virtual CompLevel initial_compile_level() { return CompLevel_highest_tier; }
virtual int compiler_count(CompLevel comp_level);
virtual void do_safepoint_work();
virtual void reprofile(ScopeDesc* trap_scope, bool is_osr);
--- a/hotspot/src/share/vm/runtime/globals.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -2123,6 +2123,10 @@
product(intx, PrefetchFieldsAhead, -1, \
"How many fields ahead to prefetch in oop scan (<= 0 means off)") \
\
+ diagnostic(bool, VerifyDuringStartup, false, \
+ "Verify memory system before executing any Java code " \
+ "during VM initialization") \
+ \
diagnostic(bool, VerifyBeforeExit, trueInDebug, \
"Verify system before exiting") \
\
@@ -3664,8 +3668,13 @@
product(bool, PrintGCCause, true, \
"Include GC cause in GC logging") \
\
- product(bool, AllowNonVirtualCalls, false, \
- "Obey the ACC_SUPER flag and allow invokenonvirtual calls")
+ product(bool , AllowNonVirtualCalls, false, \
+ "Obey the ACC_SUPER flag and allow invokenonvirtual calls") \
+ \
+ experimental(uintx, ArrayAllocatorMallocLimit, \
+ SOLARIS_ONLY(64*K) NOT_SOLARIS(max_uintx), \
+ "Allocation less than this value will be allocated " \
+ "using malloc. Larger allocations will use mmap.")
/*
* Macros for factoring of globals
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -735,6 +735,9 @@
// Exception handlers
#ifndef PRODUCT
+
+#ifdef SPARC
+
#ifdef _LP64
#define PTR_PAD ""
#else
@@ -755,7 +758,6 @@
newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
}
-#ifdef SPARC
static void print_me(intptr_t *new_sp, intptr_t *old_sp, bool *was_oops) {
#ifdef _LP64
tty->print_cr("--------+------address-----+------before-----------+-------after----------+");
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -449,8 +449,6 @@
// and explicit fences (barriers) to control for architectural reordering performed
// by the CPU(s) or platform.
-static int MBFence (int x) { OrderAccess::fence(); return x; }
-
struct SharedGlobals {
// These are highly shared mostly-read variables.
// To avoid false-sharing they need to be the sole occupants of a $ line.
@@ -1639,11 +1637,6 @@
#ifndef PRODUCT
-void ObjectSynchronizer::trace_locking(Handle locking_obj, bool is_compiled,
- bool is_method, bool is_locking) {
- // Don't know what to do here
-}
-
// Verify all monitors in the monitor cache, the verification is weak.
void ObjectSynchronizer::verify() {
ObjectMonitor* block = gBlockList;
--- a/hotspot/src/share/vm/runtime/synchronizer.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/synchronizer.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -121,7 +121,6 @@
static void oops_do(OopClosure* f);
// debugging
- static void trace_locking(Handle obj, bool is_compiled, bool is_method, bool is_locking) PRODUCT_RETURN;
static void verify() PRODUCT_RETURN;
static int verify_objmon_isinpool(ObjectMonitor *addr) PRODUCT_RETURN0;
--- a/hotspot/src/share/vm/runtime/thread.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -3446,9 +3446,9 @@
}
assert (Universe::is_fully_initialized(), "not initialized");
- if (VerifyBeforeGC && VerifyGCStartAt == 0) {
- Universe::heap()->prepare_for_verify();
- Universe::verify(); // make sure we're starting with a clean slate
+ if (VerifyDuringStartup) {
+ VM_Verify verify_op(false /* silent */); // make sure we're starting with a clean slate
+ VMThread::execute(&verify_op);
}
EXCEPTION_MARK;
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -478,6 +478,9 @@
\
nonstatic_field(CardGeneration, _rs, GenRemSet*) \
nonstatic_field(CardGeneration, _bts, BlockOffsetSharedArray*) \
+ nonstatic_field(CardGeneration, _shrink_factor, size_t) \
+ nonstatic_field(CardGeneration, _capacity_at_prologue, size_t) \
+ nonstatic_field(CardGeneration, _used_at_prologue, size_t) \
\
nonstatic_field(CardTableModRefBS, _whole_heap, const MemRegion) \
nonstatic_field(CardTableModRefBS, _guard_index, const size_t) \
@@ -548,8 +551,6 @@
nonstatic_field(Space, _bottom, HeapWord*) \
nonstatic_field(Space, _end, HeapWord*) \
\
- nonstatic_field(TenuredGeneration, _shrink_factor, size_t) \
- nonstatic_field(TenuredGeneration, _capacity_at_prologue, size_t) \
nonstatic_field(ThreadLocalAllocBuffer, _start, HeapWord*) \
nonstatic_field(ThreadLocalAllocBuffer, _top, HeapWord*) \
nonstatic_field(ThreadLocalAllocBuffer, _end, HeapWord*) \
--- a/hotspot/src/share/vm/runtime/vm_operations.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/vm_operations.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -175,7 +175,8 @@
}
void VM_Verify::doit() {
- Universe::verify();
+ Universe::heap()->prepare_for_verify();
+ Universe::verify(_silent);
}
bool VM_PrintThreads::doit_prologue() {
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -300,9 +300,9 @@
class VM_Verify: public VM_Operation {
private:
- KlassHandle _dependee;
+ bool _silent;
public:
- VM_Verify() {}
+ VM_Verify(bool silent) : _silent(silent) {}
VMOp_Type type() const { return VMOp_Verify; }
void doit();
};
--- a/hotspot/src/share/vm/services/diagnosticArgument.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/services/diagnosticArgument.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/services/memTracker.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/services/memTracker.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -127,12 +127,15 @@
assert(_state == NMT_bootstrapping_multi_thread, "wrong state");
_snapshot = new (std::nothrow)MemSnapshot();
- if (_snapshot != NULL && !_snapshot->out_of_memory()) {
- if (start_worker()) {
+ if (_snapshot != NULL) {
+ if (!_snapshot->out_of_memory() && start_worker()) {
_state = NMT_started;
NMT_track_callsite = (_tracking_level == NMT_detail && can_walk_stack());
return;
}
+
+ delete _snapshot;
+ _snapshot = NULL;
}
// fail to start native memory tracking, shut it down
@@ -544,7 +547,10 @@
assert(_worker_thread == NULL, "Just Check");
_worker_thread = new (std::nothrow) MemTrackWorker();
if (_worker_thread == NULL || _worker_thread->has_error()) {
- shutdown(NMT_initialization);
+ if (_worker_thread != NULL) {
+ delete _worker_thread;
+ _worker_thread = NULL;
+ }
return false;
}
_worker_thread->start();
--- a/hotspot/src/share/vm/utilities/accessFlags.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/accessFlags.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -194,6 +194,9 @@
void set_is_obsolete() { atomic_set_bits(JVM_ACC_IS_OBSOLETE); }
void set_is_prefixed_native() { atomic_set_bits(JVM_ACC_IS_PREFIXED_NATIVE); }
+ void clear_not_c1_compilable() { atomic_clear_bits(JVM_ACC_NOT_C1_COMPILABLE); }
+ void clear_not_c2_compilable() { atomic_clear_bits(JVM_ACC_NOT_C2_COMPILABLE); }
+ void clear_not_c2_osr_compilable() { atomic_clear_bits(JVM_ACC_NOT_C2_OSR_COMPILABLE); }
// Klass* flags
void set_has_vanilla_constructor() { atomic_set_bits(JVM_ACC_HAS_VANILLA_CONSTRUCTOR); }
void set_has_finalizer() { atomic_set_bits(JVM_ACC_HAS_FINALIZER); }
--- a/hotspot/src/share/vm/utilities/bitMap.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/bitMap.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -516,6 +516,10 @@
return sum;
}
+void BitMap::print_on_error(outputStream* st, const char* prefix) const {
+ st->print_cr("%s[" PTR_FORMAT ", " PTR_FORMAT ")",
+ prefix, map(), (char*)map() + (size() >> LogBitsPerByte));
+}
#ifndef PRODUCT
--- a/hotspot/src/share/vm/utilities/bitMap.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/bitMap.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -262,6 +262,7 @@
bool is_full() const;
bool is_empty() const;
+ void print_on_error(outputStream* st, const char* prefix) const;
#ifndef PRODUCT
public:
--- a/hotspot/src/share/vm/utilities/debug.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/debug.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -608,18 +608,6 @@
return CodeCache::find_nmethod((address)addr);
}
-static address same_page(address x, address y) {
- intptr_t page_bits = -os::vm_page_size();
- if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) {
- return x;
- } else if (x > y) {
- return (address)(intptr_t(y) | ~page_bits) + 1;
- } else {
- return (address)(intptr_t(y) & page_bits);
- }
-}
-
-
// Another interface that isn't ambiguous in dbx.
// Can we someday rename the other find to hsfind?
extern "C" void hsfind(intptr_t x) {
--- a/hotspot/src/share/vm/utilities/globalDefinitions.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -355,3 +355,33 @@
return size_t(result);
}
+
+#ifndef PRODUCT
+
+void GlobalDefinitions::test_globals() {
+ intptr_t page_sizes[] = { os::vm_page_size(), 4096, 8192, 65536, 2*1024*1024 };
+ const int num_page_sizes = sizeof(page_sizes) / sizeof(page_sizes[0]);
+
+ for (int i = 0; i < num_page_sizes; i++) {
+ intptr_t page_size = page_sizes[i];
+
+ address a_page = (address)(10*page_size);
+
+ // Check that address within page is returned as is
+ assert(clamp_address_in_page(a_page, a_page, page_size) == a_page, "incorrect");
+ assert(clamp_address_in_page(a_page + 128, a_page, page_size) == a_page + 128, "incorrect");
+ assert(clamp_address_in_page(a_page + page_size - 1, a_page, page_size) == a_page + page_size - 1, "incorrect");
+
+ // Check that address above page returns start of next page
+ assert(clamp_address_in_page(a_page + page_size, a_page, page_size) == a_page + page_size, "incorrect");
+ assert(clamp_address_in_page(a_page + page_size + 1, a_page, page_size) == a_page + page_size, "incorrect");
+ assert(clamp_address_in_page(a_page + page_size*5 + 1, a_page, page_size) == a_page + page_size, "incorrect");
+
+ // Check that address below page returns start of page
+ assert(clamp_address_in_page(a_page - 1, a_page, page_size) == a_page, "incorrect");
+ assert(clamp_address_in_page(a_page - 2*page_size - 1, a_page, page_size) == a_page, "incorrect");
+ assert(clamp_address_in_page(a_page - 5*page_size - 1, a_page, page_size) == a_page, "incorrect");
+ }
+}
+
+#endif // PRODUCT
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -419,6 +419,24 @@
return align_size_up(offset, HeapWordsPerLong);
}
+// Clamp an address to be within a specific page
+// 1. If addr is on the page it is returned as is
+// 2. If addr is above the page_address the start of the *next* page will be returned
+// 3. Otherwise, if addr is below the page_address the start of the page will be returned
+inline address clamp_address_in_page(address addr, address page_address, intptr_t page_size) {
+ if (align_size_down(intptr_t(addr), page_size) == align_size_down(intptr_t(page_address), page_size)) {
+ // address is in the specified page, just return it as is
+ return addr;
+ } else if (addr > page_address) {
+ // address is above specified page, return start of next page
+ return (address)align_size_down(intptr_t(page_address), page_size) + page_size;
+ } else {
+ // address is below specified page, return start of page
+ return (address)align_size_down(intptr_t(page_address), page_size);
+ }
+}
+
+
// The expected size in bytes of a cache line, used to pad data structures.
#define DEFAULT_CACHE_LINE_SIZE 64
@@ -827,6 +845,10 @@
return comp_level == CompLevel_highest_tier;
}
+inline bool is_compile(int comp_level) {
+ return is_c1_compile(comp_level) || is_c2_compile(comp_level);
+}
+
//----------------------------------------------------------------------------------------------------
// 'Forward' declarations of frequently used classes
// (in order to reduce interface dependencies & reduce
@@ -1296,4 +1318,15 @@
return *(void**)addr;
}
+
+#ifndef PRODUCT
+
+// For unit testing only
+class GlobalDefinitions {
+public:
+ static void test_globals();
+};
+
+#endif // PRODUCT
+
#endif // SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP
--- a/hotspot/src/share/vm/utilities/taskqueue.hpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/taskqueue.hpp Wed Jul 05 18:49:58 2017 +0200
@@ -253,6 +253,7 @@
template <class E, MEMFLAGS F, unsigned int N = TASKQUEUE_SIZE>
class GenericTaskQueue: public TaskQueueSuper<N, F> {
+ ArrayAllocator<E, F> _array_allocator;
protected:
typedef typename TaskQueueSuper<N, F>::Age Age;
typedef typename TaskQueueSuper<N, F>::idx_t idx_t;
@@ -314,7 +315,7 @@
template<class E, MEMFLAGS F, unsigned int N>
void GenericTaskQueue<E, F, N>::initialize() {
- _elems = NEW_C_HEAP_ARRAY(E, N, F);
+ _elems = _array_allocator.allocate(N);
}
template<class E, MEMFLAGS F, unsigned int N>
--- a/hotspot/src/share/vm/utilities/vmError.cpp Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Wed Jul 05 18:49:58 2017 +0200
@@ -685,13 +685,7 @@
STEP(190, "(printing heap information)" )
if (_verbose && Universe::is_fully_initialized()) {
- // Print heap information before vm abort. As we'd like as much
- // information as possible in the report we ask for the
- // extended (i.e., more detailed) version.
- Universe::print_on(st, true /* extended */);
- st->cr();
-
- Universe::heap()->barrier_set()->print_on(st);
+ Universe::heap()->print_on_error(st);
st->cr();
st->print_cr("Polling page: " INTPTR_FORMAT, os::get_polling_page());
--- a/hotspot/test/compiler/6863420/Test.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/6863420/Test.java Wed Jul 05 18:49:58 2017 +0200
@@ -27,17 +27,35 @@
* @bug 6863420
* @summary os::javaTimeNanos() go backward on Solaris x86
*
- * @run main/othervm Test
+ * Notice the internal timeout in timeout thread Test.TOT.
+ * @run main/othervm/timeout=300 Test
*/
public class Test {
+
+ static final int INTERNAL_TIMEOUT=240;
+ static class TOT extends Thread {
+ public void run() {
+ try {
+ Thread.sleep(INTERNAL_TIMEOUT*1000);
+ } catch (InterruptedException ex) {
+ }
+ done = true;
+ }
+ }
+
static long value = 0;
static boolean got_backward_time = false;
+ static volatile boolean done = false;
public static void main(String args[]) {
final int count = 100000;
- for (int numThreads = 1; numThreads <= 32; numThreads++) {
+ TOT tot = new TOT();
+ tot.setDaemon(true);
+ tot.start();
+
+ for (int numThreads = 1; !done && numThreads <= 32; numThreads++) {
final int numRuns = 1;
for (int t=1; t <= numRuns; t++) {
final int curRun = t;
@@ -48,7 +66,7 @@
Runnable thread =
new Runnable() {
public void run() {
- for (long l = 0; l < 100000; l++) {
+ for (long l = 0; !done && l < 100000; l++) {
final long start = System.nanoTime();
if (value == 12345678) {
System.out.println("Wow!");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/8011706/Test8011706.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8011706
+ * @summary loop invariant code motion may move load before store to the same field
+ * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation Test8011706
+ *
+ */
+
+public class Test8011706 {
+ int[] array;
+
+ void m(boolean test, int[] array1, int[] array2) {
+ int i = 0;
+ if (test) {
+ array = array1;
+ } else {
+ array = array2;
+ }
+
+ while(true) {
+ int v = array[i];
+ i++;
+ if (i >= 10) return;
+ }
+ }
+
+ static public void main(String[] args) {
+ int[] new_array = new int[10];
+ Test8011706 ti = new Test8011706();
+ boolean failed = false;
+ try {
+ for (int i = 0; i < 10000; i++) {
+ ti.array = null;
+ ti.m(true, new_array, new_array);
+ }
+ } catch(NullPointerException ex) {
+ throw new RuntimeException("TEST FAILED", ex);
+ }
+ System.out.println("TEST PASSED");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/ClearMethodStateTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test ClearMethodStateTest
+ * @library /testlibrary /testlibrary/whitebox
+ * @build ClearMethodStateTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ClearMethodStateTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class ClearMethodStateTest extends CompilerWhiteBoxTest {
+ public static void main(String[] args) throws Exception {
+ // to prevent inlining #method into #compile() and #test()
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
+ new ClearMethodStateTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ checkNotCompiled(METHOD);
+ compile();
+ checkCompiled(METHOD);
+ WHITE_BOX.clearMethodState(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+
+
+ if (!TIERED_COMPILATION) {
+ WHITE_BOX.clearMethodState(METHOD);
+ compile(COMPILE_THRESHOLD);
+ checkCompiled(METHOD);
+
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+ WHITE_BOX.clearMethodState(METHOD);
+
+ if (COMPILE_THRESHOLD > 1) {
+ compile(COMPILE_THRESHOLD - 1);
+ checkNotCompiled(METHOD);
+ } else {
+ System.err.println("Warning: 'CompileThreshold' <= 1");
+ }
+
+ method();
+ checkCompiled(METHOD);
+ } else {
+ System.err.println(
+ "Warning: part of test is not applicable in Tiered");
+ }
+ }
+}
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -37,6 +37,8 @@
= Integer.parseInt(getVMOption("CompileThreshold", "10000"));
protected static final boolean BACKGROUND_COMPILATION
= Boolean.valueOf(getVMOption("BackgroundCompilation", "true"));
+ protected static final boolean TIERED_COMPILATION
+ = Boolean.valueOf(getVMOption("TieredCompilation", "false"));
protected static Method getMethod(String name) {
try {
@@ -81,6 +83,9 @@
}
protected static void checkNotCompiled(Method method) {
+ if (WHITE_BOX.isMethodQueuedForCompilation(method)) {
+ throw new RuntimeException(method + " must not be in queue");
+ }
if (WHITE_BOX.isMethodCompiled(method)) {
throw new RuntimeException(method + " must be not compiled");
}
@@ -139,8 +144,11 @@
protected abstract void test() throws Exception;
protected final int compile() {
+ return compile(Math.max(COMPILE_THRESHOLD, 150000));
+ }
+
+ protected final int compile(int count) {
int result = 0;
- int count = Math.max(COMPILE_THRESHOLD, 150000);
for (int i = 0; i < count; ++i) {
result += method();
}
--- a/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -33,7 +33,7 @@
public static void main(String[] args) throws Exception {
// to prevent inlining #method into #compile()
- WHITE_BOX.setDontInlineMethod(METHOD, true);
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
new DeoptimizeAllTest().runTest();
}
--- a/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -33,7 +33,7 @@
public static void main(String[] args) throws Exception {
// to prevent inlining #method into #compile()
- WHITE_BOX.setDontInlineMethod(METHOD, true);
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
new DeoptimizeMethodTest().runTest();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test EnqueueMethodForCompilationTest
+ * @library /testlibrary /testlibrary/whitebox
+ * @build EnqueueMethodForCompilationTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI EnqueueMethodForCompilationTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class EnqueueMethodForCompilationTest extends CompilerWhiteBoxTest {
+ public static void main(String[] args) throws Exception {
+ // to prevent inlining #method into #compile()
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
+ new EnqueueMethodForCompilationTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ checkNotCompiled(METHOD);
+
+ WHITE_BOX.enqueueMethodForCompilation(METHOD, 0);
+ if (WHITE_BOX.isMethodCompilable(METHOD, 0)) {
+ throw new RuntimeException(METHOD + " is compilable at level 0");
+ }
+ checkNotCompiled(METHOD);
+
+ WHITE_BOX.enqueueMethodForCompilation(METHOD, -1);
+ checkNotCompiled(METHOD);
+
+ WHITE_BOX.enqueueMethodForCompilation(METHOD, 5);
+ if (!WHITE_BOX.isMethodCompilable(METHOD, 5)) {
+ checkNotCompiled(METHOD);
+ compile();
+ checkCompiled(METHOD);
+ } else {
+ checkCompiled(METHOD);
+ }
+
+ int compLevel = WHITE_BOX.getMethodCompilationLevel(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+
+ WHITE_BOX.enqueueMethodForCompilation(METHOD, compLevel);
+ checkCompiled(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+
+ compile();
+ checkCompiled(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+ }
+}
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -45,7 +45,7 @@
public static void main(String[] args) throws Exception {
// to prevent inlining #method into #compile()
- WHITE_BOX.setDontInlineMethod(METHOD, true);
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
new IsMethodCompilableTest().runTest();
}
@@ -60,26 +60,47 @@
"Warning: test is not applicable if PerMethodRecompilationCutoff == Inf");
return;
}
- boolean madeNotCompilable = false;
+
+ // deoptimze 'PerMethodRecompilationCutoff' times and clear state
+ for (long i = 0L, n = PER_METHOD_RECOMPILATION_CUTOFF - 1; i < n; ++i) {
+ compileAndDeoptimaze();
+ }
+ if (!WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD + " is not compilable after "
+ + (PER_METHOD_RECOMPILATION_CUTOFF - 1) + " iterations");
+ }
+ WHITE_BOX.clearMethodState(METHOD);
- for (long i = 0; i < PER_METHOD_RECOMPILATION_CUTOFF; ++i) {
- compile();
- waitBackgroundCompilation(METHOD);
- WHITE_BOX.deoptimizeMethod(METHOD);
- if (!WHITE_BOX.isMethodCompilable(METHOD)) {
- madeNotCompilable = true;
- break;
- }
+ // deoptimze 'PerMethodRecompilationCutoff' + 1 times
+ long i;
+ for (i = 0L; i < PER_METHOD_RECOMPILATION_CUTOFF
+ && WHITE_BOX.isMethodCompilable(METHOD); ++i) {
+ compileAndDeoptimaze();
}
- if (!madeNotCompilable) {
+ if (i != PER_METHOD_RECOMPILATION_CUTOFF) {
+ throw new RuntimeException(METHOD + " is not compilable after "
+ + i + " iterations, but must only after "
+ + PER_METHOD_RECOMPILATION_CUTOFF);
+ }
+ if (WHITE_BOX.isMethodCompilable(METHOD)) {
throw new RuntimeException(METHOD + " is still compilable after "
+ PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
}
compile();
- if (WHITE_BOX.isMethodCompiled(METHOD)) {
- printInfo(METHOD);
- throw new RuntimeException(
- METHOD + " is not compilable but compiled");
+ checkNotCompiled(METHOD);
+
+ WHITE_BOX.clearMethodState(METHOD);
+ if (!WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD
+ + " is compilable after clearMethodState()");
}
+ compile();
+ checkCompiled(METHOD);
+ }
+
+ private void compileAndDeoptimaze() throws Exception {
+ compile();
+ waitBackgroundCompilation(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
}
}
--- a/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -33,7 +33,7 @@
public static void main(String[] args) throws Exception {
// to prevent inlining #method into #compile()
- WHITE_BOX.setDontInlineMethod(METHOD, true);
+ WHITE_BOX.testSetDontInlineMethod(METHOD, true);
new MakeMethodNotCompilableTest().runTest();
}
@@ -46,9 +46,6 @@
throw new RuntimeException(METHOD + " must be not compilable");
}
compile();
- if (WHITE_BOX.isMethodQueuedForCompilation(METHOD)) {
- throw new RuntimeException(METHOD + " must not be in queue");
- }
checkNotCompiled(METHOD);
if (WHITE_BOX.isMethodCompilable(METHOD)) {
throw new RuntimeException(METHOD + " must be not compilable");
--- a/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -36,23 +36,23 @@
}
protected void test() throws Exception {
- if (WHITE_BOX.setDontInlineMethod(METHOD, true)) {
+ if (WHITE_BOX.testSetDontInlineMethod(METHOD, true)) {
throw new RuntimeException("on start " + METHOD
+ " must be inlineable");
}
- if (!WHITE_BOX.setDontInlineMethod(METHOD, true)) {
+ if (!WHITE_BOX.testSetDontInlineMethod(METHOD, true)) {
throw new RuntimeException("after first change to true " + METHOD
+ " must be not inlineable");
}
- if (!WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ if (!WHITE_BOX.testSetDontInlineMethod(METHOD, false)) {
throw new RuntimeException("after second change to true " + METHOD
+ " must be still not inlineable");
}
- if (WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ if (WHITE_BOX.testSetDontInlineMethod(METHOD, false)) {
throw new RuntimeException("after first change to false" + METHOD
+ " must be inlineable");
}
- if (WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ if (WHITE_BOX.testSetDontInlineMethod(METHOD, false)) {
throw new RuntimeException("after second change to false " + METHOD
+ " must be inlineable");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test SetForceInlineMethodTest
+ * @library /testlibrary /testlibrary/whitebox
+ * @build SetForceInlineMethodTest
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI SetForceInlineMethodTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class SetForceInlineMethodTest extends CompilerWhiteBoxTest {
+
+ public static void main(String[] args) throws Exception {
+ new SetForceInlineMethodTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ if (WHITE_BOX.testSetForceInlineMethod(METHOD, true)) {
+ throw new RuntimeException("on start " + METHOD
+ + " must be not force inlineable");
+ }
+ if (!WHITE_BOX.testSetForceInlineMethod(METHOD, true)) {
+ throw new RuntimeException("after first change to true " + METHOD
+ + " must be force inlineable");
+ }
+ if (!WHITE_BOX.testSetForceInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after second change to true " + METHOD
+ + " must be still force inlineable");
+ }
+ if (WHITE_BOX.testSetForceInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after first change to false" + METHOD
+ + " must be not force inlineable");
+ }
+ if (WHITE_BOX.testSetForceInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after second change to false " + METHOD
+ + " must be not force inlineable");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/6941923/Test6941923.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test Test6941923.java
+ * @bug 6941923
+ * @summary test flags for gc log rotation
+ * @library /testlibrary
+ * @run main/othervm/timeout=600 Test6941923
+ *
+ */
+import com.oracle.java.testlibrary.*;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+class GCLoggingGenerator {
+
+ public static void main(String[] args) throws Exception {
+
+ long sizeOfLog = Long.parseLong(args[0]);
+ long lines = sizeOfLog / 80;
+ // full.GC generates ad least 1-line which is not shorter then 80 chars
+ // for some GC 2 shorter lines are generated
+ for (long i = 0; i < lines; i++) {
+ System.gc();
+ }
+ }
+}
+
+public class Test6941923 {
+
+ static final File currentDirectory = new File(".");
+ static final String logFileName = "test.log";
+ static final int logFileSizeK = 16;
+ static FilenameFilter logFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.startsWith(logFileName);
+ }
+ };
+
+ public static void cleanLogs() {
+ for (File log : currentDirectory.listFiles(logFilter)) {
+ if (!log.delete()) {
+ throw new Error("Unable to delete " + log.getAbsolutePath());
+ }
+ }
+ }
+
+ public static void runTest(int numberOfFiles) throws Exception {
+
+ ArrayList<String> args = new ArrayList();
+ String[] logOpts = new String[]{
+ "-cp", System.getProperty("java.class.path"),
+ "-Xloggc:" + logFileName,
+ "-XX:-DisableExplicitGC", // to sure that System.gc() works
+ "-XX:+PrintGC", "-XX:+PrintGCDetails", "-XX:+UseGCLogFileRotation",
+ "-XX:NumberOfGCLogFiles=" + numberOfFiles,
+ "-XX:GCLogFileSize=" + logFileSizeK + "K", "-Xmx128M"};
+ // System.getProperty("test.java.opts") is '' if no options is set
+ // need to skip such empty
+ String[] externalVMopts = System.getProperty("test.java.opts").length() == 0
+ ? new String[0]
+ : System.getProperty("test.java.opts").split(" ");
+ args.addAll(Arrays.asList(externalVMopts));
+ args.addAll(Arrays.asList(logOpts));
+ args.add(GCLoggingGenerator.class.getName());
+ args.add(String.valueOf(numberOfFiles * logFileSizeK * 1024));
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args.toArray(new String[0]));
+ pb.redirectErrorStream(true);
+ pb.redirectOutput(new File(GCLoggingGenerator.class.getName() + ".log"));
+ Process process = pb.start();
+ int result = process.waitFor();
+ if (result != 0) {
+ throw new Error("Unexpected exit code = " + result);
+ }
+ File[] logs = currentDirectory.listFiles(logFilter);
+ int smallFilesNumber = 0;
+ for (File log : logs) {
+ if (log.length() < logFileSizeK * 1024) {
+ smallFilesNumber++;
+ }
+ }
+ if (logs.length != numberOfFiles) {
+ throw new Error("There are only " + logs.length + " logs instead " + numberOfFiles);
+ }
+ if (smallFilesNumber > 1) {
+ throw new Error("There should maximum one log with size < " + logFileSizeK + "K");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ cleanLogs();
+ runTest(1);
+ cleanLogs();
+ runTest(3);
+ cleanLogs();
+ }
+}
--- a/hotspot/test/gc/6941923/test6941923.sh Tue Apr 16 15:00:19 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-##
-## @test @(#)test6941923.sh
-## @bug 6941923
-## @summary test new added flags for gc log rotation
-## @author yqi
-## @run shell test6941923.sh
-##
-## some tests require path to find test source dir
-if [ "${TESTSRC}" = "" ]
-then
- TESTSRC=${PWD}
- echo "TESTSRC not set. Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../test_env.sh
-
-## skip on windows
-OS=`uname -s`
-case "$OS" in
- Windows_* | CYGWIN_* )
- echo "Test skipped for Windows"
- exit 0
- ;;
-esac
-
-# create a small test case
-testname="Test"
-if [ -e ${testname}.java ]; then
- rm -rf ${testname}.*
-fi
-
-cat >> ${testname}.java << __EOF__
-import java.util.Vector;
-
-public class Test implements Runnable
-{
- private boolean _should_stop = false;
-
- public static void main(String[] args) throws Exception {
-
- long limit = Long.parseLong(args[0]) * 60L * 1000L; // minutes
- Test t = new Test();
- t.set_stop(false);
- Thread thr = new Thread(t);
- thr.start();
-
- long time1 = System.currentTimeMillis();
- long time2 = System.currentTimeMillis();
- while (time2 - time1 < limit) {
- try {
- Thread.sleep(2000); // 2 seconds
- }
- catch(Exception e) {}
- time2 = System.currentTimeMillis();
- System.out.print("\r... " + (time2 - time1)/1000 + " seconds");
- }
- System.out.println();
- t.set_stop(true);
- }
- public void set_stop(boolean value) { _should_stop = value; }
- public void run() {
- int cap = 20000;
- int fix_size = 2048;
- int loop = 0;
- Vector< byte[] > v = new Vector< byte[] >(cap);
- while(!_should_stop) {
- byte[] g = new byte[fix_size];
- v.add(g);
- loop++;
- if (loop > cap) {
- v = null;
- cap *= 2;
- if (cap > 80000) cap = 80000;
- v = new Vector< byte[] >(cap);
- }
- }
- }
-}
-__EOF__
-
-msgsuccess="succeeded"
-msgfail="failed"
-gclogsize="16K"
-filesize=$((16*1024))
-${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${testname}.java > $NULL 2>&1
-
-if [ $? != 0 ]; then
- echo "${COMPILEJAVA}/bin/javac ${testname}.java $fail"
- exit -1
-fi
-
-# test for 2 minutes, it will complete circulation of gc log rotation
-tts=2
-logfile="test.log"
-hotspotlog="hotspot.log"
-
-if [ -e $logfile ]; then
- rm -rf $logfile
-fi
-
-#also delete $hotspotlog if it exists
-if [ -f $hotspotlog ]; then
- rm -rf $hotspotlog
-fi
-
-options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=$gclogsize"
-echo "Test gc log rotation in same file, wait for $tts minutes ...."
-${TESTJAVA}/bin/java $options $testname $tts
-if [ $? != 0 ]; then
- echo "$msgfail"
- exit -1
-fi
-
-# rotation file will be $logfile.0
-if [ -f $logfile.0 ]; then
- outfilesize=`ls -l $logfile.0 | awk '{print $5 }'`
- if [ $((outfilesize)) -ge $((filesize)) ]; then
- echo $msgsuccess
- else
- echo $msgfail
- fi
-else
- echo $msgfail
- exit -1
-fi
-
-# delete log file
-rm -rf $logfile.0
-if [ -f $hotspotlog ]; then
- rm -rf $hotspotlog
-fi
-
-#multiple log files
-numoffiles=3
-options="-Xloggc:$logfile -XX:+UseConcMarkSweepGC -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=$numoffiles -XX:GCLogFileSize=$gclogsize"
-echo "Test gc log rotation in $numoffiles files, wait for $tts minutes ...."
-${TESTJAVA}/bin/java $options $testname $tts
-if [ $? != 0 ]; then
- echo "$msgfail"
- exit -1
-fi
-
-atleast=0 # at least size of numoffile-1 files >= $gclogsize
-tk=0
-while [ $(($tk)) -lt $(($numoffiles)) ]
-do
- if [ -f $logfile.$tk ]; then
- outfilesize=`ls -l $logfile.$tk | awk '{ print $5 }'`
- if [ $(($outfilesize)) -ge $(($filesize)) ]; then
- atleast=$((atleast+1))
- fi
- fi
- tk=$((tk+1))
-done
-
-rm -rf $logfile.*
-rm -rf $testname.*
-rm -rf $hotspotlog
-
-if [ $(($atleast)) -ge $(($numoffiles-1)) ]; then
- echo $msgsuccess
-else
- echo $msgfail
- exit -1
-fi
--- a/hotspot/test/gc/TestVerifyBeforeGCDuringStartup.java Tue Apr 16 15:00:19 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/* @test TestVerifyBeforeGCDuringStartup.java
- * @key gc
- * @bug 8010463
- * @summary Simple test run with -XX:+VerifyBeforeGC -XX:-UseTLAB to verify 8010463
- * @library /testlibrary
- */
-
-import com.oracle.java.testlibrary.OutputAnalyzer;
-import com.oracle.java.testlibrary.ProcessTools;
-
-public class TestVerifyBeforeGCDuringStartup {
- public static void main(String args[]) throws Exception {
- ProcessBuilder pb =
- ProcessTools.createJavaProcessBuilder(System.getProperty("test.vm.opts"),
- "-XX:-UseTLAB",
- "-XX:+UnlockDiagnosticVMOptions",
- "-XX:+VerifyBeforeGC", "-version");
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
- output.shouldContain("[Verifying");
- output.shouldHaveExitValue(0);
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/TestVerifyDuringStartup.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test TestVerifyDuringStartup.java
+ * @key gc
+ * @bug 8010463
+ * @summary Simple test run with -XX:+VerifyDuringStartup -XX:-UseTLAB to verify 8010463
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+public class TestVerifyDuringStartup {
+ public static void main(String args[]) throws Exception {
+ ProcessBuilder pb =
+ ProcessTools.createJavaProcessBuilder(System.getProperty("test.vm.opts"),
+ "-XX:-UseTLAB",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+VerifyDuringStartup", "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("[Verifying");
+ output.shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/metaspace/G1AddMetaspaceDependency.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test G1AddMetaspaceDependency
+ * @bug 8010196
+ * @summary Checks that we don't get locking problems when adding metaspace dependencies with the G1 update buffer monitor
+ * @run main/othervm -XX:+UseG1GC -XX:G1UpdateBufferSize=1 G1AddMetaspaceDependency
+ */
+
+import java.io.InputStream;
+
+public class G1AddMetaspaceDependency {
+
+ static byte[] getClassBytes(String name) {
+ byte[] b = null;
+ try (InputStream is = ClassLoader.getSystemResourceAsStream(name)) {
+ byte[] tmp = new byte[is.available()];
+ is.read(tmp);
+ b = tmp;
+ } finally {
+ if (b == null) {
+ throw new RuntimeException("Unable to load class file");
+ }
+ return b;
+ }
+ }
+
+ static final String a_name = G1AddMetaspaceDependency.class.getName() + "$A";
+ static final String b_name = G1AddMetaspaceDependency.class.getName() + "$B";
+
+ public static void main(String... args) throws Exception {
+ final byte[] a_bytes = getClassBytes(a_name + ".class");
+ final byte[] b_bytes = getClassBytes(b_name + ".class");
+
+ for (int i = 0; i < 1000; i += 1) {
+ runTest(a_bytes, b_bytes);
+ }
+ }
+
+ static class Loader extends ClassLoader {
+ private final String myClass;
+ private final byte[] myBytes;
+ private final String friendClass;
+ private final ClassLoader friendLoader;
+
+ Loader(String myClass, byte[] myBytes,
+ String friendClass, ClassLoader friendLoader) {
+ this.myClass = myClass;
+ this.myBytes = myBytes;
+ this.friendClass = friendClass;
+ this.friendLoader = friendLoader;
+ }
+
+ Loader(String myClass, byte[] myBytes) {
+ this(myClass, myBytes, null, null);
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ Class<?> c = findLoadedClass(name);
+ if (c != null) {
+ return c;
+ }
+
+ if (name.equals(friendClass)) {
+ return friendLoader.loadClass(name);
+ }
+
+ if (name.equals(myClass)) {
+ c = defineClass(name, myBytes, 0, myBytes.length);
+ resolveClass(c);
+ return c;
+ }
+
+ return findSystemClass(name);
+ }
+
+ }
+
+ private static void runTest(final byte[] a_bytes, final byte[] b_bytes) throws Exception {
+ Loader a_loader = new Loader(a_name, a_bytes);
+ Loader b_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+ Loader c_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+ Loader d_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+ Loader e_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+ Loader f_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+ Loader g_loader = new Loader(b_name, b_bytes, a_name, a_loader);
+
+ byte[] b = new byte[20 * 2 << 20];
+ Class<?> c;
+ c = b_loader.loadClass(b_name);
+ c = c_loader.loadClass(b_name);
+ c = d_loader.loadClass(b_name);
+ c = e_loader.loadClass(b_name);
+ c = f_loader.loadClass(b_name);
+ c = g_loader.loadClass(b_name);
+ }
+ public class A {
+ }
+ class B extends A {
+ }
+}
--- a/hotspot/test/runtime/NMT/AllocTestType.java Tue Apr 16 15:00:19 2013 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @summary Test consistency of NMT by leaking a few select allocations of the Test type and then verify visibility with jcmd
- * @key nmt jcmd
- * @library /testlibrary /testlibrary/whitebox
- * @build AllocTestType
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail AllocTestType
- */
-
-import com.oracle.java.testlibrary.*;
-import sun.hotspot.WhiteBox;
-
-public class AllocTestType {
-
- public static void main(String args[]) throws Exception {
- OutputAnalyzer output;
-
- // Grab my own PID
- String pid = Integer.toString(ProcessTools.getProcessId());
- ProcessBuilder pb = new ProcessBuilder();
-
- // Use WB API to alloc with the mtTest type
- if (!WhiteBox.getWhiteBox().NMTAllocTest()) {
- throw new Exception("Call to WB API NMTAllocTest() failed");
- }
-
- // Use WB API to ensure that all data has been merged before we continue
- if (!WhiteBox.getWhiteBox().NMTWaitForDataMerge()) {
- throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
- }
-
- // Run 'jcmd <pid> VM.native_memory summary'
- pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "summary"});
- output = new OutputAnalyzer(pb.start());
- output.shouldContain("Test (reserved=512KB, committed=512KB)");
-
- // Free the memory allocated by NMTAllocTest
- if (!WhiteBox.getWhiteBox().NMTFreeTestMemory()) {
- throw new Exception("Call to WB API NMTFreeTestMemory() failed");
- }
-
- // Use WB API to ensure that all data has been merged before we continue
- if (!WhiteBox.getWhiteBox().NMTWaitForDataMerge()) {
- throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
- }
- output = new OutputAnalyzer(pb.start());
- output.shouldNotContain("Test (reserved=");
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/NMT/MallocTestType.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Test consistency of NMT by leaking a few select allocations of the Test type and then verify visibility with jcmd
+ * @key nmt jcmd
+ * @library /testlibrary /testlibrary/whitebox
+ * @build MallocTestType
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail MallocTestType
+ */
+
+import com.oracle.java.testlibrary.*;
+import sun.hotspot.WhiteBox;
+
+public class MallocTestType {
+
+ public static void main(String args[]) throws Exception {
+ OutputAnalyzer output;
+ WhiteBox wb = WhiteBox.getWhiteBox();
+
+ // Grab my own PID
+ String pid = Integer.toString(ProcessTools.getProcessId());
+ ProcessBuilder pb = new ProcessBuilder();
+
+ // Use WB API to alloc and free with the mtTest type
+ long memAlloc3 = wb.NMTMalloc(128 * 1024);
+ long memAlloc2 = wb.NMTMalloc(256 * 1024);
+ wb.NMTFree(memAlloc3);
+ long memAlloc1 = wb.NMTMalloc(512 * 1024);
+ wb.NMTFree(memAlloc2);
+
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+
+ // Run 'jcmd <pid> VM.native_memory summary'
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "summary"});
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=512KB, committed=512KB)");
+
+ // Free the memory allocated by NMTAllocTest
+ wb.NMTFree(memAlloc1);
+
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Test (reserved=");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/NMT/ThreadedMallocTestType.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @key nmt jcmd
+ * @library /testlibrary /testlibrary/whitebox
+ * @build ThreadedMallocTestType
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail ThreadedMallocTestType
+ */
+
+import com.oracle.java.testlibrary.*;
+import sun.hotspot.WhiteBox;
+
+public class ThreadedMallocTestType {
+ public static long memAlloc1;
+ public static long memAlloc2;
+ public static long memAlloc3;
+
+ public static void main(String args[]) throws Exception {
+ OutputAnalyzer output;
+ final WhiteBox wb = WhiteBox.getWhiteBox();
+
+ // Grab my own PID
+ String pid = Integer.toString(ProcessTools.getProcessId());
+ ProcessBuilder pb = new ProcessBuilder();
+
+ Thread allocThread = new Thread() {
+ public void run() {
+ // Alloc memory using the WB api
+ memAlloc1 = wb.NMTMalloc(128 * 1024);
+ memAlloc2 = wb.NMTMalloc(256 * 1024);
+ memAlloc3 = wb.NMTMalloc(512 * 1024);
+ }
+ };
+
+ allocThread.start();
+ allocThread.join();
+
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+
+ // Run 'jcmd <pid> VM.native_memory summary'
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "summary"});
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=896KB, committed=896KB)");
+
+ Thread freeThread = new Thread() {
+ public void run() {
+ // Free the memory allocated by NMTMalloc
+ wb.NMTFree(memAlloc1);
+ wb.NMTFree(memAlloc2);
+ wb.NMTFree(memAlloc3);
+ }
+ };
+
+ freeThread.start();
+ freeThread.join();
+
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Test (reserved=");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/NMT/ThreadedVirtualAllocTestType.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @key nmt jcmd
+ * @library /testlibrary /testlibrary/whitebox
+ * @build ThreadedVirtualAllocTestType
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail ThreadedVirtualAllocTestType
+ */
+
+import com.oracle.java.testlibrary.*;
+import sun.hotspot.WhiteBox;
+
+public class ThreadedVirtualAllocTestType {
+ public static long addr;
+ public static final WhiteBox wb = WhiteBox.getWhiteBox();
+ public static final long commitSize = 128 * 1024;
+ public static final long reserveSize = 512 * 1024;
+
+ public static void main(String args[]) throws Exception {
+ OutputAnalyzer output;
+
+ String pid = Integer.toString(ProcessTools.getProcessId());
+ ProcessBuilder pb = new ProcessBuilder();
+
+ Thread reserveThread = new Thread() {
+ public void run() {
+ addr = wb.NMTReserveMemory(reserveSize);
+ }
+ };
+ reserveThread.start();
+ reserveThread.join();
+
+ mergeData();
+
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "detail"});
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=512KB, committed=0KB)");
+ output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + reserveSize) + "\\] reserved 512KB for Test");
+
+ Thread commitThread = new Thread() {
+ public void run() {
+ wb.NMTCommitMemory(addr, commitSize);
+ }
+ };
+ commitThread.start();
+ commitThread.join();
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=512KB, committed=128KB)");
+ output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + commitSize) + "\\] committed 128KB");
+
+ Thread uncommitThread = new Thread() {
+ public void run() {
+ wb.NMTUncommitMemory(addr, commitSize);
+ }
+ };
+ uncommitThread.start();
+ uncommitThread.join();
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=512KB, committed=0KB)");
+ output.shouldNotMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + commitSize) + "\\] committed");
+
+ Thread releaseThread = new Thread() {
+ public void run() {
+ wb.NMTReleaseMemory(addr, reserveSize);
+ }
+ };
+ releaseThread.start();
+ releaseThread.join();
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Test (reserved=");
+ output.shouldNotContain("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + reserveSize) + "\\] reserved");
+ }
+
+ public static void mergeData() throws Exception {
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/NMT/VirtualAllocTestType.java Wed Jul 05 18:49:58 2017 +0200
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Test Reserve/Commit/Uncommit/Release of virtual memory and that we track it correctly
+ * @key nmt jcmd
+ * @library /testlibrary /testlibrary/whitebox
+ * @build VirtualAllocTestType
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail VirtualAllocTestType
+ */
+
+import com.oracle.java.testlibrary.*;
+import sun.hotspot.WhiteBox;
+
+public class VirtualAllocTestType {
+
+ public static WhiteBox wb = WhiteBox.getWhiteBox();
+ public static void main(String args[]) throws Exception {
+ OutputAnalyzer output;
+ long commitSize = 128 * 1024;
+ long reserveSize = 256 * 1024;
+ long addr;
+
+ String pid = Integer.toString(ProcessTools.getProcessId());
+ ProcessBuilder pb = new ProcessBuilder();
+
+ addr = wb.NMTReserveMemory(reserveSize);
+ mergeData();
+
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "detail"});
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=256KB, committed=0KB)");
+ output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + reserveSize) + "\\] reserved 256KB for Test");
+
+ wb.NMTCommitMemory(addr, commitSize);
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=256KB, committed=128KB)");
+ output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + commitSize) + "\\] committed 128KB");
+
+ wb.NMTUncommitMemory(addr, commitSize);
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Test (reserved=256KB, committed=0KB)");
+ output.shouldNotMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + commitSize) + "\\] committed");
+
+ wb.NMTReleaseMemory(addr, reserveSize);
+
+ mergeData();
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Test (reserved=");
+ output.shouldNotMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*" + Long.toHexString(addr + reserveSize) + "\\] reserved");
+ }
+
+ public static void mergeData() throws Exception {
+ // Use WB API to ensure that all data has been merged before we continue
+ if (!wb.NMTWaitForDataMerge()) {
+ throw new Exception("Call to WB API NMTWaitForDataMerge() failed");
+ }
+ }
+}
--- a/hotspot/test/sanity/WBApi.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/sanity/WBApi.java Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/test/serviceability/ParserTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/serviceability/ParserTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/hotspot/test/testlibrary/OutputAnalyzerTest.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/testlibrary/OutputAnalyzerTest.java Wed Jul 05 18:49:58 2017 +0200
@@ -36,6 +36,11 @@
String stdout = "aaaaaa";
String stderr = "bbbbbb";
+ // Regexps used for testing pattern matching of the test input
+ String stdoutPattern = "[a]";
+ String stderrPattern = "[b]";
+ String nonExistingPattern = "[c]";
+
OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
if (!stdout.equals(output.getStdout())) {
@@ -99,10 +104,73 @@
}
try {
- output.stderrShouldNotContain(stderr);
- throw new Exception("shouldContain() failed to throw exception");
+ output.stderrShouldNotContain(stderr);
+ throw new Exception("shouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ // Should match
+ try {
+ output.shouldMatch(stdoutPattern);
+ output.stdoutShouldMatch(stdoutPattern);
+ output.shouldMatch(stderrPattern);
+ output.stderrShouldMatch(stderrPattern);
+ } catch (RuntimeException e) {
+ throw new Exception("shouldMatch() failed", e);
+ }
+
+ try {
+ output.shouldMatch(nonExistingPattern);
+ throw new Exception("shouldMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldMatch(stderrPattern);
+ throw new Exception(
+ "stdoutShouldMatch() failed to throw exception");
} catch (RuntimeException e) {
- // expected
+ // expected
+ }
+
+ try {
+ output.stderrShouldMatch(stdoutPattern);
+ throw new Exception(
+ "stderrShouldMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ // Should not match
+ try {
+ output.shouldNotMatch(nonExistingPattern);
+ output.stdoutShouldNotMatch(nonExistingPattern);
+ output.stderrShouldNotMatch(nonExistingPattern);
+ } catch (RuntimeException e) {
+ throw new Exception("shouldNotMatch() failed", e);
+ }
+
+ try {
+ output.shouldNotMatch(stdoutPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldNotMatch(stdoutPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stderrShouldNotMatch(stderrPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
}
}
}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Wed Jul 05 18:49:58 2017 +0200
@@ -24,6 +24,8 @@
package com.oracle.java.testlibrary;
import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public final class OutputAnalyzer {
@@ -142,15 +144,112 @@
}
/**
+ * Verify that the stdout and stderr contents of output buffer matches
+ * the pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was not found
+ */
+ public void shouldMatch(String pattern) {
+ Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+ Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ if (!stdoutMatcher.find() && !stderrMatcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' missing from stdout/stderr: [" + stdout + stderr
+ + "]\n");
+ }
+ }
+
+ /**
+ * Verify that the stdout contents of output buffer matches the
+ * pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was not found
+ */
+ public void stdoutShouldMatch(String pattern) {
+ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+ if (!matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' missing from stdout: [" + stdout + "]\n");
+ }
+ }
+
+ /**
+ * Verify that the stderr contents of output buffer matches the
+ * pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was not found
+ */
+ public void stderrShouldMatch(String pattern) {
+ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ if (!matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' missing from stderr: [" + stderr + "]\n");
+ }
+ }
+
+ /**
+ * Verify that the stdout and stderr contents of output buffer does not
+ * match the pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was found
+ */
+ public void shouldNotMatch(String pattern) {
+ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+ if (matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' found in stdout: [" + stdout + "]\n");
+ }
+ matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ if (matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' found in stderr: [" + stderr + "]\n");
+ }
+ }
+
+ /**
+ * Verify that the stdout contents of output buffer does not match the
+ * pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was found
+ */
+ public void stdoutShouldNotMatch(String pattern) {
+ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+ if (matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' found in stdout: [" + stdout + "]\n");
+ }
+ }
+
+ /**
+ * Verify that the stderr contents of output buffer does not match the
+ * pattern
+ *
+ * @param pattern
+ * @throws RuntimeException If the pattern was found
+ */
+ public void stderrShouldNotMatch(String pattern) {
+ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ if (matcher.find()) {
+ throw new RuntimeException("'" + pattern
+ + "' found in stderr: [" + stderr + "]\n");
+ }
+ }
+
+ /**
* Verifiy the exit value of the process
*
* @param expectedExitValue Expected exit value from process
* @throws RuntimeException If the exit value from the process did not match the expected value
*/
public void shouldHaveExitValue(int expectedExitValue) {
- if (getExitValue() != expectedExitValue) {
- throw new RuntimeException("Exit value " + getExitValue() + " , expected to get " + expectedExitValue);
- }
+ if (getExitValue() != expectedExitValue) {
+ throw new RuntimeException("Exit value " + getExitValue() + " , expected to get " + expectedExitValue);
+ }
}
/**
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,20 +80,30 @@
public native Object[] parseCommandLine(String commandline, DiagnosticCommand[] args);
// NMT
- public native boolean NMTAllocTest();
- public native boolean NMTFreeTestMemory();
+ public native long NMTMalloc(long size);
+ public native void NMTFree(long mem);
+ public native long NMTReserveMemory(long size);
+ public native void NMTCommitMemory(long addr, long size);
+ public native void NMTUncommitMemory(long addr, long size);
+ public native void NMTReleaseMemory(long addr, long size);
public native boolean NMTWaitForDataMerge();
// Compiler
public native void deoptimizeAll();
public native boolean isMethodCompiled(Method method);
- public native boolean isMethodCompilable(Method method);
+ public boolean isMethodCompilable(Method method) {
+ return isMethodCompilable(method, -1 /*any*/);
+ }
+ public native boolean isMethodCompilable(Method method, int compLevel);
public native boolean isMethodQueuedForCompilation(Method method);
public native int deoptimizeMethod(Method method);
public native void makeMethodNotCompilable(Method method);
public native int getMethodCompilationLevel(Method method);
- public native boolean setDontInlineMethod(Method method, boolean value);
+ public native boolean testSetDontInlineMethod(Method method, boolean value);
public native int getCompileQueuesSize();
+ public native boolean testSetForceInlineMethod(Method method, boolean value);
+ public native boolean enqueueMethodForCompilation(Method method, int compLevel);
+ public native void clearMethodState(Method method);
//Intered strings
public native boolean isInStringTable(String str);
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/parser/DiagnosticCommand.java Tue Apr 16 15:00:19 2013 -0700
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/parser/DiagnosticCommand.java Wed Jul 05 18:49:58 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/make/scripts/webrev.ksh Tue Apr 16 15:00:19 2013 -0700
+++ b/make/scripts/webrev.ksh Wed Jul 05 18:49:58 2017 +0200
@@ -1436,14 +1436,15 @@
{
rm -f $FLIST
if [ -z "$Nflag" ]; then
- print " File list from hg foutgoing $PWS ..."
+ print " File list from hg foutgoing $PWS ..."
outgoing_from_mercurial_forest
HG_LIST_FROM_COMMIT=1
fi
if [ ! -f $FLIST ]; then
# hg commit hasn't been run see what is lying around
- print "\n No outgoing, perhaps you haven't commited."
- print " File list from hg fstatus -mard ...\c"
+ print "\n No outgoing, perhaps you haven't commited."
+ NO_OUTGOING=
+ print " File list from hg fstatus -mard ...\c"
FSTAT_OPT=
fstatus
HG_LIST_FROM_COMMIT=0
@@ -1466,7 +1467,7 @@
done >> $FLIST
# Then all the added files
- # But some of these could have been "moved" or renamed ones
+ # But some of these could have been "moved" or renamed ones or copied ones
# so let's make sure we get the proper info
# hg status -aC will produce something like:
# A subdir/File3
@@ -1474,8 +1475,11 @@
# File4
# A subdir/File5
# The first and last are simple addition while the middle one
- # is a move/rename
-
+ # is a move/rename or a copy. We can't distinguish from a rename vs a copy
+ # without also getting the status of removed files. The middle case above
+ # is a rename if File4 is also shown a being removed. If File4 is not a
+ # removed file, then the middle case is a copy from File4 to subdir/File4
+ # FIXME - we're not distinguishing copy from rename
$HGCMD -aC | $FILTER | while read LINE; do
ldone=""
while [ -z "$ldone" ]; do
@@ -1625,6 +1629,7 @@
else
# hg commit hasn't been run see what is lying around
print "\n No outgoing, perhaps you haven't commited."
+ NO_OUTGOING=
fi
# First let's list all the modified or deleted files
@@ -1638,8 +1643,12 @@
# A subdir/File4
# File4
# A subdir/File5
- # The first and last are simple addition while the middle one
- # is a move/rename
+ # The first and last are simple addition while the middle one
+ # is a move/rename or a copy. We can't distinguish from a rename vs a copy
+ # without also getting the status of removed files. The middle case above
+ # is a rename if File4 is also shown a being removed. If File4 is not a
+ # removed file, then the middle case is a copy from File4 to subdir/File4
+ # FIXME - we're not distinguishing copy from rename
hg status $STATUS_REV -aC | $FILTER >$FLIST.temp
while read LINE; do
@@ -1905,7 +1914,7 @@
fi
fi
else
- # It's a rename (or a move), so let's make sure we move
+ # It's a rename (or a move), or a copy, so let's make sure we move
# to the right directory first, then restore it once done
current_dir=`pwd`
cd $CWS/$PDIR
@@ -2774,34 +2783,38 @@
cleanse_rmfile="sed 's/^\(@@ [0-9+,-]*\) [0-9+,-]* @@$/\1 +0,0 @@/'"
cleanse_newfile="sed 's/^@@ [0-9+,-]* \([0-9+,-]* @@\)$/@@ -0,0 \1/'"
- rm -f $WDIR/$DIR/$F.patch
- if [[ -z $rename ]]; then
- if [ ! -f $ofile ]; then
- diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
- > $WDIR/$DIR/$F.patch
- elif [ ! -f $nfile ]; then
- diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
- > $WDIR/$DIR/$F.patch
- else
- diff -u $ofile $nfile > $WDIR/$DIR/$F.patch
- fi
- else
- diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
- > $WDIR/$DIR/$F.patch
-
- diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
- >> $WDIR/$DIR/$F.patch
-
- fi
-
-
- #
- # Tack the patch we just made onto the accumulated patch for the
- # whole wad.
- #
- cat $WDIR/$DIR/$F.patch >> $WDIR/$WNAME.patch
-
- print " patch\c"
+ if [[ -v NO_OUTGOING ]];
+ then
+ # Only need to generate a patch file here if there are no commits in outgoing
+ rm -f $WDIR/$DIR/$F.patch
+ if [[ -z $rename ]]; then
+ if [ ! -f $ofile ]; then
+ diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
+ > $WDIR/$DIR/$F.patch
+ elif [ ! -f $nfile ]; then
+ diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
+ > $WDIR/$DIR/$F.patch
+ else
+ diff -u $ofile $nfile > $WDIR/$DIR/$F.patch
+ fi
+ else
+ diff -u $ofile /dev/null | sh -c "$cleanse_rmfile" \
+ > $WDIR/$DIR/$F.patch
+
+ diff -u /dev/null $nfile | sh -c "$cleanse_newfile" \
+ >> $WDIR/$DIR/$F.patch
+
+ fi
+
+
+ #
+ # Tack the patch we just made onto the accumulated patch for the
+ # whole wad.
+ #
+ cat $WDIR/$DIR/$F.patch >> $WDIR/$WNAME.patch
+ fi
+
+ print " patch\c"
if [[ -f $ofile && -f $nfile && -z $mv_but_nodiff ]]; then
@@ -2894,6 +2907,32 @@
print
done < $FLIST
+# Create the new style mercurial patch here using hg export -r [all-revs] -g -o $CHANGESETPATH
+if [[ $SCM_MODE == "mercurial" ]]; then
+ if [[ !(-v NO_OUTGOING) ]]; then
+ EXPORTCHANGESET="$WNAME.changeset"
+ CHANGESETPATH=${WDIR}/${EXPORTCHANGESET}
+ rm -f $CHANGESETPATH
+ touch $CHANGESETPATH
+ if [[ -n $ALL_CREV ]]; then
+ rev_opt=
+ for rev in $ALL_CREV; do
+ rev_opt="$rev_opt --rev $rev"
+ done
+ elif [[ -n $FIRST_CREV ]]; then
+ rev_opt="--rev $FIRST_CREV"
+ fi
+
+ if [[ -n $rev_opt ]]; then
+ (cd $CWS;hg export -g $rev_opt -o $CHANGESETPATH)
+ # echo "Created new-patch: $CHANGESETPATH" 1>&2
+ # Use it in place of the jdk.patch created above
+ rm -f $WDIR/$WNAME.patch
+ fi
+ set +x
+ fi
+fi
+
frame_nav_js > $WDIR/ancnav.js
frame_navigation > $WDIR/ancnav.html
@@ -2989,9 +3028,13 @@
print "</td></tr>"
if [[ -f $WDIR/$WNAME.patch ]]; then
- print "<tr><th>Patch of changes:</th><td>"
- print "<a href=\"$WNAME.patch\">$WNAME.patch</a></td></tr>"
+ print "<tr><th>Patch of changes:</th><td>"
+ print "<a href=\"$WNAME.patch\">$WNAME.patch</a></td></tr>"
+elif [[ -f $CHANGESETPATH ]]; then
+ print "<tr><th>Changeset:</th><td>"
+ print "<a href=\"$EXPORTCHANGESET\">$EXPORTCHANGESET</a></td></tr>"
fi
+
if [[ -f $WDIR/$WNAME.pdf ]]; then
print "<tr><th>Printable review:</th><td>"
print "<a href=\"$WNAME.pdf\">$WNAME.pdf</a></td></tr>"