# HG changeset patch # User jdv # Date 1563528322 -19800 # Node ID 544abd4b9fd4df670c18464f9d4fee82a8452ccf # Parent 5c986f86899e0654fa597d5184a3c6c167d4e5c7# Parent 709913d8ace9a65a0b6ea26df05904c8c86a8c0c Merge diff -r 5c986f86899e -r 544abd4b9fd4 .hgtags --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 make/Images.gmk --- 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) \ diff -r 5c986f86899e -r 544abd4b9fd4 make/InitSupport.gmk --- 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) \ ) \ diff -r 5c986f86899e -r 544abd4b9fd4 make/hotspot/lib/CompileJvm.gmk --- 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), ) diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/aarch64/gc/shenandoah/c1/shenandoahBarrierSetC1_aarch64.cpp --- 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 */); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/x86/gc/shenandoah/c1/shenandoahBarrierSetC1_x86.cpp --- 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 */); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp --- 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, diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/aix/attachListener_aix.cpp --- 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() { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/aix/loadlib_aix.cpp --- 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, diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/aix/os_aix.cpp --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/aix/perfMemory_aix.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/bsd/attachListener_bsd.cpp --- 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() { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/bsd/perfMemory_bsd.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/linux/attachListener_linux.cpp --- 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() { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/linux/perfMemory_linux.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/solaris/attachListener_solaris.cpp --- 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 exists in the working directory // or /tmp then this is the trigger to start the attach mechanism bool AttachListener::is_init_trigger() { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/solaris/perfMemory_solaris.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/windows/attachListener_windows.cpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/os/windows/perfMemory_windows.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/adlc/formssel.cpp --- 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 ) { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/adlc/output_c.cpp --- 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", diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/classfile/stringTable.cpp --- 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, diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/classfile/systemDictionary.cpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/classfile/systemDictionary.hpp --- 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: diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/code/codeCache.cpp --- 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; } } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1CollectedHeap.hpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp --- 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(max_gc_threads, "CLDG Roots (ms):"); _gc_par_phases[JVMTIRoots] = new WorkerDataArray(max_gc_threads, "JVMTI Roots (ms):"); AOT_ONLY(_gc_par_phases[AOTCodeRoots] = new WorkerDataArray(max_gc_threads, "AOT Root Scan (ms):");) - JVMCI_ONLY(_gc_par_phases[JVMCIRoots] = new WorkerDataArray(max_gc_threads, "JVMCI Root Scan (ms):");) _gc_par_phases[CMRefRoots] = new WorkerDataArray(max_gc_threads, "CM RefProcessor Roots (ms):"); _gc_par_phases[WaitForStrongCLD] = new WorkerDataArray(max_gc_threads, "Wait For Strong CLD (ms):"); _gc_par_phases[WeakCLDRoots] = new WorkerDataArray(max_gc_threads, "Weak CLD Roots (ms):"); + _gc_par_phases[MergeER] = new WorkerDataArray(max_gc_threads, "Eager Reclaim (ms):"); + _gc_par_phases[MergeRS] = new WorkerDataArray(max_gc_threads, "Remembered Sets (ms):"); _merge_rs_merged_sparse = new WorkerDataArray(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", diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1Policy.cpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1RemSet.cpp --- 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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1RemSet.hpp --- 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. diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1RootProcessor.cpp --- 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)) { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/g1/g1RootProcessor.hpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/pcTasks.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/pcTasks.hpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/psMarkSweep.cpp --- 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()); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/psParallelCompact.cpp --- 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. diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/psScavenge.cpp --- 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()); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/psTasks.cpp --- 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"); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/parallel/psTasks.hpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shared/genCollectedHeap.cpp --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shared/genCollectedHeap.hpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shared/memAllocator.cpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp --- 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(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(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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp --- 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. diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.hpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp --- 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 static oop oop_load_not_in_heap(T* addr); + // Used for catching bad stores + template + static void oop_store_not_in_heap(T* addr, oop value); + template static oop oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp --- 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 template +inline void ShenandoahBarrierSet::AccessBarrier::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 +template inline oop ShenandoahBarrierSet::AccessBarrier::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) { oop res; oop expected = compare_value; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp --- 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) { } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp --- 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); }; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/z/zRootsIterator.cpp --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/gc/z/zRootsIterator.hpp --- 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 _jni_handles; + ZParallelOopsDo _vm_handles; ZParallelOopsDo _class_loader_data_graph; public: diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/include/cds.h --- 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 { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/jfr/leakprofiler/chains/rootSetClosure.cpp --- 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 RootSetClosure::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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/jfr/leakprofiler/checkpoint/rootResolver.cpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/jvmci/jvmci.cpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/jvmci/jvmci.hpp --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/libadt/set.cpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/allocation.cpp --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/allocation.hpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/allocation.inline.hpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/arena.cpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/arena.hpp --- 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 { diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/memory/filemap.cpp --- 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 ".", diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/oops/method.cpp --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/prims/cdsoffsets.cpp --- 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)); \ diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/prims/jvmtiTagMap.cpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/globals.hpp --- 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") \ \ diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/java.cpp --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/javaCalls.cpp --- 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 ); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/mutex.hpp --- 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, diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/mutexLocker.cpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/mutexLocker.hpp --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/os.cpp --- 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. diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/serviceThread.cpp --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/runtime/unhandledOops.cpp --- 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"); diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/services/attachListener.cpp --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/services/attachListener.hpp --- 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 : 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/hotspot/share/services/gcNotifier.cpp --- 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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/aix/classes/sun/nio/fs/AixNativeDispatcher.java --- 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() { - public Void run() { - System.loadLibrary("nio"); - return null; - }}); + jdk.internal.loader.BootLoader.loadLibrary("nio"); init(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/linux/classes/sun/nio/fs/LinuxNativeDispatcher.java --- 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(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/linux/classes/sun/nio/fs/LinuxWatchService.java --- 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"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/macosx/classes/apple/security/KeychainStore.java --- 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() { - 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/macosx/classes/sun/nio/fs/UTIFileTypeDetector.java --- 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"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/com/sun/crypto/provider/ChaCha20Cipher.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/com/sun/java/util/jar/pack/PackageReader.java diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/io/FilterInputStream.java diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/io/FilterOutputStream.java diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/io/PrintStream.java --- 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. * *

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. * *

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 diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/io/PushbackInputStream.java --- 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 b is null. * @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 b[1], and so forth. * * @param b the byte array to push back + * @exception NullPointerException If b is null. * @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 diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/lang/System.java --- 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); + } }); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/lang/Throwable.java --- 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 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 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(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 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; } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/DatagramPacket.java --- 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(); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/InetAddress.java --- 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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/NetworkInterface.java --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/URL.java --- 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)); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/net/URLStreamHandler.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/security/AccessController.java --- 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)); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/util/Collections.java --- 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 spliterator() { return stream().spliterator(); } + + private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { + ois.defaultReadObject(); + SharedSecrets.getJavaObjectInputStreamAccess().checkArray(ois, Object[].class, n); + } } /** diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/util/EnumSet.java --- 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> extends AbstractSet 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. */ diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/java/util/zip/ZipUtils.java --- 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 pa = () -> { System.loadLibrary("zip"); return null; }; - AccessController.doPrivileged(pa); - } + jdk.internal.loader.BootLoader.loadLibrary("zip"); } private static final Unsafe unsafe = Unsafe.getUnsafe(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/jdk/internal/loader/BootLoader.java --- 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 { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/ext/ExtendedSocketOptions.java --- 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> options; + private final Set> datagramOptions; + private final Set> clientStreamOptions; + private final Set> 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> options0(short type, boolean server) { - Set> 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> options) { this.options = options; + var datagramOptions = new HashSet>(); + var serverStreamOptions = new HashSet>(); + var clientStreamOptions = new HashSet>(); + 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/sdp/SdpSupport.java --- 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() { - public Void run() { - System.loadLibrary("net"); - return null; - } - }); + jdk.internal.loader.BootLoader.loadLibrary("net"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/spi/DefaultProxySelector.java --- 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() { - public Void run() { - System.loadLibrary("net"); - return null; - } - }); + jdk.internal.loader.BootLoader.loadLibrary("net"); hasSystemProxies = init(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/util/IPAddressUtil.java --- 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; + } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/www/content/text/plain.java diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java --- 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)); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/net/www/protocol/https/HttpsURLConnectionImpl.java --- 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., "accept"). * @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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/nio/ch/IOUtil.java --- 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() { - 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/CertStatusExtension.java --- 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. } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/CertificateRequest.java --- 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")) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/CertificateStatus.java --- 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); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java --- 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--) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/ServerHelloDone.java --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/ServerKeyExchange.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/ssl/X509TrustManagerImpl.java --- 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 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 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 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.emptyList(); @@ -376,12 +362,16 @@ // Also used by X509KeyManagerImpl static List 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.emptyList(); + } + + private static List getRequestedServerNames( + SSLSession session) { + if (session != null && (session instanceof ExtendedSSLSession)) { + return ((ExtendedSSLSession)session).getRequestedServerNames(); } return Collections.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 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 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); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/util/DerIndefLenConverter.java --- 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 eocList 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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/util/HostnameChecker.java --- 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.

* - * The name parameter should represent a DNS name. - * The template parameter - * may contain the wildcard character * + * The name parameter should represent a DNS name. The + * template 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 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java --- 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; } } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java --- 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() { - public Void run() { - System.loadLibrary("nio"); - return null; - }}); + jdk.internal.loader.BootLoader.loadLibrary("nio"); init(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/solaris/classes/sun/nio/fs/SolarisWatchService.java --- 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() { - public Void run() { - System.loadLibrary("nio"); - return null; - }}); + jdk.internal.loader.BootLoader.loadLibrary("nio"); init(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/unix/classes/sun/net/PortConfig.java --- 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) { diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/unix/classes/sun/net/dns/ResolverConfigurationImpl.java --- 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"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/unix/classes/sun/nio/fs/UnixCopyFile.java --- 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"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java --- 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(); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/windows/classes/sun/net/dns/ResolverConfigurationImpl.java --- 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() { - public Void run() { - System.loadLibrary("net"); - return null; - } - }); + jdk.internal.loader.BootLoader.loadLibrary("net"); init0(); // start the address listener thread diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/windows/classes/sun/net/www/protocol/file/Handler.java --- 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); } /* diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/windows/classes/sun/net/www/protocol/file/UNCFileURLConnection.java --- /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; + } +} + diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/windows/classes/sun/nio/fs/RegistryFileTypeDetector.java --- 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() { - @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"); } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.base/windows/classes/sun/nio/fs/WindowsNativeDispatcher.java --- 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() { - 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(); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/macosx/native/libsplashscreen/splashscreen_sys.m --- 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]; diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/share/classes/javax/swing/JTable.java --- 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)); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/share/native/libsplashscreen/libpng/png.c --- 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; } } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java --- 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()); } /** diff -r 5c986f86899e -r 544abd4b9fd4 src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.security.jgss/macosx/native/libosxkrb5/SCDynamicStoreConfig.m --- 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; } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java --- 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 - * @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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/XSLTC.java --- 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<>(); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesHandlerImpl.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TransformerFactoryImpl.java --- 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); } diff -r 5c986f86899e -r 544abd4b9fd4 src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/xs/identity/XPathMatcher.java --- 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) () -> { + if (System.getSecurityManager() == null) { System.loadLibrary("extnet"); - return null; - }); + } else { + AccessController.doPrivileged((PrivilegedAction) () -> { + System.loadLibrary("extnet"); + return null; + }); + } } -} \ No newline at end of file +} + diff -r 5c986f86899e -r 544abd4b9fd4 src/jdk.net/macosx/classes/jdk/net/MacOSXSocketOptions.java --- 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) () -> { + if (System.getSecurityManager() == null) { System.loadLibrary("extnet"); - return null; - }); + } else { + AccessController.doPrivileged((PrivilegedAction) () -> { + System.loadLibrary("extnet"); + return null; + }); + } } } diff -r 5c986f86899e -r 544abd4b9fd4 src/jdk.net/solaris/classes/jdk/net/SolarisSocketOptions.java --- 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() { - public Void run() { - System.loadLibrary("extnet"); - return null; - } - }); + if (System.getSecurityManager() == null) { + System.loadLibrary("extnet"); + } else { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + System.loadLibrary("extnet"); + return null; + } + }); + } init(); } } diff -r 5c986f86899e -r 544abd4b9fd4 test/hotspot/jtreg/gc/g1/TestGCLogMessages.java --- 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), diff -r 5c986f86899e -r 544abd4b9fd4 test/hotspot/jtreg/runtime/CheckUnhandledOops/TestOutOfMemory.java --- /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"); + } + } +} diff -r 5c986f86899e -r 544abd4b9fd4 test/hotspot/jtreg/runtime/appcds/SharedArchiveConsistency.java --- 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 arry = new ArrayList(); arry.add(READ); arry.add(WRITE); - return FileChannel.open(jsa.toPath(), new HashSet(arry)); + return FileChannel.open(jsaFile.toPath(), new HashSet(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 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); + } + } + +} diff -r 5c986f86899e -r 544abd4b9fd4 test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java --- /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); + } + } + +} diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/transform/ErrorListenerTest.java --- /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()); + } + } +} diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/validation/ValidationTest.java --- 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()))); } + } diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447a.xml --- /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 @@ + + + + + + diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447a.xsd --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447b.xml --- /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 @@ + + + + + + + + + + + + + diff -r 5c986f86899e -r 544abd4b9fd4 test/jaxp/javax/xml/jaxp/unittest/validation/files/JDK8176447b.xsd --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/ProblemList.txt --- 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 diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java --- 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."); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/awt/Color/AlphaColorTest.java --- 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(); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/io/NegativeInitSize.java diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/net/URLPermission/URLTest.java --- 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); } } } diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/sql/testng/util/TestPolicy.java --- 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); } } diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java --- 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 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"); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/EnumSet/BogusEnumSet.java --- 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, diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/EnumSet/EnumSetClassSerialization.java --- /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};")) + ); + } + } +} diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/ResourceBundle/Control/MissingResourceCauseTestRun.java --- 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"); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/ResourceBundle/modules/ModuleTestUtil.java --- 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 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 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) diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/ResourceBundle/modules/layer/LayerTest.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/ResourceBundle/modules/unnamed/UnNamedTest.java --- 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()) diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/ResourceBundle/modules/visibility/VisibilityTest.java --- 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 argsList) throws Throwable { JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("java"); + launcher.addToolArg("-ea") + .addToolArg("-esa"); argsList.forEach(launcher::addToolArg); return ProcessTools.executeCommand(launcher.getCommand()).getExitValue(); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/TimeZone/Bug8066652Run.java --- 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"); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/java/util/TimeZone/TimeZoneDatePermissionCheckRun.java --- 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"); diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/javax/accessibility/JTable/JTableCellEditor.java --- /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; + } +} diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/jdk/jfr/event/gc/collection/TestG1ParallelPhases.java --- 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", diff -r 5c986f86899e -r 544abd4b9fd4 test/jdk/sun/security/util/FilePermCompat/CompatImpact.java --- 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); } } } diff -r 5c986f86899e -r 544abd4b9fd4 test/jtreg-ext/requires/VMProps.java --- 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); diff -r 5c986f86899e -r 544abd4b9fd4 test/langtools/tools/javac/TextBlockIllegalEscape.java --- /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(""" + \! + """, ""); + } +} diff -r 5c986f86899e -r 544abd4b9fd4 test/langtools/tools/javac/TextBlockIllegalEscape.out --- /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 diff -r 5c986f86899e -r 544abd4b9fd4 test/langtools/tools/javac/file/LimitedImage.java --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 test/langtools/tools/javac/modules/InheritRuntimeEnvironmentTest.java --- 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()) diff -r 5c986f86899e -r 544abd4b9fd4 test/langtools/tools/sjavac/IdleShutdown.java --- 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(); } diff -r 5c986f86899e -r 544abd4b9fd4 test/lib/jdk/test/lib/Platform.java --- 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"); diff -r 5c986f86899e -r 544abd4b9fd4 test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java --- 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; diff -r 5c986f86899e -r 544abd4b9fd4 test/lib/jdk/test/lib/containers/docker/DockerTestUtils.java --- 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 buildJavaCommand(DockerRunOptions opts) throws Exception { List 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); } diff -r 5c986f86899e -r 544abd4b9fd4 test/lib/jdk/test/lib/util/FileUtils.java --- 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) {