--- a/.hgtags Mon Jul 15 15:23:54 2019 +0530
+++ b/.hgtags Fri Jul 19 14:55:22 2019 +0530
@@ -573,3 +573,4 @@
19d0b382f0869f72d4381b54fa129f1c74b6e766 jdk-14+4
3081f39a3d30d63b112098386ac2bb027c2b7223 jdk-13+29
0f1e29c77e50c7da11d83df410026392c4d1a28c jdk-14+5
+443f7359b34d60e7821216ffc60f88b6ffe0ccdd jdk-14+6
--- a/make/Images.gmk Mon Jul 15 15:23:54 2019 +0530
+++ b/make/Images.gmk Fri Jul 19 14:55:22 2019 +0530
@@ -102,7 +102,7 @@
WARN := Creating legacy jre image, \
DEPS := $(JMODS) $(BASE_RELEASE_FILE) \
$(call DependOnVariable, JDK_MODULES_LIST), \
- OUTPUT_DIR := $(JDK_IMAGE_DIR), \
+ OUTPUT_DIR := $(JRE_IMAGE_DIR), \
SUPPORT_DIR := $(SUPPORT_OUTPUTDIR)/images/jre, \
PRE_COMMAND := $(RM) -r $(JRE_IMAGE_DIR), \
COMMAND := $(JLINK_TOOL) --add-modules $(JRE_MODULES_LIST) \
--- a/make/InitSupport.gmk Mon Jul 15 15:23:54 2019 +0530
+++ b/make/InitSupport.gmk Fri Jul 19 14:55:22 2019 +0530
@@ -424,8 +424,8 @@
$(if $(filter all, $(LOG_REPORT)), \
$(GREP) -v -e "^Note: including file:" < $(logfile) || true $(NEWLINE) \
, \
- ($(GREP) -v -e "^Note: including file:" < $(logfile) || true) | $(HEAD) -n 12 $(NEWLINE) \
- if test `$(WC) -l < $(logfile)` -gt 12; then \
+ ($(GREP) -v -e "^Note: including file:" < $(logfile) || true) | $(HEAD) -n 15 $(NEWLINE) \
+ if test `$(WC) -l < $(logfile)` -gt 15; then \
$(ECHO) " ... (rest of output omitted)" ; \
fi $(NEWLINE) \
) \
--- a/make/hotspot/lib/CompileJvm.gmk Mon Jul 15 15:23:54 2019 +0530
+++ b/make/hotspot/lib/CompileJvm.gmk Fri Jul 19 14:55:22 2019 +0530
@@ -260,6 +260,15 @@
#
# Search the output for the operator(s) of interest, to see where they are
# referenced.
+#
+# When a reference to the global 'operator delete' is reported, it might be
+# due to a "deleting destructor". In this case, objdump may show the
+# reference to be associated with but not actually in a destructor. A
+# deleting destructor is automatically generated for a class whose destructor
+# is virtual. A deleting destructor requires an accessible 'operator delete'
+# for the associated class. If the class doesn't provide a more specific
+# declaration (either directly or by inheriting from a class that provides
+# one) then the global definition will be used, triggering this check.
ifneq ($(GENERATE_COMPILE_COMMANDS_ONLY), true)
ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang solstudio), )
--- a/src/hotspot/cpu/aarch64/gc/shenandoah/c1/shenandoahBarrierSetC1_aarch64.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/aarch64/gc/shenandoah/c1/shenandoahBarrierSetC1_aarch64.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -99,7 +99,7 @@
__ xchg(access.resolved_addr(), value_opr, result, tmp);
if (access.is_oop()) {
- result = load_reference_barrier(access.gen(), result, access.access_emit_info(), true);
+ result = load_reference_barrier(access.gen(), result);
if (ShenandoahSATBBarrier) {
pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
result /* pre_val */);
--- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -24,7 +24,7 @@
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
#include "gc/shenandoah/shenandoahForwarding.hpp"
-#include "gc/shenandoah/shenandoahHeap.hpp"
+#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
#include "gc/shenandoah/shenandoahHeuristics.hpp"
#include "gc/shenandoah/shenandoahRuntime.hpp"
@@ -282,6 +282,40 @@
__ leave();
}
+void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler* masm, Register dst, Register tmp) {
+ if (!ShenandoahLoadRefBarrier) {
+ return;
+ }
+
+ assert(dst != rscratch2, "need rscratch2");
+
+ Label is_null;
+ Label done;
+
+ __ cbz(dst, is_null);
+
+ __ enter();
+
+ Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
+ __ ldrb(rscratch2, gc_state);
+
+ // Check for heap in evacuation phase
+ __ tbz(rscratch2, ShenandoahHeap::EVACUATION_BITPOS, done);
+
+ __ mov(rscratch2, dst);
+ __ push_call_clobbered_registers();
+ __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native));
+ __ mov(r0, rscratch2);
+ __ blrt(lr, 1, 0, MacroAssembler::ret_type_integral);
+ __ mov(rscratch2, r0);
+ __ pop_call_clobbered_registers();
+ __ mov(dst, rscratch2);
+
+ __ bind(done);
+ __ leave();
+ __ bind(is_null);
+}
+
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
if (ShenandoahStoreValEnqueueBarrier) {
// Save possibly live regs.
@@ -309,15 +343,25 @@
void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register dst, Address src, Register tmp1, Register tmp_thread) {
bool on_oop = type == T_OBJECT || type == T_ARRAY;
+ bool not_in_heap = (decorators & IN_NATIVE) != 0;
bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
bool on_reference = on_weak || on_phantom;
+ bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
if (on_oop) {
- load_reference_barrier(masm, dst, tmp1);
-
- if (ShenandoahKeepAliveBarrier && on_reference) {
+ if (not_in_heap) {
+ if (ShenandoahHeap::heap()->is_traversal_mode()) {
+ load_reference_barrier(masm, dst, tmp1);
+ keep_alive = true;
+ } else {
+ load_reference_barrier_native(masm, dst, tmp1);
+ }
+ } else {
+ load_reference_barrier(masm, dst, tmp1);
+ }
+ if (ShenandoahKeepAliveBarrier && on_reference && keep_alive) {
__ enter();
satb_write_barrier_pre(masm /* masm */,
noreg /* obj */,
@@ -469,9 +513,7 @@
__ mov(res, obj);
}
// Check for null.
- if (stub->needs_null_check()) {
- __ cbz(res, done);
- }
+ __ cbz(res, done);
load_reference_barrier_not_null(ce->masm(), res, rscratch1);
@@ -572,7 +614,7 @@
__ push_call_clobbered_registers();
- __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_JRT));
+ __ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
__ blrt(lr, 1, 0, MacroAssembler::ret_type_integral);
__ mov(rscratch1, r0);
__ pop_call_clobbered_registers();
--- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
*
* 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
@@ -58,6 +58,7 @@
void resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp = noreg);
void load_reference_barrier(MacroAssembler* masm, Register dst, Register tmp);
void load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Register tmp);
+ void load_reference_barrier_native(MacroAssembler* masm, Register dst, Register tmp);
address generate_shenandoah_lrb(StubCodeGenerator* cgen);
--- a/src/hotspot/cpu/x86/gc/shenandoah/c1/shenandoahBarrierSetC1_x86.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/x86/gc/shenandoah/c1/shenandoahBarrierSetC1_x86.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -110,7 +110,7 @@
__ xchg(access.resolved_addr(), result, result, LIR_OprFact::illegalOpr);
if (access.is_oop()) {
- result = load_reference_barrier(access.gen(), result, access.access_emit_info(), true);
+ result = load_reference_barrier(access.gen(), result);
if (ShenandoahSATBBarrier) {
pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
result /* pre_val */);
--- a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -24,7 +24,7 @@
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
#include "gc/shenandoah/shenandoahForwarding.hpp"
-#include "gc/shenandoah/shenandoahHeap.hpp"
+#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
#include "gc/shenandoah/shenandoahHeuristics.hpp"
#include "gc/shenandoah/shenandoahRuntime.hpp"
@@ -401,6 +401,86 @@
#endif
}
+void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler* masm, Register dst) {
+ if (!ShenandoahLoadRefBarrier) {
+ return;
+ }
+
+ Label done;
+ Label not_null;
+ Label slow_path;
+
+ // null check
+ __ testptr(dst, dst);
+ __ jcc(Assembler::notZero, not_null);
+ __ jmp(done);
+ __ bind(not_null);
+
+
+#ifdef _LP64
+ Register thread = r15_thread;
+#else
+ Register thread = rcx;
+ if (thread == dst) {
+ thread = rbx;
+ }
+ __ push(thread);
+ __ get_thread(thread);
+#endif
+ assert_different_registers(dst, thread);
+
+ Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
+ __ testb(gc_state, ShenandoahHeap::EVACUATION);
+#ifndef _LP64
+ __ pop(thread);
+#endif
+ __ jccb(Assembler::notZero, slow_path);
+ __ jmp(done);
+ __ bind(slow_path);
+
+ if (dst != rax) {
+ __ xchgptr(dst, rax); // Move obj into rax and save rax into obj.
+ }
+ __ push(rcx);
+ __ push(rdx);
+ __ push(rdi);
+ __ push(rsi);
+#ifdef _LP64
+ __ push(r8);
+ __ push(r9);
+ __ push(r10);
+ __ push(r11);
+ __ push(r12);
+ __ push(r13);
+ __ push(r14);
+ __ push(r15);
+#endif
+
+ __ movptr(rdi, rax);
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), rdi);
+
+#ifdef _LP64
+ __ pop(r15);
+ __ pop(r14);
+ __ pop(r13);
+ __ pop(r12);
+ __ pop(r11);
+ __ pop(r10);
+ __ pop(r9);
+ __ pop(r8);
+#endif
+ __ pop(rsi);
+ __ pop(rdi);
+ __ pop(rdx);
+ __ pop(rcx);
+
+ if (dst != rax) {
+ __ xchgptr(rax, dst); // Swap back obj with rax.
+ }
+
+ __ bind(done);
+}
+
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
if (ShenandoahStoreValEnqueueBarrier) {
storeval_barrier_impl(masm, dst, tmp);
@@ -457,12 +537,24 @@
bool on_oop = type == T_OBJECT || type == T_ARRAY;
bool on_weak = (decorators & ON_WEAK_OOP_REF) != 0;
bool on_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0;
+ bool not_in_heap = (decorators & IN_NATIVE) != 0;
bool on_reference = on_weak || on_phantom;
- BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
+ bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
+
+ BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
if (on_oop) {
- load_reference_barrier(masm, dst);
+ if (not_in_heap) {
+ if (ShenandoahHeap::heap()->is_traversal_mode()) {
+ load_reference_barrier(masm, dst);
+ keep_alive = true;
+ } else {
+ load_reference_barrier_native(masm, dst);
+ }
+ } else {
+ load_reference_barrier(masm, dst);
+ }
- if (ShenandoahKeepAliveBarrier && on_reference) {
+ if (ShenandoahKeepAliveBarrier && on_reference && keep_alive) {
const Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread);
assert_different_registers(dst, tmp1, tmp_thread);
NOT_LP64(__ get_thread(thread));
@@ -788,10 +880,8 @@
}
// Check for null.
- if (stub->needs_null_check()) {
- __ testptr(res, res);
- __ jcc(Assembler::zero, done);
- }
+ __ testptr(res, res);
+ __ jcc(Assembler::zero, done);
load_reference_barrier_not_null(ce->masm(), res);
@@ -943,7 +1033,7 @@
save_vector_registers(cgen->assembler());
__ movptr(rdi, rax);
- __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_JRT), rdi);
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier), rdi);
restore_vector_registers(cgen->assembler());
#ifdef _LP64
--- a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved.
*
* 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
@@ -78,6 +78,7 @@
#endif
void load_reference_barrier(MacroAssembler* masm, Register dst);
+ void load_reference_barrier_native(MacroAssembler* masm, Register dst);
void cmpxchg_oop(MacroAssembler* masm,
Register res, Address addr, Register oldval, Register newval,
--- a/src/hotspot/os/aix/attachListener_aix.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/aix/attachListener_aix.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2018 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -71,17 +71,7 @@
// the file descriptor for the listening socket
static int _listener;
- static void set_path(char* path) {
- if (path == NULL) {
- _has_path = false;
- } else {
- strncpy(_path, path, UNIX_PATH_MAX);
- _path[UNIX_PATH_MAX-1] = '\0';
- _has_path = true;
- }
- }
-
- static void set_listener(int s) { _listener = s; }
+ static bool _atexit_registered;
// reads a request from the given connected socket
static AixAttachOperation* read_request(int s);
@@ -94,6 +84,19 @@
ATTACH_ERROR_BADVERSION = 101 // error codes
};
+ static void set_path(char* path) {
+ if (path == NULL) {
+ _path[0] = '\0';
+ _has_path = false;
+ } else {
+ strncpy(_path, path, UNIX_PATH_MAX);
+ _path[UNIX_PATH_MAX-1] = '\0';
+ _has_path = true;
+ }
+ }
+
+ static void set_listener(int s) { _listener = s; }
+
// initialize the listener, returns 0 if okay
static int init();
@@ -130,6 +133,7 @@
char AixAttachListener::_path[UNIX_PATH_MAX];
bool AixAttachListener::_has_path;
int AixAttachListener::_listener = -1;
+bool AixAttachListener::_atexit_registered = false;
// Shutdown marker to prevent accept blocking during clean-up
bool AixAttachListener::_shutdown = false;
@@ -177,17 +181,15 @@
// should be sufficient for cleanup.
extern "C" {
static void listener_cleanup() {
- static int cleanup_done;
- if (!cleanup_done) {
- cleanup_done = 1;
- AixAttachListener::set_shutdown(true);
- int s = AixAttachListener::listener();
- if (s != -1) {
- ::shutdown(s, 2);
- }
- if (AixAttachListener::has_path()) {
- ::unlink(AixAttachListener::path());
- }
+ AixAttachListener::set_shutdown(true);
+ int s = AixAttachListener::listener();
+ if (s != -1) {
+ AixAttachListener::set_listener(-1);
+ ::shutdown(s, 2);
+ }
+ if (AixAttachListener::has_path()) {
+ ::unlink(AixAttachListener::path());
+ AixAttachListener::set_path(NULL);
}
}
}
@@ -200,7 +202,10 @@
int listener; // listener socket (file descriptor)
// register function to cleanup
- ::atexit(listener_cleanup);
+ if (!_atexit_registered) {
+ _atexit_registered = true;
+ ::atexit(listener_cleanup);
+ }
int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
os::get_temp_directory(), os::current_process_id());
@@ -515,6 +520,26 @@
return ret_code;
}
+bool AttachListener::check_socket_file() {
+ int ret;
+ struct stat64 st;
+ ret = stat64(AixAttachListener::path(), &st);
+ if (ret == -1) { // need to restart attach listener.
+ log_debug(attach)("Socket file %s does not exist - Restart Attach Listener",
+ AixAttachListener::path());
+
+ listener_cleanup();
+
+ // wait to terminate current attach listener instance...
+ while (AttachListener::transit_state(AL_INITIALIZING,
+ AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) {
+ os::naked_yield();
+ }
+ return is_init_trigger();
+ }
+ return false;
+}
+
// Attach Listener is started lazily except in the case when
// +ReduseSignalUsage is used
bool AttachListener::init_at_startup() {
--- a/src/hotspot/os/aix/loadlib_aix.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/aix/loadlib_aix.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2015 SAP SE. All rights reserved.
+ * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2019 SAP SE. 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
@@ -207,7 +207,7 @@
}
}
- trcVerbose("loadquery buffer size is %llu.", buflen);
+ trcVerbose("loadquery buffer size is " SIZE_FORMAT ".", buflen);
// Iterate over the loadquery result. For details see sys/ldr.h on AIX.
ldi = (struct ld_info*) buffer;
@@ -264,7 +264,7 @@
e->info.is_in_vm = true;
}
- trcVerbose("entry: %p %llu, %p %llu, %s %s %s, %d",
+ trcVerbose("entry: %p " SIZE_FORMAT ", %p " SIZE_FORMAT ", %s %s %s, %d",
e->info.text, e->info.text_len,
e->info.data, e->info.data_len,
e->info.path, e->info.shortname,
--- a/src/hotspot/os/aix/os_aix.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/aix/os_aix.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -4075,7 +4075,7 @@
assert(minor > 0, "invalid OS release");
_os_version = (major << 24) | (minor << 16);
char ver_str[20] = {0};
- char *name_str = "unknown OS";
+ const char* name_str = "unknown OS";
if (strcmp(uts.sysname, "OS400") == 0) {
// We run on AS/400 PASE. We do not support versions older than V5R4M0.
_on_pase = 1;
@@ -4086,19 +4086,19 @@
name_str = "OS/400 (pase)";
jio_snprintf(ver_str, sizeof(ver_str), "%u.%u", major, minor);
} else if (strcmp(uts.sysname, "AIX") == 0) {
- // We run on AIX. We do not support versions older than AIX 5.3.
+ // We run on AIX. We do not support versions older than AIX 7.1.
_on_pase = 0;
// Determine detailed AIX version: Version, Release, Modification, Fix Level.
odmWrapper::determine_os_kernel_version(&_os_version);
- if (os_version_short() < 0x0503) {
- trcVerbose("AIX release older than AIX 5.3 not supported.");
+ if (os_version_short() < 0x0701) {
+ trcVerbose("AIX releases older than AIX 7.1 are not supported.");
assert(false, "AIX release too old.");
}
name_str = "AIX";
jio_snprintf(ver_str, sizeof(ver_str), "%u.%u.%u.%u",
major, minor, (_os_version >> 8) & 0xFF, _os_version & 0xFF);
} else {
- assert(false, name_str);
+ assert(false, "%s", name_str);
}
trcVerbose("We run on %s %s", name_str, ver_str);
}
--- a/src/hotspot/os/aix/perfMemory_aix.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/aix/perfMemory_aix.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1111,7 +1111,7 @@
if ((statbuf.st_size == 0) ||
((size_t)statbuf.st_size % os::vm_page_size() != 0)) {
- THROW_MSG_0(vmSymbols::java_lang_Exception(),
+ THROW_MSG_0(vmSymbols::java_io_IOException(),
"Invalid PerfMemory size");
}
--- a/src/hotspot/os/bsd/attachListener_bsd.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/bsd/attachListener_bsd.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -68,17 +68,7 @@
// the file descriptor for the listening socket
static int _listener;
- static void set_path(char* path) {
- if (path == NULL) {
- _has_path = false;
- } else {
- strncpy(_path, path, UNIX_PATH_MAX);
- _path[UNIX_PATH_MAX-1] = '\0';
- _has_path = true;
- }
- }
-
- static void set_listener(int s) { _listener = s; }
+ static bool _atexit_registered;
// reads a request from the given connected socket
static BsdAttachOperation* read_request(int s);
@@ -91,6 +81,19 @@
ATTACH_ERROR_BADVERSION = 101 // error codes
};
+ static void set_path(char* path) {
+ if (path == NULL) {
+ _path[0] = '\0';
+ _has_path = false;
+ } else {
+ strncpy(_path, path, UNIX_PATH_MAX);
+ _path[UNIX_PATH_MAX-1] = '\0';
+ _has_path = true;
+ }
+ }
+
+ static void set_listener(int s) { _listener = s; }
+
// initialize the listener, returns 0 if okay
static int init();
@@ -124,6 +127,7 @@
char BsdAttachListener::_path[UNIX_PATH_MAX];
bool BsdAttachListener::_has_path;
int BsdAttachListener::_listener = -1;
+bool BsdAttachListener::_atexit_registered = false;
// Supporting class to help split a buffer into individual components
class ArgumentIterator : public StackObj {
@@ -158,16 +162,15 @@
// bound too.
extern "C" {
static void listener_cleanup() {
- static int cleanup_done;
- if (!cleanup_done) {
- cleanup_done = 1;
- int s = BsdAttachListener::listener();
- if (s != -1) {
- ::close(s);
- }
- if (BsdAttachListener::has_path()) {
- ::unlink(BsdAttachListener::path());
- }
+ int s = BsdAttachListener::listener();
+ if (s != -1) {
+ BsdAttachListener::set_listener(-1);
+ ::shutdown(s, SHUT_RDWR);
+ ::close(s);
+ }
+ if (BsdAttachListener::has_path()) {
+ ::unlink(BsdAttachListener::path());
+ BsdAttachListener::set_path(NULL);
}
}
}
@@ -180,7 +183,10 @@
int listener; // listener socket (file descriptor)
// register function to cleanup
- ::atexit(listener_cleanup);
+ if (!_atexit_registered) {
+ _atexit_registered = true;
+ ::atexit(listener_cleanup);
+ }
int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
os::get_temp_directory(), os::current_process_id());
@@ -485,6 +491,28 @@
return ret_code;
}
+bool AttachListener::check_socket_file() {
+ int ret;
+ struct stat st;
+ ret = stat(BsdAttachListener::path(), &st);
+ if (ret == -1) { // need to restart attach listener.
+ log_debug(attach)("Socket file %s does not exist - Restart Attach Listener",
+ BsdAttachListener::path());
+
+ listener_cleanup();
+
+ // wait to terminate current attach listener instance...
+
+ while (AttachListener::transit_state(AL_INITIALIZING,
+
+ AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) {
+ os::naked_yield();
+ }
+ return is_init_trigger();
+ }
+ return false;
+}
+
// Attach Listener is started lazily except in the case when
// +ReduseSignalUsage is used
bool AttachListener::init_at_startup() {
--- a/src/hotspot/os/bsd/perfMemory_bsd.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/bsd/perfMemory_bsd.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1028,7 +1028,7 @@
if ((statbuf.st_size == 0) ||
((size_t)statbuf.st_size % os::vm_page_size() != 0)) {
- THROW_MSG_0(vmSymbols::java_lang_Exception(),
+ THROW_MSG_0(vmSymbols::java_io_IOException(),
"Invalid PerfMemory size");
}
--- a/src/hotspot/os/linux/attachListener_linux.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/linux/attachListener_linux.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -69,17 +69,7 @@
// the file descriptor for the listening socket
static int _listener;
- static void set_path(char* path) {
- if (path == NULL) {
- _has_path = false;
- } else {
- strncpy(_path, path, UNIX_PATH_MAX);
- _path[UNIX_PATH_MAX-1] = '\0';
- _has_path = true;
- }
- }
-
- static void set_listener(int s) { _listener = s; }
+ static bool _atexit_registered;
// reads a request from the given connected socket
static LinuxAttachOperation* read_request(int s);
@@ -92,6 +82,19 @@
ATTACH_ERROR_BADVERSION = 101 // error codes
};
+ static void set_path(char* path) {
+ if (path == NULL) {
+ _path[0] = '\0';
+ _has_path = false;
+ } else {
+ strncpy(_path, path, UNIX_PATH_MAX);
+ _path[UNIX_PATH_MAX-1] = '\0';
+ _has_path = true;
+ }
+ }
+
+ static void set_listener(int s) { _listener = s; }
+
// initialize the listener, returns 0 if okay
static int init();
@@ -125,6 +128,7 @@
char LinuxAttachListener::_path[UNIX_PATH_MAX];
bool LinuxAttachListener::_has_path;
int LinuxAttachListener::_listener = -1;
+bool LinuxAttachListener::_atexit_registered = false;
// Supporting class to help split a buffer into individual components
class ArgumentIterator : public StackObj {
@@ -159,16 +163,15 @@
// bound too.
extern "C" {
static void listener_cleanup() {
- static int cleanup_done;
- if (!cleanup_done) {
- cleanup_done = 1;
- int s = LinuxAttachListener::listener();
- if (s != -1) {
- ::close(s);
- }
- if (LinuxAttachListener::has_path()) {
- ::unlink(LinuxAttachListener::path());
- }
+ int s = LinuxAttachListener::listener();
+ if (s != -1) {
+ LinuxAttachListener::set_listener(-1);
+ ::shutdown(s, SHUT_RDWR);
+ ::close(s);
+ }
+ if (LinuxAttachListener::has_path()) {
+ ::unlink(LinuxAttachListener::path());
+ LinuxAttachListener::set_path(NULL);
}
}
}
@@ -181,7 +184,10 @@
int listener; // listener socket (file descriptor)
// register function to cleanup
- ::atexit(listener_cleanup);
+ if (!_atexit_registered) {
+ _atexit_registered = true;
+ ::atexit(listener_cleanup);
+ }
int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
os::get_temp_directory(), os::current_process_id());
@@ -485,6 +491,26 @@
return ret_code;
}
+bool AttachListener::check_socket_file() {
+ int ret;
+ struct stat64 st;
+ ret = stat64(LinuxAttachListener::path(), &st);
+ if (ret == -1) { // need to restart attach listener.
+ log_debug(attach)("Socket file %s does not exist - Restart Attach Listener",
+ LinuxAttachListener::path());
+
+ listener_cleanup();
+
+ // wait to terminate current attach listener instance...
+ while (AttachListener::transit_state(AL_INITIALIZING,
+ AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) {
+ os::naked_yield();
+ }
+ return is_init_trigger();
+ }
+ return false;
+}
+
// Attach Listener is started lazily except in the case when
// +ReduseSignalUsage is used
bool AttachListener::init_at_startup() {
--- a/src/hotspot/os/linux/perfMemory_linux.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/linux/perfMemory_linux.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1107,7 +1107,7 @@
if ((statbuf.st_size == 0) ||
((size_t)statbuf.st_size % os::vm_page_size() != 0)) {
- THROW_MSG_0(vmSymbols::java_lang_Exception(),
+ THROW_MSG_0(vmSymbols::java_io_IOException(),
"Invalid PerfMemory size");
}
--- a/src/hotspot/os/solaris/attachListener_solaris.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/solaris/attachListener_solaris.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -75,17 +75,7 @@
// door descriptor returned by door_create
static int _door_descriptor;
- static void set_door_path(char* path) {
- if (path == NULL) {
- _has_door_path = false;
- } else {
- strncpy(_door_path, path, PATH_MAX);
- _door_path[PATH_MAX] = '\0'; // ensure it's nul terminated
- _has_door_path = true;
- }
- }
-
- static void set_door_descriptor(int dd) { _door_descriptor = dd; }
+ static bool _atexit_registered;
// mutex to protect operation list
static mutex_t _mutex;
@@ -121,6 +111,19 @@
ATTACH_ERROR_DENIED = 104
};
+ static void set_door_path(char* path) {
+ if (path == NULL) {
+ _door_path[0] = '\0';
+ _has_door_path = false;
+ } else {
+ strncpy(_door_path, path, PATH_MAX);
+ _door_path[PATH_MAX] = '\0'; // ensure it's nul terminated
+ _has_door_path = true;
+ }
+ }
+
+ static void set_door_descriptor(int dd) { _door_descriptor = dd; }
+
// initialize the listener
static int init();
@@ -169,6 +172,7 @@
char SolarisAttachListener::_door_path[PATH_MAX+1];
volatile bool SolarisAttachListener::_has_door_path;
int SolarisAttachListener::_door_descriptor = -1;
+bool SolarisAttachListener::_atexit_registered = false;
mutex_t SolarisAttachListener::_mutex;
sema_t SolarisAttachListener::_wakeup;
SolarisAttachOperation* SolarisAttachListener::_head = NULL;
@@ -364,18 +368,16 @@
// atexit hook to detach the door and remove the file
extern "C" {
static void listener_cleanup() {
- static int cleanup_done;
- if (!cleanup_done) {
- cleanup_done = 1;
- int dd = SolarisAttachListener::door_descriptor();
- if (dd >= 0) {
- ::close(dd);
- }
- if (SolarisAttachListener::has_door_path()) {
- char* path = SolarisAttachListener::door_path();
- ::fdetach(path);
- ::unlink(path);
- }
+ int dd = SolarisAttachListener::door_descriptor();
+ if (dd >= 0) {
+ SolarisAttachListener::set_door_descriptor(-1);
+ ::close(dd);
+ }
+ if (SolarisAttachListener::has_door_path()) {
+ char* path = SolarisAttachListener::door_path();
+ ::fdetach(path);
+ ::unlink(path);
+ SolarisAttachListener::set_door_path(NULL);
}
}
}
@@ -387,7 +389,10 @@
int fd, res;
// register exit function
- ::atexit(listener_cleanup);
+ if (!_atexit_registered) {
+ _atexit_registered = true;
+ ::atexit(listener_cleanup);
+ }
// create the door descriptor
int dd = ::door_create(enqueue_proc, NULL, 0);
@@ -643,6 +648,26 @@
}
}
+bool AttachListener::check_socket_file() {
+ int ret;
+ struct stat64 st;
+ ret = stat64(SolarisAttachListener::door_path(), &st);
+ if (ret == -1) { // need to restart attach listener.
+ log_debug(attach)("Door file %s does not exist - Restart Attach Listener",
+ SolarisAttachListener::door_path());
+
+ listener_cleanup();
+
+ // wait to terminate current attach listener instance...
+ while (AttachListener::transit_state(AL_INITIALIZING,
+ AL_NOT_INITIALIZED) != AL_NOT_INITIALIZED) {
+ os::naked_yield();
+ }
+ return is_init_trigger();
+ }
+ return false;
+}
+
// If the file .attach_pid<pid> exists in the working directory
// or /tmp then this is the trigger to start the attach mechanism
bool AttachListener::is_init_trigger() {
--- a/src/hotspot/os/solaris/perfMemory_solaris.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/solaris/perfMemory_solaris.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1055,7 +1055,7 @@
if ((statbuf.st_size == 0) ||
((size_t)statbuf.st_size % os::vm_page_size() != 0)) {
- THROW_MSG_0(vmSymbols::java_lang_Exception(),
+ THROW_MSG_0(vmSymbols::java_io_IOException(),
"Invalid PerfMemory size");
}
--- a/src/hotspot/os/windows/attachListener_windows.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/windows/attachListener_windows.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -383,6 +383,12 @@
return Win32AttachListener::init();
}
+// This function is used for Un*x OSes only.
+// We need not to implement it for Windows.
+bool AttachListener::check_socket_file() {
+ return false;
+}
+
bool AttachListener::init_at_startup() {
return true;
}
--- a/src/hotspot/os/windows/perfMemory_windows.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/os/windows/perfMemory_windows.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1561,7 +1561,7 @@
warning("unexpected file size: size = " SIZE_FORMAT "\n",
statbuf.st_size);
}
- THROW_MSG_0(vmSymbols::java_lang_Exception(),
+ THROW_MSG_0(vmSymbols::java_io_IOException(),
"Invalid PerfMemory size");
}
--- a/src/hotspot/share/adlc/formssel.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/adlc/formssel.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -1513,7 +1513,7 @@
MatchNode *mnode =
strcmp(_matrule->_opType, "Set") ? _matrule : _matrule->_rChild;
- mnode->count_instr_names(names);
+ if (mnode != NULL) mnode->count_instr_names(names);
uint first = 1;
// Start with the predicate supplied in the .ad file.
@@ -1726,26 +1726,25 @@
const char *description = NULL;
const char *value = NULL;
// Check if user provided any opcode definitions
- if( this != NULL ) {
- // Update 'value' if user provided a definition in the instruction
- switch (desired_opcode) {
- case PRIMARY:
- description = "primary()";
- if( _primary != NULL) { value = _primary; }
- break;
- case SECONDARY:
- description = "secondary()";
- if( _secondary != NULL ) { value = _secondary; }
- break;
- case TERTIARY:
- description = "tertiary()";
- if( _tertiary != NULL ) { value = _tertiary; }
- break;
- default:
- assert( false, "ShouldNotReachHere();");
- break;
- }
+ // Update 'value' if user provided a definition in the instruction
+ switch (desired_opcode) {
+ case PRIMARY:
+ description = "primary()";
+ if( _primary != NULL) { value = _primary; }
+ break;
+ case SECONDARY:
+ description = "secondary()";
+ if( _secondary != NULL ) { value = _secondary; }
+ break;
+ case TERTIARY:
+ description = "tertiary()";
+ if( _tertiary != NULL ) { value = _tertiary; }
+ break;
+ default:
+ assert( false, "ShouldNotReachHere();");
+ break;
}
+
if (value != NULL) {
fprintf(fp, "(%s /*%s*/)", value, description);
}
@@ -3413,7 +3412,6 @@
// Count occurrences of operands names in the leaves of the instruction
// match rule.
void MatchNode::count_instr_names( Dict &names ) {
- if( this == NULL ) return;
if( _lChild ) _lChild->count_instr_names(names);
if( _rChild ) _rChild->count_instr_names(names);
if( !_lChild && !_rChild ) {
--- a/src/hotspot/share/adlc/output_c.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/adlc/output_c.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -2377,7 +2377,7 @@
_processing_noninput = false;
// A replacement variable, originally '$'
if ( Opcode::as_opcode_type(rep_var) != Opcode::NOT_AN_OPCODE ) {
- if (!_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(rep_var) )) {
+ if ((_inst._opcode == NULL) || !_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(rep_var) )) {
// Missing opcode
_AD.syntax_err( _inst._linenum,
"Missing $%s opcode definition in %s, used by encoding %s\n",
@@ -2433,7 +2433,7 @@
else if( Opcode::as_opcode_type(inst_rep_var) != Opcode::NOT_AN_OPCODE ) {
// else check if "primary", "secondary", "tertiary"
assert( _constant_status == LITERAL_ACCESSED, "Must be processing a literal constant parameter");
- if (!_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(inst_rep_var) )) {
+ if ((_inst._opcode == NULL) || !_inst._opcode->print_opcode(_fp, Opcode::as_opcode_type(inst_rep_var) )) {
// Missing opcode
_AD.syntax_err( _inst._linenum,
"Missing $%s opcode definition in %s\n",
--- a/src/hotspot/share/classfile/stringTable.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/classfile/stringTable.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -342,7 +342,7 @@
if (found_string != NULL) {
return found_string;
}
- return do_intern(string_or_null_h, name, len, hash, CHECK_NULL);
+ return do_intern(string_or_null_h, name, len, hash, THREAD);
}
oop StringTable::do_intern(Handle string_or_null_h, const jchar* name,
--- a/src/hotspot/share/classfile/systemDictionary.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/classfile/systemDictionary.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -114,6 +114,7 @@
const int defaultProtectionDomainCacheSize = 1009;
+OopStorage* SystemDictionary::_vm_global_oop_storage = NULL;
OopStorage* SystemDictionary::_vm_weak_oop_storage = NULL;
@@ -1844,7 +1845,7 @@
return unloading_occurred;
}
-void SystemDictionary::oops_do(OopClosure* f) {
+void SystemDictionary::oops_do(OopClosure* f, bool include_handles) {
f->do_oop(&_java_system_loader);
f->do_oop(&_java_platform_loader);
f->do_oop(&_system_loader_lock_obj);
@@ -1852,6 +1853,10 @@
// Visit extra methods
invoke_method_table()->oops_do(f);
+
+ if (include_handles) {
+ vm_global_oop_storage()->oops_do(f);
+ }
}
// CDS: scan and relocate all classes referenced by _well_known_klasses[].
@@ -2893,12 +2898,22 @@
}
void SystemDictionary::initialize_oop_storage() {
+ _vm_global_oop_storage =
+ new OopStorage("VM Global Oop Handles",
+ VMGlobalAlloc_lock,
+ VMGlobalActive_lock);
+
_vm_weak_oop_storage =
new OopStorage("VM Weak Oop Handles",
VMWeakAlloc_lock,
VMWeakActive_lock);
}
+OopStorage* SystemDictionary::vm_global_oop_storage() {
+ assert(_vm_global_oop_storage != NULL, "Uninitialized");
+ return _vm_global_oop_storage;
+}
+
OopStorage* SystemDictionary::vm_weak_oop_storage() {
assert(_vm_weak_oop_storage != NULL, "Uninitialized");
return _vm_weak_oop_storage;
--- a/src/hotspot/share/classfile/systemDictionary.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/classfile/systemDictionary.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -348,7 +348,9 @@
static bool do_unloading(GCTimer* gc_timer);
// Applies "f->do_oop" to all root oops in the system dictionary.
- static void oops_do(OopClosure* f);
+ // If include_handles is true (the default), then the handles in the
+ // storage object returned by vm_global_oop_storage() are included.
+ static void oops_do(OopClosure* f, bool include_handles = true);
// System loader lock
static oop system_loader_lock() { return _system_loader_lock_obj; }
@@ -563,7 +565,8 @@
// ProtectionDomain cache
static ProtectionDomainCacheTable* _pd_cache_table;
- // VM weak OopStorage object.
+ // VM OopStorage objects.
+ static OopStorage* _vm_global_oop_storage;
static OopStorage* _vm_weak_oop_storage;
protected:
@@ -621,6 +624,7 @@
}
static void initialize_oop_storage();
+ static OopStorage* vm_global_oop_storage();
static OopStorage* vm_weak_oop_storage();
protected:
--- a/src/hotspot/share/code/codeCache.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/code/codeCache.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -771,9 +771,10 @@
uint8_t CodeCache::_unloading_cycle = 1;
void CodeCache::increment_unloading_cycle() {
- if (_unloading_cycle == 1) {
- _unloading_cycle = 2;
- } else {
+ // 2-bit value (see IsUnloadingState in nmethod.cpp for details)
+ // 0 is reserved for new methods.
+ _unloading_cycle = (_unloading_cycle + 1) % 4;
+ if (_unloading_cycle == 0) {
_unloading_cycle = 1;
}
}
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -3683,7 +3683,7 @@
{
Ticks start = Ticks::now();
- rem_set()->merge_heap_roots(false /* remset_only */, G1GCPhaseTimes::MergeRS);
+ rem_set()->merge_heap_roots(true /* initial_evacuation */);
p->record_merge_heap_roots_time((Ticks::now() - start).seconds() * 1000.0);
}
@@ -3759,7 +3759,7 @@
{
Ticks start = Ticks::now();
- rem_set()->merge_heap_roots(true /* remset_only */, G1GCPhaseTimes::OptMergeRS);
+ rem_set()->merge_heap_roots(false /* initial_evacuation */);
phase_times()->record_or_add_optional_merge_heap_roots_time((Ticks::now() - start).seconds() * 1000.0);
}
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -353,6 +353,7 @@
assert(Thread::current()->is_VM_thread(), "current thread is not VM thread"); \
} while (0)
+#ifdef ASSERT
#define assert_used_and_recalculate_used_equal(g1h) \
do { \
size_t cur_used_bytes = g1h->used(); \
@@ -361,6 +362,9 @@
" same as recalculated used(" SIZE_FORMAT ").", \
cur_used_bytes, recal_used_bytes); \
} while (0)
+#else
+#define assert_used_and_recalculate_used_equal(g1h) do {} while(0)
+#endif
const char* young_gc_name() const;
--- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -61,11 +61,12 @@
_gc_par_phases[CLDGRoots] = new WorkerDataArray<double>(max_gc_threads, "CLDG Roots (ms):");
_gc_par_phases[JVMTIRoots] = new WorkerDataArray<double>(max_gc_threads, "JVMTI Roots (ms):");
AOT_ONLY(_gc_par_phases[AOTCodeRoots] = new WorkerDataArray<double>(max_gc_threads, "AOT Root Scan (ms):");)
- JVMCI_ONLY(_gc_par_phases[JVMCIRoots] = new WorkerDataArray<double>(max_gc_threads, "JVMCI Root Scan (ms):");)
_gc_par_phases[CMRefRoots] = new WorkerDataArray<double>(max_gc_threads, "CM RefProcessor Roots (ms):");
_gc_par_phases[WaitForStrongCLD] = new WorkerDataArray<double>(max_gc_threads, "Wait For Strong CLD (ms):");
_gc_par_phases[WeakCLDRoots] = new WorkerDataArray<double>(max_gc_threads, "Weak CLD Roots (ms):");
+ _gc_par_phases[MergeER] = new WorkerDataArray<double>(max_gc_threads, "Eager Reclaim (ms):");
+
_gc_par_phases[MergeRS] = new WorkerDataArray<double>(max_gc_threads, "Remembered Sets (ms):");
_merge_rs_merged_sparse = new WorkerDataArray<size_t>(max_gc_threads, "Merged Sparse:");
_gc_par_phases[MergeRS]->link_thread_work_items(_merge_rs_merged_sparse, MergeRSMergedSparse);
@@ -166,6 +167,8 @@
_cur_strong_code_root_purge_time_ms = 0.0;
_cur_merge_heap_roots_time_ms = 0.0;
_cur_optional_merge_heap_roots_time_ms = 0.0;
+ _cur_prepare_merge_heap_roots_time_ms = 0.0;
+ _cur_optional_prepare_merge_heap_roots_time_ms = 0.0;
_cur_evac_fail_recalc_used = 0.0;
_cur_evac_fail_remove_self_forwards = 0.0;
_cur_string_deduplication_time_ms = 0.0;
@@ -248,9 +251,10 @@
// Make sure all slots are uninitialized since this thread did not seem to have been started
ASSERT_PHASE_UNINITIALIZED(GCWorkerEnd);
ASSERT_PHASE_UNINITIALIZED(ExtRootScan);
- ASSERT_PHASE_UNINITIALIZED(MergeHCC);
+ ASSERT_PHASE_UNINITIALIZED(MergeER);
ASSERT_PHASE_UNINITIALIZED(MergeRS);
ASSERT_PHASE_UNINITIALIZED(OptMergeRS);
+ ASSERT_PHASE_UNINITIALIZED(MergeHCC);
ASSERT_PHASE_UNINITIALIZED(MergeLB);
ASSERT_PHASE_UNINITIALIZED(ScanHR);
ASSERT_PHASE_UNINITIALIZED(CodeRoots);
@@ -413,6 +417,8 @@
const double sum_ms = _cur_optional_evac_ms + _cur_optional_merge_heap_roots_time_ms;
if (sum_ms > 0) {
info_time("Merge Optional Heap Roots", _cur_optional_merge_heap_roots_time_ms);
+
+ debug_time("Prepare Optional Merge Heap Roots", _cur_optional_prepare_merge_heap_roots_time_ms);
debug_phase(_gc_par_phases[OptMergeRS]);
info_time("Evacuate Optional Collection Set", _cur_optional_evac_ms);
@@ -427,6 +433,8 @@
double G1GCPhaseTimes::print_evacuate_initial_collection_set() const {
info_time("Merge Heap Roots", _cur_merge_heap_roots_time_ms);
+ debug_time("Prepare Merge Heap Roots", _cur_prepare_merge_heap_roots_time_ms);
+ debug_phase(_gc_par_phases[MergeER]);
debug_phase(_gc_par_phases[MergeRS]);
if (G1HotCardCache::default_use_cache()) {
debug_phase(_gc_par_phases[MergeHCC]);
@@ -554,10 +562,10 @@
"CLDGRoots",
"JVMTIRoots",
AOT_ONLY("AOTCodeRoots" COMMA)
- JVMCI_ONLY("JVMCIRoots" COMMA)
"CMRefRoots",
"WaitForStrongCLD",
"WeakCLDRoots",
+ "MergeER",
"MergeRS",
"OptMergeRS",
"MergeLB",
--- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -56,10 +56,10 @@
CLDGRoots,
JVMTIRoots,
AOT_ONLY(AOTCodeRoots COMMA)
- JVMCI_ONLY(JVMCIRoots COMMA)
CMRefRoots,
WaitForStrongCLD,
WeakCLDRoots,
+ MergeER,
MergeRS,
OptMergeRS,
MergeLB,
@@ -164,6 +164,9 @@
double _cur_merge_heap_roots_time_ms;
double _cur_optional_merge_heap_roots_time_ms;
+ double _cur_prepare_merge_heap_roots_time_ms;
+ double _cur_optional_prepare_merge_heap_roots_time_ms;
+
double _cur_prepare_tlab_time_ms;
double _cur_resize_tlab_time_ms;
@@ -308,6 +311,14 @@
_cur_optional_merge_heap_roots_time_ms += ms;
}
+ void record_prepare_merge_heap_roots_time(double ms) {
+ _cur_prepare_merge_heap_roots_time_ms += ms;
+ }
+
+ void record_or_add_optional_prepare_merge_heap_roots_time(double ms) {
+ _cur_optional_prepare_merge_heap_roots_time_ms += ms;
+ }
+
void record_evac_fail_recalc_used_time(double ms) {
_cur_evac_fail_recalc_used = ms;
}
--- a/src/hotspot/share/gc/g1/g1Policy.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1Policy.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -684,7 +684,9 @@
if (remset_cards_scanned > 10) {
double avg_time_remset_scan = ((average_time_ms(G1GCPhaseTimes::ScanHR) + average_time_ms(G1GCPhaseTimes::OptScanHR)) *
remset_cards_scanned / total_cards_scanned) +
- average_time_ms(G1GCPhaseTimes::MergeRS);
+ average_time_ms(G1GCPhaseTimes::MergeER) +
+ average_time_ms(G1GCPhaseTimes::MergeRS) +
+ average_time_ms(G1GCPhaseTimes::OptMergeRS);
cost_per_remset_card_ms = avg_time_remset_scan / remset_cards_scanned;
_analytics->report_cost_per_remset_card_ms(cost_per_remset_card_ms, this_pause_was_young_only);
--- a/src/hotspot/share/gc/g1/g1RemSet.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1RemSet.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -183,259 +183,6 @@
}
};
- // Returns whether the given region contains cards we need to scan. The remembered
- // set and other sources may contain cards that
- // - are in uncommitted regions
- // - are located in the collection set
- // - are located in free regions
- // as we do not clean up remembered sets before merging heap roots.
- bool contains_cards_to_process(uint const region_idx) const {
- HeapRegion* hr = G1CollectedHeap::heap()->region_at_or_null(region_idx);
- return (hr != NULL && !hr->in_collection_set() && hr->is_old_or_humongous_or_archive());
- }
-
- class G1MergeCardSetClosure : public HeapRegionClosure {
- G1RemSetScanState* _scan_state;
- G1CardTable* _ct;
-
- uint _merged_sparse;
- uint _merged_fine;
- uint _merged_coarse;
-
- // Returns if the region contains cards we need to scan. If so, remember that
- // region in the current set of dirty regions.
- bool remember_if_interesting(uint const region_idx) {
- if (!_scan_state->contains_cards_to_process(region_idx)) {
- return false;
- }
- _scan_state->add_dirty_region(region_idx);
- return true;
- }
- public:
- G1MergeCardSetClosure(G1RemSetScanState* scan_state) :
- _scan_state(scan_state),
- _ct(G1CollectedHeap::heap()->card_table()),
- _merged_sparse(0),
- _merged_fine(0),
- _merged_coarse(0) { }
-
- void next_coarse_prt(uint const region_idx) {
- if (!remember_if_interesting(region_idx)) {
- return;
- }
-
- _merged_coarse++;
-
- size_t region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
- _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion);
- _scan_state->set_chunk_region_dirty(region_base_idx);
- }
-
- void next_fine_prt(uint const region_idx, BitMap* bm) {
- if (!remember_if_interesting(region_idx)) {
- return;
- }
-
- _merged_fine++;
-
- size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
- BitMap::idx_t cur = bm->get_next_one_offset(0);
- while (cur != bm->size()) {
- _ct->mark_clean_as_dirty(region_base_idx + cur);
- _scan_state->set_chunk_dirty(region_base_idx + cur);
- cur = bm->get_next_one_offset(cur + 1);
- }
- }
-
- void next_sparse_prt(uint const region_idx, SparsePRTEntry::card_elem_t* cards, uint const num_cards) {
- if (!remember_if_interesting(region_idx)) {
- return;
- }
-
- _merged_sparse++;
-
- size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
- for (uint i = 0; i < num_cards; i++) {
- size_t card_idx = region_base_idx + cards[i];
- _ct->mark_clean_as_dirty(card_idx);
- _scan_state->set_chunk_dirty(card_idx);
- }
- }
-
- virtual bool do_heap_region(HeapRegion* r) {
- assert(r->in_collection_set() || r->is_starts_humongous(), "must be");
-
- HeapRegionRemSet* rem_set = r->rem_set();
- if (!rem_set->is_empty()) {
- rem_set->iterate_prts(*this);
- }
-
- return false;
- }
-
- size_t merged_sparse() const { return _merged_sparse; }
- size_t merged_fine() const { return _merged_fine; }
- size_t merged_coarse() const { return _merged_coarse; }
- };
-
- // Visitor for the remembered sets of humongous candidate regions to merge their
- // remembered set into the card table.
- class G1FlushHumongousCandidateRemSets : public HeapRegionClosure {
- G1MergeCardSetClosure _cl;
-
- public:
- G1FlushHumongousCandidateRemSets(G1RemSetScanState* scan_state) : _cl(scan_state) { }
-
- virtual bool do_heap_region(HeapRegion* r) {
- G1CollectedHeap* g1h = G1CollectedHeap::heap();
-
- if (!r->is_starts_humongous() ||
- !g1h->region_attr(r->hrm_index()).is_humongous() ||
- r->rem_set()->is_empty()) {
- return false;
- }
-
- guarantee(r->rem_set()->occupancy_less_or_equal_than(G1RSetSparseRegionEntries),
- "Found a not-small remembered set here. This is inconsistent with previous assumptions.");
-
- _cl.do_heap_region(r);
-
- // We should only clear the card based remembered set here as we will not
- // implicitly rebuild anything else during eager reclaim. Note that at the moment
- // (and probably never) we do not enter this path if there are other kind of
- // remembered sets for this region.
- r->rem_set()->clear_locked(true /* only_cardset */);
- // Clear_locked() above sets the state to Empty. However we want to continue
- // collecting remembered set entries for humongous regions that were not
- // reclaimed.
- r->rem_set()->set_state_complete();
-#ifdef ASSERT
- G1HeapRegionAttr region_attr = g1h->region_attr(r->hrm_index());
- assert(region_attr.needs_remset_update(), "must be");
-#endif
- assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty.");
-
- return false;
- }
-
- size_t merged_sparse() const { return _cl.merged_sparse(); }
- size_t merged_fine() const { return _cl.merged_fine(); }
- size_t merged_coarse() const { return _cl.merged_coarse(); }
- };
-
- // Visitor for the log buffer entries to merge them into the card table.
- class G1MergeLogBufferCardsClosure : public G1CardTableEntryClosure {
- G1RemSetScanState* _scan_state;
- G1CardTable* _ct;
-
- size_t _cards_dirty;
- size_t _cards_skipped;
- public:
- G1MergeLogBufferCardsClosure(G1CollectedHeap* g1h, G1RemSetScanState* scan_state) :
- _scan_state(scan_state), _ct(g1h->card_table()), _cards_dirty(0), _cards_skipped(0)
- {}
-
- bool do_card_ptr(CardValue* card_ptr, uint worker_i) {
- // The only time we care about recording cards that
- // contain references that point into the collection set
- // is during RSet updating within an evacuation pause.
- // In this case worker_id should be the id of a GC worker thread.
- assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
-
- uint const region_idx = _ct->region_idx_for(card_ptr);
-
- // The second clause must come after - the log buffers might contain cards to uncommited
- // regions.
- // This code may count duplicate entries in the log buffers (even if rare) multiple
- // times.
- if (_scan_state->contains_cards_to_process(region_idx) && (*card_ptr == G1CardTable::dirty_card_val())) {
- _scan_state->add_dirty_region(region_idx);
- _scan_state->set_chunk_dirty(_ct->index_for_cardvalue(card_ptr));
- _cards_dirty++;
- } else {
- // We may have had dirty cards in the (initial) collection set (or the
- // young regions which are always in the initial collection set). We do
- // not fix their cards here: we already added these regions to the set of
- // regions to clear the card table at the end during the prepare() phase.
- _cards_skipped++;
- }
- return true;
- }
-
- size_t cards_dirty() const { return _cards_dirty; }
- size_t cards_skipped() const { return _cards_skipped; }
- };
-
- class G1MergeHeapRootsTask : public AbstractGangTask {
- HeapRegionClaimer _hr_claimer;
- G1RemSetScanState* _scan_state;
- bool _remembered_set_only;
-
- G1GCPhaseTimes::GCParPhases _merge_phase;
-
- volatile bool _fast_reclaim_handled;
-
- public:
- G1MergeHeapRootsTask(G1RemSetScanState* scan_state, uint num_workers, bool remembered_set_only, G1GCPhaseTimes::GCParPhases merge_phase) :
- AbstractGangTask("G1 Merge Heap Roots"),
- _hr_claimer(num_workers),
- _scan_state(scan_state),
- _remembered_set_only(remembered_set_only),
- _merge_phase(merge_phase),
- _fast_reclaim_handled(false) { }
-
- virtual void work(uint worker_id) {
- G1CollectedHeap* g1h = G1CollectedHeap::heap();
- G1GCPhaseTimes* p = g1h->phase_times();
-
- // We schedule flushing the remembered sets of humongous fast reclaim candidates
- // onto the card table first to allow the remaining parallelized tasks hide it.
- if (!_remembered_set_only &&
- p->fast_reclaim_humongous_candidates() > 0 &&
- !_fast_reclaim_handled &&
- !Atomic::cmpxchg(true, &_fast_reclaim_handled, false)) {
-
- G1FlushHumongousCandidateRemSets cl(_scan_state);
- g1h->heap_region_iterate(&cl);
-
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse);
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine);
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse);
- }
-
- // Merge remembered sets of current candidates.
- {
- G1GCParPhaseTimesTracker x(p, _merge_phase, worker_id, !_remembered_set_only /* must_record */);
- G1MergeCardSetClosure cl(_scan_state);
- g1h->collection_set_iterate_increment_from(&cl, &_hr_claimer, worker_id);
-
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse);
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine);
- p->record_or_add_thread_work_item(_merge_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse);
- }
-
- // Apply closure to log entries in the HCC.
- if (!_remembered_set_only && G1HotCardCache::default_use_cache()) {
- assert(_merge_phase == G1GCPhaseTimes::MergeRS, "Wrong merge phase");
- G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::MergeHCC, worker_id);
- G1MergeLogBufferCardsClosure cl(g1h, _scan_state);
- g1h->iterate_hcc_closure(&cl, worker_id);
- }
-
- // Now apply the closure to all remaining log entries.
- if (!_remembered_set_only) {
- assert(_merge_phase == G1GCPhaseTimes::MergeRS, "Wrong merge phase");
- G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::MergeLB, worker_id);
-
- G1MergeLogBufferCardsClosure cl(g1h, _scan_state);
- g1h->iterate_dirty_card_closure(&cl, worker_id);
-
- p->record_thread_work_item(G1GCPhaseTimes::MergeLB, worker_id, cl.cards_dirty(), G1GCPhaseTimes::MergeLBDirtyCards);
- p->record_thread_work_item(G1GCPhaseTimes::MergeLB, worker_id, cl.cards_skipped(), G1GCPhaseTimes::MergeLBSkippedCards);
- }
- }
- };
-
// Creates a snapshot of the current _top values at the start of collection to
// filter out card marks that we do not want to scan.
class G1ResetScanTopClosure : public HeapRegionClosure {
@@ -571,61 +318,46 @@
}
_all_dirty_regions = new G1DirtyRegions(_max_regions);
+ _next_dirty_regions = new G1DirtyRegions(_max_regions);
G1ResetScanTopClosure cl(this);
G1CollectedHeap::heap()->heap_region_iterate(&cl);
-
- _next_dirty_regions = new G1DirtyRegions(_max_regions);
}
- void print_merge_heap_roots_stats() {
- size_t num_scan_chunks = 0;
- for (uint i = 0; i < _max_regions * _scan_chunks_per_region; i++) {
- if (_region_scan_chunks[i]) {
- num_scan_chunks++;
- }
- }
- size_t num_visited_cards = num_scan_chunks * CardsPerChunk;
- size_t total_dirty_region_cards = _next_dirty_regions->size() * HeapRegion::CardsPerRegion;
+ void prepare_for_merge_heap_roots() {
+ _all_dirty_regions->merge(_next_dirty_regions);
- G1CollectedHeap* g1h = G1CollectedHeap::heap();
- size_t total_old_region_cards =
- (g1h->num_regions() - (g1h->num_free_regions() - g1h->collection_set()->cur_length())) * HeapRegion::CardsPerRegion;
+ _next_dirty_regions->reset();
+ for (size_t i = 0; i < _max_regions; i++) {
+ _card_table_scan_state[i] = 0;
+ }
- log_debug(gc,remset)("Visited cards " SIZE_FORMAT " Total dirty " SIZE_FORMAT " (%.2lf%%) Total old " SIZE_FORMAT " (%.2lf%%)",
- num_visited_cards,
- total_dirty_region_cards,
- percent_of(num_visited_cards, total_dirty_region_cards),
- total_old_region_cards,
- percent_of(num_visited_cards, total_old_region_cards));
+ ::memset(_region_scan_chunks, false, _max_regions * _scan_chunks_per_region * sizeof(*_region_scan_chunks));
}
- void merge_heap_roots(WorkGang* workers, bool remembered_set_only, G1GCPhaseTimes::GCParPhases merge_phase) {
- {
- _all_dirty_regions->merge(_next_dirty_regions);
- _next_dirty_regions->reset();
- for (size_t i = 0; i < _max_regions; i++) {
- _card_table_scan_state[i] = 0;
- }
-
- ::memset(_region_scan_chunks, false, _max_regions * _scan_chunks_per_region * sizeof(*_region_scan_chunks));
- }
-
- size_t const increment_length = G1CollectedHeap::heap()->collection_set()->increment_length();
+ // Returns whether the given region contains cards we need to scan. The remembered
+ // set and other sources may contain cards that
+ // - are in uncommitted regions
+ // - are located in the collection set
+ // - are located in free regions
+ // as we do not clean up remembered sets before merging heap roots.
+ bool contains_cards_to_process(uint const region_idx) const {
+ HeapRegion* hr = G1CollectedHeap::heap()->region_at_or_null(region_idx);
+ return (hr != NULL && !hr->in_collection_set() && hr->is_old_or_humongous_or_archive());
+ }
- uint const num_workers = !remembered_set_only ? workers->active_workers() :
- MIN2(workers->active_workers(), (uint)increment_length);
+ size_t num_visited_cards() const {
+ size_t result = 0;
+ for (uint i = 0; i < _max_regions * _scan_chunks_per_region; i++) {
+ if (_region_scan_chunks[i]) {
+ result++;
+ }
+ }
+ return result * CardsPerChunk;
+ }
- {
- G1MergeHeapRootsTask cl(this, num_workers, remembered_set_only, merge_phase);
- log_debug(gc, ergo)("Running %s using %u workers for " SIZE_FORMAT " regions",
- cl.name(), num_workers, increment_length);
- workers->run_task(&cl, num_workers);
- }
-
- if (log_is_enabled(Debug, gc, remset)) {
- print_merge_heap_roots_stats();
- }
+ size_t num_cards_in_dirty_regions() const {
+ return _next_dirty_regions->size() * HeapRegion::CardsPerRegion;
}
void set_chunk_region_dirty(size_t const region_card_idx) {
@@ -1169,8 +901,302 @@
_scan_state->prepare();
}
-void G1RemSet::merge_heap_roots(bool remembered_set_only, G1GCPhaseTimes::GCParPhases merge_phase) {
- _scan_state->merge_heap_roots(_g1h->workers(), remembered_set_only, merge_phase);
+class G1MergeHeapRootsTask : public AbstractGangTask {
+
+ // Visitor for remembered sets, dropping entries onto the card table.
+ class G1MergeCardSetClosure : public HeapRegionClosure {
+ G1RemSetScanState* _scan_state;
+ G1CardTable* _ct;
+
+ uint _merged_sparse;
+ uint _merged_fine;
+ uint _merged_coarse;
+
+ // Returns if the region contains cards we need to scan. If so, remember that
+ // region in the current set of dirty regions.
+ bool remember_if_interesting(uint const region_idx) {
+ if (!_scan_state->contains_cards_to_process(region_idx)) {
+ return false;
+ }
+ _scan_state->add_dirty_region(region_idx);
+ return true;
+ }
+ public:
+ G1MergeCardSetClosure(G1RemSetScanState* scan_state) :
+ _scan_state(scan_state),
+ _ct(G1CollectedHeap::heap()->card_table()),
+ _merged_sparse(0),
+ _merged_fine(0),
+ _merged_coarse(0) { }
+
+ void next_coarse_prt(uint const region_idx) {
+ if (!remember_if_interesting(region_idx)) {
+ return;
+ }
+
+ _merged_coarse++;
+
+ size_t region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
+ _ct->mark_region_dirty(region_base_idx, HeapRegion::CardsPerRegion);
+ _scan_state->set_chunk_region_dirty(region_base_idx);
+ }
+
+ void next_fine_prt(uint const region_idx, BitMap* bm) {
+ if (!remember_if_interesting(region_idx)) {
+ return;
+ }
+
+ _merged_fine++;
+
+ size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
+ BitMap::idx_t cur = bm->get_next_one_offset(0);
+ while (cur != bm->size()) {
+ _ct->mark_clean_as_dirty(region_base_idx + cur);
+ _scan_state->set_chunk_dirty(region_base_idx + cur);
+ cur = bm->get_next_one_offset(cur + 1);
+ }
+ }
+
+ void next_sparse_prt(uint const region_idx, SparsePRTEntry::card_elem_t* cards, uint const num_cards) {
+ if (!remember_if_interesting(region_idx)) {
+ return;
+ }
+
+ _merged_sparse++;
+
+ size_t const region_base_idx = (size_t)region_idx << HeapRegion::LogCardsPerRegion;
+ for (uint i = 0; i < num_cards; i++) {
+ size_t card_idx = region_base_idx + cards[i];
+ _ct->mark_clean_as_dirty(card_idx);
+ _scan_state->set_chunk_dirty(card_idx);
+ }
+ }
+
+ virtual bool do_heap_region(HeapRegion* r) {
+ assert(r->in_collection_set() || r->is_starts_humongous(), "must be");
+
+ HeapRegionRemSet* rem_set = r->rem_set();
+ if (!rem_set->is_empty()) {
+ rem_set->iterate_prts(*this);
+ }
+
+ return false;
+ }
+
+ size_t merged_sparse() const { return _merged_sparse; }
+ size_t merged_fine() const { return _merged_fine; }
+ size_t merged_coarse() const { return _merged_coarse; }
+ };
+
+ // Visitor for the remembered sets of humongous candidate regions to merge their
+ // remembered set into the card table.
+ class G1FlushHumongousCandidateRemSets : public HeapRegionClosure {
+ G1MergeCardSetClosure _cl;
+
+ public:
+ G1FlushHumongousCandidateRemSets(G1RemSetScanState* scan_state) : _cl(scan_state) { }
+
+ virtual bool do_heap_region(HeapRegion* r) {
+ G1CollectedHeap* g1h = G1CollectedHeap::heap();
+
+ if (!r->is_starts_humongous() ||
+ !g1h->region_attr(r->hrm_index()).is_humongous() ||
+ r->rem_set()->is_empty()) {
+ return false;
+ }
+
+ guarantee(r->rem_set()->occupancy_less_or_equal_than(G1RSetSparseRegionEntries),
+ "Found a not-small remembered set here. This is inconsistent with previous assumptions.");
+
+ _cl.do_heap_region(r);
+
+ // We should only clear the card based remembered set here as we will not
+ // implicitly rebuild anything else during eager reclaim. Note that at the moment
+ // (and probably never) we do not enter this path if there are other kind of
+ // remembered sets for this region.
+ r->rem_set()->clear_locked(true /* only_cardset */);
+ // Clear_locked() above sets the state to Empty. However we want to continue
+ // collecting remembered set entries for humongous regions that were not
+ // reclaimed.
+ r->rem_set()->set_state_complete();
+#ifdef ASSERT
+ G1HeapRegionAttr region_attr = g1h->region_attr(r->hrm_index());
+ assert(region_attr.needs_remset_update(), "must be");
+#endif
+ assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty.");
+
+ return false;
+ }
+
+ size_t merged_sparse() const { return _cl.merged_sparse(); }
+ size_t merged_fine() const { return _cl.merged_fine(); }
+ size_t merged_coarse() const { return _cl.merged_coarse(); }
+ };
+
+ // Visitor for the log buffer entries to merge them into the card table.
+ class G1MergeLogBufferCardsClosure : public G1CardTableEntryClosure {
+ G1RemSetScanState* _scan_state;
+ G1CardTable* _ct;
+
+ size_t _cards_dirty;
+ size_t _cards_skipped;
+ public:
+ G1MergeLogBufferCardsClosure(G1CollectedHeap* g1h, G1RemSetScanState* scan_state) :
+ _scan_state(scan_state), _ct(g1h->card_table()), _cards_dirty(0), _cards_skipped(0)
+ {}
+
+ bool do_card_ptr(CardValue* card_ptr, uint worker_i) {
+ // The only time we care about recording cards that
+ // contain references that point into the collection set
+ // is during RSet updating within an evacuation pause.
+ // In this case worker_id should be the id of a GC worker thread.
+ assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
+
+ uint const region_idx = _ct->region_idx_for(card_ptr);
+
+ // The second clause must come after - the log buffers might contain cards to uncommited
+ // regions.
+ // This code may count duplicate entries in the log buffers (even if rare) multiple
+ // times.
+ if (_scan_state->contains_cards_to_process(region_idx) && (*card_ptr == G1CardTable::dirty_card_val())) {
+ _scan_state->add_dirty_region(region_idx);
+ _scan_state->set_chunk_dirty(_ct->index_for_cardvalue(card_ptr));
+ _cards_dirty++;
+ } else {
+ // We may have had dirty cards in the (initial) collection set (or the
+ // young regions which are always in the initial collection set). We do
+ // not fix their cards here: we already added these regions to the set of
+ // regions to clear the card table at the end during the prepare() phase.
+ _cards_skipped++;
+ }
+ return true;
+ }
+
+ size_t cards_dirty() const { return _cards_dirty; }
+ size_t cards_skipped() const { return _cards_skipped; }
+ };
+
+ HeapRegionClaimer _hr_claimer;
+ G1RemSetScanState* _scan_state;
+ bool _initial_evacuation;
+
+ volatile bool _fast_reclaim_handled;
+
+public:
+ G1MergeHeapRootsTask(G1RemSetScanState* scan_state, uint num_workers, bool initial_evacuation) :
+ AbstractGangTask("G1 Merge Heap Roots"),
+ _hr_claimer(num_workers),
+ _scan_state(scan_state),
+ _initial_evacuation(initial_evacuation),
+ _fast_reclaim_handled(false) { }
+
+ virtual void work(uint worker_id) {
+ G1CollectedHeap* g1h = G1CollectedHeap::heap();
+ G1GCPhaseTimes* p = g1h->phase_times();
+
+ G1GCPhaseTimes::GCParPhases merge_remset_phase = _initial_evacuation ?
+ G1GCPhaseTimes::MergeRS :
+ G1GCPhaseTimes::OptMergeRS;
+
+ // We schedule flushing the remembered sets of humongous fast reclaim candidates
+ // onto the card table first to allow the remaining parallelized tasks hide it.
+ if (_initial_evacuation &&
+ p->fast_reclaim_humongous_candidates() > 0 &&
+ !_fast_reclaim_handled &&
+ !Atomic::cmpxchg(true, &_fast_reclaim_handled, false)) {
+
+ G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::MergeER, worker_id);
+
+ G1FlushHumongousCandidateRemSets cl(_scan_state);
+ g1h->heap_region_iterate(&cl);
+
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse);
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine);
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse);
+ }
+
+ // Merge remembered sets of current candidates.
+ {
+ G1GCParPhaseTimesTracker x(p, merge_remset_phase, worker_id, _initial_evacuation /* must_record */);
+ G1MergeCardSetClosure cl(_scan_state);
+ g1h->collection_set_iterate_increment_from(&cl, &_hr_claimer, worker_id);
+
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_sparse(), G1GCPhaseTimes::MergeRSMergedSparse);
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_fine(), G1GCPhaseTimes::MergeRSMergedFine);
+ p->record_or_add_thread_work_item(merge_remset_phase, worker_id, cl.merged_coarse(), G1GCPhaseTimes::MergeRSMergedCoarse);
+ }
+
+ // Apply closure to log entries in the HCC.
+ if (_initial_evacuation && G1HotCardCache::default_use_cache()) {
+ assert(merge_remset_phase == G1GCPhaseTimes::MergeRS, "Wrong merge phase");
+ G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::MergeHCC, worker_id);
+ G1MergeLogBufferCardsClosure cl(g1h, _scan_state);
+ g1h->iterate_hcc_closure(&cl, worker_id);
+ }
+
+ // Now apply the closure to all remaining log entries.
+ if (_initial_evacuation) {
+ assert(merge_remset_phase == G1GCPhaseTimes::MergeRS, "Wrong merge phase");
+ G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::MergeLB, worker_id);
+
+ G1MergeLogBufferCardsClosure cl(g1h, _scan_state);
+ g1h->iterate_dirty_card_closure(&cl, worker_id);
+
+ p->record_thread_work_item(G1GCPhaseTimes::MergeLB, worker_id, cl.cards_dirty(), G1GCPhaseTimes::MergeLBDirtyCards);
+ p->record_thread_work_item(G1GCPhaseTimes::MergeLB, worker_id, cl.cards_skipped(), G1GCPhaseTimes::MergeLBSkippedCards);
+ }
+ }
+};
+
+void G1RemSet::print_merge_heap_roots_stats() {
+ size_t num_visited_cards = _scan_state->num_visited_cards();
+
+ size_t total_dirty_region_cards = _scan_state->num_cards_in_dirty_regions();
+
+ G1CollectedHeap* g1h = G1CollectedHeap::heap();
+ size_t total_old_region_cards =
+ (g1h->num_regions() - (g1h->num_free_regions() - g1h->collection_set()->cur_length())) * HeapRegion::CardsPerRegion;
+
+ log_debug(gc,remset)("Visited cards " SIZE_FORMAT " Total dirty " SIZE_FORMAT " (%.2lf%%) Total old " SIZE_FORMAT " (%.2lf%%)",
+ num_visited_cards,
+ total_dirty_region_cards,
+ percent_of(num_visited_cards, total_dirty_region_cards),
+ total_old_region_cards,
+ percent_of(num_visited_cards, total_old_region_cards));
+}
+
+void G1RemSet::merge_heap_roots(bool initial_evacuation) {
+ G1CollectedHeap* g1h = G1CollectedHeap::heap();
+
+ {
+ Ticks start = Ticks::now();
+
+ _scan_state->prepare_for_merge_heap_roots();
+
+ Tickspan total = Ticks::now() - start;
+ if (initial_evacuation) {
+ g1h->phase_times()->record_prepare_merge_heap_roots_time(total.seconds() * 1000.0);
+ } else {
+ g1h->phase_times()->record_or_add_optional_prepare_merge_heap_roots_time(total.seconds() * 1000.0);
+ }
+ }
+
+ WorkGang* workers = g1h->workers();
+ size_t const increment_length = g1h->collection_set()->increment_length();
+
+ uint const num_workers = initial_evacuation ? workers->active_workers() :
+ MIN2(workers->active_workers(), (uint)increment_length);
+
+ {
+ G1MergeHeapRootsTask cl(_scan_state, num_workers, initial_evacuation);
+ log_debug(gc, ergo)("Running %s using %u workers for " SIZE_FORMAT " regions",
+ cl.name(), num_workers, increment_length);
+ workers->run_task(&cl, num_workers);
+ }
+
+ if (log_is_enabled(Debug, gc, remset)) {
+ print_merge_heap_roots_stats();
+ }
}
void G1RemSet::prepare_for_scan_heap_roots(uint region_idx) {
--- a/src/hotspot/share/gc/g1/g1RemSet.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1RemSet.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -67,6 +67,7 @@
G1Policy* _g1p;
G1HotCardCache* _hot_card_cache;
+ void print_merge_heap_roots_stats();
public:
typedef CardTable::CardValue CardValue;
@@ -94,8 +95,8 @@
// Merge cards from various sources (remembered sets, hot card cache, log buffers)
// and calculate the cards that need to be scanned later (via scan_heap_roots()).
- // If remembered_set_only is set, only merge remembered set cards.
- void merge_heap_roots(bool remembered_set_only, G1GCPhaseTimes::GCParPhases merge_phase);
+ // If initial_evacuation is set, this is called during the initial evacuation.
+ void merge_heap_roots(bool initial_evacuation);
// Prepare for and cleanup after scanning the heap roots. Must be called
// once before and after in sequential code.
--- a/src/hotspot/share/gc/g1/g1RootProcessor.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1RootProcessor.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -44,9 +44,6 @@
#include "runtime/mutex.hpp"
#include "services/management.hpp"
#include "utilities/macros.hpp"
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
void G1RootProcessor::worker_has_discovered_all_strong_classes() {
assert(ClassUnloadingWithConcurrentMark, "Currently only needed when doing G1 Class Unloading");
@@ -261,15 +258,6 @@
}
#endif
-#if INCLUDE_JVMCI
- if (EnableJVMCI) {
- G1GCParPhaseTimesTracker x(phase_times, G1GCPhaseTimes::JVMCIRoots, worker_i);
- if (_process_strong_tasks.try_claim_task(G1RP_PS_JVMCI_oops_do)) {
- JVMCI::oops_do(strong_roots);
- }
- }
-#endif
-
{
G1GCParPhaseTimesTracker x(phase_times, G1GCPhaseTimes::SystemDictionaryRoots, worker_i);
if (_process_strong_tasks.try_claim_task(G1RP_PS_SystemDictionary_oops_do)) {
--- a/src/hotspot/share/gc/g1/g1RootProcessor.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/g1/g1RootProcessor.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -64,7 +64,6 @@
G1RP_PS_jvmti_oops_do,
G1RP_PS_CodeCache_oops_do,
AOT_ONLY(G1RP_PS_aot_oops_do COMMA)
- JVMCI_ONLY(G1RP_PS_JVMCI_oops_do COMMA)
G1RP_PS_refProcessor_oops_do,
// Leave this one last.
G1RP_PS_NumElements
--- a/src/hotspot/share/gc/parallel/pcTasks.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/pcTasks.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -46,9 +46,6 @@
#include "runtime/vmThread.hpp"
#include "services/management.hpp"
#include "utilities/stack.inline.hpp"
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
//
// ThreadRootsMarkingTask
@@ -124,12 +121,6 @@
AOTLoader::oops_do(&mark_and_push_closure);
break;
-#if INCLUDE_JVMCI
- case jvmci:
- JVMCI::oops_do(&mark_and_push_closure);
- break;
-#endif
-
default:
fatal("Unknown root type");
}
--- a/src/hotspot/share/gc/parallel/pcTasks.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/pcTasks.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -99,7 +99,6 @@
system_dictionary = 7,
class_loader_data = 8,
code_cache = 9
- JVMCI_ONLY(COMMA jvmci = 10)
};
private:
RootType _root_type;
--- a/src/hotspot/share/gc/parallel/psMarkSweep.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/psMarkSweep.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -524,7 +524,6 @@
// Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
//ScavengableNMethods::scavengable_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
AOT_ONLY(AOTLoader::oops_do(mark_and_push_closure());)
- JVMCI_ONLY(JVMCI::oops_do(mark_and_push_closure());)
}
// Flush marking stack.
@@ -620,8 +619,6 @@
CodeCache::blobs_do(&adjust_from_blobs);
AOT_ONLY(AOTLoader::oops_do(adjust_pointer_closure());)
- JVMCI_ONLY(JVMCI::oops_do(adjust_pointer_closure());)
-
ref_processor()->weak_oops_do(adjust_pointer_closure());
PSScavenge::reference_processor()->weak_oops_do(adjust_pointer_closure());
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -2127,7 +2127,6 @@
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::class_loader_data));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmti));
q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::code_cache));
- JVMCI_ONLY(q->enqueue(new MarkFromRootsTask(MarkFromRootsTask::jvmci));)
if (active_gc_threads > 1) {
for (uint j = 0; j < active_gc_threads; j++) {
@@ -2217,8 +2216,6 @@
CodeCache::blobs_do(&adjust_from_blobs);
AOT_ONLY(AOTLoader::oops_do(&oop_closure);)
- JVMCI_ONLY(JVMCI::oops_do(&oop_closure);)
-
ref_processor()->weak_oops_do(&oop_closure);
// Roots were visited so references into the young gen in roots
// may have been scanned. Process them also.
--- a/src/hotspot/share/gc/parallel/psScavenge.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/psScavenge.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -379,7 +379,6 @@
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::class_loader_data));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmti));
q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::code_cache));
- JVMCI_ONLY(q->enqueue(new ScavengeRootsTask(ScavengeRootsTask::jvmci));)
TaskTerminator terminator(active_workers,
(TaskQueueSetSuper*) promotion_manager->stack_array_depth());
--- a/src/hotspot/share/gc/parallel/psTasks.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/psTasks.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -44,9 +44,6 @@
#include "runtime/thread.hpp"
#include "runtime/vmThread.hpp"
#include "services/management.hpp"
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
//
// ScavengeRootsTask
@@ -106,12 +103,6 @@
}
break;
-#if INCLUDE_JVMCI
- case jvmci:
- JVMCI::oops_do(&roots_closure);
- break;
-#endif
-
default:
fatal("Unknown root type");
}
--- a/src/hotspot/share/gc/parallel/psTasks.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/parallel/psTasks.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -61,7 +61,6 @@
management = 7,
jvmti = 8,
code_cache = 9
- JVMCI_ONLY(COMMA jvmci = 10)
};
private:
RootType _root_type;
--- a/src/hotspot/share/gc/shared/genCollectedHeap.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shared/genCollectedHeap.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -861,11 +861,6 @@
AOTLoader::oops_do(strong_roots);
}
#endif
-#if INCLUDE_JVMCI
- if (EnableJVMCI && _process_strong_tasks->try_claim_task(GCH_PS_jvmci_oops_do)) {
- JVMCI::oops_do(strong_roots);
- }
-#endif
if (_process_strong_tasks->try_claim_task(GCH_PS_SystemDictionary_oops_do)) {
SystemDictionary::oops_do(strong_roots);
}
--- a/src/hotspot/share/gc/shared/genCollectedHeap.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shared/genCollectedHeap.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -114,7 +114,6 @@
GCH_PS_jvmti_oops_do,
GCH_PS_CodeCache_oops_do,
AOT_ONLY(GCH_PS_aot_oops_do COMMA)
- JVMCI_ONLY(GCH_PS_jvmci_oops_do COMMA)
GCH_PS_younger_gens,
// Leave this one last.
GCH_PS_NumElements
--- a/src/hotspot/share/gc/shared/memAllocator.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shared/memAllocator.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -370,6 +370,10 @@
HeapWord* mem = mem_allocate(allocation);
if (mem != NULL) {
obj = initialize(mem);
+ } else {
+ // The unhandled oop detector will poison local variable obj,
+ // so reset it to NULL if mem is NULL.
+ obj = NULL;
}
}
return obj;
--- a/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -101,15 +101,15 @@
__ branch_destination(slow->continuation());
}
-LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
+LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier(LIRGenerator* gen, LIR_Opr obj) {
if (ShenandoahLoadRefBarrier) {
- return load_reference_barrier_impl(gen, obj, info, need_null_check);
+ return load_reference_barrier_impl(gen, obj);
} else {
return obj;
}
}
-LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check) {
+LIR_Opr ShenandoahBarrierSetC1::load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj) {
assert(ShenandoahLoadRefBarrier, "Should be enabled");
obj = ensure_in_register(gen, obj);
@@ -140,7 +140,7 @@
}
__ cmp(lir_cond_notEqual, flag_val, LIR_OprFact::intConst(0));
- CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, result, info ? new CodeEmitInfo(info) : NULL, need_null_check);
+ CodeStub* slow = new ShenandoahLoadReferenceBarrierStub(obj, result);
__ branch(lir_cond_notEqual, T_INT, slow);
__ branch_destination(slow->continuation());
@@ -194,7 +194,8 @@
args->append(result);
BasicTypeList signature;
signature.append(T_OBJECT);
- LIR_Opr call_result = gen->call_runtime(&signature, args, CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier),
+ LIR_Opr call_result = gen->call_runtime(&signature, args,
+ CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native),
objectType, NULL);
__ move(call_result, result);
return;
@@ -203,7 +204,7 @@
if (ShenandoahLoadRefBarrier) {
LIR_Opr tmp = gen->new_register(T_OBJECT);
BarrierSetC1::load_at_resolved(access, tmp);
- tmp = load_reference_barrier(access.gen(), tmp, access.access_emit_info(), true);
+ tmp = load_reference_barrier(access.gen(), tmp);
__ move(tmp, result);
} else {
BarrierSetC1::load_at_resolved(access, result);
@@ -245,8 +246,8 @@
}
const char* ShenandoahBarrierSetC1::rtcall_name_for_address(address entry) {
- if (entry == CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier)) {
- return "ShenandoahRuntime::oop_load_from_native_barrier";
+ if (entry == CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native)) {
+ return "ShenandoahRuntime::load_reference_barrier_native";
}
return NULL;
}
--- a/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -90,12 +90,10 @@
private:
LIR_Opr _obj;
LIR_Opr _result;
- CodeEmitInfo* _info;
- bool _needs_null_check;
public:
- ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result, CodeEmitInfo* info, bool needs_null_check) :
- _obj(obj), _result(result), _info(info), _needs_null_check(needs_null_check)
+ ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result) :
+ _obj(obj), _result(result)
{
assert(_obj->is_register(), "should be register");
assert(_result->is_register(), "should be register");
@@ -103,8 +101,6 @@
LIR_Opr obj() const { return _obj; }
LIR_Opr result() const { return _result; }
- CodeEmitInfo* info() const { return _info; }
- bool needs_null_check() const { return _needs_null_check; }
virtual void emit_code(LIR_Assembler* e);
virtual void visit(LIR_OpVisitState* visitor) {
@@ -181,10 +177,10 @@
void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
- LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
+ LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj);
LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
- LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
+ LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj);
LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -297,7 +297,7 @@
bool ShenandoahBarrierSetC2::is_shenandoah_lrb_call(Node* call) {
return call->is_CallLeaf() &&
- call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_JRT);
+ call->as_CallLeaf()->entry_point() == CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier);
}
bool ShenandoahBarrierSetC2::is_shenandoah_marking_if(PhaseTransform *phase, Node* n) {
@@ -472,19 +472,6 @@
return TypeFunc::make(domain, range);
}
-const TypeFunc* ShenandoahBarrierSetC2::oop_load_from_native_barrier_Type() {
- const Type **fields = TypeTuple::fields(1);
- fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
- const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
-
- // create result type (range)
- fields = TypeTuple::fields(1);
- fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;
- const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
-
- return TypeFunc::make(domain, range);
-}
-
const TypeFunc* ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type() {
const Type **fields = TypeTuple::fields(1);
fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
@@ -555,22 +542,9 @@
Node* offset = adr->is_AddP() ? adr->in(AddPNode::Offset) : top;
Node* load = BarrierSetC2::load_at_resolved(access, val_type);
- if ((decorators & IN_NATIVE) != 0) {
- assert(access.is_oop(), "IN_NATIVE access only for oop values");
- assert(access.is_parse_access(), "IN_NATIVE access only during parsing");
- GraphKit* kit = static_cast<C2ParseAccess &>(access).kit();
- Node* call = kit->make_runtime_call(GraphKit::RC_LEAF,
- oop_load_from_native_barrier_Type(),
- CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier),
- "ShenandoahRuntime::oop_load_from_native_barrier",
- NULL, load);
- Node* proj = kit->gvn().transform(new ProjNode(call, TypeFunc::Parms+0));
- return kit->gvn().transform(new CheckCastPPNode(kit->control(), proj, load->bottom_type()));
- }
-
if (access.is_oop()) {
if (ShenandoahLoadRefBarrier) {
- load = new ShenandoahLoadReferenceBarrierNode(NULL, load);
+ load = new ShenandoahLoadReferenceBarrierNode(NULL, load, (decorators & IN_NATIVE) != 0);
if (access.is_parse_access()) {
load = static_cast<C2ParseAccess &>(access).kit()->gvn().transform(load);
} else {
@@ -655,7 +629,7 @@
load_store = kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
}
#endif
- load_store = kit->gvn().transform(new ShenandoahLoadReferenceBarrierNode(NULL, load_store));
+ load_store = kit->gvn().transform(new ShenandoahLoadReferenceBarrierNode(NULL, load_store, false));
return load_store;
}
return BarrierSetC2::atomic_cmpxchg_val_at_resolved(access, expected_val, new_val, value_type);
@@ -723,7 +697,7 @@
}
Node* result = BarrierSetC2::atomic_xchg_at_resolved(access, val, value_type);
if (access.is_oop()) {
- result = kit->gvn().transform(new ShenandoahLoadReferenceBarrierNode(NULL, result));
+ result = kit->gvn().transform(new ShenandoahLoadReferenceBarrierNode(NULL, result, false));
shenandoah_write_barrier_pre(kit, false /* do_load */,
NULL, NULL, max_juint, NULL, NULL,
result /* pre_val */, T_OBJECT);
@@ -749,8 +723,7 @@
return strcmp(call->_name, "shenandoah_clone_barrier") == 0 ||
strcmp(call->_name, "shenandoah_cas_obj") == 0 ||
- strcmp(call->_name, "shenandoah_wb_pre") == 0 ||
- strcmp(call->_name, "ShenandoahRuntime::oop_load_from_native_barrier") == 0;
+ strcmp(call->_name, "shenandoah_wb_pre") == 0;
}
Node* ShenandoahBarrierSetC2::step_over_gc_barrier(Node* c) const {
@@ -1182,11 +1155,6 @@
case Op_ShenandoahLoadReferenceBarrier:
conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahLoadReferenceBarrierNode::ValueIn), delayed_worklist);
return true;
- case Op_CallLeaf:
- if (strcmp(n->as_CallLeaf()->_name, "ShenandoahRuntime::oop_load_from_native_barrier") == 0) {
- conn_graph->map_ideal_node(n, conn_graph->phantom_obj);
- return true;
- }
default:
// Nothing
break;
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -103,7 +103,6 @@
static const TypeFunc* write_ref_field_pre_entry_Type();
static const TypeFunc* shenandoah_clone_barrier_Type();
static const TypeFunc* shenandoah_load_reference_barrier_Type();
- static const TypeFunc* oop_load_from_native_barrier_Type();
virtual bool has_load_barriers() const { return true; }
// This is the entry-point for the backend to perform accesses through the Access API.
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1082,7 +1082,7 @@
phase->register_control(ctrl, loop, in_cset_fast_test_iff);
}
-void ShenandoahBarrierC2Support::call_lrb_stub(Node*& ctrl, Node*& val, Node*& result_mem, Node* raw_mem, PhaseIdealLoop* phase) {
+void ShenandoahBarrierC2Support::call_lrb_stub(Node*& ctrl, Node*& val, Node*& result_mem, Node* raw_mem, bool is_native, PhaseIdealLoop* phase) {
IdealLoopTree*loop = phase->get_loop(ctrl);
const TypePtr* obj_type = phase->igvn().type(val)->is_oopptr()->cast_to_nonconst();
@@ -1093,7 +1093,10 @@
mm->set_memory_at(Compile::AliasIdxRaw, raw_mem);
phase->register_new_node(mm, ctrl);
- Node* call = new CallLeafNode(ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type(), CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_JRT), "shenandoah_load_reference_barrier", TypeRawPtr::BOTTOM);
+ address calladdr = is_native ? CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native)
+ : CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier);
+ const char* name = is_native ? "oop_load_from_native_barrier" : "load_reference_barrier";
+ Node* call = new CallLeafNode(ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type(), calladdr, name, TypeRawPtr::BOTTOM);
call->init_req(TypeFunc::Control, ctrl);
call->init_req(TypeFunc::I_O, phase->C->top());
call->init_req(TypeFunc::Memory, mm);
@@ -1556,7 +1559,7 @@
Node* result_mem = NULL;
ctrl = if_not_fwd;
fwd = new_val;
- call_lrb_stub(ctrl, fwd, result_mem, raw_mem, phase);
+ call_lrb_stub(ctrl, fwd, result_mem, raw_mem, lrb->is_native(), phase);
region->init_req(_evac_path, ctrl);
val_phi->init_req(_evac_path, fwd);
raw_mem_phi->init_req(_evac_path, result_mem);
@@ -2999,11 +3002,28 @@
}
}
-ShenandoahLoadReferenceBarrierNode::ShenandoahLoadReferenceBarrierNode(Node* ctrl, Node* obj)
-: Node(ctrl, obj) {
+ShenandoahLoadReferenceBarrierNode::ShenandoahLoadReferenceBarrierNode(Node* ctrl, Node* obj, bool native)
+: Node(ctrl, obj), _native(native) {
ShenandoahBarrierSetC2::bsc2()->state()->add_load_reference_barrier(this);
}
+bool ShenandoahLoadReferenceBarrierNode::is_native() const {
+ return _native;
+}
+
+uint ShenandoahLoadReferenceBarrierNode::size_of() const {
+ return sizeof(*this);
+}
+
+uint ShenandoahLoadReferenceBarrierNode::hash() const {
+ return Node::hash() + _native ? 1 : 0;
+}
+
+bool ShenandoahLoadReferenceBarrierNode::cmp( const Node &n ) const {
+ return Node::cmp(n) && n.Opcode() == Op_ShenandoahLoadReferenceBarrier &&
+ _native == ((const ShenandoahLoadReferenceBarrierNode&)n)._native;
+}
+
const Type* ShenandoahLoadReferenceBarrierNode::bottom_type() const {
if (in(ValueIn) == NULL || in(ValueIn)->is_top()) {
return Type::TOP;
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -60,7 +60,7 @@
static void test_null(Node*& ctrl, Node* val, Node*& null_ctrl, PhaseIdealLoop* phase);
static void test_heap_stable(Node*& ctrl, Node* raw_mem, Node*& heap_stable_ctrl,
PhaseIdealLoop* phase);
- static void call_lrb_stub(Node*& ctrl, Node*& val, Node*& result_mem, Node* raw_mem, PhaseIdealLoop* phase);
+ static void call_lrb_stub(Node*& ctrl, Node*& val, Node*& result_mem, Node* raw_mem, bool is_native, PhaseIdealLoop* phase);
static Node* clone_null_check(Node*& c, Node* val, Node* unc_ctrl, PhaseIdealLoop* phase);
static void fix_null_check(Node* unc, Node* unc_ctrl, Node* new_unc_ctrl, Unique_Node_List& uses,
PhaseIdealLoop* phase);
@@ -234,8 +234,13 @@
NONE, WEAK, STRONG, NA
};
- ShenandoahLoadReferenceBarrierNode(Node* ctrl, Node* val);
+private:
+ bool _native;
+public:
+ ShenandoahLoadReferenceBarrierNode(Node* ctrl, Node* val, bool native);
+
+ bool is_native() const;
virtual int Opcode() const;
virtual const Type* bottom_type() const;
virtual const Type* Value(PhaseGVN* phase) const;
@@ -247,9 +252,9 @@
virtual Node* Identity(PhaseGVN* phase);
- uint size_of() const {
- return sizeof(*this);
- }
+ virtual uint size_of() const;
+ virtual uint hash() const;
+ virtual bool cmp( const Node &n ) const;
Strength get_barrier_strength();
CallStaticJavaNode* pin_and_expand_null_check(PhaseIterGVN& igvn);
--- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -360,5 +360,14 @@
}
oop ShenandoahBarrierSet::oop_load_from_native_barrier(oop obj) {
- return load_reference_barrier(obj);
+ if (CompressedOops::is_null(obj)) {
+ return NULL;
+ }
+
+ if (_heap->is_evacuation_in_progress() &&
+ !_heap->complete_marking_context()->is_marked(obj)) {
+ return NULL;
+ }
+
+ return load_reference_barrier_not_null(obj);
}
--- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -179,6 +179,10 @@
template <typename T>
static oop oop_load_not_in_heap(T* addr);
+ // Used for catching bad stores
+ template <typename T>
+ static void oop_store_not_in_heap(T* addr, oop value);
+
template <typename T>
static oop oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value);
--- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -25,6 +25,7 @@
#define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
#include "gc/shared/barrierSet.hpp"
+#include "gc/shenandoah/shenandoahAsserts.hpp"
#include "gc/shenandoah/shenandoahBarrierSet.hpp"
#include "gc/shenandoah/shenandoahForwarding.inline.hpp"
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
@@ -88,6 +89,13 @@
template <DecoratorSet decorators, typename BarrierSetT>
template <typename T>
+inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_not_in_heap(T* addr, oop value) {
+ shenandoah_assert_marked_if(NULL, value, !CompressedOops::is_null(value) && ShenandoahHeap::heap()->is_evacuation_in_progress());
+ Raw::oop_store(addr, value);
+}
+
+template <DecoratorSet decorators, typename BarrierSetT>
+template <typename T>
inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
oop res;
oop expected = compare_value;
--- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -52,11 +52,16 @@
}
}
+// Default the second argument for SD::oops_do.
+static void system_dictionary_oops_do(OopClosure* cl) {
+ SystemDictionary::oops_do(cl);
+}
+
ShenandoahSerialRoots::ShenandoahSerialRoots() :
_universe_root(&Universe::oops_do, ShenandoahPhaseTimings::UniverseRoots),
_object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
_management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
- _system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
+ _system_dictionary_root(&system_dictionary_oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
}
--- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -55,7 +55,7 @@
ShenandoahThreadLocalData::satb_mark_queue(thread).enqueue_known_active(orig);
JRT_END
-JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_JRT(oopDesc* src))
+JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier(oopDesc * src))
oop result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_mutator(src);
return (oopDesc*) result;
JRT_END
@@ -66,6 +66,6 @@
ShenandoahBarrierSet::barrier_set()->write_region(MemRegion((HeapWord*) obj, obj->size()));
JRT_END
-JRT_LEAF(oopDesc*, ShenandoahRuntime::oop_load_from_native_barrier(oopDesc* src))
+JRT_LEAF(oopDesc*, ShenandoahRuntime::load_reference_barrier_native(oopDesc * src))
return (oopDesc*) ShenandoahBarrierSet::barrier_set()->oop_load_from_native_barrier(oop(src));
JRT_END
--- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -37,9 +37,8 @@
static void write_ref_array_post_entry(HeapWord* dst, size_t length);
static void write_ref_field_pre_entry(oopDesc* orig, JavaThread* thread);
- static oopDesc* load_reference_barrier_JRT(oopDesc* src);
-
- static oopDesc* oop_load_from_native_barrier(oopDesc* src);
+ static oopDesc* load_reference_barrier(oopDesc *src);
+ static oopDesc* load_reference_barrier_native(oopDesc *src);
static void shenandoah_clone_barrier(oopDesc* obj);
};
--- a/src/hotspot/share/gc/z/zRootsIterator.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/z/zRootsIterator.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -69,6 +69,7 @@
static const ZStatSubPhase ZSubPhaseConcurrentRoots("Concurrent Roots");
static const ZStatSubPhase ZSubPhaseConcurrentRootsTeardown("Concurrent Roots Teardown");
static const ZStatSubPhase ZSubPhaseConcurrentRootsJNIHandles("Concurrent Roots JNIHandles");
+static const ZStatSubPhase ZSubPhaseConcurrentRootsVMHandles("Concurrent Roots VMHandles");
static const ZStatSubPhase ZSubPhaseConcurrentRootsClassLoaderDataGraph("Concurrent Roots ClassLoaderDataGraph");
static const ZStatSubPhase ZSubPhasePauseWeakRootsSetup("Pause Weak Roots Setup");
@@ -231,7 +232,8 @@
void ZRootsIterator::do_system_dictionary(ZRootsIteratorClosure* cl) {
ZStatTimer timer(ZSubPhasePauseRootsSystemDictionary);
- SystemDictionary::oops_do(cl);
+ // Handles are processed via _vm_handles.
+ SystemDictionary::oops_do(cl, false /* include_handles */);
}
void ZRootsIterator::do_threads(ZRootsIteratorClosure* cl) {
@@ -264,8 +266,10 @@
ZConcurrentRootsIterator::ZConcurrentRootsIterator(int cld_claim) :
_jni_handles_iter(JNIHandles::global_handles()),
+ _vm_handles_iter(SystemDictionary::vm_global_oop_storage()),
_cld_claim(cld_claim),
_jni_handles(this),
+ _vm_handles(this),
_class_loader_data_graph(this) {
ZStatTimer timer(ZSubPhaseConcurrentRootsSetup);
}
@@ -279,6 +283,11 @@
_jni_handles_iter.oops_do(cl);
}
+void ZConcurrentRootsIterator::do_vm_handles(ZRootsIteratorClosure* cl) {
+ ZStatTimer timer(ZSubPhaseConcurrentRootsVMHandles);
+ _vm_handles_iter.oops_do(cl);
+}
+
void ZConcurrentRootsIterator::do_class_loader_data_graph(ZRootsIteratorClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentRootsClassLoaderDataGraph);
CLDToOopClosure cld_cl(cl, _cld_claim);
@@ -288,6 +297,7 @@
void ZConcurrentRootsIterator::oops_do(ZRootsIteratorClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentRoots);
_jni_handles.oops_do(cl);
+ _vm_handles.oops_do(cl),
_class_loader_data_graph.oops_do(cl);
}
--- a/src/hotspot/share/gc/z/zRootsIterator.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/gc/z/zRootsIterator.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -112,12 +112,15 @@
class ZConcurrentRootsIterator {
private:
ZOopStorageIterator _jni_handles_iter;
+ ZOopStorageIterator _vm_handles_iter;
int _cld_claim;
void do_jni_handles(ZRootsIteratorClosure* cl);
+ void do_vm_handles(ZRootsIteratorClosure* cl);
void do_class_loader_data_graph(ZRootsIteratorClosure* cl);
ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_jni_handles> _jni_handles;
+ ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_vm_handles> _vm_handles;
ZParallelOopsDo<ZConcurrentRootsIterator, &ZConcurrentRootsIterator::do_class_loader_data_graph> _class_loader_data_graph;
public:
--- a/src/hotspot/share/include/cds.h Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/include/cds.h Fri Jul 19 14:55:22 2019 +0530
@@ -33,10 +33,10 @@
//
// Also, this is a C header file. Do not use C++ here.
-#define NUM_CDS_REGIONS 9
+#define NUM_CDS_REGIONS 8 // this must be the same as MetaspaceShared::n_regions
#define CDS_ARCHIVE_MAGIC 0xf00baba2
#define CDS_DYNAMIC_ARCHIVE_MAGIC 0xf00baba8
-#define CURRENT_CDS_ARCHIVE_VERSION 5
+#define CURRENT_CDS_ARCHIVE_VERSION 6
#define INVALID_CDS_ARCHIVE_VERSION -1
struct CDSFileMapRegion {
--- a/src/hotspot/share/jfr/leakprofiler/chains/rootSetClosure.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/jfr/leakprofiler/chains/rootSetClosure.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -42,9 +42,6 @@
#include "runtime/thread.hpp"
#include "services/management.hpp"
#include "utilities/align.hpp"
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
template <typename Delegate>
RootSetClosure<Delegate>::RootSetClosure(Delegate* delegate) : _delegate(delegate) {}
@@ -96,7 +93,6 @@
Management::oops_do(this);
StringTable::oops_do(this);
AOTLoader::oops_do(this);
- JVMCI_ONLY(JVMCI::oops_do(this);)
}
template class RootSetClosure<BFSClosure>;
--- a/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -41,9 +41,6 @@
#include "runtime/vframe_hp.hpp"
#include "services/management.hpp"
#include "utilities/growableArray.hpp"
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
class ReferenceLocateClosure : public OopClosure {
protected:
@@ -106,7 +103,6 @@
bool do_management_roots();
bool do_string_table_roots();
bool do_aot_loader_roots();
- JVMCI_ONLY(bool do_jvmci_roots();)
bool do_roots();
@@ -193,15 +189,6 @@
return rcl.complete();
}
-#if INCLUDE_JVMCI
-bool ReferenceToRootClosure::do_jvmci_roots() {
- assert(!complete(), "invariant");
- ReferenceLocateClosure rcl(_callback, OldObjectRoot::_jvmci, OldObjectRoot::_type_undetermined, NULL);
- JVMCI::oops_do(&rcl);
- return rcl.complete();
-}
-#endif
-
bool ReferenceToRootClosure::do_roots() {
assert(!complete(), "invariant");
assert(OldObjectRoot::_system_undetermined == _info._system, "invariant");
@@ -252,13 +239,6 @@
return true;
}
-#if INCLUDE_JVMCI
- if (do_jvmci_roots()) {
- _complete = true;
- return true;
- }
-#endif
-
return false;
}
--- a/src/hotspot/share/jvmci/jvmci.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/jvmci/jvmci.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -24,7 +24,7 @@
#include "precompiled.hpp"
#include "classfile/systemDictionary.hpp"
#include "gc/shared/collectedHeap.hpp"
-#include "gc/shared/oopStorage.inline.hpp"
+#include "gc/shared/oopStorage.hpp"
#include "jvmci/jvmci.hpp"
#include "jvmci/jvmciJavaClasses.hpp"
#include "jvmci/jvmciRuntime.hpp"
@@ -58,9 +58,7 @@
}
void JVMCI::initialize_globals() {
- _object_handles = new OopStorage("JVMCI Global Oop Handles",
- JVMCIGlobalAlloc_lock,
- JVMCIGlobalActive_lock);
+ _object_handles = SystemDictionary::vm_global_oop_storage();
_metadata_handles = MetadataHandleBlock::allocate_block();
if (UseJVMCINativeLibrary) {
// There are two runtimes.
@@ -115,12 +113,6 @@
_metadata_handles->chain_free_list(handle);
}
-void JVMCI::oops_do(OopClosure* f) {
- if (_object_handles != NULL) {
- _object_handles->oops_do(f);
- }
-}
-
void JVMCI::metadata_do(void f(Metadata*)) {
if (_metadata_handles != NULL) {
_metadata_handles->metadata_do(f);
--- a/src/hotspot/share/jvmci/jvmci.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/jvmci/jvmci.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -74,8 +74,6 @@
static void metadata_do(void f(Metadata*));
- static void oops_do(OopClosure* f);
-
static void shutdown();
static bool shutdown_called();
--- a/src/hotspot/share/libadt/set.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/libadt/set.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -43,7 +43,6 @@
// The caller must deallocate the string.
char *Set::setstr() const
{
- if( this == NULL ) return os::strdup("{no set}");
Set &set = clone(); // Virtually copy the basic set.
set.Sort(); // Sort elements for in-order retrieval
--- a/src/hotspot/share/memory/allocation.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/allocation.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -259,25 +259,6 @@
st->print("AllocatedObj(" INTPTR_FORMAT ")", p2i(this));
}
-AllocStats::AllocStats() {
- start_mallocs = os::num_mallocs;
- start_frees = os::num_frees;
- start_malloc_bytes = os::alloc_bytes;
- start_mfree_bytes = os::free_bytes;
- start_res_bytes = Arena::_bytes_allocated;
-}
-
-julong AllocStats::num_mallocs() { return os::num_mallocs - start_mallocs; }
-julong AllocStats::alloc_bytes() { return os::alloc_bytes - start_malloc_bytes; }
-julong AllocStats::num_frees() { return os::num_frees - start_frees; }
-julong AllocStats::free_bytes() { return os::free_bytes - start_mfree_bytes; }
-julong AllocStats::resource_bytes() { return Arena::_bytes_allocated - start_res_bytes; }
-void AllocStats::print() {
- tty->print_cr(UINT64_FORMAT " mallocs (" UINT64_FORMAT "MB), "
- UINT64_FORMAT " frees (" UINT64_FORMAT "MB), " UINT64_FORMAT "MB resrc",
- num_mallocs(), alloc_bytes()/M, num_frees(), free_bytes()/M, resource_bytes()/M);
-}
-
ReallocMark::ReallocMark() {
#ifdef ASSERT
Thread *thread = Thread::current();
--- a/src/hotspot/share/memory/allocation.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/allocation.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -507,23 +507,6 @@
#define FREE_C_HEAP_OBJ(objname)\
FreeHeap((char*)objname);
-// for statistics
-#ifndef PRODUCT
-class AllocStats : StackObj {
- julong start_mallocs, start_frees;
- julong start_malloc_bytes, start_mfree_bytes, start_res_bytes;
- public:
- AllocStats();
-
- julong num_mallocs(); // since creation of receiver
- julong alloc_bytes();
- julong num_frees();
- julong free_bytes();
- julong resource_bytes();
- void print();
-};
-#endif
-
//------------------------------ReallocMark---------------------------------
// Code which uses REALLOC_RESOURCE_ARRAY should check an associated
--- a/src/hotspot/share/memory/allocation.inline.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/allocation.inline.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -34,16 +34,13 @@
// Explicit C-heap memory management
#ifndef PRODUCT
-// Increments unsigned long value for statistics (not atomic on MP).
+// Increments unsigned long value for statistics (not atomic on MP, but avoids word-tearing on 32 bit).
inline void inc_stat_counter(volatile julong* dest, julong add_value) {
-#if defined(SPARC) || defined(X86)
- // Sparc and X86 have atomic jlong (8 bytes) instructions
+#ifdef _LP64
+ *dest += add_value;
+#else
julong value = Atomic::load(dest);
- value += add_value;
- Atomic::store(value, dest);
-#else
- // possible word-tearing during load/store
- *dest += add_value;
+ Atomic::store(value + add_value, dest);
#endif
}
#endif
--- a/src/hotspot/share/memory/arena.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/arena.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -475,10 +475,6 @@
#ifndef PRODUCT
-julong Arena::_bytes_allocated = 0;
-
-void Arena::inc_bytes_allocated(size_t x) { inc_stat_counter(&_bytes_allocated, x); }
-
// debugging code
inline void Arena::free_all(char** start, char** end) {
for (char** p = start; p < end; p++) if (*p) os::free(*p);
--- a/src/hotspot/share/memory/arena.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/arena.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -106,11 +106,8 @@
void* grow(size_t x, AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM);
size_t _size_in_bytes; // Size of arena (used for native memory tracking)
- NOT_PRODUCT(static julong _bytes_allocated;) // total #bytes allocated since start
- friend class AllocStats;
debug_only(void* malloc(size_t size);)
debug_only(void* internal_malloc_4(size_t x);)
- NOT_PRODUCT(void inc_bytes_allocated(size_t x);)
void signal_out_of_memory(size_t request, const char* whence) const;
@@ -148,7 +145,6 @@
debug_only(if (UseMallocOnly) return malloc(x);)
if (!check_for_overflow(x, "Arena::Amalloc", alloc_failmode))
return NULL;
- NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x, alloc_failmode);
} else {
@@ -163,7 +159,6 @@
debug_only(if (UseMallocOnly) return malloc(x);)
if (!check_for_overflow(x, "Arena::Amalloc_4", alloc_failmode))
return NULL;
- NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x, alloc_failmode);
} else {
@@ -185,7 +180,6 @@
#endif
if (!check_for_overflow(x, "Arena::Amalloc_D", alloc_failmode))
return NULL;
- NOT_PRODUCT(inc_bytes_allocated(x);)
if (_hwm + x > _max) {
return grow(x, alloc_failmode); // grow() returns a result aligned >= 8 bytes.
} else {
--- a/src/hotspot/share/memory/filemap.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/memory/filemap.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -155,6 +155,8 @@
const char *vm_version = VM_Version::internal_vm_info_string();
const int version_len = (int)strlen(vm_version);
+ memset(header_version, 0, JVM_IDENT_MAX);
+
if (version_len < (JVM_IDENT_MAX-1)) {
strcpy(header_version, vm_version);
@@ -170,6 +172,8 @@
sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash);
header_version[JVM_IDENT_MAX-1] = 0; // Null terminate.
}
+
+ assert(header_version[JVM_IDENT_MAX-1] == 0, "must be");
}
FileMapInfo::FileMapInfo(bool is_static) {
@@ -891,10 +895,59 @@
fail_continue("Unable to read the file header.");
return false;
}
+
+ if (!Arguments::has_jimage()) {
+ FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build.");
+ return false;
+ }
+
+ unsigned int expected_magic = is_static ? CDS_ARCHIVE_MAGIC : CDS_DYNAMIC_ARCHIVE_MAGIC;
+ if (_header->_magic != expected_magic) {
+ log_info(cds)("_magic expected: 0x%08x", expected_magic);
+ log_info(cds)(" actual: 0x%08x", _header->_magic);
+ FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
+ return false;
+ }
+
if (_header->_version != CURRENT_CDS_ARCHIVE_VERSION) {
+ log_info(cds)("_version expected: %d", CURRENT_CDS_ARCHIVE_VERSION);
+ log_info(cds)(" actual: %d", _header->_version);
fail_continue("The shared archive file has the wrong version.");
return false;
}
+
+ if (_header->_header_size != sz) {
+ log_info(cds)("_header_size expected: " SIZE_FORMAT, sz);
+ log_info(cds)(" actual: " SIZE_FORMAT, _header->_header_size);
+ FileMapInfo::fail_continue("The shared archive file has an incorrect header size.");
+ return false;
+ }
+
+ if (_header->_jvm_ident[JVM_IDENT_MAX-1] != 0) {
+ FileMapInfo::fail_continue("JVM version identifier is corrupted.");
+ return false;
+ }
+
+ char header_version[JVM_IDENT_MAX];
+ get_header_version(header_version);
+ if (strncmp(_header->_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
+ log_info(cds)("_jvm_ident expected: %s", header_version);
+ log_info(cds)(" actual: %s", _header->_jvm_ident);
+ FileMapInfo::fail_continue("The shared archive file was created by a different"
+ " version or build of HotSpot");
+ return false;
+ }
+
+ if (VerifySharedSpaces) {
+ int expected_crc = _header->compute_crc();
+ if (expected_crc != _header->_crc) {
+ log_info(cds)("_crc expected: %d", expected_crc);
+ log_info(cds)(" actual: %d", _header->_crc);
+ FileMapInfo::fail_continue("Header checksum verification failed.");
+ return false;
+ }
+ }
+
_file_offset = n;
size_t info_size = _header->_paths_misc_info_size;
@@ -909,10 +962,6 @@
_file_offset += n + _header->_base_archive_name_size; // accounts for the size of _base_archive_name
if (is_static) {
- if (_header->_magic != CDS_ARCHIVE_MAGIC) {
- fail_continue("Incorrect static archive magic number");
- return false;
- }
// just checking the last region is sufficient since the archive is written
// in sequential order
size_t len = lseek(fd, 0, SEEK_END);
@@ -1750,33 +1799,7 @@
// This function should only be called during run time with UseSharedSpaces enabled.
bool FileMapHeader::validate() {
- if (VerifySharedSpaces && compute_crc() != _crc) {
- FileMapInfo::fail_continue("Header checksum verification failed.");
- return false;
- }
- if (!Arguments::has_jimage()) {
- FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build.");
- return false;
- }
-
- if (_version != CURRENT_CDS_ARCHIVE_VERSION) {
- FileMapInfo::fail_continue("The shared archive file is the wrong version.");
- return false;
- }
- if (_magic != CDS_ARCHIVE_MAGIC && _magic != CDS_DYNAMIC_ARCHIVE_MAGIC) {
- FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
- return false;
- }
- char header_version[JVM_IDENT_MAX];
- get_header_version(header_version);
- if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
- log_info(class, path)("expected: %s", header_version);
- log_info(class, path)("actual: %s", _jvm_ident);
- FileMapInfo::fail_continue("The shared archive file was created by a different"
- " version or build of HotSpot");
- return false;
- }
if (_obj_alignment != ObjectAlignmentInBytes) {
FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
" does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".",
--- a/src/hotspot/share/oops/method.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/oops/method.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -842,10 +842,7 @@
if (comp_level == CompLevel_all) {
tty->print("all levels ");
} else {
- tty->print("levels ");
- for (int i = (int)CompLevel_none; i <= comp_level; i++) {
- tty->print("%d ", i);
- }
+ tty->print("level %d ", comp_level);
}
this->print_short_name(tty);
int size = this->code_size();
--- a/src/hotspot/share/prims/cdsoffsets.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/prims/cdsoffsets.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -49,6 +49,7 @@
ADD_NEXT(_all, "FileMapHeader::_magic", offset_of(FileMapHeader, _magic)); \
ADD_NEXT(_all, "FileMapHeader::_crc", offset_of(FileMapHeader, _crc)); \
ADD_NEXT(_all, "FileMapHeader::_version", offset_of(FileMapHeader, _version)); \
+ ADD_NEXT(_all, "FileMapHeader::_jvm_ident", offset_of(FileMapHeader, _jvm_ident)); \
ADD_NEXT(_all, "FileMapHeader::_space[0]", offset_of(FileMapHeader, _space)); \
ADD_NEXT(_all, "CDSFileMapRegion::_crc", offset_of(CDSFileMapRegion, _crc)); \
ADD_NEXT(_all, "CDSFileMapRegion::_used", offset_of(CDSFileMapRegion, _used)); \
--- a/src/hotspot/share/prims/jvmtiTagMap.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/prims/jvmtiTagMap.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -63,9 +63,6 @@
#if INCLUDE_ZGC
#include "gc/z/zGlobals.hpp"
#endif
-#if INCLUDE_JVMCI
-#include "jvmci/jvmci.hpp"
-#endif
// JvmtiTagHashmapEntry
//
@@ -3042,14 +3039,6 @@
return false;
}
-#if INCLUDE_JVMCI
- blk.set_kind(JVMTI_HEAP_REFERENCE_OTHER);
- JVMCI::oops_do(&blk);
- if (blk.stopped()) {
- return false;
- }
-#endif
-
return true;
}
--- a/src/hotspot/share/runtime/globals.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/globals.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -466,9 +466,6 @@
develop(bool, UseMallocOnly, false, \
"Use only malloc/free for allocation (no resource area/arena)") \
\
- develop(bool, PrintMallocStatistics, false, \
- "Print malloc/free statistics") \
- \
develop(bool, ZapResourceArea, trueInDebug, \
"Zap freed resource/arena space with 0xABABABAB") \
\
--- a/src/hotspot/share/runtime/java.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/java.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -203,9 +203,6 @@
}
}
-AllocStats alloc_stats;
-
-
// General statistics printing (profiling ...)
void print_statistics() {
@@ -329,11 +326,6 @@
}
print_bytecode_count();
- if (PrintMallocStatistics) {
- tty->print("allocation stats: ");
- alloc_stats.print();
- tty->cr();
- }
if (PrintSystemDictionaryAtExit) {
ResourceMark rm;
--- a/src/hotspot/share/runtime/javaCalls.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/javaCalls.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -346,9 +346,6 @@
assert(!SafepointSynchronize::is_at_safepoint(), "call to Java code during VM operation");
assert(!thread->handle_area()->no_handle_mark_active(), "cannot call out to Java here");
-
- CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
-
#if INCLUDE_JVMCI
// Gets the nmethod (if any) that should be called instead of normal target
nmethod* alternative_target = args->alternative_target();
@@ -395,10 +392,6 @@
BasicType result_type = runtime_type_from(result);
bool oop_result_flag = (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY);
- // NOTE: if we move the computation of the result_val_address inside
- // the call to call_stub, the optimizer produces wrong code.
- intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
-
// Find receiver
Handle receiver = (!method->is_static()) ? args->receiver() : Handle();
@@ -436,6 +429,11 @@
{ JavaCallWrapper link(method, receiver, result, CHECK);
{ HandleMark hm(thread); // HandleMark used by HandleMarkCleaner
+ // NOTE: if we move the computation of the result_val_address inside
+ // the call to call_stub, the optimizer produces wrong code.
+ intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
+ intptr_t* parameter_address = args->parameters();
+
StubRoutines::call_stub()(
(address)&link,
// (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
@@ -443,7 +441,7 @@
result_type,
method(),
entry_point,
- args->parameters(),
+ parameter_address,
args->size_of_parameters(),
CHECK
);
--- a/src/hotspot/share/runtime/mutex.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/mutex.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -64,8 +64,8 @@
tty = access + 2,
special = tty + 1,
suspend_resume = special + 1,
- vmweak = suspend_resume + 2,
- leaf = vmweak + 2,
+ oopstorage = suspend_resume + 2,
+ leaf = oopstorage + 2,
safepoint = leaf + 10,
barrier = safepoint + 1,
nonleaf = barrier + 1,
--- a/src/hotspot/share/runtime/mutexLocker.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/mutexLocker.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -53,6 +53,8 @@
Mutex* StringTableWeakAlloc_lock = NULL;
Mutex* StringTableWeakActive_lock = NULL;
Mutex* JNIHandleBlockFreeList_lock = NULL;
+Mutex* VMGlobalAlloc_lock = NULL;
+Mutex* VMGlobalActive_lock = NULL;
Mutex* VMWeakAlloc_lock = NULL;
Mutex* VMWeakActive_lock = NULL;
Mutex* ResolvedMethodTableWeakAlloc_lock = NULL;
@@ -161,8 +163,6 @@
#if INCLUDE_JVMCI
Monitor* JVMCI_lock = NULL;
-Mutex* JVMCIGlobalAlloc_lock = NULL;
-Mutex* JVMCIGlobalActive_lock = NULL;
#endif
@@ -216,14 +216,17 @@
def(CGC_lock , PaddedMonitor, special, true, Monitor::_safepoint_check_never); // coordinate between fore- and background GC
def(STS_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never);
- def(VMWeakAlloc_lock , PaddedMutex , vmweak, true, Monitor::_safepoint_check_never);
- def(VMWeakActive_lock , PaddedMutex , vmweak-1, true, Monitor::_safepoint_check_never);
+ def(VMGlobalAlloc_lock , PaddedMutex , oopstorage, true, Monitor::_safepoint_check_never);
+ def(VMGlobalActive_lock , PaddedMutex , oopstorage-1,true, Monitor::_safepoint_check_never);
+
+ def(VMWeakAlloc_lock , PaddedMutex , oopstorage, true, Monitor::_safepoint_check_never);
+ def(VMWeakActive_lock , PaddedMutex , oopstorage-1,true, Monitor::_safepoint_check_never);
- def(StringTableWeakAlloc_lock , PaddedMutex , vmweak, true, Monitor::_safepoint_check_never);
- def(StringTableWeakActive_lock , PaddedMutex , vmweak-1, true, Monitor::_safepoint_check_never);
+ def(StringTableWeakAlloc_lock , PaddedMutex , oopstorage, true, Monitor::_safepoint_check_never);
+ def(StringTableWeakActive_lock , PaddedMutex , oopstorage-1,true, Monitor::_safepoint_check_never);
- def(ResolvedMethodTableWeakAlloc_lock , PaddedMutex , vmweak, true, Monitor::_safepoint_check_never);
- def(ResolvedMethodTableWeakActive_lock , PaddedMutex , vmweak-1, true, Monitor::_safepoint_check_never);
+ def(ResolvedMethodTableWeakAlloc_lock , PaddedMutex , oopstorage, true, Monitor::_safepoint_check_never);
+ def(ResolvedMethodTableWeakActive_lock , PaddedMutex , oopstorage-1, true, Monitor::_safepoint_check_never);
def(FullGCCount_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never); // in support of ExplicitGCInvokesConcurrent
if (UseG1GC) {
@@ -356,8 +359,6 @@
#if INCLUDE_JVMCI
def(JVMCI_lock , PaddedMonitor, nonleaf+2, true, Monitor::_safepoint_check_always);
- def(JVMCIGlobalAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never);
- def(JVMCIGlobalActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never);
#endif
def(DumpTimeTable_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
#endif // INCLUDE_CDS
--- a/src/hotspot/share/runtime/mutexLocker.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/mutexLocker.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -46,6 +46,8 @@
extern Mutex* StringTableWeakAlloc_lock; // StringTable weak storage allocate list lock
extern Mutex* StringTableWeakActive_lock; // STringTable weak storage active list lock
extern Mutex* JNIHandleBlockFreeList_lock; // a lock on the JNI handle block free list
+extern Mutex* VMGlobalAlloc_lock; // VM Global Handles storage allocate list lock
+extern Mutex* VMGlobalActive_lock; // VM Global Handles storage active list lock
extern Mutex* VMWeakAlloc_lock; // VM Weak Handles storage allocate list lock
extern Mutex* VMWeakActive_lock; // VM Weak Handles storage active list lock
extern Mutex* ResolvedMethodTableWeakAlloc_lock; // ResolvedMethodTable weak storage allocate list
@@ -157,8 +159,6 @@
#if INCLUDE_JVMCI
extern Monitor* JVMCI_lock; // Monitor to control initialization of JVMCI
-extern Mutex* JVMCIGlobalAlloc_lock; // JVMCI global storage allocate list lock
-extern Mutex* JVMCIGlobalActive_lock; // JVMCI global storage active list lock
#endif
// A MutexLocker provides mutual exclusion with respect to a given mutex
--- a/src/hotspot/share/runtime/os.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/os.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -360,11 +360,33 @@
switch (sig) {
case SIGBREAK: {
+#if INCLUDE_SERVICES
// Check if the signal is a trigger to start the Attach Listener - in that
// case don't print stack traces.
- if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {
- continue;
+ if (!DisableAttachMechanism) {
+ // Attempt to transit state to AL_INITIALIZING.
+ AttachListenerState cur_state = AttachListener::transit_state(AL_INITIALIZING, AL_NOT_INITIALIZED);
+ if (cur_state == AL_INITIALIZING) {
+ // Attach Listener has been started to initialize. Ignore this signal.
+ continue;
+ } else if (cur_state == AL_NOT_INITIALIZED) {
+ // Start to initialize.
+ if (AttachListener::is_init_trigger()) {
+ // Attach Listener has been initialized.
+ // Accept subsequent request.
+ continue;
+ } else {
+ // Attach Listener could not be started.
+ // So we need to transit the state to AL_NOT_INITIALIZED.
+ AttachListener::set_state(AL_NOT_INITIALIZED);
+ }
+ } else if (AttachListener::check_socket_file()) {
+ // Attach Listener has been started, but unix domain socket file
+ // does not exist. So restart Attach Listener.
+ continue;
+ }
}
+#endif
// Print stack traces
// Any SIGBREAK operations added here should make sure to flush
// the output stream (e.g. tty->flush()) after output. See 4803766.
--- a/src/hotspot/share/runtime/serviceThread.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/serviceThread.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -94,6 +94,7 @@
JNIHandles::global_handles(),
JNIHandles::weak_global_handles(),
StringTable::weak_storage(),
+ SystemDictionary::vm_global_oop_storage(),
SystemDictionary::vm_weak_oop_storage()
};
const size_t oopstorage_count = ARRAY_SIZE(oopstorages);
--- a/src/hotspot/share/runtime/unhandledOops.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/runtime/unhandledOops.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -55,15 +55,15 @@
// For debugging unhandled oop detector _in the debugger_
// You don't want to turn it on in compiled code here.
-static bool unhandled_oop_print=0;
+static Thread* unhandled_oop_print = NULL;
void UnhandledOops::register_unhandled_oop(oop* op, address pc) {
if (!_thread->is_in_stack((address)op))
return;
- _level ++;
- if (unhandled_oop_print) {
- for (int i=0; i<_level; i++) tty->print(" ");
+ _level++;
+ if (unhandled_oop_print == _thread) {
+ for (int i=0; i < _level; i++) tty->print(" ");
tty->print_cr("r " INTPTR_FORMAT, p2i(op));
}
UnhandledOopEntry entry(op, pc);
@@ -98,11 +98,11 @@
void UnhandledOops::unregister_unhandled_oop(oop* op) {
if (!_thread->is_in_stack((address)op)) return;
- _level --;
- if (unhandled_oop_print) {
- for (int i=0; i<_level; i++) tty->print(" ");
+ if (unhandled_oop_print == _thread) {
+ for (int i=0; i < _level; i++) tty->print(" ");
tty->print_cr("u " INTPTR_FORMAT, p2i(op));
}
+ _level--;
int i = _oop_list->find_from_end(op, match_oop_entry);
assert(i!=-1, "oop not in unhandled_oop_list");
--- a/src/hotspot/share/services/attachListener.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/services/attachListener.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -45,7 +45,7 @@
#include "utilities/debug.hpp"
#include "utilities/formatBuffer.hpp"
-volatile bool AttachListener::_initialized;
+volatile AttachListenerState AttachListener::_state = AL_NOT_INITIALIZED;
// Implementation of "properties" command.
//
@@ -372,6 +372,7 @@
"Should already be setup");
if (AttachListener::pd_init() != 0) {
+ AttachListener::set_state(AL_NOT_INITIALIZED);
return;
}
AttachListener::set_initialized();
@@ -379,6 +380,7 @@
for (;;) {
AttachOperation* op = AttachListener::dequeue();
if (op == NULL) {
+ AttachListener::set_state(AL_NOT_INITIALIZED);
return; // dequeue failed or shutdown
}
@@ -422,6 +424,8 @@
// operation complete - send result and output to client
op->complete(res, &st);
}
+
+ ShouldNotReachHere();
}
bool AttachListener::has_init_error(TRAPS) {
@@ -445,6 +449,7 @@
const char thread_name[] = "Attach Listener";
Handle string = java_lang_String::create_from_str(thread_name, THREAD);
if (has_init_error(THREAD)) {
+ set_state(AL_NOT_INITIALIZED);
return;
}
@@ -456,6 +461,7 @@
string,
THREAD);
if (has_init_error(THREAD)) {
+ set_state(AL_NOT_INITIALIZED);
return;
}
@@ -469,6 +475,7 @@
thread_oop,
THREAD);
if (has_init_error(THREAD)) {
+ set_state(AL_NOT_INITIALIZED);
return;
}
--- a/src/hotspot/share/services/attachListener.hpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/services/attachListener.hpp Fri Jul 19 14:55:22 2019 +0530
@@ -26,6 +26,8 @@
#define SHARE_SERVICES_ATTACHLISTENER_HPP
#include "memory/allocation.hpp"
+#include "metaprogramming/isRegisteredEnum.hpp"
+#include "runtime/atomic.hpp"
#include "utilities/debug.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/macros.hpp"
@@ -49,6 +51,14 @@
AttachOperationFunction func;
};
+enum AttachListenerState {
+ AL_NOT_INITIALIZED,
+ AL_INITIALIZING,
+ AL_INITIALIZED
+};
+
+template<> struct IsRegisteredEnum<AttachListenerState> : public TrueType {};
+
class AttachListener: AllStatic {
public:
static void vm_start() NOT_SERVICES_RETURN;
@@ -58,6 +68,9 @@
// invoke to perform clean-up tasks when all clients detach
static void detachall() NOT_SERVICES_RETURN;
+ // check unix domain socket file on filesystem
+ static bool check_socket_file() NOT_SERVICES_RETURN_(false);
+
// indicates if the Attach Listener needs to be created at startup
static bool init_at_startup() NOT_SERVICES_RETURN_(false);
@@ -67,12 +80,31 @@
#if !INCLUDE_SERVICES
static bool is_attach_supported() { return false; }
#else
+
private:
- static volatile bool _initialized;
+ static volatile AttachListenerState _state;
public:
- static bool is_initialized() { return _initialized; }
- static void set_initialized() { _initialized = true; }
+ static void set_state(AttachListenerState new_state) {
+ Atomic::store(new_state, &_state);
+ }
+
+ static AttachListenerState get_state() {
+ return Atomic::load(&_state);
+ }
+
+ static AttachListenerState transit_state(AttachListenerState new_state,
+ AttachListenerState cmp_state) {
+ return Atomic::cmpxchg(new_state, &_state, cmp_state);
+ }
+
+ static bool is_initialized() {
+ return Atomic::load(&_state) == AL_INITIALIZED;
+ }
+
+ static void set_initialized() {
+ Atomic::store(AL_INITIALIZED, &_state);
+ }
// indicates if this VM supports attach-on-demand
static bool is_attach_supported() { return !DisableAttachMechanism; }
--- a/src/hotspot/share/services/gcNotifier.cpp Mon Jul 15 15:23:54 2019 +0530
+++ b/src/hotspot/share/services/gcNotifier.cpp Fri Jul 19 14:55:22 2019 +0530
@@ -159,7 +159,7 @@
gcInfoklass,
vmSymbols::com_sun_management_GcInfo_constructor_signature(),
&constructor_args,
- CHECK_NH);
+ THREAD);
}
void GCNotifier::sendNotification(TRAPS) {
--- a/src/java.base/aix/classes/sun/nio/fs/AixNativeDispatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/aix/classes/sun/nio/fs/AixNativeDispatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,9 +26,6 @@
package sun.nio.fs;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
/**
* AIX specific system calls.
*/
@@ -46,11 +43,7 @@
private static native void init();
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
init();
}
}
--- a/src/java.base/linux/classes/sun/nio/fs/LinuxNativeDispatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/linux/classes/sun/nio/fs/LinuxNativeDispatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,9 +25,6 @@
package sun.nio.fs;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
/**
* Linux specific system calls.
*/
@@ -121,11 +118,7 @@
private static native void init();
static {
- AccessController.doPrivileged(new PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
init();
}
}
--- a/src/java.base/linux/classes/sun/nio/fs/LinuxWatchService.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/linux/classes/sun/nio/fs/LinuxWatchService.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,8 +26,6 @@
package sun.nio.fs;
import java.nio.file.*;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.*;
import java.io.IOException;
import jdk.internal.misc.Unsafe;
@@ -459,10 +457,6 @@
private static native int poll(int fd1, int fd2) throws UnixException;
static {
- AccessController.doPrivileged(new PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
}
}
--- a/src/java.base/macosx/classes/apple/security/KeychainStore.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/macosx/classes/apple/security/KeychainStore.java Fri Jul 19 14:55:22 2019 +0530
@@ -105,13 +105,7 @@
private static final Debug debug = Debug.getInstance("keystore");
static {
- AccessController.doPrivileged(
- new PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("osxsecurity");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("osxsecurity");
try {
PKCS8ShroudedKeyBag_OID = new ObjectIdentifier(keyBag);
pbeWithSHAAnd3KeyTripleDESCBC_OID = new ObjectIdentifier(pbeWithSHAAnd3KeyTripleDESCBC);
--- a/src/java.base/macosx/classes/sun/nio/fs/UTIFileTypeDetector.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/macosx/classes/sun/nio/fs/UTIFileTypeDetector.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -27,8 +27,6 @@
import java.io.IOException;
import java.nio.file.Path;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
/**
* File type detector that uses a file extension to look up its MIME type
@@ -55,12 +53,6 @@
}
static {
- AccessController.doPrivileged(new PrivilegedAction<>() {
- @Override
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
}
}
--- a/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 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
@@ -1363,8 +1363,11 @@
// Calculate and compare the tag. Only do the decryption
// if and only if the tag matches.
authFinalizeData(ctPlusTag, 0, ctLen, tag, 0);
- if (Arrays.compare(ctPlusTag, ctLen, ctPlusTagLen,
- tag, 0, tag.length) != 0) {
+ long tagCompare = ((long)asLongView.get(ctPlusTag, ctLen) ^
+ (long)asLongView.get(tag, 0)) |
+ ((long)asLongView.get(ctPlusTag, ctLen + Long.BYTES) ^
+ (long)asLongView.get(tag, Long.BYTES));
+ if (tagCompare != 0) {
throw new AEADBadTagException("Tag mismatch");
}
chaCha20Transform(ctPlusTag, 0, ctLen, out, outOff);
--- a/src/java.base/share/classes/java/io/PrintStream.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/io/PrintStream.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -45,10 +45,10 @@
* ({@code '\n'}) is written.
*
* <p> All characters printed by a {@code PrintStream} are converted into
- * bytes using the given encoding or charset, or platform's default character
- * encoding if not specified.
+ * bytes using the given encoding or charset, or the platform's default
+ * character encoding if not specified.
* The {@link PrintWriter} class should be used in situations that require
- * writing characters rather than bytes.
+ * writing characters rather than bytes.
*
* <p> This class always replaces malformed and unmappable character sequences with
* the charset's default replacement string.
@@ -121,7 +121,9 @@
}
/**
- * Creates a new print stream. This stream will not flush automatically.
+ * Creates a new print stream, without automatic line flushing, with the
+ * specified OutputStream. Characters written to the stream are converted
+ * to bytes using the platform's default character encoding.
*
* @param out The output stream to which values and objects will be
* printed
@@ -133,11 +135,13 @@
}
/**
- * Creates a new print stream.
+ * Creates a new print stream, with the specified OutputStream and line
+ * flushing. Characters written to the stream are converted to bytes using
+ * the platform's default character encoding.
*
* @param out The output stream to which values and objects will be
* printed
- * @param autoFlush A boolean; if true, the output buffer will be flushed
+ * @param autoFlush Whether the output buffer will be flushed
* whenever a byte array is written, one of the
* {@code println} methods is invoked, or a newline
* character or byte ({@code '\n'}) is written
@@ -149,11 +153,12 @@
}
/**
- * Creates a new print stream.
+ * Creates a new print stream, with the specified OutputStream, line
+ * flushing, and character encoding.
*
* @param out The output stream to which values and objects will be
* printed
- * @param autoFlush A boolean; if true, the output buffer will be flushed
+ * @param autoFlush Whether the output buffer will be flushed
* whenever a byte array is written, one of the
* {@code println} methods is invoked, or a newline
* character or byte ({@code '\n'}) is written
@@ -173,14 +178,14 @@
}
/**
- * Creates a new print stream, with the specified OutputStream, automatic line
+ * Creates a new print stream, with the specified OutputStream, line
* flushing and charset. This convenience constructor creates the necessary
* intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
* which will encode characters using the provided charset.
*
* @param out The output stream to which values and objects will be
* printed
- * @param autoFlush A boolean; if true, the output buffer will be flushed
+ * @param autoFlush Whether the output buffer will be flushed
* whenever a byte array is written, one of the
* {@code println} methods is invoked, or a newline
* character or byte ({@code '\n'}) is written
@@ -700,9 +705,9 @@
/**
* Prints a character. The character is translated into one or more bytes
- * according to the platform's default character encoding, and these bytes
- * are written in exactly the manner of the
- * {@link #write(int)} method.
+ * according to the character encoding given to the constructor, or the
+ * platform's default character encoding if none specified. These bytes
+ * are written in exactly the manner of the {@link #write(int)} method.
*
* @param c The {@code char} to be printed
*/
@@ -768,9 +773,9 @@
/**
* Prints an array of characters. The characters are converted into bytes
- * according to the platform's default character encoding, and these bytes
- * are written in exactly the manner of the
- * {@link #write(int)} method.
+ * according to the character encoding given to the constructor, or the
+ * platform's default character encoding if none specified. These bytes
+ * are written in exactly the manner of the {@link #write(int)} method.
*
* @param s The array of chars to be printed
*
@@ -783,8 +788,9 @@
/**
* Prints a string. If the argument is {@code null} then the string
* {@code "null"} is printed. Otherwise, the string's characters are
- * converted into bytes according to the platform's default character
- * encoding, and these bytes are written in exactly the manner of the
+ * converted into bytes according to the character encoding given to the
+ * constructor, or the platform's default character encoding if none
+ * specified. These bytes are written in exactly the manner of the
* {@link #write(int)} method.
*
* @param s The {@code String} to be printed
--- a/src/java.base/share/classes/java/io/PushbackInputStream.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/io/PushbackInputStream.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -217,6 +217,7 @@
* @param b the byte array to push back.
* @param off the start offset of the data.
* @param len the number of bytes to push back.
+ * @exception NullPointerException If <code>b</code> is <code>null</code>.
* @exception IOException If there is not enough room in the pushback
* buffer for the specified number of bytes,
* or this input stream has been closed by
@@ -239,6 +240,7 @@
* value <code>b[1]</code>, and so forth.
*
* @param b the byte array to push back
+ * @exception NullPointerException If <code>b</code> is <code>null</code>.
* @exception IOException If there is not enough room in the pushback
* buffer for the specified number of bytes,
* or this input stream has been closed by
--- a/src/java.base/share/classes/java/lang/System.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/lang/System.java Fri Jul 19 14:55:22 2019 +0530
@@ -2274,6 +2274,11 @@
public void setCause(Throwable t, Throwable cause) {
t.setCause(cause);
}
+
+ public void loadLibrary(Class<?> caller, String library) {
+ assert library.indexOf(java.io.File.separatorChar) < 0;
+ ClassLoader.loadLibrary(caller, library, false);
+ }
});
}
}
--- a/src/java.base/share/classes/java/lang/Throwable.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/lang/Throwable.java Fri Jul 19 14:55:22 2019 +0530
@@ -25,8 +25,8 @@
package java.lang;
-import java.io.*;
-import java.util.*;
+import java.io.*;
+import java.util.*;
/**
* The {@code Throwable} class is the superclass of all errors and
@@ -904,24 +904,36 @@
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject(); // read in all fields
- if (suppressedExceptions != null) {
- List<Throwable> suppressed = null;
- if (suppressedExceptions.isEmpty()) {
- // Use the sentinel for a zero-length list
- suppressed = SUPPRESSED_SENTINEL;
- } else { // Copy Throwables to new list
- suppressed = new ArrayList<>(1);
- for (Throwable t : suppressedExceptions) {
+
+ // Set suppressed exceptions and stack trace elements fields
+ // to marker values until the contents from the serial stream
+ // are validated.
+ List<Throwable> candidateSuppressedExceptions = suppressedExceptions;
+ suppressedExceptions = SUPPRESSED_SENTINEL;
+
+ StackTraceElement[] candidateStackTrace = stackTrace;
+ stackTrace = UNASSIGNED_STACK.clone();
+
+ if (candidateSuppressedExceptions != null) {
+ int suppressedSize = validateSuppressedExceptionsList(candidateSuppressedExceptions);
+ if (suppressedSize > 0) { // Copy valid Throwables to new list
+ var suppList = new ArrayList<Throwable>(Math.min(100, suppressedSize));
+
+ for (Throwable t : candidateSuppressedExceptions) {
// Enforce constraints on suppressed exceptions in
// case of corrupt or malicious stream.
Objects.requireNonNull(t, NULL_CAUSE_MESSAGE);
if (t == this)
throw new IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
- suppressed.add(t);
+ suppList.add(t);
}
+ // If there are any invalid suppressed exceptions,
+ // implicitly use the sentinel value assigned earlier.
+ suppressedExceptions = suppList;
}
- suppressedExceptions = suppressed;
- } // else a null suppressedExceptions field remains null
+ } else {
+ suppressedExceptions = null;
+ }
/*
* For zero-length stack traces, use a clone of
@@ -932,24 +944,41 @@
* the stackTrace needs to be constructed from the information
* in backtrace.
*/
- if (stackTrace != null) {
- if (stackTrace.length == 0) {
- stackTrace = UNASSIGNED_STACK.clone();
- } else if (stackTrace.length == 1 &&
+ if (candidateStackTrace != null) {
+ // Work from a clone of the candidateStackTrace to ensure
+ // consistency of checks.
+ candidateStackTrace = candidateStackTrace.clone();
+ if (candidateStackTrace.length >= 1) {
+ if (candidateStackTrace.length == 1 &&
// Check for the marker of an immutable stack trace
- SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace[0])) {
- stackTrace = null;
- } else { // Verify stack trace elements are non-null.
- for(StackTraceElement ste : stackTrace) {
- Objects.requireNonNull(ste, "null StackTraceElement in serial stream.");
+ SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(candidateStackTrace[0])) {
+ stackTrace = null;
+ } else { // Verify stack trace elements are non-null.
+ for (StackTraceElement ste : candidateStackTrace) {
+ Objects.requireNonNull(ste, "null StackTraceElement in serial stream.");
+ }
+ stackTrace = candidateStackTrace;
}
}
+ }
+ // A null stackTrace field in the serial form can result from
+ // an exception serialized without that field in older JDK
+ // releases; treat such exceptions as having empty stack
+ // traces by leaving stackTrace assigned to a clone of
+ // UNASSIGNED_STACK.
+ }
+
+ private int validateSuppressedExceptionsList(List<Throwable> deserSuppressedExceptions)
+ throws IOException {
+ if (!Object.class.getModule().
+ equals(deserSuppressedExceptions.getClass().getModule())) {
+ throw new StreamCorruptedException("List implementation not in base module.");
} else {
- // A null stackTrace field in the serial form can result
- // from an exception serialized without that field in
- // older JDK releases; treat such exceptions as having
- // empty stack traces.
- stackTrace = UNASSIGNED_STACK.clone();
+ int size = deserSuppressedExceptions.size();
+ if (size < 0) {
+ throw new StreamCorruptedException("Negative list size reported.");
+ }
+ return size;
}
}
--- a/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -67,13 +67,7 @@
* Load net library into runtime.
*/
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
}
private static volatile boolean checkedReusePort;
--- a/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -94,13 +94,7 @@
* Load net library into runtime.
*/
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
}
private static volatile boolean checkedReusePort;
--- a/src/java.base/share/classes/java/net/DatagramPacket.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/DatagramPacket.java Fri Jul 19 14:55:22 2019 +0530
@@ -46,13 +46,7 @@
* Perform class initialization
*/
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
init();
}
--- a/src/java.base/share/classes/java/net/InetAddress.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/InetAddress.java Fri Jul 19 14:55:22 2019 +0530
@@ -317,13 +317,7 @@
} else {
preferIPv6Address = PREFER_IPV4_VALUE;
}
- AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
SharedSecrets.setJavaNetInetAddressAccess(
new JavaNetInetAddressAccess() {
public String getOriginalHostName(InetAddress ia) {
--- a/src/java.base/share/classes/java/net/NetworkInterface.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/NetworkInterface.java Fri Jul 19 14:55:22 2019 +0530
@@ -28,7 +28,6 @@
import java.util.Arrays;
import java.util.Enumeration;
import java.util.NoSuchElementException;
-import java.security.AccessController;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
@@ -57,13 +56,7 @@
private static final int defaultIndex; /* index of defaultInterface */
static {
- AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
init();
defaultInterface = DefaultInterface.getDefault();
--- a/src/java.base/share/classes/java/net/URL.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/URL.java Fri Jul 19 14:55:22 2019 +0530
@@ -45,6 +45,7 @@
import jdk.internal.access.JavaNetURLAccess;
import jdk.internal.access.SharedSecrets;
+import sun.net.util.IPAddressUtil;
import sun.security.util.SecurityConstants;
import sun.security.action.GetPropertyAction;
@@ -466,13 +467,19 @@
this.file = path;
}
- // Note: we don't do validation of the URL here. Too risky to change
+ // Note: we don't do full validation of the URL here. Too risky to change
// right now, but worth considering for future reference. -br
if (handler == null &&
(handler = getURLStreamHandler(protocol)) == null) {
throw new MalformedURLException("unknown protocol: " + protocol);
}
this.handler = handler;
+ if (host != null && isBuiltinStreamHandler(handler)) {
+ String s = IPAddressUtil.checkExternalForm(this);
+ if (s != null) {
+ throw new MalformedURLException(s);
+ }
+ }
}
/**
@@ -1038,7 +1045,12 @@
* @since 1.5
*/
public URI toURI() throws URISyntaxException {
- return new URI (toString());
+ URI uri = new URI(toString());
+ if (authority != null && isBuiltinStreamHandler(handler)) {
+ String s = IPAddressUtil.checkAuthority(this);
+ if (s != null) throw new URISyntaxException(authority, s);
+ }
+ return uri;
}
/**
@@ -1635,6 +1647,10 @@
return replacementURL;
}
+ boolean isBuiltinStreamHandler(URLStreamHandler handler) {
+ return isBuiltinStreamHandler(handler.getClass().getName());
+ }
+
private boolean isBuiltinStreamHandler(String handlerClassName) {
return (handlerClassName.startsWith(BUILTIN_HANDLERS_PREFIX));
}
--- a/src/java.base/share/classes/java/net/URLStreamHandler.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/net/URLStreamHandler.java Fri Jul 19 14:55:22 2019 +0530
@@ -516,12 +516,15 @@
* different from this one
* @since 1.3
*/
- protected void setURL(URL u, String protocol, String host, int port,
+ protected void setURL(URL u, String protocol, String host, int port,
String authority, String userInfo, String path,
String query, String ref) {
if (this != u.handler) {
throw new SecurityException("handler for url different from " +
"this handler");
+ } else if (host != null && u.isBuiltinStreamHandler(this)) {
+ String s = IPAddressUtil.checkHostString(host);
+ if (s != null) throw new IllegalArgumentException(s);
}
// ensure that no one can reset the protocol on a given URL.
u.set(u.getProtocol(), host, port, authority, userInfo, path, query, ref);
--- a/src/java.base/share/classes/java/security/AccessController.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/security/AccessController.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -445,7 +445,8 @@
throw new NullPointerException("null permissions parameter");
}
Class<?> caller = Reflection.getCallerClass();
- return AccessController.doPrivileged(action, createWrapper(null,
+ DomainCombiner dc = (context == null) ? null : context.getCombiner();
+ return AccessController.doPrivileged(action, createWrapper(dc,
caller, parent, context, perms));
}
@@ -860,7 +861,8 @@
throw new NullPointerException("null permissions parameter");
}
Class<?> caller = Reflection.getCallerClass();
- return AccessController.doPrivileged(action, createWrapper(null, caller, parent, context, perms));
+ DomainCombiner dc = (context == null) ? null : context.getCombiner();
+ return AccessController.doPrivileged(action, createWrapper(dc, caller, parent, context, perms));
}
--- a/src/java.base/share/classes/java/util/Collections.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/util/Collections.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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,6 +26,7 @@
package java.util;
import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Array;
@@ -39,6 +40,7 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
+import jdk.internal.access.SharedSecrets;
/**
* This class consists exclusively of static methods that operate on or return
@@ -5163,6 +5165,11 @@
public Spliterator<E> spliterator() {
return stream().spliterator();
}
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ SharedSecrets.getJavaObjectInputStreamAccess().checkArray(ois, Object[].class, n);
+ }
}
/**
--- a/src/java.base/share/classes/java/util/EnumSet.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/util/EnumSet.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -76,11 +76,12 @@
* @since 1.5
* @see EnumMap
*/
-@SuppressWarnings("serial") // No serialVersionUID due to usage of
- // serial proxy pattern
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable
{
+ // declare EnumSet.class serialization compatibility with JDK 8
+ private static final long serialVersionUID = 1009687484059888093L;
+
/**
* The class of all the elements of this set.
*/
--- a/src/java.base/share/classes/java/util/zip/ZipUtils.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/java/util/zip/ZipUtils.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -27,8 +27,6 @@
import java.nio.ByteBuffer;
import java.nio.file.attribute.FileTime;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDateTime;
@@ -278,13 +276,7 @@
* Loads zip native library, if not already laoded
*/
static void loadLibrary() {
- SecurityManager sm = System.getSecurityManager();
- if (sm == null) {
- System.loadLibrary("zip");
- } else {
- PrivilegedAction<Void> pa = () -> { System.loadLibrary("zip"); return null; };
- AccessController.doPrivileged(pa);
- }
+ jdk.internal.loader.BootLoader.loadLibrary("zip");
}
private static final Unsafe unsafe = Unsafe.getUnsafe();
--- a/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -311,4 +311,12 @@
* @param cause set t's cause to new value
*/
void setCause(Throwable t, Throwable cause);
+
+ /**
+ * Privileged System.loadLibrary
+ *
+ * @param caller on behalf of which the library is being loaded
+ * @param library name of the library to load
+ */
+ void loadLibrary(Class<?> caller, String library);
}
--- a/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Fri Jul 19 14:55:22 2019 +0530
@@ -129,6 +129,23 @@
}
/**
+ * Loads a library from the system path.
+ */
+ public static void loadLibrary(String library) {
+ if (System.getSecurityManager() == null) {
+ SharedSecrets.getJavaLangAccess().loadLibrary(BootLoader.class, library);
+ } else {
+ AccessController.doPrivileged(
+ new java.security.PrivilegedAction<>() {
+ public Void run() {
+ SharedSecrets.getJavaLangAccess().loadLibrary(BootLoader.class, library);
+ return null;
+ }
+ });
+ }
+ }
+
+ /**
* Returns a URL to a resource in a module defined to the boot loader.
*/
public static URL findResource(String mn, String name) throws IOException {
--- a/src/java.base/share/classes/sun/net/ext/ExtendedSocketOptions.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/ext/ExtendedSocketOptions.java Fri Jul 19 14:55:22 2019 +0530
@@ -29,8 +29,8 @@
import java.net.SocketException;
import java.net.SocketOption;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
-import java.util.stream.Collectors;
/**
* Defines the infrastructure to support extended socket options, beyond those
@@ -45,6 +45,9 @@
public static final short SOCK_DGRAM = 2;
private final Set<SocketOption<?>> options;
+ private final Set<SocketOption<?>> datagramOptions;
+ private final Set<SocketOption<?>> clientStreamOptions;
+ private final Set<SocketOption<?>> serverStreamOptions;
/** Tells whether or not the option is supported. */
public final boolean isOptionSupported(SocketOption<?> option) {
@@ -78,11 +81,11 @@
return getInstance().options0(SOCK_DGRAM, false);
}
- private boolean isDatagramOption(SocketOption<?> option) {
+ private static boolean isDatagramOption(SocketOption<?> option) {
return !option.name().startsWith("TCP_");
}
- private boolean isStreamOption(SocketOption<?> option, boolean server) {
+ private static boolean isStreamOption(SocketOption<?> option, boolean server) {
if (server && "SO_FLOW_SLA".equals(option.name())) {
return false;
} else {
@@ -91,23 +94,19 @@
}
private Set<SocketOption<?>> options0(short type, boolean server) {
- Set<SocketOption<?>> extOptions;
switch (type) {
case SOCK_DGRAM:
- extOptions = options.stream()
- .filter(option -> isDatagramOption(option))
- .collect(Collectors.toUnmodifiableSet());
- break;
+ return datagramOptions;
case SOCK_STREAM:
- extOptions = options.stream()
- .filter(option -> isStreamOption(option, server))
- .collect(Collectors.toUnmodifiableSet());
- break;
+ if (server) {
+ return serverStreamOptions;
+ } else {
+ return clientStreamOptions;
+ }
default:
//this will never happen
throw new IllegalArgumentException("Invalid socket option type");
}
- return extOptions;
}
/** Sets the value of a socket option, for the given socket. */
@@ -120,6 +119,23 @@
protected ExtendedSocketOptions(Set<SocketOption<?>> options) {
this.options = options;
+ var datagramOptions = new HashSet<SocketOption<?>>();
+ var serverStreamOptions = new HashSet<SocketOption<?>>();
+ var clientStreamOptions = new HashSet<SocketOption<?>>();
+ for (var option : options) {
+ if (isDatagramOption(option)) {
+ datagramOptions.add(option);
+ }
+ if (isStreamOption(option, true)) {
+ serverStreamOptions.add(option);
+ }
+ if (isStreamOption(option, false)) {
+ clientStreamOptions.add(option);
+ }
+ }
+ this.datagramOptions = Set.copyOf(datagramOptions);
+ this.serverStreamOptions = Set.copyOf(serverStreamOptions);
+ this.clientStreamOptions = Set.copyOf(clientStreamOptions);
}
private static volatile ExtendedSocketOptions instance;
--- a/src/java.base/share/classes/sun/net/sdp/SdpSupport.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/sdp/SdpSupport.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -27,7 +27,6 @@
import java.io.IOException;
import java.io.FileDescriptor;
-import java.security.AccessController;
import jdk.internal.access.SharedSecrets;
import jdk.internal.access.JavaIOFileDescriptorAccess;
@@ -75,12 +74,6 @@
private static native void convert0(int fd) throws IOException;
static {
- AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
}
}
--- a/src/java.base/share/classes/sun/net/spi/DefaultProxySelector.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/spi/DefaultProxySelector.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -98,13 +98,7 @@
return NetProperties.getBoolean(key);
}});
if (b != null && b.booleanValue()) {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
hasSystemProxies = init();
}
}
--- a/src/java.base/share/classes/sun/net/util/IPAddressUtil.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/util/IPAddressUtil.java Fri Jul 19 14:55:22 2019 +0530
@@ -32,9 +32,11 @@
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
+import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.security.PrivilegedActionException;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -372,4 +374,181 @@
return null;
}
}
+
+ // See java.net.URI for more details on how to generate these
+ // masks.
+ //
+ // square brackets
+ private static final long L_IPV6_DELIMS = 0x0L; // "[]"
+ private static final long H_IPV6_DELIMS = 0x28000000L; // "[]"
+ // RFC 3986 gen-delims
+ private static final long L_GEN_DELIMS = 0x8400800800000000L; // ":/?#[]@"
+ private static final long H_GEN_DELIMS = 0x28000001L; // ":/?#[]@"
+ // These gen-delims can appear in authority
+ private static final long L_AUTH_DELIMS = 0x400000000000000L; // "@[]:"
+ private static final long H_AUTH_DELIMS = 0x28000001L; // "@[]:"
+ // colon is allowed in userinfo
+ private static final long L_COLON = 0x400000000000000L; // ":"
+ private static final long H_COLON = 0x0L; // ":"
+ // slash should be encoded in authority
+ private static final long L_SLASH = 0x800000000000L; // "/"
+ private static final long H_SLASH = 0x0L; // "/"
+ // backslash should always be encoded
+ private static final long L_BACKSLASH = 0x0L; // "\"
+ private static final long H_BACKSLASH = 0x10000000L; // "\"
+ // ASCII chars 0-31 + 127 - various controls + CRLF + TAB
+ private static final long L_NON_PRINTABLE = 0xffffffffL;
+ private static final long H_NON_PRINTABLE = 0x8000000000000000L;
+ // All of the above
+ private static final long L_EXCLUDE = 0x84008008ffffffffL;
+ private static final long H_EXCLUDE = 0x8000000038000001L;
+
+ private static final char[] OTHERS = {
+ 8263,8264,8265,8448,8449,8453,8454,10868,
+ 65109,65110,65119,65131,65283,65295,65306,65311,65312
+ };
+
+ // Tell whether the given character is found by the given mask pair
+ public static boolean match(char c, long lowMask, long highMask) {
+ if (c < 64)
+ return ((1L << c) & lowMask) != 0;
+ if (c < 128)
+ return ((1L << (c - 64)) & highMask) != 0;
+ return false; // other non ASCII characters are not filtered
+ }
+
+ // returns -1 if the string doesn't contain any characters
+ // from the mask, the index of the first such character found
+ // otherwise.
+ public static int scan(String s, long lowMask, long highMask) {
+ int i = -1, len;
+ if (s == null || (len = s.length()) == 0) return -1;
+ boolean match = false;
+ while (++i < len && !(match = match(s.charAt(i), lowMask, highMask)));
+ if (match) return i;
+ return -1;
+ }
+
+ public static int scan(String s, long lowMask, long highMask, char[] others) {
+ int i = -1, len;
+ if (s == null || (len = s.length()) == 0) return -1;
+ boolean match = false;
+ char c, c0 = others[0];
+ while (++i < len && !(match = match((c=s.charAt(i)), lowMask, highMask))) {
+ if (c >= c0 && (Arrays.binarySearch(others, c) > -1)) {
+ match = true; break;
+ }
+ }
+ if (match) return i;
+
+ return -1;
+ }
+
+ private static String describeChar(char c) {
+ if (c < 32 || c == 127) {
+ if (c == '\n') return "LF";
+ if (c == '\r') return "CR";
+ return "control char (code=" + (int)c + ")";
+ }
+ if (c == '\\') return "'\\'";
+ return "'" + c + "'";
+ }
+
+ private static String checkUserInfo(String str) {
+ // colon is permitted in user info
+ int index = scan(str, L_EXCLUDE & ~L_COLON,
+ H_EXCLUDE & ~H_COLON);
+ if (index >= 0) {
+ return "Illegal character found in user-info: "
+ + describeChar(str.charAt(index));
+ }
+ return null;
+ }
+
+ private static String checkHost(String str) {
+ int index;
+ if (str.startsWith("[") && str.endsWith("]")) {
+ str = str.substring(1, str.length() - 1);
+ if (isIPv6LiteralAddress(str)) {
+ index = str.indexOf('%');
+ if (index >= 0) {
+ index = scan(str = str.substring(index),
+ L_NON_PRINTABLE | L_IPV6_DELIMS,
+ H_NON_PRINTABLE | H_IPV6_DELIMS);
+ if (index >= 0) {
+ return "Illegal character found in IPv6 scoped address: "
+ + describeChar(str.charAt(index));
+ }
+ }
+ return null;
+ }
+ return "Unrecognized IPv6 address format";
+ } else {
+ index = scan(str, L_EXCLUDE, H_EXCLUDE);
+ if (index >= 0) {
+ return "Illegal character found in host: "
+ + describeChar(str.charAt(index));
+ }
+ }
+ return null;
+ }
+
+ private static String checkAuth(String str) {
+ int index = scan(str,
+ L_EXCLUDE & ~L_AUTH_DELIMS,
+ H_EXCLUDE & ~H_AUTH_DELIMS);
+ if (index >= 0) {
+ return "Illegal character found in authority: "
+ + describeChar(str.charAt(index));
+ }
+ return null;
+ }
+
+ // check authority of hierarchical URL. Appropriate for
+ // HTTP-like protocol handlers
+ public static String checkAuthority(URL url) {
+ String s, u, h;
+ if (url == null) return null;
+ if ((s = checkUserInfo(u = url.getUserInfo())) != null) {
+ return s;
+ }
+ if ((s = checkHost(h = url.getHost())) != null) {
+ return s;
+ }
+ if (h == null && u == null) {
+ return checkAuth(url.getAuthority());
+ }
+ return null;
+ }
+
+ // minimal syntax checks - deeper check may be performed
+ // by the appropriate protocol handler
+ public static String checkExternalForm(URL url) {
+ String s;
+ if (url == null) return null;
+ int index = scan(s = url.getUserInfo(),
+ L_NON_PRINTABLE | L_SLASH,
+ H_NON_PRINTABLE | H_SLASH);
+ if (index >= 0) {
+ return "Illegal character found in authority: "
+ + describeChar(s.charAt(index));
+ }
+ if ((s = checkHostString(url.getHost())) != null) {
+ return s;
+ }
+ return null;
+ }
+
+ public static String checkHostString(String host) {
+ if (host == null) return null;
+ int index = scan(host,
+ L_NON_PRINTABLE | L_SLASH,
+ H_NON_PRINTABLE | H_SLASH,
+ OTHERS);
+ if (index >= 0) {
+ return "Illegal character found in host: "
+ + describeChar(host.charAt(index));
+ }
+ return null;
+ }
}
--- a/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 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
@@ -36,6 +36,7 @@
import java.io.FilterInputStream;
import java.io.FilterOutputStream;
import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
import java.net.URL;
import java.net.SocketPermission;
import java.net.UnknownHostException;
@@ -48,6 +49,7 @@
import java.security.Permission;
import java.util.Properties;
import sun.net.NetworkClient;
+import sun.net.util.IPAddressUtil;
import sun.net.www.MessageHeader;
import sun.net.www.MeteredStream;
import sun.net.www.URLConnection;
@@ -157,6 +159,21 @@
}
}
+ static URL checkURL(URL u) throws IllegalArgumentException {
+ if (u != null) {
+ if (u.toExternalForm().indexOf('\n') > -1) {
+ Exception mfue = new MalformedURLException("Illegal character in URL");
+ throw new IllegalArgumentException(mfue.getMessage(), mfue);
+ }
+ }
+ String s = IPAddressUtil.checkAuthority(u);
+ if (s != null) {
+ Exception mfue = new MalformedURLException(s);
+ throw new IllegalArgumentException(mfue.getMessage(), mfue);
+ }
+ return u;
+ }
+
/**
* Creates an FtpURLConnection from a URL.
*
@@ -170,7 +187,7 @@
* Same as FtpURLconnection(URL) with a per connection proxy specified
*/
FtpURLConnection(URL url, Proxy p) {
- super(url);
+ super(checkURL(url));
instProxy = p;
host = url.getHost();
port = url.getPort();
--- a/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 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
@@ -68,6 +68,7 @@
import jdk.internal.access.JavaNetHttpCookieAccess;
import jdk.internal.access.SharedSecrets;
import sun.net.*;
+import sun.net.util.IPAddressUtil;
import sun.net.www.*;
import sun.net.www.http.HttpClient;
import sun.net.www.http.PosterOutputStream;
@@ -868,8 +869,13 @@
throw new MalformedURLException("Illegal character in URL");
}
}
+ String s = IPAddressUtil.checkAuthority(u);
+ if (s != null) {
+ throw new MalformedURLException(s);
+ }
return u;
}
+
protected HttpURLConnection(URL u, Proxy p, Handler handler)
throws IOException {
super(checkURL(u));
--- a/src/java.base/share/classes/sun/net/www/protocol/https/HttpsURLConnectionImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/net/www/protocol/https/HttpsURLConnectionImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -37,6 +37,7 @@
import java.util.Map;
import java.util.List;
import java.util.Optional;
+import sun.net.util.IPAddressUtil;
import sun.net.www.http.HttpClient;
/**
@@ -69,6 +70,10 @@
throw new MalformedURLException("Illegal character in URL");
}
}
+ String s = IPAddressUtil.checkAuthority(u);
+ if (s != null) {
+ throw new MalformedURLException(s);
+ }
return u;
}
@@ -289,7 +294,7 @@
* @param key the keyword by which the request is known
* (e.g., "<code>accept</code>").
* @param value the value associated with it.
- * @see #getRequestProperties(java.lang.String)
+ * @see #getRequestProperty(java.lang.String)
* @since 1.4
*/
public void addRequestProperty(String key, String value) {
--- a/src/java.base/share/classes/sun/nio/ch/IOUtil.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/nio/ch/IOUtil.java Fri Jul 19 14:55:22 2019 +0530
@@ -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
@@ -432,15 +432,8 @@
public static void load() { }
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("net");
- System.loadLibrary("nio");
- return null;
- }
- });
-
+ jdk.internal.loader.BootLoader.loadLibrary("net");
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
initIDs();
IOV_MAX = iovMax();
--- a/src/java.base/share/classes/sun/security/ssl/CertStatusExtension.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/CertStatusExtension.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -724,12 +724,14 @@
// Update the context.
chc.handshakeExtensions.put(
SH_STATUS_REQUEST, CertStatusRequestSpec.DEFAULT);
- chc.handshakeConsumers.put(SSLHandshake.CERTIFICATE_STATUS.id,
- SSLHandshake.CERTIFICATE_STATUS);
// Since we've received a legitimate status_request in the
// ServerHello, stapling is active if it's been enabled.
chc.staplingActive = chc.sslContext.isStaplingEnabled(true);
+ if (chc.staplingActive) {
+ chc.handshakeConsumers.put(SSLHandshake.CERTIFICATE_STATUS.id,
+ SSLHandshake.CERTIFICATE_STATUS);
+ }
// No impact on session resumption.
}
@@ -1079,12 +1081,16 @@
// Update the context.
chc.handshakeExtensions.put(
SH_STATUS_REQUEST_V2, CertStatusRequestV2Spec.DEFAULT);
- chc.handshakeConsumers.put(SSLHandshake.CERTIFICATE_STATUS.id,
- SSLHandshake.CERTIFICATE_STATUS);
// Since we've received a legitimate status_request in the
- // ServerHello, stapling is active if it's been enabled.
+ // ServerHello, stapling is active if it's been enabled. If it
+ // is active, make sure we add the CertificateStatus message
+ // consumer.
chc.staplingActive = chc.sslContext.isStaplingEnabled(true);
+ if (chc.staplingActive) {
+ chc.handshakeConsumers.put(SSLHandshake.CERTIFICATE_STATUS.id,
+ SSLHandshake.CERTIFICATE_STATUS);
+ }
// No impact on session resumption.
}
--- a/src/java.base/share/classes/sun/security/ssl/CertificateRequest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/CertificateRequest.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -330,6 +330,15 @@
// clean up this consumer
chc.handshakeConsumers.remove(SSLHandshake.CERTIFICATE_REQUEST.id);
+ SSLConsumer certStatCons = chc.handshakeConsumers.remove(
+ SSLHandshake.CERTIFICATE_STATUS.id);
+ if (certStatCons != null) {
+ // Stapling was active but no certificate status message
+ // was sent. We need to run the absence handler which will
+ // check the certificate chain.
+ CertificateStatus.handshakeAbsence.absent(context, null);
+ }
+
T10CertificateRequestMessage crm =
new T10CertificateRequestMessage(chc, message);
if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
@@ -647,6 +656,15 @@
// clean up this consumer
chc.handshakeConsumers.remove(SSLHandshake.CERTIFICATE_REQUEST.id);
+ SSLConsumer certStatCons = chc.handshakeConsumers.remove(
+ SSLHandshake.CERTIFICATE_STATUS.id);
+ if (certStatCons != null) {
+ // Stapling was active but no certificate status message
+ // was sent. We need to run the absence handler which will
+ // check the certificate chain.
+ CertificateStatus.handshakeAbsence.absent(context, null);
+ }
+
T12CertificateRequestMessage crm =
new T12CertificateRequestMessage(chc, message);
if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
--- a/src/java.base/share/classes/sun/security/ssl/CertificateStatus.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/CertificateStatus.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -287,12 +287,16 @@
}
// Pin the received responses to the SSLSessionImpl. It will
- // be retrieved by the X509TrustManagerImpl during the certficicate
+ // be retrieved by the X509TrustManagerImpl during the certificate
// checking phase.
chc.handshakeSession.setStatusResponses(cst.encodedResponses);
// Now perform the check
T12CertificateConsumer.checkServerCerts(chc, chc.deferredCerts);
+
+ // Update the handshake consumers to remove this message, indicating
+ // that it has been processed.
+ chc.handshakeConsumers.remove(SSLHandshake.CERTIFICATE_STATUS.id);
}
}
--- a/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1480,8 +1480,9 @@
checkAdditionalTrust(chain, authType, engine, false);
}
- private void checkAdditionalTrust(X509Certificate[] chain, String authType,
- Socket socket, boolean isClient) throws CertificateException {
+ private void checkAdditionalTrust(X509Certificate[] chain,
+ String authType, Socket socket,
+ boolean checkClientTrusted) throws CertificateException {
if (socket != null && socket.isConnected() &&
socket instanceof SSLSocket) {
@@ -1495,9 +1496,8 @@
String identityAlg = sslSocket.getSSLParameters().
getEndpointIdentificationAlgorithm();
if (identityAlg != null && !identityAlg.isEmpty()) {
- String hostname = session.getPeerHost();
- X509TrustManagerImpl.checkIdentity(
- hostname, chain[0], identityAlg);
+ X509TrustManagerImpl.checkIdentity(session, chain,
+ identityAlg, checkClientTrusted);
}
// try the best to check the algorithm constraints
@@ -1519,12 +1519,13 @@
constraints = new SSLAlgorithmConstraints(sslSocket, true);
}
- checkAlgorithmConstraints(chain, constraints, isClient);
+ checkAlgorithmConstraints(chain, constraints, checkClientTrusted);
}
}
- private void checkAdditionalTrust(X509Certificate[] chain, String authType,
- SSLEngine engine, boolean isClient) throws CertificateException {
+ private void checkAdditionalTrust(X509Certificate[] chain,
+ String authType, SSLEngine engine,
+ boolean checkClientTrusted) throws CertificateException {
if (engine != null) {
SSLSession session = engine.getHandshakeSession();
if (session == null) {
@@ -1535,9 +1536,8 @@
String identityAlg = engine.getSSLParameters().
getEndpointIdentificationAlgorithm();
if (identityAlg != null && !identityAlg.isEmpty()) {
- String hostname = session.getPeerHost();
- X509TrustManagerImpl.checkIdentity(
- hostname, chain[0], identityAlg);
+ X509TrustManagerImpl.checkIdentity(session, chain,
+ identityAlg, checkClientTrusted);
}
// try the best to check the algorithm constraints
@@ -1559,13 +1559,13 @@
constraints = new SSLAlgorithmConstraints(engine, true);
}
- checkAlgorithmConstraints(chain, constraints, isClient);
+ checkAlgorithmConstraints(chain, constraints, checkClientTrusted);
}
}
private void checkAlgorithmConstraints(X509Certificate[] chain,
AlgorithmConstraints constraints,
- boolean isClient) throws CertificateException {
+ boolean checkClientTrusted) throws CertificateException {
try {
// Does the certificate chain end with a trusted certificate?
int checkedLength = chain.length - 1;
@@ -1584,7 +1584,7 @@
if (checkedLength >= 0) {
AlgorithmChecker checker =
new AlgorithmChecker(constraints, null,
- (isClient ? Validator.VAR_TLS_CLIENT :
+ (checkClientTrusted ? Validator.VAR_TLS_CLIENT :
Validator.VAR_TLS_SERVER));
checker.init(false);
for (int i = checkedLength; i >= 0; i--) {
--- a/src/java.base/share/classes/sun/security/ssl/ServerHelloDone.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/ServerHelloDone.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -133,6 +133,15 @@
// The consuming happens in client side only.
ClientHandshakeContext chc = (ClientHandshakeContext)context;
+ SSLConsumer certStatCons = chc.handshakeConsumers.remove(
+ SSLHandshake.CERTIFICATE_STATUS.id);
+ if (certStatCons != null) {
+ // Stapling was active but no certificate status message
+ // was sent. We need to run the absence handler which will
+ // check the certificate chain.
+ CertificateStatus.handshakeAbsence.absent(context, null);
+ }
+
// clean up this consumer
chc.handshakeConsumers.clear();
--- a/src/java.base/share/classes/sun/security/ssl/ServerKeyExchange.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/ServerKeyExchange.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 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
@@ -92,6 +92,15 @@
// clean up this consumer
chc.handshakeConsumers.remove(SSLHandshake.SERVER_KEY_EXCHANGE.id);
+ SSLConsumer certStatCons = chc.handshakeConsumers.remove(
+ SSLHandshake.CERTIFICATE_STATUS.id);
+ if (certStatCons != null) {
+ // Stapling was active but no certificate status message
+ // was sent. We need to run the absence handler which will
+ // check the certificate chain.
+ CertificateStatus.handshakeAbsence.absent(context, null);
+ }
+
SSLKeyExchange ke = SSLKeyExchange.valueOf(
chc.negotiatedCipherSuite.keyExchange,
chc.negotiatedProtocol);
--- a/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -145,7 +145,7 @@
}
private Validator checkTrustedInit(X509Certificate[] chain,
- String authType, boolean isClient) {
+ String authType, boolean checkClientTrusted) {
if (chain == null || chain.length == 0) {
throw new IllegalArgumentException(
"null or zero-length certificate chain");
@@ -157,7 +157,7 @@
}
Validator v = null;
- if (isClient) {
+ if (checkClientTrusted) {
v = clientValidator;
if (v == null) {
validatorLock.lock();
@@ -192,9 +192,10 @@
return v;
}
- private void checkTrusted(X509Certificate[] chain, String authType,
- Socket socket, boolean isClient) throws CertificateException {
- Validator v = checkTrustedInit(chain, authType, isClient);
+ private void checkTrusted(X509Certificate[] chain,
+ String authType, Socket socket,
+ boolean checkClientTrusted) throws CertificateException {
+ Validator v = checkTrustedInit(chain, authType, checkClientTrusted);
X509Certificate[] trustedChain = null;
if ((socket != null) && socket.isConnected() &&
@@ -223,28 +224,23 @@
// Grab any stapled OCSP responses for use in validation
List<byte[]> responseList = Collections.emptyList();
- if (!isClient && isExtSession) {
+ if (!checkClientTrusted && isExtSession) {
responseList =
((ExtendedSSLSession)session).getStatusResponses();
}
trustedChain = v.validate(chain, null, responseList,
- constraints, isClient ? null : authType);
-
- // check if EE certificate chains to a public root CA (as
- // pre-installed in cacerts)
- boolean chainsToPublicCA = AnchorCertificates.contains(
- trustedChain[trustedChain.length-1]);
+ constraints, checkClientTrusted ? null : authType);
// check endpoint identity
String identityAlg = sslSocket.getSSLParameters().
getEndpointIdentificationAlgorithm();
if (identityAlg != null && !identityAlg.isEmpty()) {
- checkIdentity(session, trustedChain[0], identityAlg, isClient,
- getRequestedServerNames(socket), chainsToPublicCA);
+ checkIdentity(session,
+ trustedChain, identityAlg, checkClientTrusted);
}
} else {
trustedChain = v.validate(chain, null, Collections.emptyList(),
- null, isClient ? null : authType);
+ null, checkClientTrusted ? null : authType);
}
if (SSLLogger.isOn && SSLLogger.isOn("ssl,trustmanager")) {
@@ -253,9 +249,10 @@
}
}
- private void checkTrusted(X509Certificate[] chain, String authType,
- SSLEngine engine, boolean isClient) throws CertificateException {
- Validator v = checkTrustedInit(chain, authType, isClient);
+ private void checkTrusted(X509Certificate[] chain,
+ String authType, SSLEngine engine,
+ boolean checkClientTrusted) throws CertificateException {
+ Validator v = checkTrustedInit(chain, authType, checkClientTrusted);
X509Certificate[] trustedChain = null;
if (engine != null) {
@@ -281,28 +278,23 @@
// Grab any stapled OCSP responses for use in validation
List<byte[]> responseList = Collections.emptyList();
- if (!isClient && isExtSession) {
+ if (!checkClientTrusted && isExtSession) {
responseList =
((ExtendedSSLSession)session).getStatusResponses();
}
trustedChain = v.validate(chain, null, responseList,
- constraints, isClient ? null : authType);
-
- // check if EE certificate chains to a public root CA (as
- // pre-installed in cacerts)
- boolean chainsToPublicCA = AnchorCertificates.contains(
- trustedChain[trustedChain.length-1]);
+ constraints, checkClientTrusted ? null : authType);
// check endpoint identity
String identityAlg = engine.getSSLParameters().
getEndpointIdentificationAlgorithm();
if (identityAlg != null && !identityAlg.isEmpty()) {
- checkIdentity(session, trustedChain[0], identityAlg, isClient,
- getRequestedServerNames(engine), chainsToPublicCA);
+ checkIdentity(session, trustedChain,
+ identityAlg, checkClientTrusted);
}
} else {
trustedChain = v.validate(chain, null, Collections.emptyList(),
- null, isClient ? null : authType);
+ null, checkClientTrusted ? null : authType);
}
if (SSLLogger.isOn && SSLLogger.isOn("ssl,trustmanager")) {
@@ -360,14 +352,8 @@
static List<SNIServerName> getRequestedServerNames(Socket socket) {
if (socket != null && socket.isConnected() &&
socket instanceof SSLSocket) {
-
- SSLSocket sslSocket = (SSLSocket)socket;
- SSLSession session = sslSocket.getHandshakeSession();
-
- if (session != null && (session instanceof ExtendedSSLSession)) {
- ExtendedSSLSession extSession = (ExtendedSSLSession)session;
- return extSession.getRequestedServerNames();
- }
+ return getRequestedServerNames(
+ ((SSLSocket)socket).getHandshakeSession());
}
return Collections.<SNIServerName>emptyList();
@@ -376,12 +362,16 @@
// Also used by X509KeyManagerImpl
static List<SNIServerName> getRequestedServerNames(SSLEngine engine) {
if (engine != null) {
- SSLSession session = engine.getHandshakeSession();
+ return getRequestedServerNames(engine.getHandshakeSession());
+ }
- if (session != null && (session instanceof ExtendedSSLSession)) {
- ExtendedSSLSession extSession = (ExtendedSSLSession)session;
- return extSession.getRequestedServerNames();
- }
+ return Collections.<SNIServerName>emptyList();
+ }
+
+ private static List<SNIServerName> getRequestedServerNames(
+ SSLSession session) {
+ if (session != null && (session instanceof ExtendedSSLSession)) {
+ return ((ExtendedSSLSession)session).getRequestedServerNames();
}
return Collections.<SNIServerName>emptyList();
@@ -402,23 +392,28 @@
* the identity checking aginst the server_name extension if present, and
* may failove to peer host checking.
*/
- private static void checkIdentity(SSLSession session,
- X509Certificate cert,
+ static void checkIdentity(SSLSession session,
+ X509Certificate[] trustedChain,
String algorithm,
- boolean isClient,
- List<SNIServerName> sniNames,
- boolean chainsToPublicCA) throws CertificateException {
+ boolean checkClientTrusted) throws CertificateException {
+
+ // check if EE certificate chains to a public root CA (as
+ // pre-installed in cacerts)
+ boolean chainsToPublicCA = AnchorCertificates.contains(
+ trustedChain[trustedChain.length - 1]);
boolean identifiable = false;
String peerHost = session.getPeerHost();
- if (isClient) {
- String hostname = getHostNameInSNI(sniNames);
- if (hostname != null) {
+ if (!checkClientTrusted) {
+ List<SNIServerName> sniNames = getRequestedServerNames(session);
+ String sniHostName = getHostNameInSNI(sniNames);
+ if (sniHostName != null) {
try {
- checkIdentity(hostname, cert, algorithm, chainsToPublicCA);
+ checkIdentity(sniHostName,
+ trustedChain[0], algorithm, chainsToPublicCA);
identifiable = true;
} catch (CertificateException ce) {
- if (hostname.equalsIgnoreCase(peerHost)) {
+ if (sniHostName.equalsIgnoreCase(peerHost)) {
throw ce;
}
@@ -428,7 +423,8 @@
}
if (!identifiable) {
- checkIdentity(peerHost, cert, algorithm, chainsToPublicCA);
+ checkIdentity(peerHost,
+ trustedChain[0], algorithm, chainsToPublicCA);
}
}
--- a/src/java.base/share/classes/sun/security/util/DerIndefLenConverter.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/util/DerIndefLenConverter.java Fri Jul 19 14:55:22 2019 +0530
@@ -92,8 +92,6 @@
* add the current position to the <code>eocList</code> vector.
*/
private void parseTag() throws IOException {
- if (dataPos == dataSize)
- return;
if (isEOC(data[dataPos]) && (data[dataPos + 1] == 0)) {
int numOfEncapsulatedLenBytes = 0;
Object elem = null;
@@ -332,6 +330,10 @@
// parse and set up the vectors of all the indefinite-lengths
while (dataPos < dataSize) {
+ if (dataPos + 2 > dataSize) {
+ // There should be at least one tag and one length
+ return null;
+ }
parseTag();
len = parseLength();
if (len < 0) {
--- a/src/java.base/share/classes/sun/security/util/HostnameChecker.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/util/HostnameChecker.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -260,28 +260,35 @@
* The matching is performed as per RFC 2818 rules for TLS and
* RFC 2830 rules for LDAP.<p>
*
- * The <code>name</code> parameter should represent a DNS name.
- * The <code>template</code> parameter
- * may contain the wildcard character *
+ * The <code>name</code> parameter should represent a DNS name. The
+ * <code>template</code> parameter may contain the wildcard character '*'.
*/
private boolean isMatched(String name, String template,
boolean chainsToPublicCA) {
// Normalize to Unicode, because PSL is in Unicode.
- name = IDN.toUnicode(IDN.toASCII(name));
- template = IDN.toUnicode(IDN.toASCII(template));
+ try {
+ name = IDN.toUnicode(IDN.toASCII(name));
+ template = IDN.toUnicode(IDN.toASCII(template));
+ } catch (RuntimeException re) {
+ if (SSLLogger.isOn) {
+ SSLLogger.fine("Failed to normalize to Unicode: " + re);
+ }
- if (hasIllegalWildcard(name, template, chainsToPublicCA)) {
+ return false;
+ }
+
+ if (hasIllegalWildcard(template, chainsToPublicCA)) {
return false;
}
// check the validity of the domain name template.
try {
- // Replacing wildcard character '*' with 'x' so as to check
+ // Replacing wildcard character '*' with 'z' so as to check
// the domain name template validity.
//
// Using the checking implemented in SNIHostName
- new SNIHostName(template.replace('*', 'x'));
+ new SNIHostName(template.replace('*', 'z'));
} catch (IllegalArgumentException iae) {
// It would be nice to add debug log if not matching.
return false;
@@ -299,8 +306,8 @@
/**
* Returns true if the template contains an illegal wildcard character.
*/
- private static boolean hasIllegalWildcard(String domain, String template,
- boolean chainsToPublicCA) {
+ private static boolean hasIllegalWildcard(
+ String template, boolean chainsToPublicCA) {
// not ok if it is a single wildcard character or "*."
if (template.equals("*") || template.equals("*.")) {
if (SSLLogger.isOn) {
@@ -331,25 +338,29 @@
return true;
}
- // If the wildcarded domain is a top-level domain under which names
- // can be registered, then a wildcard is not allowed.
-
if (!chainsToPublicCA) {
return false; // skip check for non-public certificates
}
- Optional<RegisteredDomain> rd = RegisteredDomain.from(domain)
- .filter(d -> d.type() == RegisteredDomain.Type.ICANN);
- if (rd.isPresent()) {
- String wDomain = afterWildcard.substring(firstDotIndex + 1);
- if (rd.get().publicSuffix().equalsIgnoreCase(wDomain)) {
- if (SSLLogger.isOn) {
- SSLLogger.fine(
- "Certificate domain name has illegal " +
- "wildcard for public suffix: " + template);
- }
- return true;
+ // If the wildcarded domain is a top-level domain under which names
+ // can be registered, then a wildcard is not allowed.
+ String wildcardedDomain = afterWildcard.substring(firstDotIndex + 1);
+ String templateDomainSuffix =
+ RegisteredDomain.from("z." + wildcardedDomain)
+ .filter(d -> d.type() == RegisteredDomain.Type.ICANN)
+ .map(RegisteredDomain::publicSuffix).orElse(null);
+ if (templateDomainSuffix == null) {
+ return false; // skip check if not known public suffix
+ }
+
+ // Is it a top-level domain?
+ if (wildcardedDomain.equalsIgnoreCase(templateDomainSuffix)) {
+ if (SSLLogger.isOn) {
+ SSLLogger.fine(
+ "Certificate domain name has illegal " +
+ "wildcard for top-level public suffix: " + template);
}
+ return true;
}
return false;
--- a/src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java Fri Jul 19 14:55:22 2019 +0530
@@ -269,6 +269,8 @@
throw (CertificateException)e;
} else if (e instanceof NoSuchAlgorithmException) {
throw (NoSuchAlgorithmException)e;
+ } else if (e instanceof RuntimeException){
+ throw (RuntimeException)e;
}
}
}
--- a/src/java.base/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,9 +25,6 @@
package sun.nio.fs;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
/**
* Solaris specific system calls.
*/
@@ -52,11 +49,7 @@
private static native void init();
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
init();
}
}
--- a/src/java.base/solaris/classes/sun/nio/fs/SolarisWatchService.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/solaris/classes/sun/nio/fs/SolarisWatchService.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,8 +26,6 @@
package sun.nio.fs;
import java.nio.file.*;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.*;
import java.io.IOException;
import jdk.internal.misc.Unsafe;
@@ -817,11 +815,7 @@
throws UnixException;
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
init();
}
}
--- a/src/java.base/unix/classes/sun/net/PortConfig.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/unix/classes/sun/net/PortConfig.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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,7 +25,7 @@
package sun.net;
-import java.security.AccessController;
+import sun.security.action.GetPropertyAction;
/**
* Determines the ephemeral port range in use on this system.
@@ -41,35 +41,29 @@
private PortConfig() {}
static {
- AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- String os = System.getProperty("os.name");
- if (os.startsWith("Linux")) {
- defaultLower = 32768;
- defaultUpper = 61000;
- } else if (os.startsWith("SunOS")) {
- defaultLower = 32768;
- defaultUpper = 65535;
- } else if (os.contains("OS X")) {
- defaultLower = 49152;
- defaultUpper = 65535;
- } else if (os.startsWith("AIX")) {
- // The ephemeral port is OS version dependent on AIX:
- // http://publib.boulder.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.rsct315.admin/bl503_ephport.htm
- // However, on AIX 5.3 / 6.1 / 7.1 we always see the
- // settings below by using:
- // /usr/sbin/no -a | fgrep ephemeral
- defaultLower = 32768;
- defaultUpper = 65535;
- } else {
- throw new InternalError(
- "sun.net.PortConfig: unknown OS");
- }
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
+ String os = GetPropertyAction.privilegedGetProperty("os.name");
+ if (os.startsWith("Linux")) {
+ defaultLower = 32768;
+ defaultUpper = 61000;
+ } else if (os.startsWith("SunOS")) {
+ defaultLower = 32768;
+ defaultUpper = 65535;
+ } else if (os.contains("OS X")) {
+ defaultLower = 49152;
+ defaultUpper = 65535;
+ } else if (os.startsWith("AIX")) {
+ // The ephemeral port is OS version dependent on AIX:
+ // http://publib.boulder.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.rsct315.admin/bl503_ephport.htm
+ // However, on AIX 5.3 / 6.1 / 7.1 we always see the
+ // settings below by using:
+ // /usr/sbin/no -a | fgrep ephemeral
+ defaultLower = 32768;
+ defaultUpper = 65535;
+ } else {
+ throw new InternalError(
+ "sun.net.PortConfig: unknown OS");
+ }
int v = getLower0();
if (v == -1) {
--- a/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -259,13 +259,7 @@
static native String fallbackDomain0();
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
}
}
--- a/src/java.base/unix/classes/sun/nio/fs/UnixCopyFile.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/unix/classes/sun/nio/fs/UnixCopyFile.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,8 +33,6 @@
import java.nio.file.LinkOption;
import java.nio.file.LinkPermission;
import java.nio.file.StandardCopyOption;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -628,12 +626,7 @@
throws UnixException;
static {
- AccessController.doPrivileged(new PrivilegedAction<>() {
- @Override
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
}
}
--- a/src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -25,9 +25,6 @@
package sun.nio.fs;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
/**
* Unix system and library calls.
*/
@@ -630,11 +627,7 @@
private static native int init();
static {
- AccessController.doPrivileged(new PrivilegedAction<>() {
- public Void run() {
- System.loadLibrary("nio");
- return null;
- }});
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
capabilities = init();
}
}
--- a/src/java.base/windows/classes/sun/net/dns/ResolverConfigurationImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/windows/classes/sun/net/dns/ResolverConfigurationImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -160,13 +160,7 @@
static native int notifyAddrChange0();
static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("net");
- return null;
- }
- });
+ jdk.internal.loader.BootLoader.loadLibrary("net");
init0();
// start the address listener thread
--- a/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -95,7 +95,7 @@
path = "\\\\" + host + path;
File f = new File(path);
if (f.exists()) {
- return createFileURLConnection(url, f);
+ return new UNCFileURLConnection(url, f, path);
}
/*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.base/windows/classes/sun/net/www/protocol/file/UNCFileURLConnection.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,52 @@
+/*
+ * 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. 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 sun.net.www.protocol.file;
+
+import java.io.File;
+import java.io.FilePermission;
+import java.net.URL;
+import java.security.Permission;
+
+final class UNCFileURLConnection extends FileURLConnection {
+
+ private final String effectivePath;
+ private volatile Permission permission;
+
+ UNCFileURLConnection(URL u, File file, String effectivePath) {
+ super(u, file);
+ this.effectivePath = effectivePath;
+ }
+
+ @Override
+ public Permission getPermission() {
+ Permission perm = permission;
+ if (perm == null) {
+ permission = perm = new FilePermission(effectivePath, "read");
+ }
+ return perm;
+ }
+}
+
--- a/src/java.base/windows/classes/sun/nio/fs/RegistryFileTypeDetector.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/windows/classes/sun/nio/fs/RegistryFileTypeDetector.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -27,8 +27,6 @@
import java.nio.file.*;
import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
/**
* File type detector that does lookup of file extension using Windows Registry.
@@ -70,13 +68,8 @@
private static native String queryStringValue(long subKey, long name);
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- @Override
- public Void run() {
- // nio.dll has dependency on net.dll
- System.loadLibrary("net");
- System.loadLibrary("nio");
- return null;
- }});
+ // nio.dll has dependency on net.dll
+ jdk.internal.loader.BootLoader.loadLibrary("net");
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
}
}
--- a/src/java.base/windows/classes/sun/nio/fs/WindowsNativeDispatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.base/windows/classes/sun/nio/fs/WindowsNativeDispatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -25,8 +25,6 @@
package sun.nio.fs;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import jdk.internal.misc.Unsafe;
import static sun.nio.fs.WindowsConstants.*;
@@ -1153,13 +1151,9 @@
private static native void initIDs();
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- // nio.dll has dependency on net.dll
- System.loadLibrary("net");
- System.loadLibrary("nio");
- return null;
- }});
+ // nio.dll has dependency on net.dll
+ jdk.internal.loader.BootLoader.loadLibrary("net");
+ jdk.internal.loader.BootLoader.loadLibrary("nio");
initIDs();
}
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -34,7 +34,6 @@
import javax.swing.JProgressBar;
import javax.swing.JTabbedPane;
import javax.swing.JSlider;
-import javax.swing.JCheckBox;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -42,6 +41,7 @@
import static javax.accessibility.AccessibleContext.ACCESSIBLE_CARET_PROPERTY;
import static javax.accessibility.AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY;
import static javax.accessibility.AccessibleContext.ACCESSIBLE_STATE_PROPERTY;
+import static javax.accessibility.AccessibleContext.ACCESSIBLE_TABLE_MODEL_CHANGED;
import static javax.accessibility.AccessibleContext.ACCESSIBLE_TEXT_PROPERTY;
import static javax.accessibility.AccessibleContext.ACCESSIBLE_NAME_PROPERTY;
@@ -129,6 +129,8 @@
valueChanged(ptr);
} else if (name.compareTo(ACCESSIBLE_SELECTION_PROPERTY) == 0) {
selectionChanged(ptr);
+ } else if (name.compareTo(ACCESSIBLE_TABLE_MODEL_CHANGED) == 0) {
+ valueChanged(ptr);
} else if (name.compareTo(ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY) == 0 ) {
if (newValue instanceof AccessibleContext) {
activeDescendant = (AccessibleContext)newValue;
--- a/src/java.desktop/macosx/native/libsplashscreen/splashscreen_sys.m Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/macosx/native/libsplashscreen/splashscreen_sys.m Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -214,7 +214,7 @@
splash->maskRequired = 0;
-
+
//TODO: the following is too much of a hack but should work in 90% cases.
// besides we don't use device-dependent drawing, so probably
// that's very fine indeed
@@ -282,9 +282,11 @@
SplashRedrawWindow(Splash * splash) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- SplashUpdateScreenData(splash);
+ [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
+ // drop the reference to the old view and image
+ [splash->window setContentView: nil];
+ SplashUpdateScreenData(splash);
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
// NSDeviceRGBColorSpace vs. NSCalibratedRGBColorSpace ?
NSBitmapImageRep * rep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes: (unsigned char**)&splash->screenData
@@ -311,7 +313,7 @@
size.height /= scaleFactor;
[image setSize: size];
}
-
+
NSImageView * view = [[NSImageView alloc] init];
[view setImage: image];
--- a/src/java.desktop/share/classes/javax/swing/JTable.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/share/classes/javax/swing/JTable.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -5278,7 +5278,8 @@
// Don't start when just a modifier is pressed
int code = e.getKeyCode();
if (code == KeyEvent.VK_SHIFT || code == KeyEvent.VK_CONTROL ||
- code == KeyEvent.VK_ALT) {
+ code == KeyEvent.VK_ALT || code == KeyEvent.VK_META ||
+ code == KeyEvent.VK_ALT_GRAPH) {
return false;
}
// Try to install the editor
@@ -5302,7 +5303,9 @@
// If we have started an editor as a result of the user
// pressing a key and the surrendersFocusOnKeystroke property
// is true, give the focus to the new editor.
- if (getSurrendersFocusOnKeystroke()) {
+ Object prop = getClientProperty("JTable.forceAutoStartsEdit");
+ if (getSurrendersFocusOnKeystroke()
+ || Boolean.TRUE.equals(prop)) {
editorComponent.requestFocus();
}
}
@@ -6668,6 +6671,7 @@
*/
protected AccessibleJTable() {
super();
+ JTable.this.putClientProperty("JTable.forceAutoStartsEdit", true);
JTable.this.addPropertyChangeListener(this);
JTable.this.getSelectionModel().addListSelectionListener(this);
TableColumnModel tcm = JTable.this.getColumnModel();
@@ -7104,15 +7108,12 @@
int row = rowAtPoint(p);
if ((column != -1) && (row != -1)) {
- TableColumn aColumn = getColumnModel().getColumn(column);
- TableCellRenderer renderer = aColumn.getCellRenderer();
- if (renderer == null) {
- Class<?> columnClass = getColumnClass(column);
- renderer = getDefaultRenderer(columnClass);
- }
- Component component = renderer.getTableCellRendererComponent(
- JTable.this, null, false, false,
- row, column);
+ if (row == getEditingRow() && column == getEditingColumn()) {
+ Component editor = getEditorComponent();
+ if (editor instanceof Accessible) {
+ return (Accessible) editor;
+ }
+ }
return new AccessibleJTableCell(JTable.this, row, column,
getAccessibleIndexAt(row, column));
}
@@ -7145,15 +7146,12 @@
int column = getAccessibleColumnAtIndex(i);
int row = getAccessibleRowAtIndex(i);
- TableColumn aColumn = getColumnModel().getColumn(column);
- TableCellRenderer renderer = aColumn.getCellRenderer();
- if (renderer == null) {
- Class<?> columnClass = getColumnClass(column);
- renderer = getDefaultRenderer(columnClass);
- }
- Component component = renderer.getTableCellRendererComponent(
- JTable.this, null, false, false,
- row, column);
+ if (row == getEditingRow() && column == getEditingColumn()) {
+ Component editor = getEditorComponent();
+ if (editor instanceof Accessible) {
+ return (Accessible) editor;
+ }
+ }
return new AccessibleJTableCell(JTable.this, row, column,
getAccessibleIndexAt(row, column));
}
--- a/src/java.desktop/share/native/libsplashscreen/libpng/png.c Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/share/native/libsplashscreen/libpng/png.c Fri Jul 19 14:55:22 2019 +0530
@@ -4622,8 +4622,7 @@
if (image != NULL && image->opaque != NULL &&
image->opaque->error_buf == NULL)
{
- /* Ignore errors here: */
- (void)png_safe_execute(image, png_image_free_function, image);
+ png_image_free_function(image);
image->opaque = NULL;
}
}
--- a/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,6 @@
import sun.java2d.pipe.ShapeDrawPipe;
import sun.java2d.pipe.TextPipe;
import sun.java2d.pipe.ValidatePipe;
-import sun.java2d.x11.X11SurfaceData;
import sun.java2d.x11.XSurfaceData;
import sun.font.FontManagerNativeLibrary;
@@ -244,7 +243,7 @@
*/
public static XRWindowSurfaceData createData(X11ComponentPeer peer) {
XRGraphicsConfig gc = getGC(peer);
- return new XRWindowSurfaceData(peer, gc, X11SurfaceData.getSurfaceType(gc, Transparency.OPAQUE));
+ return new XRWindowSurfaceData(peer, gc, gc.getSurfaceType());
}
/**
--- a/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -2451,14 +2451,14 @@
static jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
{
- gint intval = NULL;
+ gint intval = 0;
(*fp_g_object_get)(settings, key, &intval, NULL);
return create_Integer(env, intval);
}
static jobject get_boolean_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
{
- gint intval = NULL;
+ gint intval = 0;
(*fp_g_object_get)(settings, key, &intval, NULL);
return create_Boolean(env, intval);
}
--- a/src/java.security.jgss/macosx/native/libosxkrb5/SCDynamicStoreConfig.m Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.security.jgss/macosx/native/libosxkrb5/SCDynamicStoreConfig.m Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -102,7 +102,8 @@
for (NSString *realm in realms) {
CFTypeRef realmInfo = SCDynamicStoreCopyValue(store, (CFStringRef) [NSString stringWithFormat:@"Kerberos:%@", realm]);
- if (CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) {
+ if (realmInfo == NULL || CFGetTypeID(realmInfo) != CFDictionaryGetTypeID()) {
+ if (realmInfo) CFRelease(realmInfo);
return nil;
}
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -42,6 +42,7 @@
import java.util.StringTokenizer;
import javax.xml.XMLConstants;
import javax.xml.catalog.CatalogFeatures;
+import jdk.xml.internal.ErrorHandlerProxy;
import jdk.xml.internal.JdkXmlFeatures;
import jdk.xml.internal.JdkXmlUtils;
import jdk.xml.internal.SecuritySupport;
@@ -61,7 +62,7 @@
* @author G. Todd Miller
* @author Morten Jorgensen
* @author Erwin Bolwidt <ejb@klomp.org>
- * @LastModified: Nov 2017
+ * @LastModified: July 2019
*/
public class Parser implements Constants, ContentHandler {
@@ -98,9 +99,13 @@
private boolean _overrideDefaultParser;
- public Parser(XSLTC xsltc, boolean useOverrideDefaultParser) {
+ // flag indicates whether there's an user's ErrorListener
+ private boolean _hasUserErrListener;
+
+ public Parser(XSLTC xsltc, boolean useOverrideDefaultParser, boolean hasUserErrListener) {
_xsltc = xsltc;
_overrideDefaultParser = useOverrideDefaultParser;
+ _hasUserErrListener = hasUserErrListener;
}
public void init() {
@@ -426,6 +431,11 @@
try {
// Parse the input document and build the abstract syntax tree
reader.setContentHandler(this);
+ if (_hasUserErrListener) {
+ // Set a ErrorHandler proxy to pass any parsing error on to be handled
+ // by the user's ErrorListener
+ reader.setErrorHandler(new ErrorHandlerProxy());
+ }
reader.parse(input);
// Find the start of the stylesheet within the tree
return getStylesheet(_root);
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -58,7 +58,7 @@
* @author G. Todd Miller
* @author Morten Jorgensen
* @author John Howard (johnh@schemasoft.com)
- * @LastModified: Oct 2017
+ * @LastModified: July 2019
*/
public final class XSLTC {
@@ -175,10 +175,10 @@
/**
* XSLTC compiler constructor
*/
- public XSLTC(JdkXmlFeatures featureManager) {
+ public XSLTC(JdkXmlFeatures featureManager, boolean hasListener) {
_overrideDefaultParser = featureManager.getFeature(
JdkXmlFeatures.XmlFeature.JDK_OVERRIDE_PARSER);
- _parser = new Parser(this, _overrideDefaultParser);
+ _parser = new Parser(this, _overrideDefaultParser, hasListener);
_xmlFeatures = featureManager;
_extensionClassLoader = null;
_externalExtensionFunctions = new HashMap<>();
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -47,6 +47,7 @@
* Implementation of a JAXP1.1 TemplatesHandler
* @author Morten Jorgensen
* @author Santiago Pericas-Geertsen
+ * @LastModified: July 2019
*/
public class TemplatesHandlerImpl
implements ContentHandler, TemplatesHandler, SourceLoader
@@ -91,14 +92,14 @@
/**
* Default constructor
*/
- protected TemplatesHandlerImpl(int indentNumber,
- TransformerFactoryImpl tfactory)
+ protected TemplatesHandlerImpl(int indentNumber, TransformerFactoryImpl tfactory,
+ boolean hasUserErrListener)
{
_indentNumber = indentNumber;
_tfactory = tfactory;
// Instantiate XSLTC and get reference to parser object
- XSLTC xsltc = new XSLTC(tfactory.getJdkXmlFeatures());
+ XSLTC xsltc = new XSLTC(tfactory.getJdkXmlFeatures(), hasUserErrListener);
if (tfactory.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING))
xsltc.setSecureProcessing(true);
--- a/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -84,7 +84,7 @@
* @author G. Todd Miller
* @author Morten Jorgensen
* @author Santiago Pericas-Geertsen
- * @LastModified: July 2018
+ * @LastModified: July 2019
*/
public class TransformerFactoryImpl
extends SAXTransformerFactory implements SourceLoader, ErrorListener
@@ -107,6 +107,9 @@
*/
private ErrorListener _errorListener = this;
+ // flag indicating whether there's an user's ErrorListener
+ private boolean _hasUserErrListener;
+
/**
* This URIResolver is passed to all created Templates and Transformers
*/
@@ -297,6 +300,7 @@
"TransformerFactory");
throw new IllegalArgumentException(err.toString());
}
+ _hasUserErrListener = true;
_errorListener = listener;
}
@@ -946,7 +950,7 @@
}
// Create and initialize a stylesheet compiler
- final XSLTC xsltc = new XSLTC(_xmlFeatures);
+ final XSLTC xsltc = new XSLTC(_xmlFeatures, _hasUserErrListener);
if (_debug) xsltc.setDebug(true);
if (_enableInlining)
xsltc.setTemplateInlining(true);
@@ -1104,7 +1108,7 @@
// through the factory instance
buildCatalogFeatures();
final TemplatesHandlerImpl handler =
- new TemplatesHandlerImpl(_indentNumber, this);
+ new TemplatesHandlerImpl(_indentNumber, this, _hasUserErrListener);
if (_uriResolver != null) {
handler.setURIResolver(_uriResolver);
}
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/identity/XPathMatcher.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/identity/XPathMatcher.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -37,6 +37,7 @@
* @xerces.internal
*
* @author Andy Clark, IBM
+ * @LastModified: July 2019
*
*/
public class XPathMatcher {
@@ -88,25 +89,25 @@
//
/** XPath location path. */
- private XPath.LocationPath[] fLocationPaths;
+ private final XPath.LocationPath[] fLocationPaths;
/** True if XPath has been matched. */
- private int[] fMatched;
+ private final int[] fMatched;
/** The matching string. */
protected Object fMatchedString;
/** Integer stack of step indexes. */
- private IntStack[] fStepIndexes;
+ private final IntStack[] fStepIndexes;
/** Current step. */
- private int[] fCurrentStep;
+ private final int[] fCurrentStep;
/**
* No match depth. The value of this field will be zero while
* matching is successful for the given xpath expression.
*/
- private int [] fNoMatchDepth;
+ private final int [] fNoMatchDepth;
final QName fQName = new QName();
@@ -207,7 +208,7 @@
*
* @throws SAXException Thrown by handler to signal an error.
*/
- public void startElement(QName element, XMLAttributes attributes){
+ public void startElement(QName element, XMLAttributes attributes) {
if (DEBUG_METHODS2) {
System.out.println(toString()+"#startElement("+
"element={"+element+"},"+
@@ -215,7 +216,7 @@
")");
}
- for(int i = 0; i < fLocationPaths.length; i++) {
+ for (int i = 0; i < fLocationPaths.length; i++) {
// push context
int startStep = fCurrentStep[i];
fStepIndexes[i].push(startStep);
@@ -284,18 +285,16 @@
if (DEBUG_MATCH) {
System.out.println(toString()+" [CHILD] before");
}
- if (nodeTest.type == XPath.NodeTest.QNAME) {
- if (!nodeTest.name.equals(element)) {
- if(fCurrentStep[i] > descendantStep) {
- fCurrentStep[i] = descendantStep;
- continue;
- }
- fNoMatchDepth[i]++;
- if (DEBUG_MATCH) {
- System.out.println(toString()+" [CHILD] after NO MATCH");
- }
+ if (!matches(nodeTest, element)) {
+ if (fCurrentStep[i] > descendantStep) {
+ fCurrentStep[i] = descendantStep;
continue;
}
+ fNoMatchDepth[i]++;
+ if (DEBUG_MATCH) {
+ System.out.println(toString()+" [CHILD] after NO MATCH");
+ }
+ continue;
}
fCurrentStep[i]++;
if (DEBUG_MATCH) {
@@ -303,10 +302,11 @@
}
}
if (fCurrentStep[i] == steps.length) {
- if(sawDescendant) {
+ if (sawDescendant) {
fCurrentStep[i] = descendantStep;
fMatched[i] = MATCHED_DESCENDANT;
- } else {
+ }
+ else {
fMatched[i] = MATCHED;
}
continue;
@@ -324,8 +324,7 @@
for (int aIndex = 0; aIndex < attrCount; aIndex++) {
attributes.getName(aIndex, fQName);
- if (nodeTest.type != XPath.NodeTest.QNAME ||
- nodeTest.name.equals(fQName)) {
+ if (matches(nodeTest, fQName)) {
fCurrentStep[i]++;
if (fCurrentStep[i] == steps.length) {
fMatched[i] = MATCHED_ATTRIBUTE;
@@ -384,7 +383,7 @@
"element={"+element+"},"+
")");
}
- for(int i = 0; i<fLocationPaths.length; i++) {
+ for (int i = 0; i < fLocationPaths.length; i++) {
// go back a step
fCurrentStep[i] = fStepIndexes[i].pop();
@@ -395,10 +394,13 @@
// signal match, if appropriate
else {
- int j=0;
- for(; j<i && ((fMatched[j] & MATCHED) != MATCHED); j++);
- if ((j<i) || (fMatched[j] == 0) ||
- ((fMatched[j] & MATCHED_ATTRIBUTE) == MATCHED_ATTRIBUTE)) {
+ int j = 0;
+ for(; j < i && ((fMatched[j] & MATCHED) != MATCHED); j++);
+ if ((j < i) || (fMatched[j] == 0)) {
+ continue;
+ }
+ if ((fMatched[j] & MATCHED_ATTRIBUTE) == MATCHED_ATTRIBUTE) {
+ fMatched[i] = 0;
continue;
}
// only certain kinds of matchers actually
@@ -476,6 +478,18 @@
return str.toString();
} // normalize(String):String
+ /** Returns true if the given QName matches the node test. **/
+ private static boolean matches(XPath.NodeTest nodeTest, QName value) {
+ if (nodeTest.type == XPath.NodeTest.QNAME) {
+ return nodeTest.name.equals(value);
+ }
+ if (nodeTest.type == XPath.NodeTest.NAMESPACE) {
+ return nodeTest.name.uri == value.uri;
+ }
+ // XPath.NodeTest.WILDCARD
+ return true;
+ } // matches(XPath.NodeTest,QName):boolean
+
//
// MAIN
//
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.xml/share/classes/jdk/xml/internal/ErrorHandlerProxy.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,51 @@
+/*
+ * 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. 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 jdk.xml.internal;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Implements an ErrorHandler that simply passes on the Exception.
+ */
+public class ErrorHandlerProxy implements ErrorHandler {
+
+ @Override
+ public void warning(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ @Override
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ @Override
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+}
--- a/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2015, 2018, SAP SE. All rights reserved.
+ * Copyright (c) 2015, 2019, SAP SE. 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
@@ -254,8 +254,12 @@
return VirtualMachineImpl.read(s, bs, off, len);
}
- public void close() throws IOException {
- VirtualMachineImpl.close(s);
+ public synchronized void close() throws IOException {
+ if (s != -1) {
+ int toClose = s;
+ s = -1;
+ VirtualMachineImpl.close(toClose);
+ }
}
}
--- a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -260,12 +260,11 @@
return VirtualMachineImpl.read(s, bs, off, len);
}
- public void close() throws IOException {
- synchronized (this) {
- if (s != -1) {
- VirtualMachineImpl.close(s);
- s = -1;
- }
+ public synchronized void close() throws IOException {
+ if (s != -1) {
+ int toClose = s;
+ s = -1;
+ VirtualMachineImpl.close(toClose);
}
}
}
--- a/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -256,8 +256,12 @@
return VirtualMachineImpl.read(s, bs, off, len);
}
- public void close() throws IOException {
- VirtualMachineImpl.close(s);
+ public synchronized void close() throws IOException {
+ if (s != -1) {
+ int toClose = s;
+ s = -1;
+ VirtualMachineImpl.close(toClose);
+ }
}
}
--- a/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -204,8 +204,12 @@
return VirtualMachineImpl.read(s, bs, off, len);
}
- public void close() throws IOException {
- VirtualMachineImpl.close(s);
+ public synchronized void close() throws IOException {
+ if (s != -1) {
+ int toClose = s;
+ s = -1;
+ VirtualMachineImpl.close(toClose);
+ }
}
}
--- a/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java Fri Jul 19 14:55:22 2019 +0530
@@ -169,10 +169,11 @@
return VirtualMachineImpl.readPipe(hPipe, bs, off, len);
}
- public void close() throws IOException {
+ public synchronized void close() throws IOException {
if (hPipe != -1) {
- VirtualMachineImpl.closePipe(hPipe);
+ long toClose = hPipe;
hPipe = -1;
+ VirtualMachineImpl.closePipe(toClose);
}
}
}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java Fri Jul 19 14:55:22 2019 +0530
@@ -99,6 +99,10 @@
*/
protected boolean shouldTranslateEscapes;
+ /** Has the string broken escapes?
+ */
+ protected boolean hasBrokenEscapes;
+
protected ScannerFactory fac;
// The set of lint options currently in effect. It is initialized
@@ -261,6 +265,7 @@
case '\\':
reader.putChar(true); break;
default:
+ hasBrokenEscapes = true;
lexError(reader.bp, Errors.IllegalEscChar);
}
}
@@ -426,6 +431,7 @@
// Clear flags.
shouldStripIndent = false;
shouldTranslateEscapes = false;
+ hasBrokenEscapes = false;
// Check if text block string methods are present.
boolean hasTextBlockSupport = TextBlockSupport.hasSupport();
// Track the end of first line for error recovery.
@@ -1038,7 +1044,7 @@
string = TextBlockSupport.stripIndent(string);
}
// Translate escape sequences if present.
- if (shouldTranslateEscapes) {
+ if (shouldTranslateEscapes && !hasBrokenEscapes) {
string = TextBlockSupport.translateEscapes(string);
}
// Build string token.
--- a/src/jdk.net/linux/classes/jdk/net/LinuxSocketOptions.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.net/linux/classes/jdk/net/LinuxSocketOptions.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -95,9 +95,14 @@
private static native boolean keepAliveOptionsSupported0();
private static native boolean quickAckSupported0();
static {
- AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ if (System.getSecurityManager() == null) {
System.loadLibrary("extnet");
- return null;
- });
+ } else {
+ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ System.loadLibrary("extnet");
+ return null;
+ });
+ }
}
-}
\ No newline at end of file
+}
+
--- a/src/jdk.net/macosx/classes/jdk/net/MacOSXSocketOptions.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.net/macosx/classes/jdk/net/MacOSXSocketOptions.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 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
@@ -77,9 +77,13 @@
private static native int getTcpKeepAliveIntvl0(int fd) throws SocketException;
private static native boolean keepAliveOptionsSupported0();
static {
- AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ if (System.getSecurityManager() == null) {
System.loadLibrary("extnet");
- return null;
- });
+ } else {
+ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ System.loadLibrary("extnet");
+ return null;
+ });
+ }
}
}
--- a/src/jdk.net/solaris/classes/jdk/net/SolarisSocketOptions.java Mon Jul 15 15:23:54 2019 +0530
+++ b/src/jdk.net/solaris/classes/jdk/net/SolarisSocketOptions.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 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
@@ -45,12 +45,16 @@
private static native void init();
static {
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("extnet");
- return null;
- }
- });
+ if (System.getSecurityManager() == null) {
+ System.loadLibrary("extnet");
+ } else {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+ System.loadLibrary("extnet");
+ return null;
+ }
+ });
+ }
init();
}
}
--- a/test/hotspot/jtreg/gc/g1/TestGCLogMessages.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/hotspot/jtreg/gc/g1/TestGCLogMessages.java Fri Jul 19 14:55:22 2019 +0530
@@ -97,6 +97,8 @@
// Merge Heap Roots
new LogMessageWithLevel("Merge Heap Roots", Level.INFO),
+ new LogMessageWithLevel("Prepare Merge Heap Roots", Level.DEBUG),
+ new LogMessageWithLevel("Eager Reclaim", Level.DEBUG),
new LogMessageWithLevel("Remembered Sets", Level.DEBUG),
new LogMessageWithLevel("Merged Sparse", Level.DEBUG),
new LogMessageWithLevel("Merged Fine", Level.DEBUG),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/runtime/CheckUnhandledOops/TestOutOfMemory.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,44 @@
+/*
+ * 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 8227766
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+CheckUnhandledOops -Xmx100m TestOutOfMemory
+ */
+
+public class TestOutOfMemory {
+ public static void main(java.lang.String[] unused) {
+ final int BIG = 0x100000;
+ // Getting OOM breaks the unhandled oop detector
+ try {
+ int[][] X = new int[BIG][];
+ for (int i = 0; i < BIG; i++) {
+ X[i] = new int[BIG];
+ System.out.println("length = " + X.length);
+ }
+ } catch (OutOfMemoryError oom) {
+ System.out.println("OOM expected");
+ }
+ }
+}
--- a/test/hotspot/jtreg/runtime/appcds/SharedArchiveConsistency.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/hotspot/jtreg/runtime/appcds/SharedArchiveConsistency.java Fri Jul 19 14:55:22 2019 +0530
@@ -61,13 +61,17 @@
public class SharedArchiveConsistency {
public static WhiteBox wb;
- public static int offset_magic; // FileMapHeader::_magic
- public static int sp_offset_crc; // CDSFileMapRegion::_crc
+ public static int offset_magic; // CDSFileMapHeaderBase::_magic
+ public static int offset_version; // CDSFileMapHeaderBase::_version
+ public static int offset_jvm_ident; // FileMapHeader::_jvm_ident
+ public static int sp_offset_crc; // CDSFileMapRegion::_crc
+ public static int offset_paths_misc_info_size;
public static int file_header_size = -1;// total size of header, variant, need calculation
public static int CDSFileMapRegion_size; // size of CDSFileMapRegion
public static int sp_offset; // offset of CDSFileMapRegion
public static int sp_used_offset; // offset of CDSFileMapRegion::_used
public static int size_t_size; // size of size_t
+ public static int int_size; // size of int
public static File jsa; // will be updated during test
public static File orgJsaFile; // kept the original file not touched.
@@ -94,6 +98,8 @@
public static void getFileOffsetInfo() throws Exception {
wb = WhiteBox.getWhiteBox();
offset_magic = wb.getOffsetForName("FileMapHeader::_magic");
+ offset_version = wb.getOffsetForName("FileMapHeader::_version");
+ offset_jvm_ident = wb.getOffsetForName("FileMapHeader::_jvm_ident");
sp_offset_crc = wb.getOffsetForName("CDSFileMapRegion::_crc");
try {
int nonExistOffset = wb.getOffsetForName("FileMapHeader::_non_exist_offset");
@@ -113,13 +119,13 @@
return file_header_size;
}
// this is not real header size, it is struct size
- int int_size = wb.getOffsetForName("int_size");
+ int_size = wb.getOffsetForName("int_size");
file_header_size = wb.getOffsetForName("file_header_size");
- int offset_path_misc_info = wb.getOffsetForName("FileMapHeader::_paths_misc_info_size") -
+ offset_paths_misc_info_size = wb.getOffsetForName("FileMapHeader::_paths_misc_info_size") -
offset_magic;
- int path_misc_info_size = (int)readInt(fc, offset_path_misc_info, int_size);
- file_header_size += path_misc_info_size; //readInt(fc, offset_path_misc_info, size_t_size);
- System.out.println("offset_path_misc_info = " + offset_path_misc_info);
+ int path_misc_info_size = (int)readInt(fc, offset_paths_misc_info_size, int_size);
+ file_header_size += path_misc_info_size;
+ System.out.println("offset_paths_misc_info_size = " + offset_paths_misc_info_size);
System.out.println("path_misc_info_size = " + path_misc_info_size);
System.out.println("file_header_size = " + file_header_size);
file_header_size = (int)align_up_page(file_header_size);
@@ -160,15 +166,15 @@
fc.force(true);
}
- public static FileChannel getFileChannel() throws Exception {
+ public static FileChannel getFileChannel(File jsaFile) throws Exception {
List<StandardOpenOption> arry = new ArrayList<StandardOpenOption>();
arry.add(READ);
arry.add(WRITE);
- return FileChannel.open(jsa.toPath(), new HashSet<StandardOpenOption>(arry));
+ return FileChannel.open(jsaFile.toPath(), new HashSet<StandardOpenOption>(arry));
}
- public static void modifyJsaContentRandomly() throws Exception {
- FileChannel fc = getFileChannel();
+ public static void modifyJsaContentRandomly(File jsaFile) throws Exception {
+ FileChannel fc = getFileChannel(jsaFile);
// corrupt random area in the data areas
long[] used = new long[num_regions]; // record used bytes
long start0, start, end, off;
@@ -210,8 +216,8 @@
return used;
}
- public static boolean modifyJsaContent(int region) throws Exception {
- FileChannel fc = getFileChannel();
+ public static boolean modifyJsaContent(int region, File jsaFile) throws Exception {
+ FileChannel fc = getFileChannel(jsaFile);
byte[] buf = new byte[4096];
ByteBuffer bbuf = ByteBuffer.wrap(buf);
@@ -248,8 +254,8 @@
return true;
}
- public static void modifyJsaHeader() throws Exception {
- FileChannel fc = getFileChannel();
+ public static void modifyJsaHeader(File jsaFile) throws Exception {
+ FileChannel fc = getFileChannel(jsaFile);
// screw up header info
byte[] buf = new byte[getFileHeaderSize(fc)];
ByteBuffer bbuf = ByteBuffer.wrap(buf);
@@ -259,6 +265,30 @@
}
}
+ public static void modifyJvmIdent() throws Exception {
+ FileChannel fc = getFileChannel(jsa);
+ int headerSize = getFileHeaderSize(fc);
+ System.out.println(" offset_jvm_ident " + offset_jvm_ident);
+ byte[] buf = new byte[256];
+ ByteBuffer bbuf = ByteBuffer.wrap(buf);
+ writeData(fc, (long)offset_jvm_ident, bbuf);
+ if (fc.isOpen()) {
+ fc.close();
+ }
+ }
+
+ public static void modifyHeaderIntField(long offset, int value) throws Exception {
+ FileChannel fc = getFileChannel(jsa);
+ int headerSize = getFileHeaderSize(fc);
+ System.out.println(" offset " + offset);
+ byte[] buf = ByteBuffer.allocate(4).putInt(value).array();
+ ByteBuffer bbuf = ByteBuffer.wrap(buf);
+ writeData(fc, offset, bbuf);
+ if (fc.isOpen()) {
+ fc.close();
+ }
+ }
+
public static void copyFile(File from, File to) throws Exception {
if (to.exists()) {
if(!to.delete()) {
@@ -348,10 +378,10 @@
// test, should pass
System.out.println("1. Normal, should pass but may fail\n");
- String[] execArgs = {"-cp", jarFile, "Hello"};
+ String[] execArgs = {"-Xlog:cds", "-cp", jarFile, "Hello"};
// tests that corrupt contents of the archive need to run with
// VerifySharedSpaces enabled to detect inconsistencies
- String[] verifyExecArgs = {"-XX:+VerifySharedSpaces", "-cp", jarFile, "Hello"};
+ String[] verifyExecArgs = {"-Xlog:cds", "-XX:+VerifySharedSpaces", "-cp", jarFile, "Hello"};
OutputAnalyzer output = TestCommon.execCommon(execArgs);
@@ -373,10 +403,36 @@
orgJsaFile = new File(new File(currentDir), "appcds.jsa.bak");
copyFile(jsa, orgJsaFile);
-
// modify jsa header, test should fail
System.out.println("\n2. Corrupt header, should fail\n");
- modifyJsaHeader();
+ modifyJsaHeader(jsa);
+ output = TestCommon.execCommon(execArgs);
+ output.shouldContain("The shared archive file has a bad magic number");
+ output.shouldNotContain("Checksum verification failed");
+
+ copyFile(orgJsaFile, jsa);
+ // modify _jvm_ident and _paths_misc_info_size, test should fail
+ System.out.println("\n2a. Corrupt _jvm_ident and _paths_misc_info_size, should fail\n");
+ modifyJvmIdent();
+ modifyHeaderIntField(offset_paths_misc_info_size, Integer.MAX_VALUE);
+ output = TestCommon.execCommon(execArgs);
+ output.shouldContain("The shared archive file was created by a different version or build of HotSpot");
+ output.shouldNotContain("Checksum verification failed");
+
+ copyFile(orgJsaFile, jsa);
+ // modify _magic and _paths_misc_info_size, test should fail
+ System.out.println("\n2b. Corrupt _magic and _paths_misc_info_size, should fail\n");
+ modifyHeaderIntField(offset_magic, 0x00000000);
+ modifyHeaderIntField(offset_paths_misc_info_size, Integer.MAX_VALUE);
+ output = TestCommon.execCommon(execArgs);
+ output.shouldContain("The shared archive file has a bad magic number");
+ output.shouldNotContain("Checksum verification failed");
+
+ copyFile(orgJsaFile, jsa);
+ // modify _version and _paths_misc_info_size, test should fail
+ System.out.println("\n2c. Corrupt _version and _paths_misc_info_size, should fail\n");
+ modifyHeaderIntField(offset_version, 0x00000000);
+ modifyHeaderIntField(offset_paths_misc_info_size, Integer.MAX_VALUE);
output = TestCommon.execCommon(execArgs);
output.shouldContain("The shared archive file has the wrong version");
output.shouldNotContain("Checksum verification failed");
@@ -387,8 +443,9 @@
for (int i=0; i<num_regions; i++) {
newJsaFile = new File(TestCommon.getNewArchiveName(shared_region_name[i]));
copyFile(orgJsaFile, newJsaFile);
- if (modifyJsaContent(i)) {
- testAndCheck(execArgs);
+ TestCommon.setCurrentArchiveName(newJsaFile.toString());
+ if (modifyJsaContent(i, newJsaFile)) {
+ testAndCheck(verifyExecArgs);
}
}
@@ -396,15 +453,17 @@
System.out.println("\n4. Corrupt Header and Content, should fail\n");
newJsaFile = new File(TestCommon.getNewArchiveName("header-and-content"));
copyFile(orgJsaFile, newJsaFile);
- modifyJsaHeader();
- modifyJsaContent(0); // this will not be reached since failed on header change first
+ TestCommon.setCurrentArchiveName(newJsaFile.toString());
+ modifyJsaHeader(newJsaFile);
+ modifyJsaContent(0, newJsaFile); // this will not be reached since failed on header change first
output = TestCommon.execCommon(execArgs);
- output.shouldContain("The shared archive file has the wrong version");
+ output.shouldContain("The shared archive file has a bad magic number");
output.shouldNotContain("Checksum verification failed");
// delete bytes in data section
System.out.println("\n5. Delete bytes at beginning of data section, should fail\n");
copyFile(orgJsaFile, jsa, true);
+ TestCommon.setCurrentArchiveName(jsa.toString());
testAndCheck(verifyExecArgs);
// insert bytes in data section forward
@@ -415,7 +474,8 @@
System.out.println("\n7. modify Content in random areas, should fail\n");
newJsaFile = new File(TestCommon.getNewArchiveName("random-areas"));
copyFile(orgJsaFile, newJsaFile);
- modifyJsaContentRandomly();
+ TestCommon.setCurrentArchiveName(newJsaFile.toString());
+ modifyJsaContentRandomly(newJsaFile);
testAndCheck(verifyExecArgs);
}
}
--- a/test/hotspot/jtreg/runtime/appcds/TestCommon.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/hotspot/jtreg/runtime/appcds/TestCommon.java Fri Jul 19 14:55:22 2019 +0530
@@ -90,6 +90,10 @@
return currentArchiveName;
}
+ public static void setCurrentArchiveName(String archiveName) {
+ currentArchiveName = archiveName;
+ }
+
public static String getNewArchiveName() {
return getNewArchiveName(null);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/serviceability/attach/ConcAttachTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,126 @@
+/*
+ * 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 8225690
+ * @requires os.family != "windows"
+ * @library /test/lib
+ * @modules jdk.attach/com.sun.tools.attach
+ * @run main ConcAttachTest
+ */
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import com.sun.tools.attach.VirtualMachine;
+import com.sun.tools.attach.AttachNotSupportedException;
+
+import jdk.test.lib.apps.LingeredApp;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class ConcAttachTest implements Runnable {
+
+ private static final int NUM_CONC_REQUESTS = 100;
+
+ private static final int THREAD_POOL_TIMEOUT_IN_SEC = 30;
+
+ private static CountDownLatch latch;
+
+ private static String strPID;
+
+ // Attach to LingeredApp concurrently.
+ public void run() {
+ VirtualMachine vm = null;
+
+ try {
+ latch.countDown();
+ latch.await();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ try {
+ vm = VirtualMachine.attach(strPID);
+ } catch (AttachNotSupportedException | IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ vm.detach();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private static void checkAttachListenerThread() throws InterruptedException, IOException {
+ JDKToolLauncher jcmd = JDKToolLauncher.createUsingTestJDK("jcmd");
+ jcmd.addToolArg(strPID);
+ jcmd.addToolArg("Thread.print");
+
+ ProcessBuilder pb = new ProcessBuilder(jcmd.getCommand());
+ Process jcmdProc = pb.start();
+
+ OutputAnalyzer out = new OutputAnalyzer(jcmdProc);
+
+ jcmdProc.waitFor();
+
+ System.out.println(out.getStdout());
+ System.err.println(out.getStderr());
+
+ long numOfAttachListener = out.asLines()
+ .stream()
+ .filter(l -> l.contains("Attach Listener"))
+ .count();
+
+ Asserts.assertEquals(1L, numOfAttachListener, "AttachListener should exist only 1 thread.");
+ }
+
+ public static void main(String... args) throws Exception {
+ LingeredApp app = null;
+ latch = new CountDownLatch(NUM_CONC_REQUESTS);
+ ExecutorService pool = Executors.newFixedThreadPool(NUM_CONC_REQUESTS);
+
+ try {
+ app = LingeredApp.startApp();
+ strPID = Long.toString(app.getPid());
+
+ for (int i = 0; i < NUM_CONC_REQUESTS; i++) {
+ pool.submit(new ConcAttachTest());
+ }
+
+ pool.shutdown();
+ pool.awaitTermination(THREAD_POOL_TIMEOUT_IN_SEC, TimeUnit.SECONDS);
+
+ checkAttachListenerThread();
+ } finally {
+ LingeredApp.stopApp(app);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,81 @@
+/*
+ * 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 8225193
+ * @requires os.family != "windows"
+ * @library /test/lib
+ * @run main RemovingUnixDomainSocketTest
+ */
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+import jdk.test.lib.apps.LingeredApp;
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class RemovingUnixDomainSocketTest {
+
+ private static void runJCmd(long pid) throws InterruptedException, IOException {
+ JDKToolLauncher jcmd = JDKToolLauncher.createUsingTestJDK("jcmd");
+ jcmd.addToolArg(Long.toString(pid));
+ jcmd.addToolArg("VM.version");
+
+ ProcessBuilder pb = new ProcessBuilder(jcmd.getCommand());
+ Process jcmdProc = pb.start();
+
+ OutputAnalyzer out = new OutputAnalyzer(jcmdProc);
+
+ jcmdProc.waitFor();
+
+ System.out.println(out.getStdout());
+ System.err.println(out.getStderr());
+
+ out.stderrShouldBeEmpty();
+ }
+
+ public static void main(String... args) throws Exception {
+ LingeredApp app = null;
+ try {
+ app = LingeredApp.startApp();
+
+ // Access to Attach Listener
+ runJCmd(app.getPid());
+
+ // Remove unix domain socket file
+ var sockFile = Path.of(System.getProperty("java.io.tmpdir"),
+ ".java_pid" + app.getPid())
+ .toFile();
+ System.out.println("Remove " + sockFile.toString());
+ sockFile.delete();
+
+ // Access to Attach Listener again
+ runJCmd(app.getPid());
+ } finally {
+ LingeredApp.stopApp(app);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jaxp/javax/xml/jaxp/unittest/transform/ErrorListenerTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,118 @@
+/*
+ * 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 transform;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import javax.xml.transform.ErrorListener;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+
+/*
+ * @test
+ * @bug 8157830
+ * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
+ * @run testng/othervm transform.ErrorListenerTest
+ * @summary Verifies that ErrorListeners are handled properly
+ */
+public class ErrorListenerTest {
+
+ static final private String INVALID_STYLESHEET = "xxx";
+ static final private String SYSTEM_ID = "http://openjdk_java_net/xsl/dummy.xsl";
+
+ PrintStream original;
+
+ @BeforeClass
+ public void setUpClass() throws Exception {
+ // save the PrintStream
+ original = System.err;
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ // set back to the original
+ System.setErr(original);
+ }
+
+ /**
+ * Verifies that when an ErrorListener is registered, parser errors are passed
+ * onto the listener without other output.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void test() throws Exception {
+ InputStream is = new ByteArrayInputStream(INVALID_STYLESHEET.getBytes());
+ InputSource source = new InputSource(is);
+ source.setSystemId(SYSTEM_ID);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ System.setErr(ps);
+
+ TransformerFactory factory = TransformerFactory.newInstance();
+ factory.setErrorListener(new ErrListener());
+
+ try {
+ factory.newTransformer(new SAXSource(source));
+ } catch (TransformerConfigurationException e) {
+ // nothing
+ }
+
+ // all errors are handled by the ErrorListener, no other output
+ Assert.assertEquals(baos.toString(), "");
+
+ }
+
+ class ErrListener implements ErrorListener {
+
+ @Override
+ public void error(TransformerException exception)
+ throws TransformerException {
+ System.out.println("Correctly handled error: " + exception.getMessage());
+ }
+
+ @Override
+ public void fatalError(TransformerException exception)
+ throws TransformerException {
+ System.out.println("Correctly handled fatal: " + exception.getMessage());
+ }
+
+ @Override
+ public void warning(TransformerException exception)
+ throws TransformerException {
+ System.out.println("Correctly handled warning: " + exception.getMessage());
+ }
+ }
+}
--- a/test/jaxp/javax/xml/jaxp/unittest/validation/ValidationTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jaxp/javax/xml/jaxp/unittest/validation/ValidationTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -36,11 +36,12 @@
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
+import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/*
* @test
- * @bug 8220818
+ * @bug 8220818 8176447
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
* @run testng/othervm validation.ValidationTest
* @summary Runs validations with schemas and sources
@@ -71,6 +72,17 @@
};
}
+ /*
+ DataProvider: uniqueness
+ */
+ @DataProvider(name = "uniqueness")
+ Object[][] getUniqueData() {
+ return new Object[][]{
+ {"JDK8176447a.xsd", "JDK8176447a.xml"},
+ {"JDK8176447b.xsd", "JDK8176447b.xml"},
+ };
+ }
+
@Test(dataProvider = "invalid", expectedExceptions = SAXParseException.class)
public void testValidateRefType(String xsd, String xml) throws Exception {
validate(xsd, xml);
@@ -81,6 +93,19 @@
validate(xsd, xml);
}
+ /**
+ * @bug 8176447
+ * Verifies that the uniqueness constraint is checked.
+ * @param xsd the XSD
+ * @param xml the XML
+ * @throws Exception expected when the uniqueness constraint is validated
+ * correctly.
+ */
+ @Test(dataProvider = "uniqueness", expectedExceptions = SAXException.class)
+ public void testUnique(String xsd, String xml) throws Exception {
+ validate(xsd, xml);
+ }
+
private void validate(String xsd, String xml) throws Exception {
final SchemaFactory schemaFactory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
@@ -90,4 +115,5 @@
validator.validate(new StreamSource(
new File(getClass().getResource(FILE_PATH + xml).getFile())));
}
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447a.xml Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,8 @@
+<test xmlns="http://openjdk_java_net/test.xml"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="JDK8176447a.xsd">
+ <innerObject>
+ <innerInnerObject test-unique-attribute="1" />
+ <innerInnerObject test-unique-attribute="1" />
+ </innerObject>
+</test>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447a.xsd Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://www.w3.org/1999/xhtml"
+ xmlns:sn="http://openjdk_java_net/test.xml"
+ targetNamespace="http://openjdk_java_net/test.xml" elementFormDefault="qualified">
+ <xsd:element name="test" type="sn:object">
+ <xsd:unique name="testunique">
+ <xsd:selector xpath="sn:innerObject"/>
+ <xsd:field xpath="sn:innerInnerObject/@test-unique-attribute"/>
+ </xsd:unique>
+ </xsd:element>
+ <xsd:complexType name="object">
+ <xsd:sequence>
+ <xsd:element name="innerObject" maxOccurs="unbounded" type="sn:testType" />
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="testType">
+ <xsd:sequence>
+ <xsd:element name="innerInnerObject" maxOccurs="unbounded" type="sn:testObjectType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:complexType name="testObjectType">
+ <xsd:attribute use="optional" name="test-unique-attribute" type="xsd:int" />
+ </xsd:complexType>
+</xsd:schema>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447b.xml Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="JDK8176447b.xsd">
+ <e>
+ <e1 a1="a" >
+ <e2 a2="a"/>
+ <e2 a2="a"/>
+ </e1>
+ <e1 a1="a">
+ <e2 a2="b"/>
+ <e2 a2="a"/>
+ </e1>
+ </e>
+</root>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447b.xsd Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xs:element name="root">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="e" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="e1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="e2">
+ <xs:complexType>
+ <xs:attribute name="a2" use="required" type="xs:NCName"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="a1" use="required" type="xs:NCName"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:key name="checkAttrib">
+ <xs:selector xpath=".//e1"/>
+ <xs:field xpath="@a1"/>
+ <xs:field xpath="e2/@a2"/>
+ </xs:key>
+
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
--- a/test/jdk/ProblemList.txt Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/ProblemList.txt Fri Jul 19 14:55:22 2019 +0530
@@ -114,7 +114,6 @@
# jdk_awt
-java/awt/Color/AlphaColorTest.java 8224825 linux-all
java/awt/event/MouseEvent/MouseClickTest/MouseClickTest.java 8168389 windows-all,macosx-all
java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java 8224055 macosx-all
java/awt/Focus/ActualFocusedWindowTest/ActualFocusedWindowBlockingTest.java 8168408 windows-all,macosx-all
--- a/test/jdk/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -57,8 +57,7 @@
// Careful with these values.
private static final long MIN_SIZE_FOR_PASS = 1;
- // Max size for pass dynamically determined below
- private static long max_size_for_pass = Long.MAX_VALUE;
+ private static long MAX_SIZE_FOR_PASS = Long.MAX_VALUE;
private static boolean trace = false;
@@ -67,16 +66,6 @@
trace = true;
}
- // 4934082: On Linux, VM size *can* be larger than total swap
- // size. Linux might not reserve swap memory immediately when
- // a page is mmaped. This means that the reported committed
- // memory size can grow beyond the swap limit.
- long max_size = mbean.getTotalSwapSpaceSize() +
- mbean.getTotalPhysicalMemorySize();
-
- if (max_size > 0) {
- max_size_for_pass = max_size;
- }
long size = mbean.getCommittedVirtualMemorySize();
if (size == -1) {
System.out.println("getCommittedVirtualMemorySize() is not supported");
@@ -88,11 +77,11 @@
size);
}
- if (size < MIN_SIZE_FOR_PASS || size > max_size_for_pass) {
+ if (size < MIN_SIZE_FOR_PASS || size > MAX_SIZE_FOR_PASS) {
throw new RuntimeException("Committed virtual memory size " +
"illegal value: " + size + " bytes " +
"(MIN = " + MIN_SIZE_FOR_PASS + "; " +
- "MAX = " + max_size_for_pass + ")");
+ "MAX = " + MAX_SIZE_FOR_PASS + ")");
}
System.out.println("Test passed.");
--- a/test/jdk/java/awt/Color/AlphaColorTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/awt/Color/AlphaColorTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 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
@@ -24,7 +24,7 @@
/**
* @test
* @key headful
- * @bug 8204931
+ * @bug 8204931 8227392 8224825
* @summary test alpha colors are blended with background.
*/
@@ -73,8 +73,14 @@
static Frame frame;
private static void createAndShowGUI() {
- frame = new Frame("Alpha Color Test");
- frame.setBackground(Color.black);
+ frame = new Frame("Alpha Color Test") {
+ @Override
+ public void paint(Graphics g) {
+ g.setColor(Color.black);
+ g.fillRect(0, 0, getWidth(), getHeight());
+ super.paint(g);
+ }
+ };
Color color = new Color(255, 255, 255, 127);
frame.add("Center", new AlphaColorTest(color));
frame.pack();
--- a/test/jdk/java/net/URLPermission/URLTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/net/URLPermission/URLTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -276,7 +276,9 @@
}
static class CustomPolicy extends Policy {
+ static final Policy DEFAULT_POLICY = Policy.getPolicy();
final PermissionCollection perms = new Permissions();
+
CustomPolicy(Permission... permissions) {
java.util.Arrays.stream(permissions).forEach(perms::add);
@@ -301,7 +303,7 @@
}
public boolean implies(ProtectionDomain domain, Permission perm) {
- return perms.implies(perm);
+ return perms.implies(perm) || DEFAULT_POLICY.implies(domain, perm);
}
}
}
--- a/test/jdk/java/sql/testng/util/TestPolicy.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/sql/testng/util/TestPolicy.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -42,6 +42,7 @@
* JDBC concrete classes
*/
public class TestPolicy extends Policy {
+ static final Policy DEFAULT_POLICY = Policy.getPolicy();
final PermissionCollection permissions = new Permissions();
@@ -137,6 +138,6 @@
@Override
public boolean implies(ProtectionDomain domain, Permission perm) {
- return permissions.implies(perm);
+ return permissions.implies(perm) || DEFAULT_POLICY.implies(domain, perm);
}
}
--- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -93,7 +93,9 @@
private static void testRun(String property, List<String> javaParam)
throws Throwable{
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-cp")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-cp")
.addToolArg(Utils.TEST_CLASS_PATH)
.addToolArg("-Djdk.calendar.japanese.supplemental.era=" + property)
.addToolArg("SupplementalJapaneseEraTest");
--- a/test/jdk/java/util/EnumSet/BogusEnumSet.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/EnumSet/BogusEnumSet.java Fri Jul 19 14:55:22 2019 +0530
@@ -32,11 +32,11 @@
public class BogusEnumSet {
public static void main(String[] args) throws Throwable {
- // This test depends on the current serialVersionUID of EnumSet,
- // which may change if the EnumSet class is modified.
- // The current value is -2409567991088730183L = 0xde8f7eadb5012fb9L
- // If the value changes, it will have to be patched into the
- // serialized byte stream below at the location noted.
+ // This test tries to deserialize a bogus stream produced with
+ // hypothetical EnumSet without a writeReplace() method - i.e.
+ // not using serialization proxy pattern. It tests that such
+ // stream is not accepted as valid stream - the EnumSet class
+ // declares a readObject() method which throws exception.
byte[] serializedForm = {
(byte)0xac, (byte)0xed, 0x0, 0x5, 0x73, 0x72, 0x0, 0x18,
0x6a, 0x61, 0x76, 0x61, 0x2e, 0x75, 0x74, 0x69,
@@ -45,10 +45,9 @@
0x7e, (byte)0xb0, (byte)0xd0, 0x7e, 0x2, 0x0, 0x1, 0x4a, 0x0, 0x8,
0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x78, 0x72, 0x0,
0x11, 0x6a, 0x61, 0x76, 0x61, 0x2e, 0x75, 0x74, 0x69,
- 0x6c, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x74,
- // EnumSet's serialVersionUID is the following eight bytes (big-endian)
- (byte)0xde, (byte)0x8f, 0x7e, (byte)0xad, (byte)0xb5, (byte)0x01, 0x2f, (byte)0xb9,
- 0x2, 0x0, 0x2, 0x4c, 0x0, 0xb, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x6c, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x74, 0xe,
+ 0x3, 0x21, 0x6a, (byte)0xcd, (byte)0x8c, 0x29, (byte)0xdd, 0x2,
+ 0x0, 0x2, 0x4c, 0x0, 0xb, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
0x54, 0x79, 0x70, 0x65, 0x74, 0x0, 0x11, 0x4c, 0x6a, 0x61, 0x76,
0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x43, 0x6c, 0x61, 0x73,
0x73, 0x3b, 0x5b, 0x0, 0x8, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/EnumSet/EnumSetClassSerialization.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,101 @@
+/*
+ * 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 8227368
+ * @summary Test deserialization of a stream containing EnumSet.class object
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.EnumSet;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class EnumSetClassSerialization {
+
+ public static void main(String[] args) throws Exception {
+ // EnumSet.class object serialized with JDK 8
+ int[] bytes = {
+ 0xac, 0xed, 0x00, 0x05, 0x76, 0x72, 0x00, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x2e, 0x75, 0x74, 0x69,
+ 0x6c, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x74, 0x0e, 0x03, 0x21, 0x6a, 0xcd, 0x8c, 0x29,
+ 0xdd, 0x02, 0x00, 0x02, 0x4c, 0x00, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79,
+ 0x70, 0x65, 0x74, 0x00, 0x11, 0x4c, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x2f,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x3b, 0x5b, 0x00, 0x08, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+ 0x65, 0x74, 0x00, 0x11, 0x5b, 0x4c, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x2f,
+ 0x45, 0x6e, 0x75, 0x6d, 0x3b, 0x78, 0x70
+ };
+
+ InputStream in = new InputStream() {
+ int i = 0;
+
+ @Override
+ public int read() {
+ return i < bytes.length ? bytes[i++] & 0xFF : -1;
+ }
+ };
+ ObjectInputStream ois = new ObjectInputStream(in);
+
+ Object res = ois.readObject();
+
+ if (res != EnumSet.class) {
+ throw new AssertionError(
+ "Expected: " + EnumSet.class + ", got: " + res);
+ }
+ }
+
+ /**
+ * This class can be used to print out lines that constitute
+ * the 'bytes' variable initializer in the test.
+ */
+ public static class Serializer {
+ public static void main(String[] args) throws IOException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(EnumSet.class);
+ oos.close();
+ byte[] bytes = baos.toByteArray();
+ int bpl = 16;
+ System.out.print(
+ IntStream
+ .range(0, (bytes.length + bpl - 1) / bpl)
+ .mapToObj(i -> IntStream
+ .range(
+ i * bpl,
+ Math.min(i * bpl + bpl, bytes.length)
+ )
+ .mapToObj(ii -> {
+ String s = Integer.toHexString(bytes[ii] & 0xFF);
+ return s.length() == 1 ? "0x0" + s : "0x" + s;
+ })
+ .collect(Collectors.joining(", "))
+ )
+ .collect(Collectors.joining(",\n ", "int[] bytes = {\n ", "\n};"))
+ );
+ }
+ }
+}
--- a/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -85,7 +85,8 @@
String cp = Utils.TEST_CLASSES + File.pathSeparator + Utils.TEST_SRC
+ File.pathSeparator + ".";
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-esa")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
.addToolArg("-cp")
.addToolArg(cp)
.addToolArg("MissingResourceCauseTest");
--- a/test/jdk/java/util/ResourceBundle/modules/ModuleTestUtil.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/ResourceBundle/modules/ModuleTestUtil.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -134,7 +134,9 @@
public static void runModule(String mp, String mn, List<String> localeList)
throws Throwable {
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-p")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-p")
.addToolArg(mp)
.addToolArg("-m")
.addToolArg(mn);
@@ -160,7 +162,9 @@
public static void runModuleWithCp(String cp, String mp, String mn,
List<String> localeList, boolean expected) throws Throwable {
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-cp")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-cp")
.addToolArg(cp)
.addToolArg("-p")
.addToolArg(mp)
--- a/test/jdk/java/util/ResourceBundle/modules/layer/LayerTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/ResourceBundle/modules/layer/LayerTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -72,7 +72,9 @@
private static void runCmd() throws Throwable {
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-cp")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-cp")
.addToolArg(Utils.TEST_CLASSES)
.addToolArg("Main")
.addToolArg(Utils.TEST_CLASSES);
--- a/test/jdk/java/util/ResourceBundle/modules/unnamed/UnNamedTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/ResourceBundle/modules/unnamed/UnNamedTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -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
@@ -74,7 +74,9 @@
private static void runCmd() throws Throwable {
// access resource bundles that are exported private unconditionally.
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-cp")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-cp")
.addToolArg(Utils.TEST_CLASSES)
.addToolArg("--module-path")
.addToolArg(MODS_DIR.toString())
@@ -92,7 +94,9 @@
// --add-exports can't open resources
launcher = JDKToolLauncher.createUsingTestJDK("java");
- launcher.addToolArg("-cp")
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa")
+ .addToolArg("-cp")
.addToolArg(Utils.TEST_CLASSES)
.addToolArg("--module-path")
.addToolArg(MODS_DIR.toString())
--- a/test/jdk/java/util/ResourceBundle/modules/visibility/VisibilityTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/ResourceBundle/modules/visibility/VisibilityTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -329,6 +329,8 @@
private int runCmd(List<String> argsList) throws Throwable {
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
+ launcher.addToolArg("-ea")
+ .addToolArg("-esa");
argsList.forEach(launcher::addToolArg);
return ProcessTools.executeCommand(launcher.getCommand()).getExitValue();
--- a/test/jdk/java/util/TimeZone/Bug8066652Run.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/TimeZone/Bug8066652Run.java Fri Jul 19 14:55:22 2019 +0530
@@ -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
@@ -51,6 +51,8 @@
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
//Setting invalid TimeZone using VM option
launcher.addToolArg("-Duser.timezone=Foo/Bar")
+ .addToolArg("-ea")
+ .addToolArg("-esa")
.addToolArg("-cp")
.addToolArg(cp)
.addToolArg("Bug8066652");
--- a/test/jdk/java/util/TimeZone/TimeZoneDatePermissionCheckRun.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/java/util/TimeZone/TimeZoneDatePermissionCheckRun.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -69,6 +69,8 @@
JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java");
launcher.addToolArg("-Djava.security.manager")
.addToolArg("-Djava.security.debug=access,failure,policy")
+ .addToolArg("-ea")
+ .addToolArg("-esa")
.addToolArg("-cp")
.addToolArg(jarPath)
.addToolArg("TimeZoneDatePermissionCheck");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/accessibility/JTable/JTableCellEditor.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,91 @@
+/*
+ * 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 java.awt.EventQueue;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Locale;
+
+import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleTable;
+import javax.swing.JFrame;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+
+/**
+ * @test
+ * @bug 8226653
+ * @key headful
+ * @summary The active cell editor should be reported as a child of the table.
+ * Note that the accessibility API ignores the real children of the
+ * table, but reports the "virtual" child per cell in the grid.
+ */
+public final class JTableCellEditor {
+
+ private static final int COUNT = 3;
+ private static JTable table;
+ private static JFrame frame;
+
+ public static void main(final String[] args)
+ throws InvocationTargetException, InterruptedException {
+ EventQueue.invokeAndWait(() -> {
+ frame = new JFrame();
+ table = new JTable(testSelectionWithFilterTable());
+ frame.add(table);
+ frame.pack();
+ });
+ EventQueue.invokeAndWait(() -> table.editCellAt(1, 1));
+ EventQueue.invokeAndWait(() -> {
+ AccessibleTable aTable = table.getAccessibleContext()
+ .getAccessibleTable();
+ int aColumns = aTable.getAccessibleColumnCount();
+ int aRows = aTable.getAccessibleRowCount();
+ // We cannot assume which component will be used as an editor of the
+ // table cell, but we can expect it will have the "text" role.
+ AccessibleRole role = aTable.getAccessibleAt(1, 1)
+ .getAccessibleContext()
+ .getAccessibleRole();
+ frame.dispose();
+ if (!role.toDisplayString(Locale.ENGLISH).equals("text")) {
+ throw new RuntimeException("Unexpected role: " + role);
+ }
+ if (aColumns != COUNT) {
+ throw new RuntimeException("Wrong columns: " + aColumns);
+ }
+ if (aRows != COUNT) {
+ throw new RuntimeException("Wrong rows: " + aRows);
+ }
+ });
+ }
+
+ /**
+ * Creates a dummy table model.
+ */
+ private static TableModel testSelectionWithFilterTable() {
+ DefaultTableModel model = new DefaultTableModel(0, 3);
+ for (int i = 0; i < COUNT; i++) {
+ model.addRow(new Object[]{i + "x0", i + "x1", i + "x2"});
+ }
+ return model;
+ }
+}
--- a/test/jdk/jdk/jfr/event/gc/collection/TestG1ParallelPhases.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/jdk/jfr/event/gc/collection/TestG1ParallelPhases.java Fri Jul 19 14:55:22 2019 +0530
@@ -100,6 +100,7 @@
"CMRefRoots",
"WaitForStrongCLD",
"WeakCLDRoots",
+ "MergeER",
"MergeHCC",
"MergeRS",
"MergeLB",
--- a/test/jdk/sun/security/util/FilePermCompat/CompatImpact.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jdk/sun/security/util/FilePermCompat/CompatImpact.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2017, 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
@@ -90,7 +90,7 @@
.debug(testcase)
.start();
if (p.waitFor() != 0) {
- Files.copy(Paths.get("stderr." + testcase), System.out);
+ Files.copy(Paths.get(testcase + ".stderr"), System.out);
failed += testcase + " ";
}
@@ -101,7 +101,7 @@
.debug(testcase)
.start();
if (p.waitFor() != 0) {
- Files.copy(Paths.get("stderr." + testcase), System.out);
+ Files.copy(Paths.get(testcase + ".stderr"), System.out);
failed += testcase + " ";
}
@@ -114,7 +114,7 @@
.debug(testcase)
.start();
if (p.waitFor() != 0) {
- Files.copy(Paths.get("stderr." + testcase), System.out);
+ Files.copy(Paths.get(testcase + ".stderr"), System.out);
failed += testcase + " ";
}
@@ -126,7 +126,7 @@
.debug(testcase)
.start();
if (p.waitFor() != 0) {
- Files.copy(Paths.get("stderr." + testcase), System.out);
+ Files.copy(Paths.get(testcase + ".stderr"), System.out);
failed += testcase + " ";
}
@@ -138,7 +138,7 @@
.debug(testcase)
.start();
if (p.waitFor() != 0) {
- Files.copy(Paths.get("stderr." + testcase), System.out);
+ Files.copy(Paths.get(testcase + ".stderr"), System.out);
failed += testcase + " ";
}
@@ -238,6 +238,7 @@
// For my policy, f is passed into test and new MP(f)
// will be set as new policy
p.perm(new SecurityPermission("setPolicy"));
+ p.perm(new SecurityPermission("getPolicy"));
p.args(f);
break;
default:
@@ -249,7 +250,9 @@
// My own Policy impl, with only one granted permission, also not smart
// enough to know whether ProtectionDomain grants any permission
static class MP extends Policy {
+ static final Policy DEFAULT_POLICY = Policy.getPolicy();
final PermissionCollection pc;
+
MP(String f) {
FilePermission p = new FilePermission(f, "read");
pc = p.newPermissionCollection();
@@ -267,7 +270,7 @@
@Override
public boolean implies(ProtectionDomain domain, Permission permission) {
- return pc.implies(permission);
+ return pc.implies(permission) || DEFAULT_POLICY.implies(domain, permission);
}
}
}
--- a/test/jtreg-ext/requires/VMProps.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/jtreg-ext/requires/VMProps.java Fri Jul 19 14:55:22 2019 +0530
@@ -455,7 +455,7 @@
}
private boolean checkDockerSupport() throws IOException, InterruptedException {
- ProcessBuilder pb = new ProcessBuilder("docker", "ps");
+ ProcessBuilder pb = new ProcessBuilder(Platform.DOCKER_COMMAND, "ps");
Process p = pb.start();
p.waitFor(10, TimeUnit.SECONDS);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/TextBlockIllegalEscape.java Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8227640
+ * @summary Verify that illegal escapes in text blocks do not crash the javac.
+ * @compile/fail/ref=TextBlockIllegalEscape.out --enable-preview -source ${jdk.version} -XDrawDiagnostics TextBlockIllegalEscape.java
+ */
+
+public class TextBlockIllegalEscape {
+ static void test() {
+ EQ("""
+ \!
+ """, "");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/TextBlockIllegalEscape.out Fri Jul 19 14:55:22 2019 +0530
@@ -0,0 +1,4 @@
+TextBlockIllegalEscape.java:11:13: compiler.err.illegal.esc.char
+- compiler.note.preview.filename: TextBlockIllegalEscape.java
+- compiler.note.preview.recompile
+1 error
--- a/test/langtools/tools/javac/file/LimitedImage.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/langtools/tools/javac/file/LimitedImage.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2017, 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
@@ -28,7 +28,7 @@
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
- * @run main/othervm --limit-modules jdk.compiler LimitedImage
+ * @run main/othervm --limit-modules jdk.compiler,jdk.internal.vm.compiler LimitedImage
*/
import java.io.IOException;
--- a/test/langtools/tools/javac/modules/InheritRuntimeEnvironmentTest.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/langtools/tools/javac/modules/InheritRuntimeEnvironmentTest.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -130,7 +130,8 @@
// This is the test, to verify that the module being compiled will not be able to read
// modules on the module path when a --limit-modules is used
new TestCase(base)
- .testOpts("--module-path", modules.toString(), "--limit-modules", "jdk.compiler")
+ .testOpts("--module-path", modules.toString(),
+ "--limit-modules", "jdk.compiler,jdk.internal.vm.compiler")
.otherOpts("-XDrawDiagnostics",
"--module-source-path", src.toString(),
"-classpath", emptyClassPath.toString())
--- a/test/langtools/tools/sjavac/IdleShutdown.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/langtools/tools/sjavac/IdleShutdown.java Fri Jul 19 14:55:22 2019 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -88,9 +88,13 @@
long error = Math.abs(expectedTimeout - timeoutTimestamp.get());
log("Timeout error: " + error + " ms");
- if (error > TIMEOUT_MS * .1)
- throw new AssertionError("Error too big");
-
+ String timeoutFactorText = System.getProperty("test.timeout.factor", "1.0");
+ double timeoutFactor = Double.parseDouble(timeoutFactorText);
+ double allowedError = TIMEOUT_MS * 0.1 * timeoutFactor;
+ if (error > allowedError) {
+ throw new AssertionError("Timeout error too large, error is " + error +
+ " milliseconds, we allowed " + allowedError + " milliseconds");
+ }
log("Shutting down");
service.shutdown();
}
--- a/test/lib/jdk/test/lib/Platform.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/lib/jdk/test/lib/Platform.java Fri Jul 19 14:55:22 2019 +0530
@@ -33,6 +33,12 @@
import java.security.PrivilegedExceptionAction;
public class Platform {
+ // Use this property to specify docker location on your system.
+ // E.g.: "/usr/local/bin/docker". We define this constant here so
+ // that it can be used in VMProps as well which checks docker support
+ // via this command
+ public static final String DOCKER_COMMAND =
+ System.getProperty("jdk.test.docker.command", "docker");
public static final String vmName = privilegedGetProperty("java.vm.name");
public static final String vmInfo = privilegedGetProperty("java.vm.info");
private static final String osVersion = privilegedGetProperty("os.version");
--- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java Fri Jul 19 14:55:22 2019 +0530
@@ -531,16 +531,20 @@
long newUsage = metrics.getCpuUsage();
long[] newPerCpu = metrics.getPerCpuUsage();
- if (newSysVal <= startSysVal) {
+ // system/user CPU usage counters may be slowly increasing.
+ // allow for equal values for a pass
+ if (newSysVal < startSysVal) {
fail(SubSystem.CPU, "getCpuSystemUsage", newSysVal, startSysVal);
}
- if (newUserVal <= startUserVal) {
+ // system/user CPU usage counters may be slowly increasing.
+ // allow for equal values for a pass
+ if (newUserVal < startUserVal) {
fail(SubSystem.CPU, "getCpuUserUsage", newUserVal, startUserVal);
}
if (newUsage <= startUsage) {
- fail(SubSystem.CPU, "getCpuUserUsage", newUsage, startUsage);
+ fail(SubSystem.CPU, "getCpuUsage", newUsage, startUsage);
}
boolean success = false;
--- a/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java Fri Jul 19 14:55:22 2019 +0530
@@ -37,6 +37,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import jdk.test.lib.Platform;
import jdk.test.lib.Utils;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
@@ -54,11 +55,6 @@
// diagnostic information.
private static final int MAX_LINES_TO_COPY_FOR_CHILD_STDOUT = 100;
- // Use this property to specify docker location on your system.
- // E.g.: "/usr/local/bin/docker".
- private static final String DOCKER_COMMAND =
- System.getProperty("jdk.test.docker.command", "docker");
-
// Set this property to true to retain image after test. By default
// images are removed after test execution completes.
// Retaining the image can be useful for diagnostics and image inspection.
@@ -116,7 +112,7 @@
*/
private static boolean isDockerEngineAvailableCheck() throws Exception {
try {
- execute(DOCKER_COMMAND, "ps")
+ execute(Platform.DOCKER_COMMAND, "ps")
.shouldHaveExitValue(0)
.shouldContain("CONTAINER")
.shouldContain("IMAGE");
@@ -179,9 +175,8 @@
DockerfileConfig.getBaseImageVersion());
try {
// Build the docker
- execute(DOCKER_COMMAND, "build", "--no-cache", "--tag", imageName, buildDir.toString())
- .shouldHaveExitValue(0)
- .shouldContain("Successfully built");
+ execute(Platform.DOCKER_COMMAND, "build", "--no-cache", "--tag", imageName, buildDir.toString())
+ .shouldHaveExitValue(0);
} catch (Exception e) {
// If docker image building fails there is a good chance it happens due to environment and/or
// configuration other than product failure. Throw jtreg skipped exception in such case
@@ -202,7 +197,7 @@
public static List<String> buildJavaCommand(DockerRunOptions opts) throws Exception {
List<String> cmd = new ArrayList<>();
- cmd.add(DOCKER_COMMAND);
+ cmd.add(Platform.DOCKER_COMMAND);
cmd.add("run");
if (opts.tty)
cmd.add("--tty=true");
@@ -244,7 +239,7 @@
* @throws Exception
*/
public static void removeDockerImage(String imageNameAndTag) throws Exception {
- execute(DOCKER_COMMAND, "rmi", "--force", imageNameAndTag);
+ execute(Platform.DOCKER_COMMAND, "rmi", "--force", imageNameAndTag);
}
--- a/test/lib/jdk/test/lib/util/FileUtils.java Mon Jul 15 15:23:54 2019 +0530
+++ b/test/lib/jdk/test/lib/util/FileUtils.java Fri Jul 19 14:55:22 2019 +0530
@@ -96,7 +96,7 @@
*/
public static void deleteFileIfExistsWithRetry(Path path) throws IOException {
try {
- if (Files.exists(path)) {
+ if (!Files.notExists(path)) {
deleteFileWithRetry0(path);
}
} catch (InterruptedException x) {