--- a/.hgtags Mon Oct 07 15:52:38 2019 +0200
+++ b/.hgtags Mon Oct 07 16:13:25 2019 +0200
@@ -589,3 +589,4 @@
9c250a7600e12bdb1e611835250af3204d4aa152 jdk-13-ga
778fc2dcbdaa8981e07e929a2cacef979c72261e jdk-14+15
d29f0181ba424a95d881aba5eabf2e393abcc70f jdk-14+16
+5c83830390baafb76a1fbe33443c57620bd45fb9 jdk-14+17
--- a/make/autoconf/version-numbers Mon Oct 07 15:52:38 2019 +0200
+++ b/make/autoconf/version-numbers Mon Oct 07 16:13:25 2019 +0200
@@ -35,7 +35,7 @@
DEFAULT_VERSION_DATE=2020-03-17
DEFAULT_VERSION_CLASSFILE_MAJOR=58 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
DEFAULT_VERSION_CLASSFILE_MINOR=0
-DEFAULT_ACCEPTABLE_BOOT_VERSIONS="12 13 14"
+DEFAULT_ACCEPTABLE_BOOT_VERSIONS="13 14"
DEFAULT_JDK_SOURCE_TARGET_VERSION=14
DEFAULT_PROMOTED_VERSION_PRE=ea
--- a/make/conf/jib-profiles.js Mon Oct 07 15:52:38 2019 +0200
+++ b/make/conf/jib-profiles.js Mon Oct 07 16:13:25 2019 +0200
@@ -365,7 +365,7 @@
};
};
- common.boot_jdk_version = "12";
+ common.boot_jdk_version = "13";
common.boot_jdk_build_number = "33";
common.boot_jdk_home = input.get("boot_jdk", "install_path") + "/jdk-"
+ common.boot_jdk_version
--- a/src/hotspot/cpu/aarch64/gc/z/zGlobals_aarch64.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/aarch64/gc/z/zGlobals_aarch64.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -40,7 +40,7 @@
// +--------------------------------+ 0x0000014000000000 (20TB)
// | Remapped View |
// +--------------------------------+ 0x0000010000000000 (16TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x00000c0000000000 (12TB)
// | Marked1 View |
// +--------------------------------+ 0x0000080000000000 (8TB)
@@ -75,7 +75,7 @@
// +--------------------------------+ 0x0000280000000000 (40TB)
// | Remapped View |
// +--------------------------------+ 0x0000200000000000 (32TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x0000180000000000 (24TB)
// | Marked1 View |
// +--------------------------------+ 0x0000100000000000 (16TB)
@@ -110,7 +110,7 @@
// +--------------------------------+ 0x0000500000000000 (80TB)
// | Remapped View |
// +--------------------------------+ 0x0000400000000000 (64TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x0000300000000000 (48TB)
// | Marked1 View |
// +--------------------------------+ 0x0000200000000000 (32TB)
--- a/src/hotspot/cpu/aarch64/gc/z/zGlobals_aarch64.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/aarch64/gc/z/zGlobals_aarch64.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -36,7 +36,6 @@
// ------------------------------------------------------------------
//
const size_t ZPlatformGranuleSizeShift = 21; // 2MB
-const size_t ZPlatformMaxHeapSizeShift = 46; // 16TB
const size_t ZPlatformNMethodDisarmedOffset = 4;
const size_t ZPlatformCacheLineSize = 64;
--- a/src/hotspot/cpu/x86/gc/z/zGlobals_x86.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/gc/z/zGlobals_x86.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -40,7 +40,7 @@
// +--------------------------------+ 0x0000014000000000 (20TB)
// | Remapped View |
// +--------------------------------+ 0x0000010000000000 (16TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x00000c0000000000 (12TB)
// | Marked1 View |
// +--------------------------------+ 0x0000080000000000 (8TB)
@@ -75,7 +75,7 @@
// +--------------------------------+ 0x0000280000000000 (40TB)
// | Remapped View |
// +--------------------------------+ 0x0000200000000000 (32TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x0000180000000000 (24TB)
// | Marked1 View |
// +--------------------------------+ 0x0000100000000000 (16TB)
@@ -110,7 +110,7 @@
// +--------------------------------+ 0x0000500000000000 (80TB)
// | Remapped View |
// +--------------------------------+ 0x0000400000000000 (64TB)
-// | (Reserved, but unused) |
+// . .
// +--------------------------------+ 0x0000300000000000 (48TB)
// | Marked1 View |
// +--------------------------------+ 0x0000200000000000 (32TB)
--- a/src/hotspot/cpu/x86/gc/z/zGlobals_x86.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/gc/z/zGlobals_x86.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -36,7 +36,6 @@
// ------------------------------------------------------------------
//
const size_t ZPlatformGranuleSizeShift = 21; // 2MB
-const size_t ZPlatformMaxHeapSizeShift = 46; // 16TB
const size_t ZPlatformNMethodDisarmedOffset = 4;
const size_t ZPlatformCacheLineSize = 64;
--- a/src/hotspot/cpu/x86/globals_x86.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/globals_x86.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -211,5 +211,15 @@
"Use BMI2 instructions") \
\
diagnostic(bool, UseLibmIntrinsic, true, \
- "Use Libm Intrinsics")
+ "Use Libm Intrinsics") \
+ \
+ /* Minimum array size in bytes to use AVX512 intrinsics */ \
+ /* for copy, inflate and fill which don't bail out early based on any */ \
+ /* condition. When this value is set to zero compare operations like */ \
+ /* compare, vectorizedMismatch, compress can also use AVX512 intrinsics.*/\
+ diagnostic(int, AVX3Threshold, 4096, \
+ "Minimum array size in bytes to use AVX512 intrinsics" \
+ "for copy, inflate and fill. When this value is set as zero" \
+ "compare operations can also use AVX512 intrinsics.") \
+ range(0, max_jint)
#endif // CPU_X86_GLOBALS_X86_HPP
--- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -6593,7 +6593,7 @@
bind(COMPARE_WIDE_VECTORS_LOOP);
#ifdef _LP64
- if (VM_Version::supports_avx512vlbw()) { // trying 64 bytes fast loop
+ if ((AVX3Threshold == 0) && VM_Version::supports_avx512vlbw()) { // trying 64 bytes fast loop
cmpl(cnt2, stride2x2);
jccb(Assembler::below, COMPARE_WIDE_VECTORS_LOOP_AVX2);
testl(cnt2, stride2x2-1); // cnt2 holds the vector count
@@ -6853,7 +6853,7 @@
testl(len, len);
jcc(Assembler::zero, FALSE_LABEL);
- if ((UseAVX > 2) && // AVX512
+ if ((AVX3Threshold == 0) && (UseAVX > 2) && // AVX512
VM_Version::supports_avx512vlbw() &&
VM_Version::supports_bmi2()) {
@@ -6926,7 +6926,7 @@
} else {
movl(result, len); // copy
- if (UseAVX == 2 && UseSSE >= 2) {
+ if (UseAVX >= 2 && UseSSE >= 2) {
// With AVX2, use 32-byte vector compare
Label COMPARE_WIDE_VECTORS, COMPARE_TAIL;
@@ -7099,14 +7099,12 @@
lea(ary2, Address(ary2, limit, Address::times_1));
negptr(limit);
- bind(COMPARE_WIDE_VECTORS);
-
#ifdef _LP64
- if (VM_Version::supports_avx512vlbw()) { // trying 64 bytes fast loop
+ if ((AVX3Threshold == 0) && VM_Version::supports_avx512vlbw()) { // trying 64 bytes fast loop
Label COMPARE_WIDE_VECTORS_LOOP_AVX2, COMPARE_WIDE_VECTORS_LOOP_AVX3;
cmpl(limit, -64);
- jccb(Assembler::greater, COMPARE_WIDE_VECTORS_LOOP_AVX2);
+ jcc(Assembler::greater, COMPARE_WIDE_VECTORS_LOOP_AVX2);
bind(COMPARE_WIDE_VECTORS_LOOP_AVX3); // the hottest loop
@@ -7139,7 +7137,7 @@
}//if (VM_Version::supports_avx512vlbw())
#endif //_LP64
-
+ bind(COMPARE_WIDE_VECTORS);
vmovdqu(vec1, Address(ary1, limit, Address::times_1));
vmovdqu(vec2, Address(ary2, limit, Address::times_1));
vpxor(vec1, vec2);
@@ -7365,32 +7363,33 @@
assert( UseSSE >= 2, "supported cpu only" );
Label L_fill_32_bytes_loop, L_check_fill_8_bytes, L_fill_8_bytes_loop, L_fill_8_bytes;
movdl(xtmp, value);
- if (UseAVX > 2 && UseUnalignedLoadStores) {
+ if (UseAVX >= 2 && UseUnalignedLoadStores) {
+ Label L_check_fill_32_bytes;
+ if (UseAVX > 2) {
+ // Fill 64-byte chunks
+ Label L_fill_64_bytes_loop_avx3, L_check_fill_64_bytes_avx2;
+
+ // If number of bytes to fill < AVX3Threshold, perform fill using AVX2
+ cmpl(count, AVX3Threshold);
+ jccb(Assembler::below, L_check_fill_64_bytes_avx2);
+
+ vpbroadcastd(xtmp, xtmp, Assembler::AVX_512bit);
+
+ subl(count, 16 << shift);
+ jccb(Assembler::less, L_check_fill_32_bytes);
+ align(16);
+
+ BIND(L_fill_64_bytes_loop_avx3);
+ evmovdqul(Address(to, 0), xtmp, Assembler::AVX_512bit);
+ addptr(to, 64);
+ subl(count, 16 << shift);
+ jcc(Assembler::greaterEqual, L_fill_64_bytes_loop_avx3);
+ jmpb(L_check_fill_32_bytes);
+
+ BIND(L_check_fill_64_bytes_avx2);
+ }
// Fill 64-byte chunks
- Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
- vpbroadcastd(xtmp, xtmp, Assembler::AVX_512bit);
-
- subl(count, 16 << shift);
- jcc(Assembler::less, L_check_fill_32_bytes);
- align(16);
-
- BIND(L_fill_64_bytes_loop);
- evmovdqul(Address(to, 0), xtmp, Assembler::AVX_512bit);
- addptr(to, 64);
- subl(count, 16 << shift);
- jcc(Assembler::greaterEqual, L_fill_64_bytes_loop);
-
- BIND(L_check_fill_32_bytes);
- addl(count, 8 << shift);
- jccb(Assembler::less, L_check_fill_8_bytes);
- vmovdqu(Address(to, 0), xtmp);
- addptr(to, 32);
- subl(count, 8 << shift);
-
- BIND(L_check_fill_8_bytes);
- } else if (UseAVX == 2 && UseUnalignedLoadStores) {
- // Fill 64-byte chunks
- Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
+ Label L_fill_64_bytes_loop;
vpbroadcastd(xtmp, xtmp, Assembler::AVX_256bit);
subl(count, 16 << shift);
@@ -8104,12 +8103,13 @@
shlq(length);
xorq(result, result);
- if ((UseAVX > 2) &&
+ if ((AVX3Threshold == 0) && (UseAVX > 2) &&
VM_Version::supports_avx512vlbw()) {
Label VECTOR64_LOOP, VECTOR64_NOT_EQUAL, VECTOR32_TAIL;
cmpq(length, 64);
jcc(Assembler::less, VECTOR32_TAIL);
+
movq(tmp1, length);
andq(tmp1, 0x3F); // tail count
andq(length, ~(0x3F)); //vector count
@@ -9566,7 +9566,7 @@
// save length for return
push(len);
- if ((UseAVX > 2) && // AVX512
+ if ((AVX3Threshold == 0) && (UseAVX > 2) && // AVX512
VM_Version::supports_avx512vlbw() &&
VM_Version::supports_bmi2()) {
@@ -9758,7 +9758,7 @@
// }
void MacroAssembler::byte_array_inflate(Register src, Register dst, Register len,
XMMRegister tmp1, Register tmp2) {
- Label copy_chars_loop, done, below_threshold;
+ Label copy_chars_loop, done, below_threshold, avx3_threshold;
// rsi: src
// rdi: dst
// rdx: len
@@ -9768,7 +9768,7 @@
// rdi holds start addr of destination char[]
// rdx holds length
assert_different_registers(src, dst, len, tmp2);
-
+ movl(tmp2, len);
if ((UseAVX > 2) && // AVX512
VM_Version::supports_avx512vlbw() &&
VM_Version::supports_bmi2()) {
@@ -9780,9 +9780,11 @@
testl(len, -16);
jcc(Assembler::zero, below_threshold);
+ testl(len, -1 * AVX3Threshold);
+ jcc(Assembler::zero, avx3_threshold);
+
// In order to use only one arithmetic operation for the main loop we use
// this pre-calculation
- movl(tmp2, len);
andl(tmp2, (32 - 1)); // tail count (in chars), 32 element wide loop
andl(len, -32); // vector count
jccb(Assembler::zero, copy_tail);
@@ -9813,12 +9815,11 @@
evmovdquw(Address(dst, 0), k2, tmp1, Assembler::AVX_512bit);
jmp(done);
+ bind(avx3_threshold);
}
if (UseSSE42Intrinsics) {
Label copy_16_loop, copy_8_loop, copy_bytes, copy_new_tail, copy_tail;
- movl(tmp2, len);
-
if (UseAVX > 1) {
andl(tmp2, (16 - 1));
andl(len, -16);
@@ -9843,13 +9844,7 @@
bind(below_threshold);
bind(copy_new_tail);
- if ((UseAVX > 2) &&
- VM_Version::supports_avx512vlbw() &&
- VM_Version::supports_bmi2()) {
- movl(tmp2, len);
- } else {
- movl(len, tmp2);
- }
+ movl(len, tmp2);
andl(tmp2, 0x00000007);
andl(len, 0xFFFFFFF8);
jccb(Assembler::zero, copy_tail);
--- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1288,30 +1288,58 @@
if (UseUnalignedLoadStores) {
Label L_end;
// Copy 64-bytes per iteration
- __ BIND(L_loop);
if (UseAVX > 2) {
+ Label L_loop_avx512, L_loop_avx2, L_32_byte_head, L_above_threshold, L_below_threshold;
+
+ __ BIND(L_copy_bytes);
+ __ cmpptr(qword_count, (-1 * AVX3Threshold / 8));
+ __ jccb(Assembler::less, L_above_threshold);
+ __ jmpb(L_below_threshold);
+
+ __ bind(L_loop_avx512);
__ evmovdqul(xmm0, Address(end_from, qword_count, Address::times_8, -56), Assembler::AVX_512bit);
__ evmovdqul(Address(end_to, qword_count, Address::times_8, -56), xmm0, Assembler::AVX_512bit);
- } else if (UseAVX == 2) {
+ __ bind(L_above_threshold);
+ __ addptr(qword_count, 8);
+ __ jcc(Assembler::lessEqual, L_loop_avx512);
+ __ jmpb(L_32_byte_head);
+
+ __ bind(L_loop_avx2);
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
__ vmovdqu(xmm1, Address(end_from, qword_count, Address::times_8, -24));
__ vmovdqu(Address(end_to, qword_count, Address::times_8, -24), xmm1);
+ __ bind(L_below_threshold);
+ __ addptr(qword_count, 8);
+ __ jcc(Assembler::lessEqual, L_loop_avx2);
+
+ __ bind(L_32_byte_head);
+ __ subptr(qword_count, 4); // sub(8) and add(4)
+ __ jccb(Assembler::greater, L_end);
} else {
- __ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
- __ movdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
- __ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, -40));
- __ movdqu(Address(end_to, qword_count, Address::times_8, -40), xmm1);
- __ movdqu(xmm2, Address(end_from, qword_count, Address::times_8, -24));
- __ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm2);
- __ movdqu(xmm3, Address(end_from, qword_count, Address::times_8, - 8));
- __ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm3);
+ __ BIND(L_loop);
+ if (UseAVX == 2) {
+ __ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
+ __ vmovdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
+ __ vmovdqu(xmm1, Address(end_from, qword_count, Address::times_8, -24));
+ __ vmovdqu(Address(end_to, qword_count, Address::times_8, -24), xmm1);
+ } else {
+ __ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -56));
+ __ movdqu(Address(end_to, qword_count, Address::times_8, -56), xmm0);
+ __ movdqu(xmm1, Address(end_from, qword_count, Address::times_8, -40));
+ __ movdqu(Address(end_to, qword_count, Address::times_8, -40), xmm1);
+ __ movdqu(xmm2, Address(end_from, qword_count, Address::times_8, -24));
+ __ movdqu(Address(end_to, qword_count, Address::times_8, -24), xmm2);
+ __ movdqu(xmm3, Address(end_from, qword_count, Address::times_8, - 8));
+ __ movdqu(Address(end_to, qword_count, Address::times_8, - 8), xmm3);
+ }
+
+ __ BIND(L_copy_bytes);
+ __ addptr(qword_count, 8);
+ __ jcc(Assembler::lessEqual, L_loop);
+ __ subptr(qword_count, 4); // sub(8) and add(4)
+ __ jccb(Assembler::greater, L_end);
}
- __ BIND(L_copy_bytes);
- __ addptr(qword_count, 8);
- __ jcc(Assembler::lessEqual, L_loop);
- __ subptr(qword_count, 4); // sub(8) and add(4)
- __ jccb(Assembler::greater, L_end);
// Copy trailing 32 bytes
if (UseAVX >= 2) {
__ vmovdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24));
@@ -1368,31 +1396,59 @@
if (UseUnalignedLoadStores) {
Label L_end;
// Copy 64-bytes per iteration
- __ BIND(L_loop);
if (UseAVX > 2) {
+ Label L_loop_avx512, L_loop_avx2, L_32_byte_head, L_above_threshold, L_below_threshold;
+
+ __ BIND(L_copy_bytes);
+ __ cmpptr(qword_count, (AVX3Threshold / 8));
+ __ jccb(Assembler::greater, L_above_threshold);
+ __ jmpb(L_below_threshold);
+
+ __ BIND(L_loop_avx512);
__ evmovdqul(xmm0, Address(from, qword_count, Address::times_8, 0), Assembler::AVX_512bit);
__ evmovdqul(Address(dest, qword_count, Address::times_8, 0), xmm0, Assembler::AVX_512bit);
- } else if (UseAVX == 2) {
+ __ bind(L_above_threshold);
+ __ subptr(qword_count, 8);
+ __ jcc(Assembler::greaterEqual, L_loop_avx512);
+ __ jmpb(L_32_byte_head);
+
+ __ bind(L_loop_avx2);
__ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 32));
__ vmovdqu(Address(dest, qword_count, Address::times_8, 32), xmm0);
- __ vmovdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
- __ vmovdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
+ __ vmovdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
+ __ vmovdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
+ __ bind(L_below_threshold);
+ __ subptr(qword_count, 8);
+ __ jcc(Assembler::greaterEqual, L_loop_avx2);
+
+ __ bind(L_32_byte_head);
+ __ addptr(qword_count, 4); // add(8) and sub(4)
+ __ jccb(Assembler::less, L_end);
} else {
- __ movdqu(xmm0, Address(from, qword_count, Address::times_8, 48));
- __ movdqu(Address(dest, qword_count, Address::times_8, 48), xmm0);
- __ movdqu(xmm1, Address(from, qword_count, Address::times_8, 32));
- __ movdqu(Address(dest, qword_count, Address::times_8, 32), xmm1);
- __ movdqu(xmm2, Address(from, qword_count, Address::times_8, 16));
- __ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm2);
- __ movdqu(xmm3, Address(from, qword_count, Address::times_8, 0));
- __ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm3);
+ __ BIND(L_loop);
+ if (UseAVX == 2) {
+ __ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 32));
+ __ vmovdqu(Address(dest, qword_count, Address::times_8, 32), xmm0);
+ __ vmovdqu(xmm1, Address(from, qword_count, Address::times_8, 0));
+ __ vmovdqu(Address(dest, qword_count, Address::times_8, 0), xmm1);
+ } else {
+ __ movdqu(xmm0, Address(from, qword_count, Address::times_8, 48));
+ __ movdqu(Address(dest, qword_count, Address::times_8, 48), xmm0);
+ __ movdqu(xmm1, Address(from, qword_count, Address::times_8, 32));
+ __ movdqu(Address(dest, qword_count, Address::times_8, 32), xmm1);
+ __ movdqu(xmm2, Address(from, qword_count, Address::times_8, 16));
+ __ movdqu(Address(dest, qword_count, Address::times_8, 16), xmm2);
+ __ movdqu(xmm3, Address(from, qword_count, Address::times_8, 0));
+ __ movdqu(Address(dest, qword_count, Address::times_8, 0), xmm3);
+ }
+
+ __ BIND(L_copy_bytes);
+ __ subptr(qword_count, 8);
+ __ jcc(Assembler::greaterEqual, L_loop);
+
+ __ addptr(qword_count, 4); // add(8) and sub(4)
+ __ jccb(Assembler::less, L_end);
}
- __ BIND(L_copy_bytes);
- __ subptr(qword_count, 8);
- __ jcc(Assembler::greaterEqual, L_loop);
-
- __ addptr(qword_count, 4); // add(8) and sub(4)
- __ jccb(Assembler::less, L_end);
// Copy trailing 32 bytes
if (UseAVX >= 2) {
__ vmovdqu(xmm0, Address(from, qword_count, Address::times_8, 0));
--- a/src/hotspot/cpu/x86/vm_version_x86.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/vm_version_x86.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -381,6 +381,10 @@
__ cmpl(rax, 0xE0);
__ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
+ __ movl(rax, Address(rsi, 0));
+ __ cmpl(rax, 0x50654); // If it is Skylake
+ __ jcc(Assembler::equal, legacy_setup);
// If UseAVX is unitialized or is set by the user to include EVEX
if (use_evex) {
// EVEX setup: run in lowest evex mode
@@ -465,6 +469,11 @@
__ cmpl(rax, 0xE0);
__ jcc(Assembler::notEqual, legacy_save_restore);
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
+ __ movl(rax, Address(rsi, 0));
+ __ cmpl(rax, 0x50654); // If it is Skylake
+ __ jcc(Assembler::equal, legacy_save_restore);
+
// If UseAVX is unitialized or is set by the user to include EVEX
if (use_evex) {
// EVEX check: run in lowest evex mode
@@ -660,6 +669,9 @@
}
if (FLAG_IS_DEFAULT(UseAVX)) {
FLAG_SET_DEFAULT(UseAVX, use_avx_limit);
+ if (is_intel_family_core() && _model == CPU_MODEL_SKYLAKE && _stepping < 5) {
+ FLAG_SET_DEFAULT(UseAVX, 2); //Set UseAVX=2 for Skylake
+ }
} else if (UseAVX > use_avx_limit) {
warning("UseAVX=%d is not supported on this CPU, setting it to UseAVX=%d", (int) UseAVX, use_avx_limit);
FLAG_SET_DEFAULT(UseAVX, use_avx_limit);
@@ -1059,6 +1071,13 @@
}
#endif // COMPILER2 && ASSERT
+ if (!FLAG_IS_DEFAULT(AVX3Threshold)) {
+ if (!is_power_of_2(AVX3Threshold)) {
+ warning("AVX3Threshold must be a power of 2");
+ FLAG_SET_DEFAULT(AVX3Threshold, 4096);
+ }
+ }
+
#ifdef _LP64
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
UseMultiplyToLenIntrinsic = true;
--- a/src/hotspot/cpu/x86/vm_version_x86.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/vm_version_x86.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -366,7 +366,7 @@
CPU_MODEL_HASWELL_E3 = 0x3c,
CPU_MODEL_HASWELL_E7 = 0x3f,
CPU_MODEL_BROADWELL = 0x3d,
- CPU_MODEL_SKYLAKE = CPU_MODEL_HASWELL_E3
+ CPU_MODEL_SKYLAKE = 0x55
};
// cpuid information block. All info derived from executing cpuid with
--- a/src/hotspot/cpu/x86/x86.ad Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/cpu/x86/x86.ad Mon Oct 07 16:13:25 2019 +0200
@@ -2863,6 +2863,7 @@
%}
+#ifdef _LP64
instruct roundD_reg(legRegD dst, legRegD src, immU8 rmode) %{
predicate(UseSSE>=4);
match(Set dst (RoundDoubleMode src rmode));
@@ -2963,6 +2964,7 @@
%}
ins_pipe( pipe_slow );
%}
+#endif // _LP64
instruct onspinwait() %{
match(OnSpinWait);
@@ -3859,7 +3861,7 @@
%}
instruct Repl2F_zero(vecD dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateF zero));
format %{ "xorps $dst,$dst\t! replicate2F zero" %}
ins_encode %{
@@ -3869,7 +3871,7 @@
%}
instruct Repl4F_zero(vecX dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 4 && UseAVX < 3);
+ predicate(n->as_Vector()->length() == 4);
match(Set dst (ReplicateF zero));
format %{ "xorps $dst,$dst\t! replicate4F zero" %}
ins_encode %{
@@ -3879,7 +3881,7 @@
%}
instruct Repl8F_zero(vecY dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 8 && UseAVX < 3);
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 0);
match(Set dst (ReplicateF zero));
format %{ "vxorps $dst,$dst,$dst\t! replicate8F zero" %}
ins_encode %{
@@ -3953,7 +3955,7 @@
// Replicate double (8 byte) scalar zero to be vector
instruct Repl2D_zero(vecX dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
+ predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateD zero));
format %{ "xorpd $dst,$dst\t! replicate2D zero" %}
ins_encode %{
@@ -3963,7 +3965,7 @@
%}
instruct Repl4D_zero(vecY dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 4 && UseAVX < 3);
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 0);
match(Set dst (ReplicateD zero));
format %{ "vxorpd $dst,$dst,$dst,vect256\t! replicate4D zero" %}
ins_encode %{
@@ -4888,42 +4890,6 @@
ins_pipe( pipe_slow );
%}
-instruct Repl2F_zero_evex(vecD dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 2 && UseAVX > 2);
- match(Set dst (ReplicateF zero));
- format %{ "vpxor $dst k0,$dst,$dst\t! replicate2F zero" %}
- ins_encode %{
- // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
- int vector_len = 2;
- __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl4F_zero_evex(vecX dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 4 && UseAVX > 2);
- match(Set dst (ReplicateF zero));
- format %{ "vpxor $dst k0,$dst,$dst\t! replicate4F zero" %}
- ins_encode %{
- // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
- int vector_len = 2;
- __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl8F_zero_evex(vecY dst, immF0 zero) %{
- predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
- match(Set dst (ReplicateF zero));
- format %{ "vpxor $dst k0,$dst,$dst\t! replicate8F zero" %}
- ins_encode %{
- // Use vpxor in place of vxorps since EVEX has a constriant on dq for vxorps: this is a 512-bit operation
- int vector_len = 2;
- __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
instruct Repl16F_zero_evex(vecZ dst, immF0 zero) %{
predicate(n->as_Vector()->length() == 16 && UseAVX > 2);
match(Set dst (ReplicateF zero));
@@ -4980,30 +4946,6 @@
ins_pipe( pipe_slow );
%}
-instruct Repl2D_zero_evex(vecX dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 2 && UseAVX > 2);
- match(Set dst (ReplicateD zero));
- format %{ "vpxor $dst k0,$dst,$dst\t! replicate2D zero" %}
- ins_encode %{
- // Use vpxor in place of vxorpd since EVEX has a constriant on dq for vxorpd: this is a 512-bit operation
- int vector_len = 2;
- __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
-instruct Repl4D_zero_evex(vecY dst, immD0 zero) %{
- predicate(n->as_Vector()->length() == 4 && UseAVX > 2);
- match(Set dst (ReplicateD zero));
- format %{ "vpxor $dst k0,$dst,$dst\t! replicate4D zero" %}
- ins_encode %{
- // Use vpxor in place of vxorpd since EVEX has a constriant on dq for vxorpd: this is a 512-bit operation
- int vector_len = 2;
- __ vpxor($dst$$XMMRegister,$dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( fpu_reg_reg );
-%}
-
instruct Repl8D_zero_evex(vecZ dst, immD0 zero) %{
predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
match(Set dst (ReplicateD zero));
--- a/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/os/posix/gc/z/zVirtualMemory_posix.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -43,7 +43,7 @@
if ((uintptr_t)res != start) {
// Failed to reserve memory at the requested address
- unmap(start, size);
+ unmap((uintptr_t)res, size);
return false;
}
--- a/src/hotspot/os/windows/os_windows.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/os/windows/os_windows.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -4189,8 +4189,6 @@
if (::isalpha(buf[0]) && !::IsDBCSLeadByte(buf[0]) && buf[1] == ':' && buf[2] == '\\') {
prefix = L"\\\\?\\";
} else if (buf[0] == '\\' && buf[1] == '\\') {
- assert(buf[2] != '\\');
-
if (buf[2] == '?' && buf[3] == '\\') {
prefix = L"";
needs_fullpath = false;
--- a/src/hotspot/share/classfile/classFileParser.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/classFileParser.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -3004,7 +3004,7 @@
// We temporarily use the vtable_index field in the Method* to store the
// class file index, so we can read in after calling qsort.
// Put the method ordering in the shared archive.
- if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
+ if (JvmtiExport::can_maintain_original_method_order() || Arguments::is_dumping_archive()) {
for (int index = 0; index < length; index++) {
Method* const m = methods->at(index);
assert(!m->valid_vtable_index(), "vtable index should not be set");
@@ -3018,7 +3018,7 @@
intArray* method_ordering = NULL;
// If JVMTI original method ordering or sharing is enabled construct int
// array remembering the original ordering
- if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
+ if (JvmtiExport::can_maintain_original_method_order() || Arguments::is_dumping_archive()) {
method_ordering = new intArray(length, length, -1);
for (int index = 0; index < length; index++) {
Method* const m = methods->at(index);
--- a/src/hotspot/share/classfile/classLoader.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/classLoader.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -462,7 +462,7 @@
#if INCLUDE_CDS
void ClassLoader::exit_with_path_failure(const char* error, const char* message) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only called at dump time");
+ Arguments::assert_is_dumping_archive();
tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure");
vm_exit_during_initialization(error, message);
}
@@ -532,7 +532,7 @@
#if INCLUDE_CDS
void ClassLoader::setup_app_search_path(const char *class_path) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "Sanity");
+ Arguments::assert_is_dumping_archive();
ResourceMark rm;
ClasspathStream cp_stream(class_path);
@@ -546,7 +546,7 @@
void ClassLoader::add_to_module_path_entries(const char* path,
ClassPathEntry* entry) {
assert(entry != NULL, "ClassPathEntry should not be NULL");
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
// The entry does not exist, add to the list
if (_module_path_entries == NULL) {
@@ -560,7 +560,7 @@
// Add a module path to the _module_path_entries list.
void ClassLoader::update_module_path_entry_list(const char *path, TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
struct stat st;
if (os::stat(path, &st) != 0) {
tty->print_cr("os::stat error %d (%s). CDS dump aborted (path was \"%s\").",
@@ -656,7 +656,7 @@
bool set_base_piece = true;
#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
if (!Arguments::has_jimage()) {
vm_exit_during_initialization("CDS is not supported in exploded JDK build", NULL);
}
@@ -1360,7 +1360,7 @@
// Record the shared classpath index and loader type for classes loaded
// by the builtin loaders at dump time.
void ClassLoader::record_result(InstanceKlass* ik, const ClassFileStream* stream, TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "sanity");
+ Arguments::assert_is_dumping_archive();
assert(stream != NULL, "sanity");
if (ik->is_unsafe_anonymous()) {
@@ -1537,13 +1537,13 @@
#if INCLUDE_CDS
void ClassLoader::initialize_shared_path() {
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
ClassLoaderExt::setup_search_paths();
}
}
void ClassLoader::initialize_module_path(TRAPS) {
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
ClassLoaderExt::setup_module_paths(THREAD);
FileMapInfo::allocate_shared_path_table();
}
--- a/src/hotspot/share/classfile/classLoader.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/classLoader.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -26,6 +26,7 @@
#define SHARE_CLASSFILE_CLASSLOADER_HPP
#include "jimage.hpp"
+#include "runtime/arguments.hpp"
#include "runtime/handles.hpp"
#include "runtime/perfData.hpp"
#include "utilities/exceptions.hpp"
@@ -395,8 +396,7 @@
// Helper function used by CDS code to get the number of module path
// entries during shared classpath setup time.
static int num_module_path_entries() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "Should only be called at CDS dump time");
+ Arguments::assert_is_dumping_archive();
int num_entries = 0;
ClassPathEntry* e= ClassLoader::_module_path_entries;
while (e != NULL) {
--- a/src/hotspot/share/classfile/classLoader.inline.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/classLoader.inline.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -62,8 +62,7 @@
// entries during shared classpath setup time.
inline int ClassLoader::num_boot_classpath_entries() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "Should only be called at CDS dump time");
+ Arguments::assert_is_dumping_archive();
assert(has_jrt_entry(), "must have a java runtime image");
int num_entries = 1; // count the runtime image
ClassPathEntry* e = ClassLoader::_first_append_entry;
@@ -85,8 +84,7 @@
// Helper function used by CDS code to get the number of app classpath
// entries during shared classpath setup time.
inline int ClassLoader::num_app_classpath_entries() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "Should only be called at CDS dump time");
+ Arguments::assert_is_dumping_archive();
int num_entries = 0;
ClassPathEntry* e= ClassLoader::_app_classpath_entries;
while (e != NULL) {
--- a/src/hotspot/share/classfile/classLoaderExt.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/classLoaderExt.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -62,8 +62,7 @@
}
void ClassLoaderExt::setup_app_search_path() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "this function is only used at CDS dump time");
+ Arguments::assert_is_dumping_archive();
_app_class_paths_start_index = ClassLoader::num_boot_classpath_entries();
char* app_class_path = os::strdup(Arguments::get_appclasspath());
@@ -92,8 +91,7 @@
}
}
void ClassLoaderExt::setup_module_paths(TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "this function is only used with CDS dump time");
+ Arguments::assert_is_dumping_archive();
_app_module_paths_start_index = ClassLoader::num_boot_classpath_entries() +
ClassLoader::num_app_classpath_entries();
Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
@@ -231,7 +229,7 @@
void ClassLoaderExt::record_result(const s2 classpath_index,
InstanceKlass* result,
TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "Sanity");
+ Arguments::assert_is_dumping_archive();
// We need to remember where the class comes from during dumping.
oop loader = result->class_loader();
--- a/src/hotspot/share/classfile/compactHashtable.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/compactHashtable.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -42,7 +42,7 @@
//
CompactHashtableWriter::CompactHashtableWriter(int num_entries,
CompactHashtableStats* stats) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump-time only");
+ Arguments::assert_is_dumping_archive();
assert(num_entries >= 0, "sanity");
_num_buckets = calculate_num_buckets(num_entries);
assert(_num_buckets > 0, "no buckets");
--- a/src/hotspot/share/classfile/dictionary.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/dictionary.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -246,7 +246,7 @@
// Used to scan and relocate the classes during CDS archive dump.
void Dictionary::classes_do(MetaspaceClosure* it) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump-time only");
+ Arguments::assert_is_dumping_archive();
for (int index = 0; index < table_size(); index++) {
for (DictionaryEntry* probe = bucket(index);
probe != NULL;
--- a/src/hotspot/share/classfile/javaClasses.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/javaClasses.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -202,7 +202,6 @@
// Conversion between '.' and '/' formats
static Handle externalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '/', '.', THREAD); }
- static Handle internalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '.', '/', THREAD); }
// Conversion
static Symbol* as_symbol(oop java_string);
--- a/src/hotspot/share/classfile/klassFactory.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/klassFactory.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -218,7 +218,7 @@
JFR_ONLY(ON_KLASS_CREATION(result, parser, THREAD);)
#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
ClassLoader::record_result(result, stream, THREAD);
}
#endif // INCLUDE_CDS
--- a/src/hotspot/share/classfile/symbolTable.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/symbolTable.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -220,7 +220,7 @@
assert (len <= Symbol::max_length(), "should be checked by caller");
Symbol* sym;
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
c_heap = false;
}
if (c_heap) {
@@ -283,7 +283,7 @@
};
void SymbolTable::metaspace_pointers_do(MetaspaceClosure* it) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "called only during dump time");
+ Arguments::assert_is_dumping_archive();
MetaspacePointersDo mpd(it);
_local_table->do_safepoint_scan(mpd);
}
--- a/src/hotspot/share/classfile/systemDictionaryShared.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1029,7 +1029,7 @@
}
void SystemDictionaryShared::set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only when dumping");
+ Arguments::assert_is_dumping_archive();
assert(!is_builtin(k), "must be unregistered class");
DumpTimeSharedClassInfo* info = find_or_allocate_info_for(k);
info->_clsfile_size = cfs->length();
@@ -1185,7 +1185,7 @@
bool SystemDictionaryShared::is_excluded_class(InstanceKlass* k) {
assert(_no_class_loading_should_happen, "sanity");
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only when dumping");
+ Arguments::assert_is_dumping_archive();
return find_or_allocate_info_for(k)->is_excluded();
}
@@ -1209,7 +1209,7 @@
bool SystemDictionaryShared::add_verification_constraint(InstanceKlass* k, Symbol* name,
Symbol* from_name, bool from_field_is_protected, bool from_is_array, bool from_is_object) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "called at dump time only");
+ Arguments::assert_is_dumping_archive();
DumpTimeSharedClassInfo* info = find_or_allocate_info_for(k);
info->add_verification_constraint(k, name, from_name, from_field_is_protected,
from_is_array, from_is_object);
--- a/src/hotspot/share/classfile/verificationType.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/classfile/verificationType.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -94,7 +94,7 @@
return true;
}
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
if (SystemDictionaryShared::add_verification_constraint(klass,
name(), from.name(), from_field_is_protected, from.is_array(),
from.is_object())) {
--- a/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactTask.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/g1/g1FullGCCompactionPoint.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/g1/g1FullGCMarker.inline.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1276,12 +1276,32 @@
// The rethrow call may have too many projections to be
// properly handled here. Given there's no reason for a
// barrier to depend on the call, move it above the call
- if (phase->get_ctrl(val) == ctrl) {
- assert(val->Opcode() == Op_DecodeN, "unexpected node");
- assert(phase->is_dominator(phase->get_ctrl(val->in(1)), call->in(0)), "Load is too low");
- phase->set_ctrl(val, call->in(0));
- }
- phase->set_ctrl(lrb, call->in(0));
+ stack.push(lrb, 0);
+ do {
+ Node* n = stack.node();
+ uint idx = stack.index();
+ if (idx < n->req()) {
+ Node* in = n->in(idx);
+ stack.set_index(idx+1);
+ if (in != NULL) {
+ if (phase->has_ctrl(in)) {
+ if (phase->is_dominator(call, phase->get_ctrl(in))) {
+#ifdef ASSERT
+ for (uint i = 0; i < stack.size(); i++) {
+ assert(stack.node_at(i) != in, "node shouldn't have been seen yet");
+ }
+#endif
+ stack.push(in, 0);
+ }
+ } else {
+ assert(phase->is_dominator(in, call->in(0)), "no dependency on the call");
+ }
+ }
+ } else {
+ phase->set_ctrl(n, call->in(0));
+ stack.pop();
+ }
+ } while(stack.size() > 0);
continue;
}
CallProjections projs;
--- a/src/hotspot/share/gc/z/zArguments.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/z/zArguments.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -37,11 +37,6 @@
void ZArguments::initialize() {
GCArguments::initialize();
- // Check max heap size
- if (MaxHeapSize > ZMaxHeapSize) {
- vm_exit_during_initialization("Java heap too large");
- }
-
// Enable NUMA by default
if (FLAG_IS_DEFAULT(UseNUMA)) {
FLAG_SET_DEFAULT(UseNUMA, true);
--- a/src/hotspot/share/gc/z/zGlobals.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/z/zGlobals.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -44,10 +44,6 @@
const size_t ZGranuleSizeShift = ZPlatformGranuleSizeShift;
const size_t ZGranuleSize = (size_t)1 << ZGranuleSizeShift;
-// Max heap size shift/size
-const size_t ZMaxHeapSizeShift = ZPlatformMaxHeapSizeShift;
-const size_t ZMaxHeapSize = (size_t)1 << ZMaxHeapSizeShift;
-
// Page types
const uint8_t ZPageTypeSmall = 0;
const uint8_t ZPageTypeMedium = 1;
--- a/src/hotspot/share/gc/z/zVirtualMemory.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/gc/z/zVirtualMemory.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -31,6 +31,13 @@
_manager(),
_initialized(false) {
+ // Check max supported heap size
+ if (max_capacity > ZAddressOffsetMax) {
+ log_error(gc)("Java heap too large (max supported heap size is " SIZE_FORMAT "G)",
+ ZAddressOffsetMax / G);
+ return;
+ }
+
log_info(gc, init)("Address Space: " SIZE_FORMAT "T", ZAddressOffsetMax / K / G);
// Reserve address space
--- a/src/hotspot/share/jfr/recorder/jfrRecorder.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/jfr/recorder/jfrRecorder.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -168,7 +168,7 @@
static bool is_cds_dump_requested() {
// we will not be able to launch recordings if a cds dump is being requested
- if ((DumpSharedSpaces || DynamicDumpSharedSpaces) && (JfrOptionSet::startup_recording_options() != NULL)) {
+ if (Arguments::is_dumping_archive() && (JfrOptionSet::startup_recording_options() != NULL)) {
warning("JFR will be disabled during CDS dumping");
teardown_startup_support();
return true;
--- a/src/hotspot/share/logging/logSelectionList.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/logging/logSelectionList.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, 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/src/hotspot/share/memory/filemap.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/memory/filemap.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -263,7 +263,7 @@
void SharedClassPathEntry::init(bool is_modules_image,
ClassPathEntry* cpe, TRAPS) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
_timestamp = 0;
_filesize = 0;
_from_class_path_attr = false;
@@ -397,7 +397,7 @@
}
void FileMapInfo::allocate_shared_path_table() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "Sanity");
+ Arguments::assert_is_dumping_archive();
EXCEPTION_MARK; // The following calls should never throw, but would exit VM on error.
ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
@@ -444,7 +444,7 @@
}
void FileMapInfo::check_nonempty_dir_in_shared_path_table() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
bool has_nonempty_dir = false;
@@ -471,7 +471,7 @@
}
void FileMapInfo::record_non_existent_class_path_entry(const char* path) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
log_info(class, path)("non-existent Class-Path entry %s", path);
if (_non_existent_class_paths == NULL) {
_non_existent_class_paths = new (ResourceObj::C_HEAP, mtInternal)GrowableArray<const char*>(10, true);
@@ -480,7 +480,7 @@
}
int FileMapInfo::num_non_existent_class_paths() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
if (_non_existent_class_paths != NULL) {
return _non_existent_class_paths->length();
} else {
@@ -1150,7 +1150,7 @@
void FileMapInfo::write_region(int region, char* base, size_t size,
bool read_only, bool allow_exec) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "Dump time only");
+ Arguments::assert_is_dumping_archive();
FileMapRegion* si = space_at(region);
char* target_base = base;
--- a/src/hotspot/share/memory/metaspaceShared.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/memory/metaspaceShared.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -425,7 +425,7 @@
}
void MetaspaceShared::commit_shared_space_to(char* newtop) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump-time only");
+ Arguments::assert_is_dumping_archive();
char* base = _shared_rs.base();
size_t need_committed_size = newtop - base;
size_t has_committed_size = _shared_vs.committed_size();
@@ -509,8 +509,7 @@
}
uintx MetaspaceShared::object_delta_uintx(void* obj) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
- "supported only for dumping");
+ Arguments::assert_is_dumping_archive();
if (DumpSharedSpaces) {
assert(shared_rs()->contains(obj), "must be");
} else {
--- a/src/hotspot/share/memory/universe.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/memory/universe.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -710,7 +710,7 @@
}
#if INCLUDE_CDS
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
MetaspaceShared::prepare_for_dumping();
}
#endif
--- a/src/hotspot/share/oops/constMethod.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/oops/constMethod.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -26,6 +26,7 @@
#define SHARE_OOPS_CONSTMETHOD_HPP
#include "oops/oop.hpp"
+#include "runtime/arguments.hpp"
#include "utilities/align.hpp"
// An ConstMethod represents portions of a Java method which are not written to after
@@ -293,7 +294,7 @@
_adapter = adapter;
}
void set_adapter_trampoline(AdapterHandlerEntry** trampoline) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "must be");
+ Arguments::assert_is_dumping_archive();
if (DumpSharedSpaces) {
assert(*trampoline == NULL,
"must be NULL during dump time, to be initialized at run time");
--- a/src/hotspot/share/oops/cpCache.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/oops/cpCache.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -708,7 +708,7 @@
}
void ConstantPoolCache::walk_entries_for_initialization(bool check_only) {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "sanity");
+ Arguments::assert_is_dumping_archive();
// When dumping the archive, we want to clean up the ConstantPoolCache
// to remove any effect of linking due to the execution of Java code --
// each ConstantPoolCacheEntry will have the same contents as if
--- a/src/hotspot/share/oops/instanceKlass.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/oops/instanceKlass.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -453,7 +453,7 @@
assert(is_instance_klass(), "is layout incorrect?");
assert(size_helper() == parser.layout_size(), "incorrect size_helper?");
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
SystemDictionaryShared::init_dumptime_info(this);
}
}
@@ -603,7 +603,7 @@
}
set_annotations(NULL);
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
SystemDictionaryShared::remove_dumptime_info(this);
}
}
@@ -2229,7 +2229,7 @@
// (1) We are running AOT to generate a shared library.
return true;
}
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
// (2) We are running -Xshare:dump or -XX:ArchiveClassesAtExit to create a shared archive
return true;
}
@@ -2477,7 +2477,7 @@
// notify ClassLoadingService of class unload
ClassLoadingService::notify_class_unloaded(ik);
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
SystemDictionaryShared::remove_dumptime_info(ik);
}
--- a/src/hotspot/share/oops/klass.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/oops/klass.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -525,7 +525,7 @@
}
void Klass::remove_unshareable_info() {
- assert (DumpSharedSpaces || DynamicDumpSharedSpaces,
+ assert (Arguments::is_dumping_archive(),
"only called during CDS dump time");
JFR_ONLY(REMOVE_ID(this);)
if (log_is_enabled(Trace, cds, unshareable)) {
@@ -543,7 +543,7 @@
}
void Klass::remove_java_mirror() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "only called during CDS dump time");
+ Arguments::assert_is_dumping_archive();
if (log_is_enabled(Trace, cds, unshareable)) {
ResourceMark rm;
log_trace(cds, unshareable)("remove java_mirror: %s", external_name());
--- a/src/hotspot/share/oops/method.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/oops/method.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -979,7 +979,7 @@
void Method::unlink_method() {
_code = NULL;
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump time only");
+ Arguments::assert_is_dumping_archive();
// Set the values to what they should be at run time. Note that
// this Method can no longer be executed during dump time.
_i2i_entry = Interpreter::entry_for_cds_method(this);
--- a/src/hotspot/share/opto/loopnode.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/opto/loopnode.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -4049,28 +4049,32 @@
// dominated by early is considered a potentially interfering store.
// This can produce false positives.
if (n->is_Load() && LCA != early) {
- Node_List worklist;
-
- Node *mem = n->in(MemNode::Memory);
- for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) {
- Node* s = mem->fast_out(i);
- worklist.push(s);
- }
- while(worklist.size() != 0 && LCA != early) {
- Node* s = worklist.pop();
- if (s->is_Load() || s->Opcode() == Op_SafePoint ||
- (s->is_CallStaticJava() && s->as_CallStaticJava()->uncommon_trap_request() != 0)) {
- continue;
- } else if (s->is_MergeMem()) {
- for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) {
- Node* s1 = s->fast_out(i);
- worklist.push(s1);
- }
- } else {
- Node *sctrl = has_ctrl(s) ? get_ctrl(s) : s->in(0);
- assert(sctrl != NULL || s->outcnt() == 0, "must have control");
- if (sctrl != NULL && !sctrl->is_top() && is_dominator(early, sctrl)) {
- LCA = dom_lca_for_get_late_ctrl(LCA, sctrl, n);
+ int load_alias_idx = C->get_alias_index(n->adr_type());
+ if (C->alias_type(load_alias_idx)->is_rewritable()) {
+
+ Node_List worklist;
+
+ Node *mem = n->in(MemNode::Memory);
+ for (DUIterator_Fast imax, i = mem->fast_outs(imax); i < imax; i++) {
+ Node* s = mem->fast_out(i);
+ worklist.push(s);
+ }
+ while(worklist.size() != 0 && LCA != early) {
+ Node* s = worklist.pop();
+ if (s->is_Load() || s->Opcode() == Op_SafePoint ||
+ (s->is_CallStaticJava() && s->as_CallStaticJava()->uncommon_trap_request() != 0)) {
+ continue;
+ } else if (s->is_MergeMem()) {
+ for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) {
+ Node* s1 = s->fast_out(i);
+ worklist.push(s1);
+ }
+ } else {
+ Node *sctrl = has_ctrl(s) ? get_ctrl(s) : s->in(0);
+ assert(sctrl != NULL || s->outcnt() == 0, "must have control");
+ if (sctrl != NULL && !sctrl->is_top() && C->can_alias(s->adr_type(), load_alias_idx) && is_dominator(early, sctrl)) {
+ LCA = dom_lca_for_get_late_ctrl(LCA, sctrl, n);
+ }
}
}
}
--- a/src/hotspot/share/opto/loopopts.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/opto/loopopts.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1075,26 +1075,21 @@
// uses.
// A better fix for this problem can be found in the BugTraq entry, but
// expediency for Mantis demands this hack.
- // 6855164: If the merge point has a FastLockNode with a PhiNode input, we stop
- // split_if_with_blocks from splitting a block because we could not move around
- // the FastLockNode.
+#ifdef _LP64
for (DUIterator_Fast imax, i = region->fast_outs(imax); i < imax; i++) {
Node* n = region->fast_out(i);
if (n->is_Phi()) {
for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
Node* m = n->fast_out(j);
- if (m->is_FastLock())
- return false;
-#ifdef _LP64
if (m->Opcode() == Op_ConvI2L)
return false;
if (m->is_CastII() && m->isa_CastII()->has_range_check()) {
return false;
}
-#endif
}
}
}
+#endif
return true;
}
--- a/src/hotspot/share/opto/split_if.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/opto/split_if.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -110,83 +110,90 @@
n->dump();
}
#endif
- // Clone down any block-local BoolNode uses of this CmpNode
- for (DUIterator i = n->outs(); n->has_out(i); i++) {
- Node* bol = n->out(i);
- assert( bol->is_Bool(), "" );
- if (bol->outcnt() == 1) {
- Node* use = bol->unique_out();
- if (use->Opcode() == Op_Opaque4) {
- if (use->outcnt() == 1) {
- Node* iff = use->unique_out();
- assert(iff->is_If(), "unexpected node type");
- Node *use_c = iff->in(0);
+ if (!n->is_FastLock()) {
+ // Clone down any block-local BoolNode uses of this CmpNode
+ for (DUIterator i = n->outs(); n->has_out(i); i++) {
+ Node* bol = n->out(i);
+ assert( bol->is_Bool(), "" );
+ if (bol->outcnt() == 1) {
+ Node* use = bol->unique_out();
+ if (use->Opcode() == Op_Opaque4) {
+ if (use->outcnt() == 1) {
+ Node* iff = use->unique_out();
+ assert(iff->is_If(), "unexpected node type");
+ Node *use_c = iff->in(0);
+ if (use_c == blk1 || use_c == blk2) {
+ continue;
+ }
+ }
+ } else {
+ // We might see an Opaque1 from a loop limit check here
+ assert(use->is_If() || use->is_CMove() || use->Opcode() == Op_Opaque1, "unexpected node type");
+ Node *use_c = use->is_If() ? use->in(0) : get_ctrl(use);
if (use_c == blk1 || use_c == blk2) {
+ assert(use->is_CMove(), "unexpected node type");
continue;
}
}
- } else {
- // We might see an Opaque1 from a loop limit check here
- assert(use->is_If() || use->is_CMove() || use->Opcode() == Op_Opaque1, "unexpected node type");
- Node *use_c = use->is_If() ? use->in(0) : get_ctrl(use);
- if (use_c == blk1 || use_c == blk2) {
- assert(use->is_CMove(), "unexpected node type");
- continue;
+ }
+ if (get_ctrl(bol) == blk1 || get_ctrl(bol) == blk2) {
+ // Recursively sink any BoolNode
+#ifndef PRODUCT
+ if( PrintOpto && VerifyLoopOptimizations ) {
+ tty->print("Cloning down: ");
+ bol->dump();
}
- }
- }
- if (get_ctrl(bol) == blk1 || get_ctrl(bol) == blk2) {
- // Recursively sink any BoolNode
-#ifndef PRODUCT
- if( PrintOpto && VerifyLoopOptimizations ) {
- tty->print("Cloning down: ");
- bol->dump();
- }
#endif
- for (DUIterator j = bol->outs(); bol->has_out(j); j++) {
- Node* u = bol->out(j);
- // Uses are either IfNodes, CMoves or Opaque4
- if (u->Opcode() == Op_Opaque4) {
- assert(u->in(1) == bol, "bad input");
- for (DUIterator_Last kmin, k = u->last_outs(kmin); k >= kmin; --k) {
- Node* iff = u->last_out(k);
- assert(iff->is_If() || iff->is_CMove(), "unexpected node type");
- assert( iff->in(1) == u, "" );
+ for (DUIterator j = bol->outs(); bol->has_out(j); j++) {
+ Node* u = bol->out(j);
+ // Uses are either IfNodes, CMoves or Opaque4
+ if (u->Opcode() == Op_Opaque4) {
+ assert(u->in(1) == bol, "bad input");
+ for (DUIterator_Last kmin, k = u->last_outs(kmin); k >= kmin; --k) {
+ Node* iff = u->last_out(k);
+ assert(iff->is_If() || iff->is_CMove(), "unexpected node type");
+ assert( iff->in(1) == u, "" );
+ // Get control block of either the CMove or the If input
+ Node *iff_ctrl = iff->is_If() ? iff->in(0) : get_ctrl(iff);
+ Node *x1 = bol->clone();
+ Node *x2 = u->clone();
+ register_new_node(x1, iff_ctrl);
+ register_new_node(x2, iff_ctrl);
+ _igvn.replace_input_of(x2, 1, x1);
+ _igvn.replace_input_of(iff, 1, x2);
+ }
+ _igvn.remove_dead_node(u);
+ --j;
+ } else {
+ // We might see an Opaque1 from a loop limit check here
+ assert(u->is_If() || u->is_CMove() || u->Opcode() == Op_Opaque1, "unexpected node type");
+ assert(u->in(1) == bol, "");
// Get control block of either the CMove or the If input
- Node *iff_ctrl = iff->is_If() ? iff->in(0) : get_ctrl(iff);
- Node *x1 = bol->clone();
- Node *x2 = u->clone();
- register_new_node(x1, iff_ctrl);
- register_new_node(x2, iff_ctrl);
- _igvn.replace_input_of(x2, 1, x1);
- _igvn.replace_input_of(iff, 1, x2);
+ Node *u_ctrl = u->is_If() ? u->in(0) : get_ctrl(u);
+ assert((u_ctrl != blk1 && u_ctrl != blk2) || u->is_CMove(), "won't converge");
+ Node *x = bol->clone();
+ register_new_node(x, u_ctrl);
+ _igvn.replace_input_of(u, 1, x);
+ --j;
}
- _igvn.remove_dead_node(u);
- --j;
- } else {
- // We might see an Opaque1 from a loop limit check here
- assert(u->is_If() || u->is_CMove() || u->Opcode() == Op_Opaque1, "unexpected node type");
- assert(u->in(1) == bol, "");
- // Get control block of either the CMove or the If input
- Node *u_ctrl = u->is_If() ? u->in(0) : get_ctrl(u);
- assert((u_ctrl != blk1 && u_ctrl != blk2) || u->is_CMove(), "won't converge");
- Node *x = bol->clone();
- register_new_node(x, u_ctrl);
- _igvn.replace_input_of(u, 1, x);
- --j;
}
+ _igvn.remove_dead_node(bol);
+ --i;
}
- _igvn.remove_dead_node(bol);
- --i;
}
}
// Clone down this CmpNode
for (DUIterator_Last jmin, j = n->last_outs(jmin); j >= jmin; --j) {
- Node* bol = n->last_out(j);
- assert( bol->in(1) == n, "" );
+ Node* use = n->last_out(j);
+ uint pos = 1;
+ if (n->is_FastLock()) {
+ pos = TypeFunc::Parms + 2;
+ assert(use->is_Lock(), "FastLock only used by LockNode");
+ }
+ assert(use->in(pos) == n, "" );
Node *x = n->clone();
- register_new_node(x, get_ctrl(bol));
- _igvn.replace_input_of(bol, 1, x);
+ register_new_node(x, ctrl_or_self(use));
+ _igvn.replace_input_of(use, pos, x);
}
_igvn.remove_dead_node( n );
--- a/src/hotspot/share/prims/jvm.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/prims/jvm.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -990,13 +990,21 @@
ResourceMark rm(THREAD);
Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
- Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
-
- const char* str = java_lang_String::as_utf8_string(string());
+ char* str = java_lang_String::as_utf8_string(h_name());
+
// Sanity check, don't expect null
if (str == NULL) return NULL;
- const int str_len = (int)strlen(str);
+ // Internalize the string, converting '.' to '/' in string.
+ char* p = (char*)str;
+ while (*p != '\0') {
+ if (*p == '.') {
+ *p = '/';
+ }
+ p++;
+ }
+
+ const int str_len = (int)(p - str);
if (str_len > Symbol::max_length()) {
// It's impossible to create this class; the name cannot fit
// into the constant pool.
--- a/src/hotspot/share/prims/jvmtiThreadState.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/prims/jvmtiThreadState.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, 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/src/hotspot/share/runtime/arguments.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/arguments.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -1454,7 +1454,7 @@
"--patch-module"
};
void Arguments::check_unsupported_dumping_properties() {
- assert(DumpSharedSpaces || DynamicDumpSharedSpaces,
+ assert(is_dumping_archive(),
"this function is only used with CDS dump time");
assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be");
// If a vm option is found in the unsupported_options array, vm will exit with an error message.
@@ -3537,7 +3537,7 @@
SharedArchivePath = get_default_shared_archive_path();
} else {
int archives = num_archives(SharedArchiveFile);
- if (DynamicDumpSharedSpaces || DumpSharedSpaces) {
+ if (is_dumping_archive()) {
if (archives > 1) {
vm_exit_during_initialization(
"Cannot have more than 1 archive file specified in -XX:SharedArchiveFile during CDS dumping");
@@ -3550,7 +3550,7 @@
}
}
}
- if (!DynamicDumpSharedSpaces && !DumpSharedSpaces){
+ if (!is_dumping_archive()){
if (archives > 2) {
vm_exit_during_initialization(
"Cannot have more than 2 archive files specified in the -XX:SharedArchiveFile option");
--- a/src/hotspot/share/runtime/arguments.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/arguments.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -647,6 +647,12 @@
static bool atojulong(const char *s, julong* result);
static bool has_jfr_option() NOT_JFR_RETURN_(false);
+
+ static bool is_dumping_archive() { return DumpSharedSpaces || DynamicDumpSharedSpaces; }
+
+ static void assert_is_dumping_archive() {
+ assert(Arguments::is_dumping_archive(), "dump time only");
+ }
};
// Disable options not supported in this release, with a warning if they
--- a/src/hotspot/share/runtime/globals.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/globals.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -385,7 +385,7 @@
notproduct(ccstrlist, DeoptimizeOnlyAt, "", \
"A comma separated list of bcis to deoptimize at") \
\
- product(bool, DeoptimizeRandom, false, \
+ develop(bool, DeoptimizeRandom, false, \
"Deoptimize random frames on random exit from the runtime system")\
\
notproduct(bool, ZombieALot, false, \
--- a/src/hotspot/share/runtime/mutex.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/mutex.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -70,22 +70,16 @@
}
#endif // ASSERT
-void Mutex::lock(Thread* self) {
- check_safepoint_state(self);
-
- assert(_owner != self, "invariant");
-
- Mutex* in_flight_mutex = NULL;
+void Mutex::lock_contended(Thread* self) {
+ Mutex *in_flight_mutex = NULL;
DEBUG_ONLY(int retry_cnt = 0;)
bool is_active_Java_thread = self->is_active_Java_thread();
- while (!_lock.try_lock()) {
- // The lock is contended
-
- #ifdef ASSERT
+ do {
+ #ifdef ASSERT
if (retry_cnt++ > 3) {
log_trace(vmmutex)("JavaThread " INTPTR_FORMAT " on %d attempt trying to acquire vmmutex %s", p2i(self), retry_cnt, _name);
}
- #endif // ASSERT
+ #endif // ASSERT
// Is it a JavaThread participating in the safepoint protocol.
if (is_active_Java_thread) {
@@ -102,6 +96,17 @@
_lock.lock();
break;
}
+ } while (!_lock.try_lock());
+}
+
+void Mutex::lock(Thread* self) {
+ check_safepoint_state(self);
+
+ assert(_owner != self, "invariant");
+
+ if (!_lock.try_lock()) {
+ // The lock is contended, use contended slow-path function to lock
+ lock_contended(self);
}
assert_owner(NULL);
@@ -109,7 +114,7 @@
}
void Mutex::lock() {
- this->lock(Thread::current());
+ lock(Thread::current());
}
// Lock without safepoint check - a degenerate variant of lock() for use by
--- a/src/hotspot/share/runtime/mutex.hpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/mutex.hpp Mon Oct 07 16:13:25 2019 +0200
@@ -152,6 +152,9 @@
bool is_locked() const { return _owner != NULL; }
bool try_lock(); // Like lock(), but unblocking. It returns false instead
+ private:
+ void lock_contended(Thread *thread); // contended slow-path
+ public:
void release_for_safepoint();
--- a/src/hotspot/share/runtime/thread.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/src/hotspot/share/runtime/thread.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -4185,7 +4185,7 @@
for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
// CDS dumping does not support native JVMTI agent.
// CDS dumping supports Java agent if the AllowArchivingWithJavaAgent diagnostic option is specified.
- if (DumpSharedSpaces || DynamicDumpSharedSpaces) {
+ if (Arguments::is_dumping_archive()) {
if(!agent->is_instrument_lib()) {
vm_exit_during_cds_dumping("CDS dumping does not support native JVMTI agent, name", agent->name());
} else if (!AllowArchivingWithJavaAgent) {
--- a/src/java.base/share/classes/java/io/BufferedReader.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.base/share/classes/java/io/BufferedReader.java Mon Oct 07 16:13:25 2019 +0200
@@ -314,7 +314,7 @@
* @throws IOException If an I/O error occurs
*/
String readLine(boolean ignoreLF, boolean[] term) throws IOException {
- StringBuffer s = null;
+ StringBuilder s = null;
int startChar;
synchronized (lock) {
@@ -372,7 +372,7 @@
}
if (s == null)
- s = new StringBuffer(defaultExpectedLineLength);
+ s = new StringBuilder(defaultExpectedLineLength);
s.append(cb, startChar, i - startChar);
}
}
--- a/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectionKey.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectionKey.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,13 @@
package java.nio.channels.spi;
-import java.nio.channels.*;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import sun.nio.ch.SelectionKeyImpl;
+import sun.nio.ch.SelectorImpl;
/**
* Base implementation class for selection keys.
@@ -41,20 +46,29 @@
public abstract class AbstractSelectionKey
extends SelectionKey
{
+ private static final VarHandle INVALID;
+ static {
+ try {
+ MethodHandles.Lookup l = MethodHandles.lookup();
+ INVALID = l.findVarHandle(AbstractSelectionKey.class, "invalid", boolean.class);
+ } catch (Exception e) {
+ throw new InternalError(e);
+ }
+ }
/**
* Initializes a new instance of this class.
*/
protected AbstractSelectionKey() { }
- private volatile boolean valid = true;
+ private volatile boolean invalid;
public final boolean isValid() {
- return valid;
+ return !invalid;
}
void invalidate() { // package-private
- valid = false;
+ invalid = true;
}
/**
@@ -64,13 +78,14 @@
* selector's cancelled-key set while synchronized on that set. </p>
*/
public final void cancel() {
- // Synchronizing "this" to prevent this key from getting canceled
- // multiple times by different threads, which might cause race
- // condition between selector's select() and channel's close().
- synchronized (this) {
- if (valid) {
- valid = false;
- ((AbstractSelector)selector()).cancel(this);
+ boolean changed = (boolean) INVALID.compareAndSet(this, false, true);
+ if (changed) {
+ Selector sel = selector();
+ if (sel instanceof SelectorImpl) {
+ // queue cancelled key directly
+ ((SelectorImpl) sel).cancel((SelectionKeyImpl) this);
+ } else {
+ ((AbstractSelector) sel).cancel(this);
}
}
}
--- a/src/java.base/share/classes/java/nio/channels/spi/AbstractSelector.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.base/share/classes/java/nio/channels/spi/AbstractSelector.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,12 +26,14 @@
package java.nio.channels.spi;
import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.HashSet;
import java.util.Set;
import sun.nio.ch.Interruptible;
-import java.util.concurrent.atomic.AtomicBoolean;
+import sun.nio.ch.SelectorImpl;
/**
@@ -69,12 +71,23 @@
public abstract class AbstractSelector
extends Selector
{
-
- private final AtomicBoolean selectorOpen = new AtomicBoolean(true);
+ private static final VarHandle CLOSED;
+ static {
+ try {
+ MethodHandles.Lookup l = MethodHandles.lookup();
+ CLOSED = l.findVarHandle(AbstractSelector.class, "closed", boolean.class);
+ } catch (Exception e) {
+ throw new InternalError(e);
+ }
+ }
+ private volatile boolean closed;
// The provider that created this selector
private final SelectorProvider provider;
+ // cancelled-key, not used by the JDK Selector implementations
+ private final Set<SelectionKey> cancelledKeys;
+
/**
* Initializes a new instance of this class.
*
@@ -83,10 +96,14 @@
*/
protected AbstractSelector(SelectorProvider provider) {
this.provider = provider;
+ if (this instanceof SelectorImpl) {
+ // not used in JDK Selector implementations
+ this.cancelledKeys = Set.of();
+ } else {
+ this.cancelledKeys = new HashSet<>();
+ }
}
- private final Set<SelectionKey> cancelledKeys = new HashSet<SelectionKey>();
-
void cancel(SelectionKey k) { // package-private
synchronized (cancelledKeys) {
cancelledKeys.add(k);
@@ -105,10 +122,10 @@
* If an I/O error occurs
*/
public final void close() throws IOException {
- boolean open = selectorOpen.getAndSet(false);
- if (!open)
- return;
- implCloseSelector();
+ boolean changed = (boolean) CLOSED.compareAndSet(this, false, true);
+ if (changed) {
+ implCloseSelector();
+ }
}
/**
@@ -130,7 +147,7 @@
protected abstract void implCloseSelector() throws IOException;
public final boolean isOpen() {
- return selectorOpen.get();
+ return !closed;
}
/**
--- a/src/java.base/share/classes/java/util/stream/Collector.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.base/share/classes/java/util/stream/Collector.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2019, 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
@@ -33,6 +33,10 @@
import java.util.function.Function;
import java.util.function.Supplier;
+// A compilation test for the code snippets in this class-level javadoc can be found at:
+// test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorExample.java
+// The test needs to be updated if the examples in this javadoc change or new examples are added.
+
/**
* A <a href="package-summary.html#Reduction">mutable reduction operation</a> that
* accumulates input elements into a mutable result container, optionally transforming
@@ -154,7 +158,7 @@
* Performing a reduction operation with a {@code Collector} should produce a
* result equivalent to:
* <pre>{@code
- * R container = collector.supplier().get();
+ * A container = collector.supplier().get();
* for (T t : data)
* collector.accumulator().accept(container, t);
* return collector.finisher().apply(container);
--- a/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2019, 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
@@ -33,7 +33,9 @@
import java.nio.channels.spi.AbstractSelectableChannel;
import java.nio.channels.spi.AbstractSelector;
import java.nio.channels.spi.SelectorProvider;
+import java.util.ArrayDeque;
import java.util.Collections;
+import java.util.Deque;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
@@ -46,7 +48,7 @@
* Base Selector implementation class.
*/
-abstract class SelectorImpl
+public abstract class SelectorImpl
extends AbstractSelector
{
// The set of keys registered with this Selector
@@ -59,6 +61,9 @@
private final Set<SelectionKey> publicKeys; // Immutable
private final Set<SelectionKey> publicSelectedKeys; // Removal allowed, but not addition
+ // pending cancelled keys for deregistration
+ private final Deque<SelectionKeyImpl> cancelledKeys = new ArrayDeque<>();
+
// used to check for reentrancy
private boolean inSelect;
@@ -239,33 +244,36 @@
protected abstract void implDereg(SelectionKeyImpl ski) throws IOException;
/**
- * Invoked by selection operations to process the cancelled-key set
+ * Queue a cancelled key for the next selection operation
+ */
+ public void cancel(SelectionKeyImpl ski) {
+ synchronized (cancelledKeys) {
+ cancelledKeys.addLast(ski);
+ }
+ }
+
+ /**
+ * Invoked by selection operations to process the cancelled keys
*/
protected final void processDeregisterQueue() throws IOException {
assert Thread.holdsLock(this);
assert Thread.holdsLock(publicSelectedKeys);
- Set<SelectionKey> cks = cancelledKeys();
- synchronized (cks) {
- if (!cks.isEmpty()) {
- Iterator<SelectionKey> i = cks.iterator();
- while (i.hasNext()) {
- SelectionKeyImpl ski = (SelectionKeyImpl)i.next();
- i.remove();
-
- // remove the key from the selector
- implDereg(ski);
+ synchronized (cancelledKeys) {
+ SelectionKeyImpl ski;
+ while ((ski = cancelledKeys.pollFirst()) != null) {
+ // remove the key from the selector
+ implDereg(ski);
- selectedKeys.remove(ski);
- keys.remove(ski);
+ selectedKeys.remove(ski);
+ keys.remove(ski);
- // remove from channel's key set
- deregister(ski);
+ // remove from channel's key set
+ deregister(ski);
- SelectableChannel ch = ski.channel();
- if (!ch.isOpen() && !ch.isRegistered())
- ((SelChImpl)ch).kill();
- }
+ SelectableChannel ch = ski.channel();
+ if (!ch.isOpen() && !ch.isRegistered())
+ ((SelChImpl)ch).kill();
}
}
}
--- a/src/java.prefs/share/classes/java/util/prefs/NodeChangeEvent.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.prefs/share/classes/java/util/prefs/NodeChangeEvent.java Mon Oct 07 16:13:25 2019 +0200
@@ -46,8 +46,6 @@
public class NodeChangeEvent extends java.util.EventObject {
/**
* The node that was added or removed.
- *
- * @serial
*/
private transient Preferences child;
--- a/src/java.rmi/share/classes/java/rmi/activation/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.rmi/share/classes/java/rmi/activation/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/*
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/java.rmi/share/classes/java/rmi/dgc/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.rmi/share/classes/java/rmi/dgc/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/*
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/java.rmi/share/classes/java/rmi/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.rmi/share/classes/java/rmi/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/*
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/java.rmi/share/classes/java/rmi/registry/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.rmi/share/classes/java/rmi/registry/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/*
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/java.rmi/share/classes/java/rmi/server/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.rmi/share/classes/java/rmi/server/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/*
* Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/java.sql/share/classes/javax/sql/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/java.sql/share/classes/javax/sql/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,23 +1,23 @@
/**
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * <p>
+ *
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
- * <p>
+ *
* 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).
- * <p>
+ *
* 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.
- * <p>
+ *
* 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.
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Mon Oct 07 16:13:25 2019 +0200
@@ -233,7 +233,7 @@
}
public void setMultiReleaseValue(String multiReleaseValue) {
- fsEnv = Collections.singletonMap("multi-release", multiReleaseValue);
+ fsEnv = Collections.singletonMap("releaseVersion", multiReleaseValue);
}
private boolean contains(Collection<Path> searchPath, Path file) throws IOException {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/package-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/package-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -25,7 +25,7 @@
/**
* Doclets provide the user-selectable backends for processing the
- * documentation comnments in Java source code.
+ * documentation comments in Java source code.
*
* <p>Doclets are implementations of the {@link jdk.javadoc.doclet Doclet API}.</p>
*
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Mon Oct 07 16:13:25 2019 +0200
@@ -320,7 +320,7 @@
//necessary.
DocFinder.Output inheritedDoc =
DocFinder.search(configuration,
- new DocFinder.Input(utils, (ExecutableElement) member));
+ new DocFinder.Input(utils, member));
if (inheritedDoc.holder != null
&& !utils.getFirstSentenceTrees(inheritedDoc.holder).isEmpty()) {
// let the comment helper know of the overridden element
@@ -473,7 +473,7 @@
private void addSummaryFootNote(TypeElement inheritedClass, SortedSet<Element> inheritedMembers,
Content linksTree, MemberSummaryWriter writer) {
for (Element member : inheritedMembers) {
- TypeElement t = (utils.isPackagePrivate(inheritedClass) && !utils.isLinkable(inheritedClass))
+ TypeElement t = utils.isUndocumentedEnclosure(inheritedClass)
? typeElement : inheritedClass;
writer.addInheritedMemberSummary(t, member, inheritedMembers.first() == member,
inheritedMembers.last() == member, linksTree);
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Mon Oct 07 16:13:25 2019 +0200
@@ -529,6 +529,10 @@
return true;
}
+ public boolean isUndocumentedEnclosure(TypeElement enclosingTypeElement) {
+ return isPackagePrivate(enclosingTypeElement) && !isLinkable(enclosingTypeElement);
+ }
+
public boolean isError(TypeElement te) {
if (isEnum(te) || isInterface(te) || isAnnotationType(te)) {
return false;
@@ -1064,8 +1068,7 @@
// Allow for the behavior that members of undocumented supertypes
// may be included in documented types
- TypeElement enclElem = getEnclosingTypeElement(elem);
- if (typeElem != enclElem && isSubclassOf(typeElem, enclElem)) {
+ if (isUndocumentedEnclosure(getEnclosingTypeElement(elem))) {
return true;
}
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberTable.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberTable.java Mon Oct 07 16:13:25 2019 +0200
@@ -209,7 +209,7 @@
public List<? extends Element> getVisibleMembers(Kind kind) {
Predicate<Element> declaredAndLeafMembers = e -> {
TypeElement encl = utils.getEnclosingTypeElement(e);
- return encl == te || isUndocumentedEnclosure(encl);
+ return encl == te || utils.isUndocumentedEnclosure(encl);
};
return getVisibleMembers(kind, declaredAndLeafMembers);
}
@@ -238,7 +238,8 @@
ensureInitialized();
OverridingMethodInfo found = overriddenMethodTable.get(e);
- if (found != null && (found.simpleOverride || isUndocumentedEnclosure(utils.getEnclosingTypeElement(e)))) {
+ if (found != null
+ && (found.simpleOverride || utils.isUndocumentedEnclosure(utils.getEnclosingTypeElement(e)))) {
return found.overrider;
}
return null;
@@ -347,10 +348,6 @@
return pm == null ? null : pm.setter;
}
- boolean isUndocumentedEnclosure(TypeElement encl) {
- return utils.isPackagePrivate(encl) && !utils.isLinkable(encl);
- }
-
private void computeParents() {
for (TypeMirror intfType : te.getInterfaces()) {
TypeElement intfc = utils.asTypeElement(intfType);
@@ -388,7 +385,7 @@
private void computeLeafMembers(LocalMemberTable lmt, Kind kind) {
List<Element> list = new ArrayList<>();
- if (isUndocumentedEnclosure(te)) {
+ if (utils.isUndocumentedEnclosure(te)) {
list.addAll(lmt.getOrderedMembers(kind));
}
parents.forEach(pvmt -> {
@@ -617,7 +614,7 @@
// Disallow package-private super methods to leak in
TypeElement encl = utils.getEnclosingTypeElement(inheritedMethod);
- if (isUndocumentedEnclosure(encl)) {
+ if (utils.isUndocumentedEnclosure(encl)) {
overriddenMethodTable.computeIfAbsent(lMethod,
l -> new OverridingMethodInfo(inheritedMethod, false));
return false;
--- a/src/jdk.jdwp.agent/share/native/libdt_socket/socketTransport.c Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.jdwp.agent/share/native/libdt_socket/socketTransport.c Mon Oct 07 16:13:25 2019 +0200
@@ -511,7 +511,7 @@
if (buffer == NULL) {
RETURN_ERROR(JDWPTRANSPORT_ERROR_OUT_OF_MEMORY, "out of memory");
}
- strncpy(buffer, allowed_peers, len);
+ memcpy(buffer, allowed_peers, len);
buffer[len] = '\0';
jdwpTransportError err = parseAllowedPeersInternal(buffer);
--- a/src/jdk.jshell/share/classes/jdk/jshell/ExpressionToTypeInfo.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.jshell/share/classes/jdk/jshell/ExpressionToTypeInfo.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2019, 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
@@ -149,6 +149,7 @@
private static class Result extends Error {
static final long serialVersionUID = -5942088234594905629L;
+ @SuppressWarnings("serial") // Not statically typed as Serializable
final TreePath expressionPath;
Result(TreePath path) {
--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Mon Oct 07 16:13:25 2019 +0200
@@ -60,18 +60,20 @@
JarFileSystem(ZipFileSystemProvider provider, Path zfpath, Map<String,?> env) throws IOException {
super(provider, zfpath, env);
- if (isMultiReleaseJar()) {
+ Object o = getRuntimeVersion(env);
+ if (isMultiReleaseJar() && (o != null)) {
int version;
- Object o = env.get("multi-release");
if (o instanceof String) {
String s = (String)o;
if (s.equals("runtime")) {
version = Runtime.version().feature();
+ } else if (s.matches("^[1-9][0-9]*$")) {
+ version = Version.parse(s).feature();
} else {
- version = Integer.parseInt(s);
+ throw new IllegalArgumentException("Invalid runtime version");
}
} else if (o instanceof Integer) {
- version = (Integer)o;
+ version = Version.parse(((Integer)o).toString()).feature();
} else if (o instanceof Version) {
version = ((Version)o).feature();
} else {
@@ -83,6 +85,23 @@
}
}
+ /**
+ * Utility method to get the release version for a multi-release JAR. It
+ * first checks the documented property {@code releaseVersion} and if not
+ * found checks the original property {@code multi-release}
+ * @param env ZIP FS map
+ * @return release version or null if it is not specified
+ */
+ private Object getRuntimeVersion(Map<String, ?> env) {
+ Object o = null;
+ if (env.containsKey(ZipFileSystemProvider.PROPERTY_RELEASE_VERSION)) {
+ o = env.get(ZipFileSystemProvider.PROPERTY_RELEASE_VERSION);
+ } else {
+ o = env.get(ZipFileSystemProvider.PROPERTY_MULTI_RELEASE);
+ }
+ return o;
+ }
+
private boolean isMultiReleaseJar() throws IOException {
try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) {
String multiRelease = new Manifest(is).getMainAttributes()
--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Mon Oct 07 16:13:25 2019 +0200
@@ -81,13 +81,19 @@
(PrivilegedAction<Boolean>)()->System.getProperty("os.name")
.startsWith("Windows"));
private static final byte[] ROOTPATH = new byte[] { '/' };
- private static final String OPT_POSIX = "enablePosixFileAttributes";
- private static final String OPT_DEFAULT_OWNER = "defaultOwner";
- private static final String OPT_DEFAULT_GROUP = "defaultGroup";
- private static final String OPT_DEFAULT_PERMISSIONS = "defaultPermissions";
+ private static final String PROPERTY_POSIX = "enablePosixFileAttributes";
+ private static final String PROPERTY_DEFAULT_OWNER = "defaultOwner";
+ private static final String PROPERTY_DEFAULT_GROUP = "defaultGroup";
+ private static final String PROPERTY_DEFAULT_PERMISSIONS = "defaultPermissions";
private static final Set<PosixFilePermission> DEFAULT_PERMISSIONS =
PosixFilePermissions.fromString("rwxrwxrwx");
+ // Property used to specify the compression mode to use
+ private static final String PROPERTY_COMPRESSION_METHOD = "compressionMethod";
+ // Value specified for compressionMethod property to compress Zip entries
+ private static final String COMPRESSION_METHOD_DEFLATED = "DEFLATED";
+ // Value specified for compressionMethod property to not compress Zip entries
+ private static final String COMPRESSION_METHOD_STORED = "STORED";
private final ZipFileSystemProvider provider;
private final Path zfpath;
@@ -124,8 +130,8 @@
this.noExtt = "false".equals(env.get("zipinfo-time"));
this.useTempFile = isTrue(env, "useTempFile");
this.forceEnd64 = isTrue(env, "forceZIP64End");
- this.defaultCompressionMethod = isTrue(env, "noCompression") ? METHOD_STORED : METHOD_DEFLATED;
- this.supportPosix = isTrue(env, OPT_POSIX);
+ this.defaultCompressionMethod = getDefaultCompressionMethod(env);
+ this.supportPosix = isTrue(env, PROPERTY_POSIX);
this.defaultOwner = initOwner(zfpath, env);
this.defaultGroup = initGroup(zfpath, env);
this.defaultPermissions = initPermissions(env);
@@ -138,7 +144,7 @@
new END().write(os, 0, forceEnd64);
}
} else {
- throw new FileSystemNotFoundException(zfpath.toString());
+ throw new NoSuchFileException(zfpath.toString());
}
}
// sm and existence check
@@ -163,6 +169,50 @@
this.zfpath = zfpath;
}
+ /**
+ * Return the compression method to use (STORED or DEFLATED). If the
+ * property {@code commpressionMethod} is set use its value to determine
+ * the compression method to use. If the property is not set, then the
+ * default compression is DEFLATED unless the property {@code noCompression}
+ * is set which is supported for backwards compatibility.
+ * @param env Zip FS map of properties
+ * @return The Compression method to use
+ */
+ private int getDefaultCompressionMethod(Map<String, ?> env) {
+ int result =
+ isTrue(env, "noCompression") ? METHOD_STORED : METHOD_DEFLATED;
+ if (env.containsKey(PROPERTY_COMPRESSION_METHOD)) {
+ Object compressionMethod = env.get(PROPERTY_COMPRESSION_METHOD);
+ if (compressionMethod != null) {
+ if (compressionMethod instanceof String) {
+ switch (((String) compressionMethod).toUpperCase()) {
+ case COMPRESSION_METHOD_STORED:
+ result = METHOD_STORED;
+ break;
+ case COMPRESSION_METHOD_DEFLATED:
+ result = METHOD_DEFLATED;
+ break;
+ default:
+ throw new IllegalArgumentException(String.format(
+ "The value for the %s property must be %s or %s",
+ PROPERTY_COMPRESSION_METHOD, COMPRESSION_METHOD_STORED,
+ COMPRESSION_METHOD_DEFLATED));
+ }
+ } else {
+ throw new IllegalArgumentException(String.format(
+ "The Object type for the %s property must be a String",
+ PROPERTY_COMPRESSION_METHOD));
+ }
+ } else {
+ throw new IllegalArgumentException(String.format(
+ "The value for the %s property must be %s or %s",
+ PROPERTY_COMPRESSION_METHOD, COMPRESSION_METHOD_STORED,
+ COMPRESSION_METHOD_DEFLATED));
+ }
+ }
+ return result;
+ }
+
// returns true if there is a name=true/"true" setting in env
private static boolean isTrue(Map<String, ?> env, String name) {
return "true".equals(env.get(name)) || TRUE.equals(env.get(name));
@@ -173,7 +223,7 @@
// be determined, we try to go with system property "user.name". If that's not
// accessible, we return "<zipfs_default>".
private UserPrincipal initOwner(Path zfpath, Map<String, ?> env) throws IOException {
- Object o = env.get(OPT_DEFAULT_OWNER);
+ Object o = env.get(PROPERTY_DEFAULT_OWNER);
if (o == null) {
try {
PrivilegedExceptionAction<UserPrincipal> pa = ()->Files.getOwner(zfpath);
@@ -193,7 +243,7 @@
if (o instanceof String) {
if (((String)o).isEmpty()) {
throw new IllegalArgumentException("Value for property " +
- OPT_DEFAULT_OWNER + " must not be empty.");
+ PROPERTY_DEFAULT_OWNER + " must not be empty.");
}
return ()->(String)o;
}
@@ -201,7 +251,7 @@
return (UserPrincipal)o;
}
throw new IllegalArgumentException("Value for property " +
- OPT_DEFAULT_OWNER + " must be of type " + String.class +
+ PROPERTY_DEFAULT_OWNER + " must be of type " + String.class +
" or " + UserPrincipal.class);
}
@@ -210,7 +260,7 @@
// If this is not possible/unsupported, we will return a group principal going by
// the same name as the default owner.
private GroupPrincipal initGroup(Path zfpath, Map<String, ?> env) throws IOException {
- Object o = env.get(OPT_DEFAULT_GROUP);
+ Object o = env.get(PROPERTY_DEFAULT_GROUP);
if (o == null) {
try {
PosixFileAttributeView zfpv = Files.getFileAttributeView(zfpath, PosixFileAttributeView.class);
@@ -232,7 +282,7 @@
if (o instanceof String) {
if (((String)o).isEmpty()) {
throw new IllegalArgumentException("Value for property " +
- OPT_DEFAULT_GROUP + " must not be empty.");
+ PROPERTY_DEFAULT_GROUP + " must not be empty.");
}
return ()->(String)o;
}
@@ -240,14 +290,14 @@
return (GroupPrincipal)o;
}
throw new IllegalArgumentException("Value for property " +
- OPT_DEFAULT_GROUP + " must be of type " + String.class +
+ PROPERTY_DEFAULT_GROUP + " must be of type " + String.class +
" or " + GroupPrincipal.class);
}
// Initialize the default permissions for files inside the zip archive.
// If not specified in env, it will return 777.
private Set<PosixFilePermission> initPermissions(Map<String, ?> env) {
- Object o = env.get(OPT_DEFAULT_PERMISSIONS);
+ Object o = env.get(PROPERTY_DEFAULT_PERMISSIONS);
if (o == null) {
return DEFAULT_PERMISSIONS;
}
@@ -256,7 +306,7 @@
}
if (!(o instanceof Set)) {
throw new IllegalArgumentException("Value for property " +
- OPT_DEFAULT_PERMISSIONS + " must be of type " + String.class +
+ PROPERTY_DEFAULT_PERMISSIONS + " must be of type " + String.class +
" or " + Set.class);
}
Set<PosixFilePermission> perms = new HashSet<>();
@@ -264,7 +314,7 @@
if (o2 instanceof PosixFilePermission) {
perms.add((PosixFilePermission)o2);
} else {
- throw new IllegalArgumentException(OPT_DEFAULT_PERMISSIONS +
+ throw new IllegalArgumentException(PROPERTY_DEFAULT_PERMISSIONS +
" must only contain objects of type " + PosixFilePermission.class);
}
}
--- a/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystemProvider.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystemProvider.java Mon Oct 07 16:13:25 2019 +0200
@@ -53,6 +53,11 @@
*/
public class ZipFileSystemProvider extends FileSystemProvider {
+ // Property used to specify the entry version to use for a multi-release JAR
+ static final String PROPERTY_RELEASE_VERSION = "releaseVersion";
+ // Original property used to specify the entry version to use for a
+ // multi-release JAR which is kept for backwards compatibility.
+ static final String PROPERTY_MULTI_RELEASE = "multi-release";
private final Map<Path, ZipFileSystem> filesystems = new HashMap<>();
public ZipFileSystemProvider() {}
@@ -104,20 +109,7 @@
if (filesystems.containsKey(realPath))
throw new FileSystemAlreadyExistsException();
}
- ZipFileSystem zipfs;
- try {
- if (env.containsKey("multi-release")) {
- zipfs = new JarFileSystem(this, path, env);
- } else {
- zipfs = new ZipFileSystem(this, path, env);
- }
- } catch (ZipException ze) {
- String pname = path.toString();
- if (pname.endsWith(".zip") || pname.endsWith(".jar"))
- throw ze;
- // assume NOT a zip/jar file
- throw new UnsupportedOperationException();
- }
+ ZipFileSystem zipfs = getZipFileSystem(path, env);
if (realPath == null) { // newly created
realPath = path.toRealPath();
}
@@ -131,20 +123,25 @@
throws IOException
{
ensureFile(path);
+ return getZipFileSystem(path, env);
+ }
+
+ private ZipFileSystem getZipFileSystem(Path path, Map<String, ?> env) throws IOException {
+ ZipFileSystem zipfs;
try {
- ZipFileSystem zipfs;
- if (env.containsKey("multi-release")) {
+ if (env.containsKey(PROPERTY_RELEASE_VERSION) ||
+ env.containsKey(PROPERTY_MULTI_RELEASE)) {
zipfs = new JarFileSystem(this, path, env);
} else {
zipfs = new ZipFileSystem(this, path, env);
}
- return zipfs;
} catch (ZipException ze) {
String pname = path.toString();
if (pname.endsWith(".zip") || pname.endsWith(".jar"))
throw ze;
throw new UnsupportedOperationException();
}
+ return zipfs;
}
@Override
--- a/src/jdk.zipfs/share/classes/module-info.java Mon Oct 07 15:52:38 2019 +0200
+++ b/src/jdk.zipfs/share/classes/module-info.java Mon Oct 07 16:13:25 2019 +0200
@@ -147,7 +147,7 @@
* <tbody>
* <tr>
* <th scope="row">create</th>
- * <td>java.lang.String</td>
+ * <td>{@link java.lang.String} or {@link java.lang.Boolean}</td>
* <td>false</td>
* <td>
* If the value is {@code true}, the Zip file system provider
@@ -156,7 +156,7 @@
* </tr>
* <tr>
* <th scope="row">encoding</th>
- * <td>java.lang.String</td>
+ * <td>{@link java.lang.String}</td>
* <td>UTF-8</td>
* <td>
* The value indicates the encoding scheme for the
@@ -164,8 +164,8 @@
* </td>
* </tr>
* <tr>
- * <td scope="row">enablePosixFileAttributes</td>
- * <td>java.lang.String</td>
+ * <th scope="row">enablePosixFileAttributes</th>
+ * <td>{@link java.lang.String} or {@link java.lang.Boolean}</td>
* <td>false</td>
* <td>
* If the value is {@code true}, the Zip file system will support
@@ -173,8 +173,9 @@
* </td>
* </tr>
* <tr>
- * <td scope="row">defaultOwner</td>
- * <td>{@link java.nio.file.attribute.UserPrincipal UserPrincipal}<br> or java.lang.String</td>
+ * <th scope="row">defaultOwner</th>
+ * <td>{@link java.nio.file.attribute.UserPrincipal UserPrincipal}<br> or
+ * {@link java.lang.String}</td>
* <td>null/unset</td>
* <td>
* Override the default owner for entries in the Zip file system.<br>
@@ -182,8 +183,9 @@
* </td>
* </tr>
* <tr>
- * <td scope="row">defaultGroup</td>
- * <td>{@link java.nio.file.attribute.GroupPrincipal GroupPrincipal}<br> or java.lang.String</td>
+ * <th scope="row">defaultGroup</th>
+ * <td>{@link java.nio.file.attribute.GroupPrincipal GroupPrincipal}<br> or
+ * {@link java.lang.String}</td>
* <td>null/unset</td>
* <td>
* Override the the default group for entries in the Zip file system.<br>
@@ -191,9 +193,9 @@
* </td>
* </tr>
* <tr>
- * <td scope="row">defaultPermissions</td>
+ * <th scope="row">defaultPermissions</th>
* <td>{@link java.util.Set Set}<{@link java.nio.file.attribute.PosixFilePermission PosixFilePermission}><br>
- * or java.lang.String</td>
+ * or {@link java.lang.String}</td>
* <td>null/unset</td>
* <td>
* Override the default Set of permissions for entries in the Zip file system.<br>
@@ -201,7 +203,66 @@
* a String that is parsed by {@link java.nio.file.attribute.PosixFilePermissions#fromString PosixFilePermissions::fromString}
* </td>
* </tr>
- * </tbody>
+ * <tr>
+ * <th scope="row">compressionMethod</th>
+ * <td>{@link java.lang.String}</td>
+ * <td>"DEFLATED"</td>
+ * <td>
+ * The value representing the compression method to use when writing entries
+ * to the Zip file system.
+ * <ul>
+ * <li>
+ * If the value is {@code "STORED"}, the Zip file system provider will
+ * not compress entries when writing to the Zip file system.
+ * </li>
+ * <li>
+ * If the value is {@code "DEFLATED"} or the property is not set,
+ * the Zip file system provider will use data compression when
+ * writing entries to the Zip file system.
+ * </li>
+ * <li>
+ * If the value is not {@code "STORED"} or {@code "DEFLATED"}, an
+ * {@code IllegalArgumentException} will be thrown when the Zip
+ * filesystem is created.
+ * </li>
+ * </ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <th scope="row">releaseVersion</th>
+ * <td>{@link java.lang.String} or {@link java.lang.Integer}</td>
+ * <td>null/unset</td>
+ * <td>
+ * A value representing the version entry to use when accessing a
+ * <a href=="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
+ * multi-release JAR</a>. If the JAR is not a
+ * <a href=="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
+ * multi-release JAR</a>, the value will be ignored and the JAR will be
+ * considered un-versioned.
+ * <p>
+ * The value must be either the string "runtime" or represent a valid
+ * {@linkplain Runtime.Version Java SE Platform version number},
+ * such as {@code 9} or {@code 14}, in order to determine the version entry.
+ *
+ * <ul>
+ * <li>
+ * If the value is {@code null} or the property is not set,
+ * then the JAR will be treated as an un-versioned JAR.
+ * </li>
+ * <li>
+ * If the value is {@code "runtime"}, the
+ * version entry will be determined by invoking
+ * {@linkplain Runtime.Version#feature() Runtime.Version.feature()}.
+ * </li>
+ * <li>
+ * If the value does not represent a valid
+ * {@linkplain Runtime.Version Java SE Platform version number},
+ * an {@code IllegalArgumentException} will be thrown.
+ * </li>
+ * </ul>
+ * </td>
+ * </tr>
+ * </tbody>
* </table>
*
* <h2>Examples:</h2>
@@ -223,7 +284,7 @@
* <pre>
* {@code
*
- * FileSystem zipfs = FileSystems.newFileSystem(Path.of("helloworld.jar"), null);
+ * FileSystem zipfs = FileSystems.newFileSystem(Path.of("helloworld.jar"));
* Path rootDir = zipfs.getPath("/");
* Files.walk(rootDir)
* .forEach(System.out::println);
--- a/test/hotspot/gtest/runtime/test_os_windows.cpp Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/gtest/runtime/test_os_windows.cpp Mon Oct 07 16:13:25 2019 +0200
@@ -354,7 +354,7 @@
if (convert_to_cstring(buf, JVM_MAXPATHLEN, path)) {
::testing::Test::RecordProperty(name, buf);
- snprintf(buf, JVM_MAXPATHLEN, "%d", (int) wcslen(path));
+ os::snprintf(buf, JVM_MAXPATHLEN, "%d", (int) wcslen(path));
::testing::Test::RecordProperty(len_name, buf);
}
}
--- a/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationAllTest.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationAllTest.java Mon Oct 07 16:13:25 2019 +0200
@@ -33,12 +33,14 @@
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -XX:-DeoptimizeRandom
+ * -XX:+WhiteBoxAPI
+ * -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom
* -XX:CompileCommand=dontinline,compiler.codecache.stress.Helper$TestCase::method
* -XX:-SegmentedCodeCache
* compiler.codecache.stress.UnexpectedDeoptimizationAllTest
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -XX:-DeoptimizeRandom
+ * -XX:+WhiteBoxAPI
+ * -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom
* -XX:CompileCommand=dontinline,compiler.codecache.stress.Helper$TestCase::method
* -XX:+SegmentedCodeCache
* compiler.codecache.stress.UnexpectedDeoptimizationAllTest
--- a/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationTest.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/jtreg/compiler/codecache/stress/UnexpectedDeoptimizationTest.java Mon Oct 07 16:13:25 2019 +0200
@@ -33,12 +33,14 @@
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -XX:-DeoptimizeRandom
+ * -XX:+WhiteBoxAPI
+ * -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom
* -XX:CompileCommand=dontinline,compiler.codecache.stress.Helper$TestCase::method
* -XX:-SegmentedCodeCache
* compiler.codecache.stress.UnexpectedDeoptimizationTest
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
- * -XX:+WhiteBoxAPI -XX:-DeoptimizeRandom
+ * -XX:+WhiteBoxAPI
+ * -XX:+IgnoreUnrecognizedVMOptions -XX:-DeoptimizeRandom
* -XX:CompileCommand=dontinline,compiler.codecache.stress.Helper$TestCase::method
* -XX:+SegmentedCodeCache
* compiler.codecache.stress.UnexpectedDeoptimizationTest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/loopopts/SplitIfSharedFastLockBehindCastPP.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2019, Red Hat, Inc. 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 8231620
+ * @summary assert(bol->is_Bool()) crash during split if due to FastLockNode
+ *
+ * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement SplitIfSharedFastLockBehindCastPP
+ */
+
+
+public class SplitIfSharedFastLockBehindCastPP {
+ private static boolean field;
+ private static A obj_field;
+
+ public static void main(String[] args) {
+ A lock = new A();
+ obj_field = lock;
+ for (int i = 0; i < 20_000; i++) {
+ test1(true, lock);
+ test1(false, lock);
+ test2(true);
+ test2(false);
+ }
+ }
+
+ private static void test1(boolean flag, Object obj) {
+ if (obj == null) {
+ }
+
+ boolean flag2;
+ if (flag) {
+ flag2 = true;
+ } else {
+ flag2 = false;
+ obj = obj_field;
+ }
+
+ // This loop will be unswitched. The condition becomes candidate for split if
+ for (int i = 0; i < 100; i++) {
+ if (flag2) {
+ field = true;
+ } else {
+ field = false;
+ }
+ synchronized (obj) {
+ field = true;
+ }
+ }
+ }
+
+ private static Object test2(boolean flag) {
+ int integer;
+ if (flag) {
+ field = true;
+ integer = 1;
+ } else {
+ field = false;
+ integer = 2;
+ }
+
+ Object obj = integer;
+
+ // This loop will be unswitched. The condition becomes candidate for split if
+ for (int i = 0; i < 100; i++) {
+ if (integer == 1) {
+ field = true;
+ } else {
+ field = false;
+ }
+ synchronized (obj) {
+ field = true;
+ }
+ }
+ return obj;
+ }
+
+ private static final class A {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/loopstripmining/TestConservativeAntiDep.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2019, Red Hat, Inc. 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 8231550
+ * @summary C2: ShouldNotReachHere() in verify_strip_mined_scheduling
+ *
+ * @run main/othervm -XX:-BackgroundCompilation -XX:LoopMaxUnroll=0 TestConservativeAntiDep
+ *
+ */
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+
+public class TestConservativeAntiDep {
+ private static long longField;
+
+ public static void main(String[] args) throws InstantiationException, IllegalAccessException {
+ for (int i = 0; i < 20_000; i++) {
+ test1(A.class);
+ test2(B.class);
+ }
+ }
+
+ private static int test1(Class klass) {
+ Object[] in = (Object[])Array.newInstance(klass, 100);
+
+ Object[] o = in;
+ int v = 1;
+ // CountedLoop has control dependent CastPP
+ for (int i = 0; i < 100 ; i++) {
+ longField = i; // sunk in outer strip mined loop
+ o = (A[]) o;
+ v *= 2;
+ }
+
+ // LoadRange cannot float higher than CountedLoop (because of
+ // CastPP) and is found anti-dependent with long store so
+ // scheduled in outer strip mined loop
+ return v + o.length;
+ }
+
+ private static int test2(Class klass) throws IllegalAccessException, InstantiationException {
+ A in = (A)klass.newInstance();
+
+ A o = in;
+ int v = 1;
+ // CountedLoop has control dependent CastPP
+ for (int i = 0; i < 100 ; i++) {
+ longField = i; // sunk in outer strip mined loop
+ o = (B) o;
+ v *= 2;
+ }
+
+ // Load cannot float higher than CountedLoop (because of
+ // CastPP) and is found anti-dependent with long store so
+ // scheduled in outer strip mined loop
+ return v + o.intField;
+ }
+
+ private static class A {
+ int intField;
+ public A() {}
+ }
+
+ private static class B extends A {
+ public B() {}
+ }
+}
--- a/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/HelloDynamic.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/HelloDynamic.java Mon Oct 07 16:13:25 2019 +0200
@@ -52,6 +52,9 @@
doTest(baseArchiveName, topArchiveName);
}
+ private static final String JDWP_OPTION =
+ "-Xrunjdwp:transport=dt_socket,server=y,suspend=n";
+
private static void doTest(String baseArchiveName, String topArchiveName) throws Exception {
String appJar = ClassFileInstaller.getJarPath("hello.jar");
String mainClass = "Hello";
@@ -71,5 +74,19 @@
output.shouldContain("Hello source: shared objects file")
.shouldHaveExitValue(0);
});
+
+ // Sanity test with JDWP options.
+ // Test with the default base archive should be sufficient.
+ if (baseArchiveName == null) {
+ run2(baseArchiveName, topArchiveName,
+ JDWP_OPTION,
+ "-Xlog:class+load",
+ "-Xlog:cds+dynamic=debug,cds=debug",
+ "-cp", appJar, mainClass)
+ .assertNormalExit(output -> {
+ output.shouldContain("Hello source: shared objects file")
+ .shouldHaveExitValue(0);
+ });
+ }
}
}
--- a/test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbLauncher.java Mon Oct 07 16:13:25 2019 +0200
@@ -140,6 +140,7 @@
for (String cmd : commands) {
int index = commands.indexOf(cmd) + 1;
OutputAnalyzer out = new OutputAnalyzer(parts[index]);
+ out.shouldNotMatch("Unrecognized command.");
if (expectedStrMap != null) {
List<String> expectedStr = expectedStrMap.get(cmd);
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jdi/Binder.java Mon Oct 07 16:13:25 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2019, 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
@@ -201,8 +201,6 @@
debugee = localLaunchDebugee(vmm, classToExecute, classPath);
} else if (argumentHandler.isAttachingConnector()) {
debugee = localLaunchAndAttachDebugee(vmm, classToExecute, classPath);
- } else if (argumentHandler.isLaunchingConnector()) {
- debugee = localLaunchDebugee(vmm, classToExecute, classPath);
} else if (argumentHandler.isListeningConnector()) {
debugee = localLaunchAndListenDebugee(vmm, classToExecute, classPath);
} else {
--- a/test/jdk/ProblemList.txt Mon Oct 07 15:52:38 2019 +0200
+++ b/test/jdk/ProblemList.txt Mon Oct 07 16:13:25 2019 +0200
@@ -861,6 +861,8 @@
sun/tools/jstat/jstatClassloadOutput1.sh 8173942 generic-all
sun/tools/jhsdb/BasicLauncherTest.java 8193639,8211767 solaris-all,linux-ppc64,linux-ppc64le
sun/tools/jhsdb/HeapDumpTest.java 8193639 solaris-all
+sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java 8230731,8001227 windows-all
+sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java 8231635,8231634 generic-all
############################################################################
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorExample.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.openjdk.tests.java.util.stream;
+
+/*
+ * THE CONTENTS OF THIS FILE HAVE TO BE IN SYNC WITH THE EXAMPLES USED
+ * IN THE JAVADOC.
+ *
+ * @test
+ * @bug 8231161
+ * @compile CollectorExample.java
+ * @summary Compilation test only. Compile code snippets from
+ * java.util.stream.Collector class-level API documentation
+ */
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+public class CollectorExample {
+
+ // Empty helper classes
+
+ class Widget {
+ }
+
+ class Employee {
+ public int getSalary() {
+ return 0; // money isn't everything
+ }
+
+ public Department getDepartment() {
+ return new Department();
+ }
+ }
+
+ class Department {
+ }
+
+ <T, A, R> void testSnippet1(Collector<T, A, R> collector, T t1, T t2) {
+
+ Supplier<A> supplier = collector.supplier();
+ BiConsumer<A, T> accumulator = collector.accumulator();
+ BinaryOperator<A> combiner = collector.combiner();
+ Function<A, R> finisher = collector.finisher();
+
+ // Example start
+ A a1 = supplier.get();
+ accumulator.accept(a1, t1);
+ accumulator.accept(a1, t2);
+ R r1 = finisher.apply(a1);
+
+ A a2 = supplier.get();
+ accumulator.accept(a2, t1);
+ A a3 = supplier.get();
+ accumulator.accept(a3, t2);
+ R r2 = finisher.apply(combiner.apply(a2, a3));
+ }
+
+ void testSnippet2() {
+ Collector<Widget, ?, TreeSet<Widget>> intoSet =
+ Collector.of(TreeSet::new, TreeSet::add,
+ (left, right) -> { left.addAll(right); return left; });
+ }
+
+ <T, A, R> void testSnippet3(Collector<T, A, R> collector, Collection<T> data) {
+ A container = collector.supplier().get();
+ for (T t : data)
+ collector.accumulator().accept(container, t);
+ collector.finisher().apply(container);
+ }
+
+ void testSnippet4and5() {
+ Collector<Employee, ?, Integer> summingSalaries
+ = Collectors.summingInt(Employee::getSalary);
+
+ Collector<Employee, ?, Map<Department, Integer>> summingSalariesByDept
+ = Collectors.groupingBy(Employee::getDepartment, summingSalaries);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/nio/zipfs/CompressionModeTest.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+import org.testng.annotations.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import static java.lang.String.format;
+import static java.util.stream.Collectors.joining;
+import static org.testng.Assert.*;
+
+/**
+ * @test
+ * @bug 8231093
+ * @summary Test Zip FS compressionMethod property
+ * @modules jdk.zipfs
+ * @run testng CompressionModeTest
+ */
+public class CompressionModeTest {
+
+ private static final Path HERE = Path.of(".");
+
+ /**
+ * Number of ZIP entries to create
+ */
+ private static final int ENTRIES = 5;
+
+ /**
+ * Value used for creating the required entries in a ZIP or JAR file
+ */
+ private static final String ZIP_FILE_VALUE = "US Open 2019";
+ private static final byte[] ZIP_FILE_ENTRY =
+ ZIP_FILE_VALUE.getBytes(StandardCharsets.UTF_8);
+
+ private static final SecureRandom random = new SecureRandom();
+
+ /**
+ * Validate that you can create a ZIP file with and without compression
+ * and that entries are created with the specified compression method.
+ *
+ * @param env Properties used for creating the ZIP Filesystem
+ * @param compression Indicates whether the files are DEFLATED(default)
+ * or STORED
+ * @throws Exception If an error occurs during the creation, verification or
+ * deletion of the ZIP file
+ */
+ @Test(dataProvider = "validCompressionMethods", enabled = true)
+ public void testValidCompressionMehods(Map<String, String> env,
+ int compression) throws Exception {
+
+ System.out.printf("ZIP FS Map = %s, Compression mode= %s%n ",
+ formatMap(env), compression);
+
+ Path zipfile = generatePath(HERE, "test", ".zip");
+ Files.deleteIfExists(zipfile);
+ createZipFile(zipfile, env, ENTRIES);
+ verify(zipfile, compression, ENTRIES, 0);
+ Files.deleteIfExists(zipfile);
+ }
+
+ /**
+ * Validate that an IllegalArgumentException is thrown when an invalid
+ * value is specified for the compressionMethod property.
+ *
+ * @param env Properties used for creating the ZIP Filesystem
+ * @throws Exception if an error occurs other than the expected
+ * IllegalArgumentException
+ */
+ @Test(dataProvider = "invalidCompressionMethod")
+ public void testInvalidCompressionMethod(Map<String, String> env) throws Exception {
+ System.out.printf("ZIP FS Map = %s%n ", formatMap(env));
+ Path zipfile = generatePath(HERE, "test", ".zip");
+ Files.deleteIfExists(zipfile);
+ assertThrows(IllegalArgumentException.class, () ->
+ createZipFile(zipfile, env, ENTRIES));
+ Files.deleteIfExists(zipfile);
+ }
+
+ /**
+ * Create a ZIP File System using the specified properties and a ZIP file
+ * with the specified number of entries
+ *
+ * @param zipFile Path to the ZIP File to create
+ * @param env Properties used for creating the ZIP Filesystem
+ * @param entries Number of entries to add to the ZIP File
+ * @throws IOException If an error occurs while creating the ZIP file
+ */
+ private void createZipFile(Path zipFile, Map<String, String> env,
+ int entries) throws IOException {
+ System.out.printf("Creating file = %s%n", zipFile);
+ try (FileSystem zipfs =
+ FileSystems.newFileSystem(zipFile, env)) {
+
+ for (int i = 0; i < entries; i++) {
+ Files.writeString(zipfs.getPath("Entry-" + i), ZIP_FILE_VALUE);
+ }
+ }
+ }
+
+ /**
+ * DataProvider used to validate that you can create a ZIP file with and
+ * without compression.
+ */
+ @DataProvider(name = "validCompressionMethods")
+ private Object[][] validCompressionMethods() {
+ return new Object[][]{
+ {Map.of("create", "true"), ZipEntry.DEFLATED},
+ {Map.of("create", "true", "noCompression", "true"),
+ ZipEntry.STORED},
+ {Map.of("create", "true", "noCompression", "false"),
+ ZipEntry.DEFLATED},
+ {Map.of("create", "true", "compressionMethod", "STORED"),
+ ZipEntry.STORED},
+ {Map.of("create", "true", "compressionMethod", "DEFLATED"),
+ ZipEntry.DEFLATED},
+ {Map.of("create", "true", "compressionMethod", "stored"),
+ ZipEntry.STORED},
+ {Map.of("create", "true", "compressionMethod", "deflated"),
+ ZipEntry.DEFLATED}
+ };
+ }
+
+ /**
+ * DataProvider used to validate that an IllegalArgumentException is thrown
+ * for an invalid value for the compressionMethod property.
+ */
+ @DataProvider(name = "invalidCompressionMethod")
+ private Object[][] invalidCompressionMethod() {
+ HashMap<String, String> map = new HashMap<>();
+ map.put("create", "true");
+ map.put("compressionMethod", null);
+ return new Object[][]{
+ {map},
+ {Map.of("create", "true", "compressionMethod", "")},
+ {Map.of("create", "true", "compressionMethod",
+ Integer.parseInt("5"))},
+ {Map.of("create", "true", "compressionMethod", "invalid")}
+ };
+ }
+
+ /**
+ * Verify that the given path is a ZIP file containing the
+ * expected entries.
+ *
+ * @param zipfile ZIP file to be validated
+ * @param method Expected Compression method: STORED or DEFLATED
+ * @param entries Number of expected entries
+ * @param start Starting number for verifying entries
+ * @throws Exception If an error occurs while examining the ZIP file
+ */
+ private static void verify(Path zipfile, int method, int entries,
+ int start) throws Exception {
+ // check entries with ZIP API
+ try (ZipFile zf = new ZipFile(zipfile.toFile())) {
+ // check entry count
+ assertEquals(entries, zf.size());
+
+ // check compression method and content of each entry
+ for (int i = start; i < entries; i++) {
+ ZipEntry ze = zf.getEntry("Entry-" + i);
+ assertNotNull(ze);
+ assertEquals(method, ze.getMethod());
+ try (InputStream is = zf.getInputStream(ze)) {
+ byte[] bytes = is.readAllBytes();
+ assertTrue(Arrays.equals(bytes, ZIP_FILE_ENTRY));
+ }
+ }
+ }
+ // check entries with FileSystem API
+ try (FileSystem fs = FileSystems.newFileSystem(zipfile)) {
+
+ // check entry count
+ Path top = fs.getPath("/");
+ long count = Files.find(top, Integer.MAX_VALUE, (path, attrs) ->
+ attrs.isRegularFile() || (attrs.isDirectory() &&
+ path.getFileName() != null &&
+ path.getFileName().toString().equals("META-INF")))
+ .count();
+ assertEquals(entries, count);
+
+ // check content of each entry
+ for (int i = start; i < entries; i++) {
+ Path file = fs.getPath("Entry-" + i);
+ byte[] bytes = Files.readAllBytes(file);
+ assertTrue(Arrays.equals(bytes, ZIP_FILE_ENTRY));
+ }
+ }
+ }
+
+ /**
+ * Generate a temporary file Path
+ *
+ * @param dir Directory used to create the path
+ * @param prefix The prefix string used to create the path
+ * @param suffix The suffix string used to create the path
+ * @return Path that was generated
+ */
+ private static Path generatePath(Path dir, String prefix, String suffix) {
+ long n = random.nextLong();
+ String s = prefix + Long.toUnsignedString(n) + suffix;
+ Path name = dir.getFileSystem().getPath(s);
+ // the generated name should be a simple file name
+ if (name.getParent() != null)
+ throw new IllegalArgumentException("Invalid prefix or suffix");
+ return dir.resolve(name);
+ }
+
+ /**
+ * Utility method to return a formatted String of the key:value entries for
+ * a Map
+ *
+ * @param env Map to format
+ * @return Formatted string of the Map entries
+ */
+ private static String formatMap(Map<String, String> env) {
+ return env.entrySet().stream()
+ .map(e -> format("(%s:%s)", e.getKey(), e.getValue()))
+ .collect(joining(", "));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/nio/zipfs/NonExistentPathTests.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.FileSystemNotFoundException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.util.Map;
+
+import static org.testng.Assert.assertThrows;
+
+/**
+ * @test
+ * @bug 8223771
+ * @summary Validate the correct Exception is thrown if the Zip/JAR is not found
+ *
+ * @modules jdk.zipfs
+ * @run testng/othervm NonExistentPathTests
+ */
+public class NonExistentPathTests {
+ private static final String ZIPFS_SCHEME = "jar";
+ private static final ClassLoader CLASS_LOADER = null;
+ // Non-exist JAR file to test against
+ private static final Path INVALID_JAR_FILE = Path.of("jarDoesNotExist.jar");
+ // Standard Exception expected from FileSystems.newFileSystem
+ private static Class<? extends Exception> testException = IOException.class;
+
+ /**
+ * Validate that the correct Exception is thrown when specifying a Path
+ * to a JAR that does not exist and is not being created.
+ */
+ @Test
+ public void testNewFileSystemWithPath() {
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(INVALID_JAR_FILE));
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(INVALID_JAR_FILE, Map.of()));
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(INVALID_JAR_FILE, CLASS_LOADER));
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(INVALID_JAR_FILE, Map.of(), CLASS_LOADER));
+ }
+
+ /**
+ * Validate that the correct Exception is thrown when specifying a URI
+ * to a JAR that does not exist and is not being created.
+ */
+ @Test
+ public void testNewFileSystemWithUri() throws Exception {
+ var jarURI = new URI(ZIPFS_SCHEME,
+ INVALID_JAR_FILE.toUri().toString(), null);
+
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(jarURI, Map.of()));
+
+ assertThrows(testException, () ->
+ FileSystems.newFileSystem(jarURI, Map.of(), CLASS_LOADER));
+ }
+}
--- a/test/jdk/jdk/nio/zipfs/jarfs/MultiReleaseJarTest.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/jdk/jdk/nio/zipfs/jarfs/MultiReleaseJarTest.java Mon Oct 07 16:13:25 2019 +0200
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8144355 8144062 8176709 8194070 8193802
+ * @bug 8144355 8144062 8176709 8194070 8193802 8231093
* @summary Test aliasing additions to ZipFileSystem for multi-release jar files
* @library /lib/testlibrary/java/util/jar
* @modules jdk.compiler
@@ -40,6 +40,7 @@
import java.lang.Runtime.Version;
import java.net.URI;
import java.nio.file.*;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@@ -88,8 +89,7 @@
public Object[][] createStrings() {
return new Object[][]{
{"runtime", MAJOR_VERSION},
- {"-20", 8},
- {"0", 8},
+ {null, 8},
{"8", 8},
{"9", 9},
{Integer.toString(MAJOR_VERSION), MAJOR_VERSION},
@@ -101,8 +101,7 @@
@DataProvider(name="integers")
public Object[][] createIntegers() {
return new Object[][] {
- {Integer.valueOf(-5), 8},
- {Integer.valueOf(0), 8},
+ {null, 8},
{Integer.valueOf(8), 8},
{Integer.valueOf(9), 9},
{Integer.valueOf(MAJOR_VERSION), MAJOR_VERSION},
@@ -114,6 +113,7 @@
@DataProvider(name="versions")
public Object[][] createVersions() {
return new Object[][] {
+ {null, 8},
{Version.parse("8"), 8},
{Version.parse("9"), 9},
{Version.parse(Integer.toString(MAJOR_VERSION)), MAJOR_VERSION},
@@ -122,6 +122,20 @@
};
}
+ @DataProvider(name="invalidVersions")
+ public Object[][] invalidVersions() {
+ return new Object[][] {
+ {Map.of("releaseVersion", "")},
+ {Map.of("releaseVersion", "invalid")},
+ {Map.of("releaseVersion", "0")},
+ {Map.of("releaseVersion", "-1")},
+ {Map.of("releaseVersion", "11.0.1")},
+ {Map.of("releaseVersion", new ArrayList<Long>())},
+ {Map.of("releaseVersion", Integer.valueOf(0))},
+ {Map.of("releaseVersion", Integer.valueOf(-1))}
+ };
+ }
+
// Not the best test but all I can do since ZipFileSystem and JarFileSystem
// are not public, so I can't use (fs instanceof ...)
@Test
@@ -131,7 +145,7 @@
try (FileSystem fs = FileSystems.newFileSystem(mruri, env)) {
Assert.assertTrue(readAndCompare(fs, 8));
}
- env.put("multi-release", "runtime");
+ env.put("releaseVersion", "runtime");
// a configuration and jar file is multi-release
try (FileSystem fs = FileSystems.newFileSystem(mruri, env)) {
Assert.assertTrue(readAndCompare(fs, MAJOR_VERSION));
@@ -150,30 +164,67 @@
@Test(dataProvider="strings")
public void testStrings(String value, int expected) throws Throwable {
+ stringEnv.put("releaseVersion", value);
+ runTest(stringEnv, expected);
+ }
+
+ @Test(dataProvider="integers")
+ public void testIntegers(Integer value, int expected) throws Throwable {
+ integerEnv.put("releaseVersion", value);
+ runTest(integerEnv, expected);
+ }
+
+ @Test(dataProvider="versions")
+ public void testVersions(Version value, int expected) throws Throwable {
+ versionEnv.put("releaseVersion", value);
+ runTest(versionEnv, expected);
+ }
+
+ @Test
+ public void testShortJar() throws Throwable {
+ integerEnv.put("releaseVersion", Integer.valueOf(MAJOR_VERSION));
+ runTest(smruri, integerEnv, MAJOR_VERSION);
+ integerEnv.put("releaseVersion", Integer.valueOf(9));
+ runTest(smruri, integerEnv, 8);
+ }
+
+ /**
+ * Validate that an invalid value for the "releaseVersion" property throws
+ * an {@code IllegalArgumentException}
+ * @param env Zip FS map
+ * @throws Throwable Exception thrown for anything other than the expected
+ * IllegalArgumentException
+ */
+ @Test(dataProvider="invalidVersions")
+ public void testInvalidVersions(Map<String,?> env) throws Throwable {
+ Assert.assertThrows(IllegalArgumentException.class, () ->
+ FileSystems.newFileSystem(Path.of(userdir,
+ "multi-release.jar"), env));
+ }
+
+ // The following tests are for backwards compatibility to validate that
+ // the original property still works
+ @Test(dataProvider="strings")
+ public void testMRStrings(String value, int expected) throws Throwable {
+ stringEnv.clear();
stringEnv.put("multi-release", value);
runTest(stringEnv, expected);
}
@Test(dataProvider="integers")
- public void testIntegers(Integer value, int expected) throws Throwable {
+ public void testMRIntegers(Integer value, int expected) throws Throwable {
+ integerEnv.clear();
integerEnv.put("multi-release", value);
runTest(integerEnv, expected);
}
@Test(dataProvider="versions")
- public void testVersions(Version value, int expected) throws Throwable {
+ public void testMRVersions(Version value, int expected) throws Throwable {
+ versionEnv.clear();
versionEnv.put("multi-release", value);
runTest(versionEnv, expected);
}
- @Test
- public void testShortJar() throws Throwable {
- integerEnv.put("multi-release", Integer.valueOf(MAJOR_VERSION));
- runTest(smruri, integerEnv, MAJOR_VERSION);
- integerEnv.put("multi-release", Integer.valueOf(9));
- runTest(smruri, integerEnv, 8);
- }
-
private void runTest(Map<String,?> env, int expected) throws Throwable {
runTest(mruri, env, expected);
}
@@ -213,7 +264,7 @@
JarBuilder jb = new JarBuilder(jfname);
jb.addAttribute("Multi-Release", "true");
jb.build();
- Map<String,String> env = Map.of("multi-release", "runtime");
+ Map<String,String> env = Map.of("releaseVersion", "runtime");
try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
Assert.assertTrue(true);
}
@@ -228,7 +279,7 @@
creator.buildCustomMultiReleaseJar(fileName, value, Map.of(),
/*addEntries*/true);
- Map<String,String> env = Map.of("multi-release", "runtime");
+ Map<String,String> env = Map.of("releaseVersion", "runtime");
Path filePath = Paths.get(userdir, fileName);
String ssp = filePath.toUri().toString();
URI customJar = new URI("jar", ssp , null);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sun/tools/jhsdb/HeapDumpTestWithActiveProcess.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2019, 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 8230731 8001227 8231635 8231634 8196969
+ * @requires vm.hasSAandCanAttach
+ * @library /test/lib
+ * @compile JShellHeapDumpTest.java
+ * @run main/timeout=240 JShellHeapDumpTest nosleep
+ */
--- a/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/jdk/sun/tools/jhsdb/JShellHeapDumpTest.java Mon Oct 07 16:13:25 2019 +0200
@@ -48,7 +48,8 @@
public class JShellHeapDumpTest {
- protected static Process jShellProcess;
+ static Process jShellProcess;
+ static boolean doSleep = true; // By default do a short sleep when app starts up
public static void launch(String expectedMessage, List<String> toolArgs)
throws IOException {
@@ -141,13 +142,23 @@
// Give jshell a chance to fully start up. This makes SA more stable for the jmap dump.
try {
- Thread.sleep(2000);
+ if (doSleep) {
+ Thread.sleep(2000);
+ }
} catch (Exception e) {
}
}
public static void main(String[] args) throws Exception {
-
+ if (args.length == 1) {
+ if (args[0].equals("nosleep")) {
+ doSleep = false;
+ } else {
+ throw new RuntimeException("Invalid arg: " + args[0]);
+ }
+ } else if (args.length != 0) {
+ throw new RuntimeException("Too many args: " + args.length);
+ }
testHeapDump();
// The test throws RuntimeException on error.
--- a/test/langtools/jdk/javadoc/doclet/testMemberInheritance/TestMemberInheritance.java Mon Oct 07 15:52:38 2019 +0200
+++ b/test/langtools/jdk/javadoc/doclet/testMemberInheritance/TestMemberInheritance.java Mon Oct 07 16:13:25 2019 +0200
@@ -24,7 +24,7 @@
/*
* @test
* @bug 4638588 4635809 6256068 6270645 8025633 8026567 8162363 8175200
- * 8192850 8182765
+ * 8192850 8182765 8220217
* @summary Test to make sure that members are inherited properly in the Javadoc.
* Verify that inheritance labels are correct.
* @author jamieh
@@ -47,7 +47,7 @@
public void test() {
javadoc("-d", "out",
"-sourcepath", testSrc,
- "pkg", "diamond", "inheritDist", "pkg1");
+ "pkg", "diamond", "inheritDist", "pkg1", "pkg2");
checkExit(Exit.OK);
checkOutput("pkg/SubClass.html", true,
@@ -104,5 +104,27 @@
+ "<code><a href=\"Interface.html#between(java.time.chrono.ChronoLocalDate"
+ ",java.time.chrono.ChronoLocalDate)\">between</a></code>"
);
+
+ checkOutput("pkg2/DocumentedNonGenericChild.html", true,
+ "<section class=\"description\">\n<hr>\n"
+ + "<pre>public abstract class <span class=\"typeNameLabel\">"
+ + "DocumentedNonGenericChild</span>\n"
+ + "extends java.lang.Object</pre>\n"
+ + "</section>");
+
+ checkOutput("pkg2/DocumentedNonGenericChild.html", true,
+ "<td class=\"colFirst\"><code>protected abstract java.lang.String</code></td>\n"
+ + "<th class=\"colSecond\" scope=\"row\"><code><span class=\"memberNameLink\">"
+ + "<a href=\"#parentMethod()\">parentMethod</a></span>()</code></th>\n"
+ + "<td class=\"colLast\">\n"
+ + "<div class=\"block\">Returns some value.</div>\n"
+ + "</td>\n");
+
+ checkOutput("pkg2/DocumentedNonGenericChild.html", true,
+ "<h3><a id=\"parentMethod()\">parentMethod</a></h3>\n"
+ + "<div class=\"memberSignature\"><span class=\"modifiers\">protected abstract</span>"
+ + " <span class=\"returnType\">java.lang.String</span> "
+ + "<span class=\"memberName\">parentMethod</span>()</div>");
+
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testMemberInheritance/pkg2/DocumentedNonGenericChild.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package pkg2;
+
+public abstract class DocumentedNonGenericChild extends UndocumentedGenericParent<String> {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testMemberInheritance/pkg2/UndocumentedGenericParent.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package pkg2;
+
+abstract class UndocumentedGenericParent<T> {
+ /**
+ * Returns some value.
+ *
+ * @return some value
+ */
+ protected abstract String parentMethod();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/micro/org/openjdk/bench/java/security/GetContext.java Mon Oct 07 16:13:25 2019 +0200
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, 2019 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.openjdk.bench.java.security;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Benchmark measuring AccessController.getContext
+ */
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@State(Scope.Thread)
+public abstract class GetContext {
+
+ public static class Top extends GetContext {
+
+ @Benchmark
+ public AccessControlContext testNonPriv() {
+ return AccessController.getContext();
+ }
+
+ @Benchmark
+ public AccessControlContext testPriv() {
+ PrivilegedAction<AccessControlContext> pa = () -> AccessController.getContext();
+ return AccessController.doPrivileged(pa);
+ }
+ }
+
+ public static class Deep extends GetContext {
+
+ @Param({"2", "50"})
+ int depth;
+
+ private AccessControlContext recurse(int depth) {
+ if (depth > 0) {
+ return recurse(depth - 1);
+ } else {
+ return AccessController.getContext();
+ }
+ }
+
+ @Benchmark
+ public AccessControlContext testNonPrivRecurse() {
+ return recurse(depth);
+ }
+
+ @Benchmark
+ public AccessControlContext testPrivInline() {
+ PrivilegedAction<AccessControlContext> pa = () -> recurse(depth);
+ return AccessController.doPrivileged(pa);
+ }
+ }
+}