# HG changeset patch # User duke # Date 1499282729 -7200 # Node ID a090823529e7a510a7ecce0a33fa4fa8b2b90606 # Parent f74f056dc0694995467d4fd1c970f817debab17a# Parent 41c718ab07256d69c775251e9132540f2e7358ec Merge diff -r f74f056dc069 -r a090823529e7 .hgtags-top-repo --- a/.hgtags-top-repo Mon Mar 07 18:49:02 2016 +0530 +++ b/.hgtags-top-repo Wed Jul 05 21:25:29 2017 +0200 @@ -350,3 +350,4 @@ be58b02c11f90b88c67e4d0e2cb5e4cf2d9b3c57 jdk-9+105 54575d8783b3a39a2d710c28cda675d44261f9d9 jdk-9+106 4d65eba233a8730f913734a6804910b842d2cb54 jdk-9+107 +c7be2a78c31b3b6132f2f5e9e4b3d3bb1c20245c jdk-9+108 diff -r f74f056dc069 -r a090823529e7 common/conf/jib-profiles.js --- a/common/conf/jib-profiles.js Mon Mar 07 18:49:02 2016 +0530 +++ b/common/conf/jib-profiles.js Wed Jul 05 21:25:29 2017 +0200 @@ -311,6 +311,16 @@ labels: [ "open" ] }, + "linux-x86-open": { + target_os: mainProfiles["linux-x86"].target_os, + target_cpu: mainProfiles["linux-x86"].target_cpu, + dependencies: mainProfiles["linux-x86"].dependencies, + configure_args: concat(mainProfiles["linux-x86"].configure_args, + "--enable-openjdk-only"), + make_args: mainProfiles["linux-x86"].make_args, + labels: [ "open" ] + }, + "solaris-x64-open": { target_os: mainProfiles["solaris-x64"].target_os, target_cpu: mainProfiles["solaris-x64"].target_cpu, @@ -319,6 +329,16 @@ "--enable-openjdk-only"), make_args: mainProfiles["solaris-x64"].make_args, labels: [ "open" ] + }, + + "windows-x86-open": { + target_os: mainProfiles["windows-x86"].target_os, + target_cpu: mainProfiles["windows-x86"].target_cpu, + dependencies: mainProfiles["windows-x86"].dependencies, + configure_args: concat(mainProfiles["windows-x86"].configure_args, + "--enable-openjdk-only"), + make_args: mainProfiles["windows-x86"].make_args, + labels: [ "open" ] } }; profiles = concatObjects(profiles, jprtOpenProfiles); diff -r f74f056dc069 -r a090823529e7 corba/.hgtags --- a/corba/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/corba/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -350,3 +350,4 @@ 64006ae915b3aa85ac7e6fac679024d2da7fe526 jdk-9+105 8ec4f97943fe56f93e4621f622b56b7144c0181a jdk-9+106 49202432b69445164a42be7cbdf74ed5fce98157 jdk-9+107 +84f2862a25eb3232ff36c376b4e2bf2a83dfced3 jdk-9+108 diff -r f74f056dc069 -r a090823529e7 hotspot/.hgtags --- a/hotspot/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -510,3 +510,4 @@ 266fa9bb5297bf02cb2a7b038b10a109817d2b48 jdk-9+105 7232de4c17c37f60aecec4f3191090bd3d41d334 jdk-9+106 c5146d4da417f76edfc43097d2e2ced042a65b4e jdk-9+107 +934f6793f5f7dca44f69b4559d525fa64b31840d jdk-9+108 diff -r f74f056dc069 -r a090823529e7 hotspot/make/bsd/makefiles/amd64.make --- a/hotspot/make/bsd/makefiles/amd64.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/bsd/makefiles/amd64.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2016, 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 @@ -37,3 +37,11 @@ endif OPT_CFLAGS/compactingPermGenGen.o = -O1 + +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/sharedRuntimeTrig.o += -g + OPT_CFLAGS/sharedRuntimeTrans.o += -g + OPT_CFLAGS/compactingPermGenGen.o += -g +endif diff -r f74f056dc069 -r a090823529e7 hotspot/make/bsd/makefiles/gcc.make --- a/hotspot/make/bsd/makefiles/gcc.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/bsd/makefiles/gcc.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2016, 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,13 @@ ), 1) OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT) OPT_CFLAGS/unsafe.o += -O1 + + # The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides + # of OPT_CFLAGS. Restore it here. + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/loopTransform.o += -g + OPT_CFLAGS/unsafe.o += -g + endif else $(error "Update compiler workarounds for Clang $(CC_VER_MAJOR).$(CC_VER_MINOR)") endif diff -r f74f056dc069 -r a090823529e7 hotspot/make/linux/makefiles/amd64.make --- a/hotspot/make/linux/makefiles/amd64.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/linux/makefiles/amd64.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2016, 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 @@ -32,3 +32,11 @@ CFLAGS += -D_LP64=1 OPT_CFLAGS/compactingPermGenGen.o = -O1 + +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/sharedRuntimeTrig.o += -g + OPT_CFLAGS/sharedRuntimeTrans.o += -g + OPT_CFLAGS/compactingPermGenGen.o += -g +endif diff -r f74f056dc069 -r a090823529e7 hotspot/make/linux/makefiles/gcc.make --- a/hotspot/make/linux/makefiles/gcc.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/linux/makefiles/gcc.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2016, 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 @@ -265,6 +265,11 @@ # GCC >= 4.3 # Gcc 4.1.2 does not support this flag, nor does it have problems compiling the file. OPT_CFLAGS/vmStructs.o += -fno-var-tracking-assignments + # The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides + # of OPT_CFLAGS. Restore it here. + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/vmStructs.o += -g + endif endif # The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp @@ -277,6 +282,11 @@ ifeq ($(USE_CLANG), true) ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1) OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT) + # The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides + # of OPT_CFLAGS. Restore it here. + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/loopTransform.o += -g + endif endif else # Do not allow GCC 4.1.1 diff -r f74f056dc069 -r a090823529e7 hotspot/make/linux/makefiles/i486.make --- a/hotspot/make/linux/makefiles/i486.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/linux/makefiles/i486.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2016, 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 @@ -32,3 +32,11 @@ CFLAGS += -DVM_LITTLE_ENDIAN OPT_CFLAGS/compactingPermGenGen.o = -O1 + +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/sharedRuntimeTrig.o += -g + OPT_CFLAGS/sharedRuntimeTrans.o += -g + OPT_CFLAGS/compactingPermGenGen.o += -g +endif diff -r f74f056dc069 -r a090823529e7 hotspot/make/linux/makefiles/zeroshark.make --- a/hotspot/make/linux/makefiles/zeroshark.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/linux/makefiles/zeroshark.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. # Copyright 2007, 2008 Red Hat, Inc. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -29,12 +29,6 @@ ifeq ($(USE_CLANG), true) WARNING_FLAGS += -Wno-undef endif -# Suppress some warning flags that are normally turned on for hotspot, -# because some of the zero code has not been updated accordingly. -WARNING_FLAGS += -Wno-return-type \ - -Wno-format-nonliteral -Wno-format-security \ - -Wno-maybe-uninitialized - # The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT) diff -r f74f056dc069 -r a090823529e7 hotspot/make/solaris/makefiles/amd64.make --- a/hotspot/make/solaris/makefiles/amd64.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/solaris/makefiles/amd64.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2016, 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,6 +34,14 @@ OPT_CFLAGS/generateOptoStub.o = -xO2 # Temporary util SS12u1 C++ compiler is fixed OPT_CFLAGS/c1_LinearScan.o = -xO2 + +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/generateOptoStub.o += -g0 -xs + OPT_CFLAGS/LinearScan.o += -g0 -xs +endif + else ifeq ("${Platform_compiler}", "gcc") diff -r f74f056dc069 -r a090823529e7 hotspot/make/solaris/makefiles/product.make --- a/hotspot/make/solaris/makefiles/product.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/solaris/makefiles/product.make Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2016, 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 @@ -35,11 +35,21 @@ # for this method for now. (fix this when dtrace bug 6258412 is fixed) ifndef USE_GCC OPT_CFLAGS/ciEnv.o = $(OPT_CFLAGS) -xinline=no%__1cFciEnvbFpost_compiled_method_load_event6MpnHnmethod__v_ +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/ciEnv.o += -g0 -xs +endif endif # Need extra inlining to get oop_ps_push_contents functions to perform well enough. ifndef USE_GCC OPT_CFLAGS/psPromotionManager.o = $(OPT_CFLAGS) -W2,-Ainline:inc=1000 +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/psPromotionManager.o += -g0 -xs +endif endif # (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files) @@ -55,6 +65,12 @@ ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1) # dtrace cannot handle tail call optimization (6672627, 6693876) OPT_CFLAGS/jni.o = $(OPT_CFLAGS/DEFAULT) $(OPT_CCFLAGS/NO_TAIL_CALL_OPT) +# The -g0 -xs flag is added to OPT_CFLAGS in sparcWorks.make, but lost in case of +# per-file overrides of OPT_CFLAGS. Restore it here. This is mainly needed +# to provide a good baseline to compare the new build against. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/jni.o += -g0 -xs +endif endif # COMPILER_NUMERIC_REV >= 509 # Workaround SS11 bug 6345274 (all platforms) (Fixed in SS11 patch and SS12) diff -r f74f056dc069 -r a090823529e7 hotspot/make/solaris/makefiles/sparcWorks.make --- a/hotspot/make/solaris/makefiles/sparcWorks.make Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/make/solaris/makefiles/sparcWorks.make Wed Jul 05 21:25:29 2017 +0200 @@ -158,9 +158,20 @@ OPT_CCFLAGS/NO_TAIL_CALL_OPT = -Qoption ube -O~yz OPT_CFLAGS/stubGenerator_x86_32.o = $(OPT_CFLAGS) -xspace OPT_CFLAGS/stubGenerator_x86_64.o = $(OPT_CFLAGS) -xspace +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/stubGenerator_x86_32.o += -g0 -xs + OPT_CFLAGS/stubGenerator_x86_64.o += -g0 -xs +endif endif # Platform_arch == x86 ifeq ("${Platform_arch}", "sparc") OPT_CFLAGS/stubGenerator_sparc.o = $(OPT_CFLAGS) -xspace +# The debug flag is added to OPT_CFLAGS, but lost in case of per-file overrides +# of OPT_CFLAGS. Restore it here. +ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) + OPT_CFLAGS/stubGenerator_sparc.o += -g0 -xs +endif endif endif # COMPILER_REV_NUMERIC >= 509 diff -r f74f056dc069 -r a090823529e7 hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -773,7 +773,7 @@ } BasicType CppInterpreter::result_type_of(Method* method) { - BasicType t; + BasicType t = T_ILLEGAL; // silence compiler warnings switch (method->result_index()) { case 0 : t = T_BOOLEAN; break; case 1 : t = T_CHAR; break; diff -r f74f056dc069 -r a090823529e7 hotspot/src/cpu/zero/vm/interpreterRT_zero.cpp --- a/hotspot/src/cpu/zero/vm/interpreterRT_zero.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/cpu/zero/vm/interpreterRT_zero.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -62,7 +62,7 @@ } void InterpreterRuntime::SignatureHandlerGeneratorBase::push(BasicType type) { - ffi_type *ftype; + ffi_type *ftype = NULL; switch (type) { case T_VOID: ftype = &ffi_type_void; diff -r f74f056dc069 -r a090823529e7 hotspot/src/os/aix/vm/attachListener_aix.cpp --- a/hotspot/src/os/aix/vm/attachListener_aix.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os/aix/vm/attachListener_aix.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2015 SAP SE. All rights reserved. + * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016 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 @@ -225,7 +225,7 @@ // We must call bind with the actual socketaddr length. This is obligatory for AS400. int res = ::bind(listener, (struct sockaddr*)&addr, SUN_LEN(&addr)); if (res == -1) { - RESTARTABLE(::close(listener), res); + ::close(listener); return -1; } @@ -238,7 +238,7 @@ } } if (res == -1) { - RESTARTABLE(::close(listener), res); + ::close(listener); ::unlink(initial_path); return -1; } @@ -400,7 +400,7 @@ AixAttachOperation* op = read_request(s); if (op == NULL) { int res; - RESTARTABLE(::close(s), res); + ::close(s); continue; } else { return op; @@ -452,7 +452,7 @@ } // done - RESTARTABLE(::close(this->socket()), rc); + ::close(this->socket()); // were we externally suspended while we were waiting? thread->check_and_wait_while_suspended(); diff -r f74f056dc069 -r a090823529e7 hotspot/src/os/aix/vm/perfMemory_aix.cpp --- a/hotspot/src/os/aix/vm/perfMemory_aix.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os/aix/vm/perfMemory_aix.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2013 SAP SE. All rights reserved. + * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016 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 @@ -121,7 +121,7 @@ addr += result; } - RESTARTABLE(::close(fd), result); + result = ::close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { warning("Could not close %s: %s\n", destfile, strerror(errno)); @@ -299,10 +299,13 @@ bool create; int error; int fd; + int result; create = false; - if (lstat(path, &orig_st) != 0) { + RESTARTABLE(::lstat(path, &orig_st), result); + + if (result == OS_ERR) { if (errno == ENOENT && (oflag & O_CREAT) != 0) { // File doesn't exist, but_we want to create it, add O_EXCL flag // to make sure no-one creates it (or a symlink) before us @@ -316,7 +319,7 @@ return OS_ERR; } } else { - // Lstat success, check if existing file is a link. + // lstat success, check if existing file is a link. if ((orig_st.st_mode & S_IFMT) == S_IFLNK) { // File is a symlink. errno = ELOOP; @@ -325,9 +328,9 @@ } if (use_mode == true) { - fd = open(path, oflag, mode); + RESTARTABLE(::open(path, oflag, mode), fd); } else { - fd = open(path, oflag); + RESTARTABLE(::open(path, oflag), fd); } if (fd == OS_ERR) { @@ -336,7 +339,8 @@ // Can't do inode checks on before/after if we created the file. if (create == false) { - if (fstat(fd, &new_st) != 0) { + RESTARTABLE(::fstat(fd, &new_st), result); + if (result == OS_ERR) { // Keep errno from fstat, in case close also fails. error = errno; ::close(fd); @@ -384,7 +388,7 @@ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); #else // workaround (jdk6 coding) - RESTARTABLE(::open_o_nofollow(dirname, O_RDONLY), result); + result = open_o_nofollow(dirname, O_RDONLY); #endif if (result == OS_ERR) { @@ -888,7 +892,7 @@ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result); #else // workaround function (jdk6 code) - RESTARTABLE(::open_o_nofollow(filename, O_RDWR|O_CREAT, S_IREAD|S_IWRITE), result); + result = open_o_nofollow(filename, O_RDWR|O_CREAT, S_IREAD|S_IWRITE); #endif if (result == OS_ERR) { @@ -931,7 +935,7 @@ if (PrintMiscellaneous && Verbose) { warning("could not set shared memory file size: %s\n", strerror(errno)); } - RESTARTABLE(::close(fd), result); + ::close(fd); return -1; } @@ -951,7 +955,7 @@ #ifdef O_NOFOLLOW RESTARTABLE(::open(filename, oflags), result); #else - RESTARTABLE(::open_o_nofollow(filename, oflags), result); + open_o_nofollow(filename, oflags); #endif if (result == OS_ERR) { @@ -1006,8 +1010,7 @@ char* dirname = get_user_tmp_dir(user_name); char* filename = get_sharedmem_filename(dirname, vmid); - - // Get the short filename. + // get the short filename. char* short_filename = strrchr(filename, '/'); if (short_filename == NULL) { short_filename = filename; @@ -1033,9 +1036,7 @@ mapAddress = (char*)::mmap((char*)0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - // attempt to close the file - restart it if it was interrupted, - // but ignore other failures - RESTARTABLE(::close(fd), result); + result = ::close(fd); assert(result != OS_ERR, "could not close file"); if (mapAddress == MAP_FAILED) { @@ -1142,7 +1143,6 @@ // constructs for the file and the shared memory mapping. if (mode == PerfMemory::PERF_MODE_RO) { mmap_prot = PROT_READ; - // No O_NOFOLLOW defined at buildtime, and it is not documented for open. #ifdef O_NOFOLLOW file_flags = O_RDONLY | O_NOFOLLOW; @@ -1205,21 +1205,28 @@ FREE_C_HEAP_ARRAY(char, filename); // open the shared memory file for the give vmid - fd = open_sharedmem_file(rfilename, file_flags, CHECK); - assert(fd != OS_ERR, "unexpected value"); + fd = open_sharedmem_file(rfilename, file_flags, THREAD); + + if (fd == OS_ERR) { + return; + } + + if (HAS_PENDING_EXCEPTION) { + ::close(fd); + return; + } if (*sizep == 0) { size = sharedmem_filesize(fd, CHECK); - assert(size != 0, "unexpected size"); } else { size = *sizep; } + assert(size > 0, "unexpected size <= 0"); + mapAddress = (char*)::mmap((char*)0, size, mmap_prot, MAP_SHARED, fd, 0); - // attempt to close the file - restart if it gets interrupted, - // but ignore other failures - RESTARTABLE(::close(fd), result); + result = ::close(fd); assert(result != OS_ERR, "could not close file"); if (mapAddress == MAP_FAILED) { @@ -1230,7 +1237,7 @@ "Could not map PerfMemory"); } - // It does not go through os api, the operation has to record from here. + // it does not go through os api, the operation has to record from here. MemTracker::record_virtual_memory_reserve((address)mapAddress, size, CURRENT_PC, mtInternal); *addr = mapAddress; @@ -1238,7 +1245,7 @@ if (PerfTraceMemOps) { tty->print("mapped " SIZE_FORMAT " bytes for vmid %d at " - INTPTR_FORMAT "\n", size, vmid, (void*)mapAddress); + INTPTR_FORMAT "\n", size, vmid, p2i((void*)mapAddress)); } } diff -r f74f056dc069 -r a090823529e7 hotspot/src/os/posix/vm/os_posix.cpp --- a/hotspot/src/os/posix/vm/os_posix.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os/posix/vm/os_posix.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, 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 @@ -238,14 +238,12 @@ st->cr(); } -#ifndef PRODUCT bool os::get_host_name(char* buf, size_t buflen) { struct utsname name; uname(&name); jio_snprintf(buf, buflen, "%s", name.nodename); return true; } -#endif // PRODUCT bool os::has_allocatable_memory_limit(julong* limit) { struct rlimit rlim; diff -r f74f056dc069 -r a090823529e7 hotspot/src/os/windows/vm/os_windows.cpp --- a/hotspot/src/os/windows/vm/os_windows.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1531,12 +1531,10 @@ return result; } -#ifndef PRODUCT bool os::get_host_name(char* buf, size_t buflen) { DWORD size = (DWORD)buflen; return (GetComputerNameEx(ComputerNameDnsHostname, buf, &size) == TRUE); } -#endif // PRODUCT void os::get_summary_os_info(char* buf, size_t buflen) { stringStream sst(buf, buflen); diff -r f74f056dc069 -r a090823529e7 hotspot/src/os/windows/vm/perfMemory_windows.cpp --- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -628,6 +628,7 @@ if (!is_directory_secure(dirname)) { // the directory is not secure, don't attempt any cleanup + os::closedir(dirp); return; } @@ -1445,6 +1446,8 @@ // check that the file system is secure - i.e. it supports ACLs. if (!is_filesystem_secure(dirname)) { + FREE_C_HEAP_ARRAY(char, dirname); + FREE_C_HEAP_ARRAY(char, user); return NULL; } @@ -1624,6 +1627,7 @@ // if (!is_directory_secure(dirname)) { FREE_C_HEAP_ARRAY(char, dirname); + if (luser != user) FREE_C_HEAP_ARRAY(char, luser); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Process not found"); } diff -r f74f056dc069 -r a090823529e7 hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp --- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -65,6 +65,7 @@ frame os::get_sender_for_C_frame(frame* fr) { ShouldNotCallThis(); + return frame(NULL, NULL); // silence compile warning. } frame os::current_frame() { @@ -102,6 +103,7 @@ address os::Linux::ucontext_get_pc(const ucontext_t* uc) { ShouldNotCallThis(); + return NULL; // silence compile warnings } void os::Linux::ucontext_set_pc(ucontext_t * uc, address pc) { @@ -112,10 +114,12 @@ intptr_t** ret_sp, intptr_t** ret_fp) { ShouldNotCallThis(); + return NULL; // silence compile warnings } frame os::fetch_frame_from_context(const void* ucVoid) { ShouldNotCallThis(); + return frame(NULL, NULL); // silence compile warnings } extern "C" JNIEXPORT int @@ -262,11 +266,16 @@ } #endif // !PRODUCT - const char *fmt = "caught unhandled signal %d"; char buf[64]; - sprintf(buf, fmt, sig); + sprintf(buf, "caught unhandled signal %d", sig); + +// Silence -Wformat-security warning for fatal() +PRAGMA_DIAG_PUSH +PRAGMA_FORMAT_NONLITERAL_IGNORED fatal(buf); +PRAGMA_DIAG_POP + return true; // silence compiler warnings } void os::Linux::init_thread_fpu_state(void) { @@ -275,6 +284,7 @@ int os::Linux::get_fpu_control_word() { ShouldNotCallThis(); + return -1; // silence compile warnings } void os::Linux::set_fpu_control_word(int fpu) { @@ -419,6 +429,7 @@ extern "C" { int SpinPause() { + return -1; // silence compile warnings } diff -r f74f056dc069 -r a090823529e7 hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp --- a/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -110,6 +110,7 @@ void* ucontext, bool isInJava) { ShouldNotCallThis(); + return false; // silence compile warning } // These routines are only used on cpu architectures that diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/classfile/stringTable.cpp --- a/hotspot/src/share/vm/classfile/stringTable.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/classfile/stringTable.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -200,7 +200,6 @@ return string; } - oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { oop found_string = lookup_shared(name, len); @@ -214,7 +213,9 @@ // Found if (found_string != NULL) { - ensure_string_alive(found_string); + if (found_string != string_or_null()) { + ensure_string_alive(found_string); + } return found_string; } @@ -249,7 +250,9 @@ hashValue, CHECK_NULL); } - ensure_string_alive(added_or_found); + if (added_or_found != string()) { + ensure_string_alive(added_or_found); + } return added_or_found; } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/classfile/vmSymbols.hpp --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -123,7 +123,7 @@ template(sun_misc_Launcher_ExtClassLoader, "sun/misc/Launcher$ExtClassLoader") \ \ /* Java runtime version access */ \ - template(sun_misc_Version, "sun/misc/Version") \ + template(java_lang_VersionProps, "java/lang/VersionProps") \ template(java_runtime_name_name, "java_runtime_name") \ template(java_runtime_version_name, "java_runtime_version") \ \ diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/cms/parNewGeneration.cpp --- a/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -39,6 +39,7 @@ #include "gc/shared/genOopClosures.inline.hpp" #include "gc/shared/generation.hpp" #include "gc/shared/plab.inline.hpp" +#include "gc/shared/preservedMarks.inline.hpp" #include "gc/shared/referencePolicy.hpp" #include "gc/shared/space.hpp" #include "gc/shared/spaceDecorator.hpp" @@ -64,6 +65,7 @@ int thread_num_, ObjToScanQueueSet* work_queue_set_, Stack* overflow_stacks_, + PreservedMarks* preserved_marks_, size_t desired_plab_sz_, ParallelTaskTerminator& term_) : _to_space(to_space_), @@ -73,6 +75,7 @@ _work_queue(work_queue_set_->queue(thread_num_)), _to_space_full(false), _overflow_stack(overflow_stacks_ ? overflow_stacks_ + thread_num_ : NULL), + _preserved_marks(preserved_marks_), _ageTable(false), // false ==> not the global age table, no perf data. _to_space_alloc_buffer(desired_plab_sz_), _to_space_closure(young_gen_, this), @@ -286,6 +289,7 @@ Generation& old_gen, ObjToScanQueueSet& queue_set, Stack* overflow_stacks_, + PreservedMarksSet& preserved_marks_set, size_t desired_plab_sz, ParallelTaskTerminator& term); @@ -322,6 +326,7 @@ Generation& old_gen, ObjToScanQueueSet& queue_set, Stack* overflow_stacks, + PreservedMarksSet& preserved_marks_set, size_t desired_plab_sz, ParallelTaskTerminator& term) : ResourceArray(sizeof(ParScanThreadState), num_threads), @@ -336,7 +341,8 @@ for (int i = 0; i < num_threads; ++i) { new ((ParScanThreadState*)_data + i) ParScanThreadState(&to_space, &young_gen, &old_gen, i, &queue_set, - overflow_stacks, desired_plab_sz, term); + overflow_stacks, preserved_marks_set.get(i), + desired_plab_sz, term); } } @@ -905,12 +911,16 @@ // Set the correct parallelism (number of queues) in the reference processor ref_processor()->set_active_mt_degree(active_workers); + // Need to initialize the preserved marks before the ThreadStateSet c'tor. + _preserved_marks_set.init(active_workers); + // Always set the terminator for the active number of workers // because only those workers go through the termination protocol. ParallelTaskTerminator _term(active_workers, task_queues()); ParScanThreadStateSet thread_state_set(active_workers, *to(), *this, *_old_gen, *task_queues(), - _overflow_stacks, desired_plab_sz(), _term); + _overflow_stacks, _preserved_marks_set, + desired_plab_sz(), _term); thread_state_set.reset(active_workers, promotion_failed()); @@ -993,6 +1003,7 @@ } else { handle_promotion_failed(gch, thread_state_set); } + _preserved_marks_set.reclaim(); // set new iteration safe limit for the survivor spaces from()->set_concurrent_iteration_safe_limit(from()->top()); to()->set_concurrent_iteration_safe_limit(to()->top()); @@ -1070,15 +1081,6 @@ return forward_ptr; } -void ParNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) { - if (m->must_be_preserved_for_promotion_failure(obj)) { - // We should really have separate per-worker stacks, rather - // than use locking of a common pair of stacks. - MutexLocker ml(ParGCRareEvent_lock); - preserve_mark(obj, m); - } -} - // Multiple GC threads may try to promote an object. If the object // is successfully promoted, a forwarding pointer will be installed in // the object in the young generation. This method claims the right @@ -1136,7 +1138,7 @@ _promotion_failed = true; new_obj = old; - preserve_mark_if_necessary(old, m); + par_scan_state->preserved_marks()->push_if_necessary(old, m); par_scan_state->register_promotion_failure(sz); } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/cms/parNewGeneration.hpp --- a/hotspot/src/share/vm/gc/cms/parNewGeneration.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/cms/parNewGeneration.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -30,6 +30,7 @@ #include "gc/shared/copyFailedInfo.hpp" #include "gc/shared/gcTrace.hpp" #include "gc/shared/plab.hpp" +#include "gc/shared/preservedMarks.hpp" #include "gc/shared/taskqueue.hpp" #include "memory/padded.hpp" @@ -65,6 +66,7 @@ private: ObjToScanQueue *_work_queue; Stack* const _overflow_stack; + PreservedMarks* const _preserved_marks; PLAB _to_space_alloc_buffer; @@ -128,6 +130,7 @@ Generation* old_gen_, int thread_num_, ObjToScanQueueSet* work_queue_set_, Stack* overflow_stacks_, + PreservedMarks* preserved_marks_, size_t desired_plab_sz_, ParallelTaskTerminator& term_); @@ -136,6 +139,8 @@ ObjToScanQueue* work_queue() { return _work_queue; } + PreservedMarks* preserved_marks() const { return _preserved_marks; } + PLAB* to_space_alloc_buffer() { return &_to_space_alloc_buffer; } @@ -331,10 +336,6 @@ static oop real_forwardee_slow(oop obj); static void waste_some_time(); - // Preserve the mark of "obj", if necessary, in preparation for its mark - // word being overwritten with a self-forwarding-pointer. - void preserve_mark_if_necessary(oop obj, markOop m); - void handle_promotion_failed(GenCollectedHeap* gch, ParScanThreadStateSet& thread_state_set); protected: diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/concurrentG1RefineThread.cpp --- a/hotspot/src/share/vm/gc/g1/concurrentG1RefineThread.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/concurrentG1RefineThread.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -89,8 +89,6 @@ void ConcurrentG1RefineThread::activate() { MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag); if (!is_primary()) { - log_debug(gc, refine)("G1-Refine-activated worker %d, on threshold %d, current %d", - _worker_id, _threshold, JavaThread::dirty_card_queue_set().completed_buffers_num()); set_active(true); } else { DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); @@ -102,8 +100,6 @@ void ConcurrentG1RefineThread::deactivate() { MutexLockerEx x(_monitor, Mutex::_no_safepoint_check_flag); if (!is_primary()) { - log_debug(gc, refine)("G1-Refine-deactivated worker %d, off threshold %d, current %d", - _worker_id, _deactivation_threshold, JavaThread::dirty_card_queue_set().completed_buffers_num()); set_active(false); } else { DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); @@ -130,9 +126,12 @@ break; } + DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); + log_debug(gc, refine)("Activated %d, on threshold: %d, current: %d", + _worker_id, _threshold, dcqs.completed_buffers_num()); + { SuspendibleThreadSetJoiner sts_join; - DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set(); do { int curr_buffer_num = (int)dcqs.completed_buffers_num(); @@ -142,24 +141,19 @@ dcqs.set_completed_queue_padding(0); } - if (!is_primary() && curr_buffer_num <= _deactivation_threshold) { - // If the number of the buffer has fallen below our threshold - // we should deactivate. The predecessor will reactivate this - // thread should the number of the buffers cross the threshold again. - deactivate(); - break; - } - // Check if we need to activate the next thread. if (_next != NULL && !_next->is_active() && curr_buffer_num > _next->_threshold) { _next->activate(); } - } while (dcqs.apply_closure_to_completed_buffer(_refine_closure, _worker_id + _worker_id_offset, cg1r()->green_zone())); + } while (dcqs.apply_closure_to_completed_buffer(_refine_closure, + _worker_id + _worker_id_offset, + _deactivation_threshold, + false /* during_pause */)); - // We can exit the loop above while being active if there was a yield request. - if (is_active()) { - deactivate(); - } + deactivate(); + log_debug(gc, refine)("Deactivated %d, off threshold: %d, current: %d", + _worker_id, _deactivation_threshold, + dcqs.completed_buffers_num()); } if (os::supports_vtime()) { @@ -169,7 +163,7 @@ } } - log_debug(gc, refine)("G1-Refine-stop"); + log_debug(gc, refine)("Stopping %d", _worker_id); } void ConcurrentG1RefineThread::stop() { diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp --- a/hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, 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 @@ -228,37 +228,30 @@ return nd; } -bool DirtyCardQueueSet::apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl, - uint worker_i, - BufferNode* nd) { - if (nd != NULL) { - void **buf = BufferNode::make_buffer_from_node(nd); - size_t index = nd->index(); - bool b = - DirtyCardQueue::apply_closure_to_buffer(cl, buf, - index, _sz, - true, worker_i); - if (b) { - deallocate_buffer(buf); - return true; // In normal case, go on to next buffer. - } else { - enqueue_complete_buffer(buf, index); - return false; - } - } else { - return false; - } -} - bool DirtyCardQueueSet::apply_closure_to_completed_buffer(CardTableEntryClosure* cl, uint worker_i, int stop_at, bool during_pause) { assert(!during_pause || stop_at == 0, "Should not leave any completed buffers during a pause"); BufferNode* nd = get_completed_buffer(stop_at); - bool res = apply_closure_to_completed_buffer_helper(cl, worker_i, nd); - if (res) Atomic::inc(&_processed_buffers_rs_thread); - return res; + if (nd == NULL) { + return false; + } else { + void** buf = BufferNode::make_buffer_from_node(nd); + size_t index = nd->index(); + if (DirtyCardQueue::apply_closure_to_buffer(cl, + buf, index, _sz, + true, worker_i)) { + // Done with fully processed buffer. + deallocate_buffer(buf); + Atomic::inc(&_processed_buffers_rs_thread); + return true; + } else { + // Return partially processed buffer to the queue. + enqueue_complete_buffer(buf, index); + return false; + } + } } void DirtyCardQueueSet::apply_closure_to_all_completed_buffers(CardTableEntryClosure* cl) { diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp --- a/hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, 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,14 +133,9 @@ // partially completed buffer (with its processed elements set to NULL) // is returned to the completed buffer set, and this call returns false. bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl, - uint worker_i = 0, - int stop_at = 0, - bool during_pause = false); - - // Helper routine for the above. - bool apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl, - uint worker_i, - BufferNode* nd); + uint worker_i, + int stop_at, + bool during_pause); BufferNode* get_completed_buffer(int stop_at); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp --- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -2777,12 +2777,6 @@ } void G1CollectedHeap::print_tracing_info() const { - // We'll overload this to mean "trace GC pause statistics." - if (TraceYoungGenTime || TraceOldGenTime) { - // The "G1CollectorPolicy" is keeping track of these stats, so delegate - // to that. - g1_policy()->print_tracing_info(); - } g1_rem_set()->print_summary_info(); concurrent_mark()->print_summary_info(); g1_policy()->print_yg_surv_rate_info(); @@ -2908,7 +2902,6 @@ bool* succeeded, GCCause::Cause gc_cause) { assert_heap_not_locked_and_not_at_safepoint(); - g1_policy()->record_stop_world_start(); VM_G1IncCollectionPause op(gc_count_before, word_size, false, /* should_initiate_conc_mark */ @@ -3242,10 +3235,6 @@ GCTraceCPUTime tcpu; - uint active_workers = AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), - workers()->active_workers(), - Threads::number_of_non_daemon_threads()); - workers()->set_active_workers(active_workers); FormatBuffer<> gc_string("Pause "); if (collector_state()->during_initial_mark_pause()) { gc_string.append("Initial Mark"); @@ -3256,6 +3245,11 @@ } GCTraceTime(Info, gc) tm(gc_string, NULL, gc_cause(), true); + uint active_workers = AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(), + workers()->active_workers(), + Threads::number_of_non_daemon_threads()); + workers()->set_active_workers(active_workers); + g1_policy()->note_gc_start(active_workers); TraceCollectorStats tcs(g1mm()->incremental_collection_counters()); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp --- a/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -81,10 +81,8 @@ G1CollectorPolicy::G1CollectorPolicy() : _predictor(G1ConfidencePercent / 100.0), - _parallel_gc_threads(ParallelGCThreads), _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), - _stop_world_start(0.0), _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)), @@ -129,7 +127,6 @@ _inc_cset_head(NULL), _inc_cset_tail(NULL), _inc_cset_bytes_used_before(0), - _inc_cset_max_finger(NULL), _inc_cset_recorded_rs_lengths(0), _inc_cset_recorded_rs_lengths_diffs(0), _inc_cset_predicted_elapsed_time_ms(0.0), @@ -172,9 +169,9 @@ _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0; clear_ratio_check_data(); - _phase_times = new G1GCPhaseTimes(_parallel_gc_threads); + _phase_times = new G1GCPhaseTimes(ParallelGCThreads); - int index = MIN2(_parallel_gc_threads - 1, 7); + int index = MIN2(ParallelGCThreads - 1, 7u); _rs_length_diff_seq->add(rs_length_diff_defaults[index]); _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]); @@ -872,8 +869,6 @@ double full_gc_time_sec = end_sec - _full_collection_start_sec; double full_gc_time_ms = full_gc_time_sec * 1000.0; - _trace_old_gen_time_data.record_full_collection(full_gc_time_ms); - update_recent_gc_times(end_sec, full_gc_time_ms); collector_state()->set_full_collection(false); @@ -904,10 +899,6 @@ record_pause(FullGC, _full_collection_start_sec, end_sec); } -void G1CollectorPolicy::record_stop_world_start() { - _stop_world_start = os::elapsedTime(); -} - void G1CollectorPolicy::record_collection_pause_start(double start_time_sec) { // We only need to do this here as the policy will only be applied // to the GC we're about to start. so, no point is calculating this @@ -918,10 +909,6 @@ "sanity, used: " SIZE_FORMAT " recalculate_used: " SIZE_FORMAT, _g1->used(), _g1->recalculate_used()); - double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0; - _trace_young_gen_time_data.record_start_collection(s_w_t_ms); - _stop_world_start = 0.0; - phase_times()->record_cur_collection_start_sec(start_time_sec); _pending_cards = _g1->pending_card_num(); @@ -973,13 +960,6 @@ collector_state()->set_in_marking_window(false); } -void G1CollectorPolicy::record_concurrent_pause() { - if (_stop_world_start > 0.0) { - double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0; - _trace_young_gen_time_data.record_yield_time(yield_ms); - } -} - double G1CollectorPolicy::average_time_ms(G1GCPhaseTimes::GCParPhases phase) const { return phase_times()->average_time_ms(phase); } @@ -1064,7 +1044,6 @@ } if (update_stats) { - _trace_young_gen_time_data.record_end_collection(pause_time_ms, phase_times()); // We maintain the invariant that all objects allocated by mutator // threads will be allocated out of eden regions. So, we can use // the eden region number allocated since the previous GC to @@ -1654,11 +1633,6 @@ return expand_bytes; } -void G1CollectorPolicy::print_tracing_info() const { - _trace_young_gen_time_data.print(); - _trace_old_gen_time_data.print(); -} - void G1CollectorPolicy::print_yg_surv_rate_info() const { #ifndef PRODUCT _short_lived_surv_rate_group->print_surv_rate_summary(); @@ -1869,7 +1843,6 @@ _inc_cset_tail = NULL; _inc_cset_bytes_used_before = 0; - _inc_cset_max_finger = 0; _inc_cset_recorded_rs_lengths = 0; _inc_cset_recorded_rs_lengths_diffs = 0; _inc_cset_predicted_elapsed_time_ms = 0.0; @@ -1981,9 +1954,6 @@ size_t rs_length = hr->rem_set()->occupied(); add_to_incremental_cset_info(hr, rs_length); - HeapWord* hr_end = hr->end(); - _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end); - assert(!hr->in_collection_set(), "invariant"); _g1->register_young_region_with_cset(hr); assert(hr->next_in_collection_set() == NULL, "invariant"); @@ -2190,12 +2160,6 @@ collector_state()->set_last_gc_was_young(collector_state()->gcs_are_young()); - if (collector_state()->last_gc_was_young()) { - _trace_young_gen_time_data.increment_young_collection_count(); - } else { - _trace_young_gen_time_data.increment_mixed_collection_count(); - } - // The young list is laid with the survivor regions from the previous // pause are appended to the RHS of the young list, i.e. // [Newly Young Regions ++ Survivors from last pause]. @@ -2335,127 +2299,3 @@ double non_young_end_time_sec = os::elapsedTime(); phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0); } - -void TraceYoungGenTimeData::record_start_collection(double time_to_stop_the_world_ms) { - if(TraceYoungGenTime) { - _all_stop_world_times_ms.add(time_to_stop_the_world_ms); - } -} - -void TraceYoungGenTimeData::record_yield_time(double yield_time_ms) { - if(TraceYoungGenTime) { - _all_yield_times_ms.add(yield_time_ms); - } -} - -void TraceYoungGenTimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) { - if(TraceYoungGenTime) { - _total.add(pause_time_ms); - _other.add(pause_time_ms - phase_times->accounted_time_ms()); - _root_region_scan_wait.add(phase_times->root_region_scan_wait_time_ms()); - _parallel.add(phase_times->cur_collection_par_time_ms()); - _ext_root_scan.add(phase_times->average_time_ms(G1GCPhaseTimes::ExtRootScan)); - _satb_filtering.add(phase_times->average_time_ms(G1GCPhaseTimes::SATBFiltering)); - _update_rs.add(phase_times->average_time_ms(G1GCPhaseTimes::UpdateRS)); - _scan_rs.add(phase_times->average_time_ms(G1GCPhaseTimes::ScanRS)); - _obj_copy.add(phase_times->average_time_ms(G1GCPhaseTimes::ObjCopy)); - _termination.add(phase_times->average_time_ms(G1GCPhaseTimes::Termination)); - - double parallel_known_time = phase_times->average_time_ms(G1GCPhaseTimes::ExtRootScan) + - phase_times->average_time_ms(G1GCPhaseTimes::SATBFiltering) + - phase_times->average_time_ms(G1GCPhaseTimes::UpdateRS) + - phase_times->average_time_ms(G1GCPhaseTimes::ScanRS) + - phase_times->average_time_ms(G1GCPhaseTimes::ObjCopy) + - phase_times->average_time_ms(G1GCPhaseTimes::Termination); - - double parallel_other_time = phase_times->cur_collection_par_time_ms() - parallel_known_time; - _parallel_other.add(parallel_other_time); - _clear_ct.add(phase_times->cur_clear_ct_time_ms()); - } -} - -void TraceYoungGenTimeData::increment_young_collection_count() { - if(TraceYoungGenTime) { - ++_young_pause_num; - } -} - -void TraceYoungGenTimeData::increment_mixed_collection_count() { - if(TraceYoungGenTime) { - ++_mixed_pause_num; - } -} - -void TraceYoungGenTimeData::print_summary(const char* str, - const NumberSeq* seq) const { - double sum = seq->sum(); - tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)", - str, sum / 1000.0, seq->avg()); -} - -void TraceYoungGenTimeData::print_summary_sd(const char* str, - const NumberSeq* seq) const { - print_summary(str, seq); - tty->print_cr("%45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)", - "(num", seq->num(), seq->sd(), seq->maximum()); -} - -void TraceYoungGenTimeData::print() const { - if (!TraceYoungGenTime) { - return; - } - - tty->print_cr("ALL PAUSES"); - print_summary_sd(" Total", &_total); - tty->cr(); - tty->cr(); - tty->print_cr(" Young GC Pauses: %8d", _young_pause_num); - tty->print_cr(" Mixed GC Pauses: %8d", _mixed_pause_num); - tty->cr(); - - tty->print_cr("EVACUATION PAUSES"); - - if (_young_pause_num == 0 && _mixed_pause_num == 0) { - tty->print_cr("none"); - } else { - print_summary_sd(" Evacuation Pauses", &_total); - print_summary(" Root Region Scan Wait", &_root_region_scan_wait); - print_summary(" Parallel Time", &_parallel); - print_summary(" Ext Root Scanning", &_ext_root_scan); - print_summary(" SATB Filtering", &_satb_filtering); - print_summary(" Update RS", &_update_rs); - print_summary(" Scan RS", &_scan_rs); - print_summary(" Object Copy", &_obj_copy); - print_summary(" Termination", &_termination); - print_summary(" Parallel Other", &_parallel_other); - print_summary(" Clear CT", &_clear_ct); - print_summary(" Other", &_other); - } - tty->cr(); - - tty->print_cr("MISC"); - print_summary_sd(" Stop World", &_all_stop_world_times_ms); - print_summary_sd(" Yields", &_all_yield_times_ms); -} - -void TraceOldGenTimeData::record_full_collection(double full_gc_time_ms) { - if (TraceOldGenTime) { - _all_full_gc_times.add(full_gc_time_ms); - } -} - -void TraceOldGenTimeData::print() const { - if (!TraceOldGenTime) { - return; - } - - if (_all_full_gc_times.num() > 0) { - tty->print("\n%4d full_gcs: total time = %8.2f s", - _all_full_gc_times.num(), - _all_full_gc_times.sum() / 1000.0); - tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times.avg()); - tty->print_cr(" [std. dev = %8.2f ms, max = %8.2f ms]", - _all_full_gc_times.sd(), - _all_full_gc_times.maximum()); - } -} diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp --- a/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -45,52 +45,6 @@ class G1IHOPControl; class G1YoungGenSizer; -// TraceYoungGenTime collects data on _both_ young and mixed evacuation pauses -// (the latter may contain non-young regions - i.e. regions that are -// technically in old) while TraceOldGenTime collects data about full GCs. -class TraceYoungGenTimeData : public CHeapObj { - private: - unsigned _young_pause_num; - unsigned _mixed_pause_num; - - NumberSeq _all_stop_world_times_ms; - NumberSeq _all_yield_times_ms; - - NumberSeq _total; - NumberSeq _other; - NumberSeq _root_region_scan_wait; - NumberSeq _parallel; - NumberSeq _ext_root_scan; - NumberSeq _satb_filtering; - NumberSeq _update_rs; - NumberSeq _scan_rs; - NumberSeq _obj_copy; - NumberSeq _termination; - NumberSeq _parallel_other; - NumberSeq _clear_ct; - - void print_summary(const char* str, const NumberSeq* seq) const; - void print_summary_sd(const char* str, const NumberSeq* seq) const; - -public: - TraceYoungGenTimeData() : _young_pause_num(0), _mixed_pause_num(0) {}; - void record_start_collection(double time_to_stop_the_world_ms); - void record_yield_time(double yield_time_ms); - void record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times); - void increment_young_collection_count(); - void increment_mixed_collection_count(); - void print() const; -}; - -class TraceOldGenTimeData : public CHeapObj { - private: - NumberSeq _all_full_gc_times; - - public: - void record_full_collection(double full_gc_time_ms); - void print() const; -}; - class G1CollectorPolicy: public CollectorPolicy { private: G1IHOPControl* _ihop_control; @@ -107,13 +61,6 @@ double get_new_prediction(TruncatedSeq const* seq) const; size_t get_new_size_prediction(TruncatedSeq const* seq) const; - // either equal to the number of parallel threads, if ParallelGCThreads - // has been set, or 1 otherwise - int _parallel_gc_threads; - - // The number of GC threads currently active. - uintx _no_of_gc_threads; - G1MMUTracker* _mmu_tracker; void initialize_alignments(); @@ -134,11 +81,6 @@ double _ratio_over_threshold_sum; uint _pauses_since_start; - TraceYoungGenTimeData _trace_young_gen_time_data; - TraceOldGenTimeData _trace_old_gen_time_data; - - double _stop_world_start; - uint _young_list_target_length; uint _young_list_fixed_length; @@ -212,9 +154,6 @@ double update_rs_processed_buffers, double goal_ms); - uintx no_of_gc_threads() { return _no_of_gc_threads; } - void set_no_of_gc_threads(uintx v) { _no_of_gc_threads = v; } - double _pause_time_target_ms; size_t _pending_cards; @@ -389,9 +328,6 @@ // an evacuation pause. size_t _inc_cset_bytes_used_before; - // Used to record the highest end of heap region in collection set - HeapWord* _inc_cset_max_finger; - // The RSet lengths recorded for regions in the CSet. It is updated // by the thread that adds a new region to the CSet. We assume that // only one thread can be allocating a new CSet region (currently, @@ -573,9 +509,6 @@ virtual void print_phases(); - void record_stop_world_start(); - void record_concurrent_pause(); - // Record how much space we copied during a GC. This is typically // called when a GC alloc region is being retired. void record_bytes_copied_during_gc(size_t bytes) { @@ -685,9 +618,6 @@ // Clear ratio tracking data used by expansion_amount(). void clear_ratio_check_data(); - // Print tracing information. - void print_tracing_info() const; - // Print stats on young survival ratio void print_yg_surv_rate_info() const; diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp --- a/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/g1ConcurrentMark.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -2662,9 +2662,6 @@ // We take a break if someone is trying to stop the world. bool G1ConcurrentMark::do_yield_check(uint worker_id) { if (SuspendibleThreadSet::should_yield()) { - if (worker_id == 0) { - _g1h->g1_policy()->record_concurrent_pause(); - } SuspendibleThreadSet::yield(); return true; } else { diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/g1/g1EvacFailure.hpp --- a/hotspot/src/share/vm/gc/g1/g1EvacFailure.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/g1/g1EvacFailure.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -27,25 +27,12 @@ #include "gc/g1/g1OopClosures.hpp" #include "gc/g1/heapRegionManager.hpp" + #include "gc/shared/preservedMarks.hpp" #include "gc/shared/workgroup.hpp" #include "utilities/globalDefinitions.hpp" class G1CollectedHeap; -class OopAndMarkOop { - oop _o; - markOop _m; - public: - OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { - } - - void set_mark() { - _o->set_mark(_m); - } -}; - -typedef Stack OopAndMarkOopStack; - // Task to fixup self-forwarding pointers // installed as a result of an evacuation failure. class G1ParRemoveSelfForwardPtrsTask: public AbstractGangTask { diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/serial/defNewGeneration.cpp --- a/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -36,6 +36,7 @@ #include "gc/shared/genCollectedHeap.hpp" #include "gc/shared/genOopClosures.inline.hpp" #include "gc/shared/generationSpec.hpp" +#include "gc/shared/preservedMarks.inline.hpp" #include "gc/shared/referencePolicy.hpp" #include "gc/shared/space.inline.hpp" #include "gc/shared/spaceDecorator.hpp" @@ -184,6 +185,7 @@ size_t initial_size, const char* policy) : Generation(rs, initial_size), + _preserved_marks_set(false /* in_c_heap */), _promo_failure_drain_in_progress(false), _should_allocate_from_space(false) { @@ -602,6 +604,8 @@ age_table()->clear(); to()->clear(SpaceDecorator::Mangle); + // The preserved marks should be empty at the start of the GC. + _preserved_marks_set.init(1); gch->rem_set()->prepare_for_younger_refs_iterate(false); @@ -704,6 +708,8 @@ // Reset the PromotionFailureALot counters. NOT_PRODUCT(gch->reset_promotion_should_fail();) } + // We should have processed and cleared all the preserved marks. + _preserved_marks_set.reclaim(); // set new iteration safe limit for the survivor spaces from()->set_concurrent_iteration_safe_limit(from()->top()); to()->set_concurrent_iteration_safe_limit(to()->top()); @@ -721,13 +727,6 @@ gc_tracer.report_gc_end(_gc_timer->gc_end(), _gc_timer->time_partitions()); } -class RemoveForwardPointerClosure: public ObjectClosure { -public: - void do_object(oop obj) { - obj->init_mark(); - } -}; - void DefNewGeneration::init_assuming_no_promotion_failure() { _promotion_failed = false; _promotion_failed_info.reset(); @@ -735,33 +734,12 @@ } void DefNewGeneration::remove_forwarding_pointers() { - RemoveForwardPointerClosure rspc; + RemoveForwardedPointerClosure rspc; eden()->object_iterate(&rspc); from()->object_iterate(&rspc); // Now restore saved marks, if any. - assert(_objs_with_preserved_marks.size() == _preserved_marks_of_objs.size(), - "should be the same"); - while (!_objs_with_preserved_marks.is_empty()) { - oop obj = _objs_with_preserved_marks.pop(); - markOop m = _preserved_marks_of_objs.pop(); - obj->set_mark(m); - } - _objs_with_preserved_marks.clear(true); - _preserved_marks_of_objs.clear(true); -} - -void DefNewGeneration::preserve_mark(oop obj, markOop m) { - assert(_promotion_failed && m->must_be_preserved_for_promotion_failure(obj), - "Oversaving!"); - _objs_with_preserved_marks.push(obj); - _preserved_marks_of_objs.push(m); -} - -void DefNewGeneration::preserve_mark_if_necessary(oop obj, markOop m) { - if (m->must_be_preserved_for_promotion_failure(obj)) { - preserve_mark(obj, m); - } + _preserved_marks_set.restore(); } void DefNewGeneration::handle_promotion_failure(oop old) { @@ -769,7 +747,7 @@ _promotion_failed = true; _promotion_failed_info.register_copy_failure(old->size()); - preserve_mark_if_necessary(old, old->mark()); + _preserved_marks_set.get()->push_if_necessary(old, old->mark()); // forward to self old->forward_to(old); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/serial/defNewGeneration.hpp --- a/hotspot/src/share/vm/gc/serial/defNewGeneration.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -30,6 +30,7 @@ #include "gc/shared/copyFailedInfo.hpp" #include "gc/shared/generation.hpp" #include "gc/shared/generationCounters.hpp" +#include "gc/shared/preservedMarks.hpp" #include "utilities/stack.hpp" class ContiguousSpace; @@ -87,15 +88,8 @@ // therefore we must remove their forwarding pointers. void remove_forwarding_pointers(); - // Preserve the mark of "obj", if necessary, in preparation for its mark - // word being overwritten with a self-forwarding-pointer. - void preserve_mark_if_necessary(oop obj, markOop m); - void preserve_mark(oop obj, markOop m); // work routine used by the above - - // Together, these keep pairs. - // They should always contain the same number of elements. - Stack _objs_with_preserved_marks; - Stack _preserved_marks_of_objs; + // Preserved marks + PreservedMarksSet _preserved_marks_set; // Promotion failure handling ExtendedOopClosure *_promo_failure_scan_stack_closure; diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/shared/preservedMarks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/gc/shared/preservedMarks.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2016, 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. + * + */ + +#include "precompiled.hpp" +#include "gc/shared/preservedMarks.inline.hpp" +#include "memory/allocation.inline.hpp" +#include "oops/oop.inline.hpp" + +void PreservedMarks::restore() { + // First, iterate over the stack and restore all marks. + StackIterator iter(_stack); + while (!iter.is_empty()) { + OopAndMarkOop elem = iter.next(); + elem.set_mark(); + } + + // Second, reclaim all the stack memory + _stack.clear(true /* clear_cache */); +} + +void RemoveForwardedPointerClosure::do_object(oop obj) { + if (obj->is_forwarded()) { + obj->init_mark(); + } +} + +void PreservedMarksSet::init(uint num) { + assert(_stacks == NULL && _num == 0, "do not re-initialize"); + assert(num > 0, "pre-condition"); + if (_in_c_heap) { + _stacks = NEW_C_HEAP_ARRAY(Padded, num, mtGC); + } else { + _stacks = NEW_RESOURCE_ARRAY(Padded, num); + } + for (uint i = 0; i < num; i += 1) { + ::new (_stacks + i) PreservedMarks(); + } + _num = num; + + assert_empty(); +} + +void PreservedMarksSet::restore() { + for (uint i = 0; i < _num; i += 1) { + get(i)->restore(); + } +} + +void PreservedMarksSet::reclaim() { + assert_empty(); + + for (uint i = 0; i < _num; i += 1) { + _stacks[i].~Padded(); + } + + if (_in_c_heap) { + FREE_C_HEAP_ARRAY(Padded, _stacks); + } else { + // the array was resource-allocated, so nothing to do + } + _stacks = NULL; + _num = 0; +} + +#ifndef PRODUCT +void PreservedMarksSet::assert_empty() { + assert(_stacks != NULL && _num > 0, "should have been initialized"); + for (uint i = 0; i < _num; i += 1) { + assert(get(i)->is_empty(), "stack should be empty"); + } +} +#endif // ndef PRODUCT diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/shared/preservedMarks.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/gc/shared/preservedMarks.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2016, 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. + * + */ + +#ifndef SHARE_VM_GC_SHARED_PRESERVEDMARKS_HPP +#define SHARE_VM_GC_SHARED_PRESERVEDMARKS_HPP + +#include "memory/allocation.hpp" +#include "memory/padded.hpp" +#include "oops/oop.hpp" +#include "utilities/stack.hpp" + +class OopAndMarkOop { +private: + oop _o; + markOop _m; + +public: + OopAndMarkOop(oop obj, markOop m) : _o(obj), _m(m) { } + + void set_mark() const { + _o->set_mark(_m); + } +}; +typedef Stack OopAndMarkOopStack; + +class PreservedMarks VALUE_OBJ_CLASS_SPEC { +private: + OopAndMarkOopStack _stack; + + inline bool should_preserve_mark(oop obj, markOop m) const; + inline void push(oop obj, markOop m); + +public: + bool is_empty() const { return _stack.is_empty(); } + inline void push_if_necessary(oop obj, markOop m); + // Iterate over the stack, restore the preserved marks, then reclaim + // the memory taken up by stack chunks. + void restore(); + ~PreservedMarks() { assert(is_empty(), "should have been cleared"); } +}; + +class RemoveForwardedPointerClosure: public ObjectClosure { +public: + virtual void do_object(oop obj); +}; + +class PreservedMarksSet VALUE_OBJ_CLASS_SPEC { +private: + // true -> _stacks will be allocated in the C heap + // false -> _stacks will be allocated in the resource arena + const bool _in_c_heap; + + // Number of stacks we have allocated (typically, one stack per GC worker). + // This should be >= 1 if the stacks have been initialized, + // or == 0 if they have not. + uint _num; + + // Stack array (typically, one stack per GC worker) of length _num. + // This should be != NULL if the stacks have been initialized, + // or == NULL if they have not. + Padded* _stacks; + +public: + // Return the i'th stack. + PreservedMarks* get(uint i = 0) const { + assert(_num > 0 && _stacks != NULL, "stacks should have been initialized"); + assert(i < _num, "pre-condition"); + return (_stacks + i); + } + + // Allocate stack array. + void init(uint num); + // Iterate over all stacks, restore all preserved marks, then + // reclaim the memory taken up by stack chunks. + void restore(); + // Reclaim stack array. + void reclaim(); + + // Assert all the stacks are empty. + void assert_empty() PRODUCT_RETURN; + + PreservedMarksSet(bool in_c_heap) + : _in_c_heap(in_c_heap), _num(0), _stacks(NULL) { } + + ~PreservedMarksSet() { + assert(_stacks == NULL && _num == 0, "stacks should have been reclaimed"); + } +}; + +#endif // SHARE_VM_GC_SHARED_PRESERVEDMARKS_HPP diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/shared/preservedMarks.inline.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/gc/shared/preservedMarks.inline.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016, 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. + * + */ + +#include "gc/shared/preservedMarks.hpp" +#include "oops/markOop.inline.hpp" +#include "utilities/stack.inline.hpp" + +#ifndef SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP +#define SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP + +inline bool PreservedMarks::should_preserve_mark(oop obj, markOop m) const { + return m->must_be_preserved_for_promotion_failure(obj); +} + +inline void PreservedMarks::push(oop obj, markOop m) { + assert(should_preserve_mark(obj, m), "pre-condition"); + OopAndMarkOop elem(obj, m); + _stack.push(elem); +} + +inline void PreservedMarks::push_if_necessary(oop obj, markOop m) { + if (should_preserve_mark(obj, m)) { + push(obj, m); + } +} + +#endif // SHARE_VM_GC_SHARED_PRESERVEDMARKS_INLINE_HPP diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/shared/referenceProcessor.cpp --- a/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -339,7 +339,7 @@ // all linked Reference objects. Note that it is important to not dirty any // cards during reference processing since this will cause card table // verification to fail for G1. - log_develop_trace(gc, ref)("ReferenceProcessor::enqueue_discovered_reflist list " INTPTR_FORMAT, p2i(refs_list.head())); + log_develop_trace(gc, ref)("ReferenceProcessor::enqueue_discovered_reflist list " INTPTR_FORMAT, p2i(&refs_list)); oop obj = NULL; oop next_d = refs_list.head(); @@ -502,7 +502,7 @@ // Close the reachable set complete_gc->do_void(); log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " dead Refs out of " SIZE_FORMAT " discovered Refs by policy, from list " INTPTR_FORMAT, - iter.removed(), iter.processed(), p2i(refs_list.head())); + iter.removed(), iter.processed(), p2i(&refs_list)); } // Traverse the list and remove any Refs that are not active, or @@ -536,7 +536,7 @@ if (iter.processed() > 0) { log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT " Refs in discovered list " INTPTR_FORMAT, - iter.removed(), iter.processed(), p2i(refs_list.head())); + iter.removed(), iter.processed(), p2i(&refs_list)); } ) } @@ -575,7 +575,7 @@ if (iter.processed() > 0) { log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT " Refs in discovered list " INTPTR_FORMAT, - iter.removed(), iter.processed(), p2i(refs_list.head())); + iter.removed(), iter.processed(), p2i(&refs_list)); } ) } @@ -1198,7 +1198,7 @@ NOT_PRODUCT( if (iter.processed() > 0) { log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " Refs out of " SIZE_FORMAT " Refs in discovered list " INTPTR_FORMAT, - iter.removed(), iter.processed(), p2i(refs_list.head())); + iter.removed(), iter.processed(), p2i(&refs_list)); } ) } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/gc/shared/workgroup.hpp --- a/hotspot/src/share/vm/gc/shared/workgroup.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -29,6 +29,7 @@ #include "runtime/globals.hpp" #include "runtime/thread.hpp" #include "gc/shared/gcId.hpp" +#include "logging/log.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" @@ -151,6 +152,7 @@ _active_workers = MAX2(1U, _active_workers); assert(UseDynamicNumberOfGCThreads || _active_workers == _total_workers, "Unless dynamic should use total workers"); + log_info(gc, task)("GC Workers: %d", _active_workers); } // Return the Ith worker. diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/interpreter/cppInterpreter.cpp --- a/hotspot/src/share/vm/interpreter/cppInterpreter.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/interpreter/cppInterpreter.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -27,6 +27,7 @@ #include "interpreter/cppInterpreterGenerator.hpp" #include "interpreter/interpreter.hpp" #include "interpreter/interpreterRuntime.hpp" +#include "runtime/logTimer.hpp" #ifdef CC_INTERP @@ -42,7 +43,7 @@ // generate interpreter { ResourceMark rm; - TraceTime timer("Interpreter generation", TraceStartupTime); + TraceStartupTime timer("Interpreter generation"); int code_size = InterpreterCodeSize; NOT_PRODUCT(code_size *= 4;) // debug uses extra interpreter code space _code = new StubQueue(new InterpreterCodeletInterface, code_size, NULL, diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/interpreter/templateInterpreter.cpp --- a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -31,6 +31,7 @@ #include "interpreter/templateInterpreterGenerator.hpp" #include "interpreter/templateTable.hpp" #include "memory/resourceArea.hpp" +#include "runtime/logTimer.hpp" #ifndef CC_INTERP @@ -48,7 +49,7 @@ // generate interpreter { ResourceMark rm; - TraceTime timer("Interpreter generation", TraceStartupTime); + TraceStartupTime timer("Interpreter generation"); int code_size = InterpreterCodeSize; NOT_PRODUCT(code_size *= 4;) // debug uses extra interpreter code space #if INCLUDE_JVMTI diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/interpreter/templateTable.cpp --- a/hotspot/src/share/vm/interpreter/templateTable.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/interpreter/templateTable.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -26,8 +26,7 @@ #include "gc/shared/collectedHeap.hpp" #include "interpreter/interp_masm.hpp" #include "interpreter/templateTable.hpp" -#include "runtime/timer.hpp" - +#include "runtime/logTimer.hpp" #ifdef CC_INTERP @@ -246,7 +245,7 @@ if (_is_initialized) return; // Initialize table - TraceTime timer("TemplateTable initialization", TraceStartupTime); + TraceStartupTime timer("TemplateTable initialization"); _bs = Universe::heap()->barrier_set(); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/logging/logConfiguration.cpp --- a/hotspot/src/share/vm/logging/logConfiguration.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/logging/logConfiguration.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -82,8 +82,7 @@ void LogConfiguration::initialize(jlong vm_start_time) { LogFileOutput::set_file_name_parameters(vm_start_time); - LogDecorations::set_vm_start_time_millis(vm_start_time); - + LogDecorations::initialize(vm_start_time); assert(_outputs == NULL, "Should not initialize _outputs before this function, initialize called twice?"); _outputs = NEW_C_HEAP_ARRAY(LogOutput*, 2, mtLogging); _outputs[0] = LogOutput::Stdout; diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/logging/logDecorations.cpp --- a/hotspot/src/share/vm/logging/logDecorations.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/logging/logDecorations.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -29,12 +29,21 @@ #include "services/management.hpp" jlong LogDecorations::_vm_start_time_millis = 0; +const char* LogDecorations::_host_name = ""; LogDecorations::LogDecorations(LogLevelType level, const LogTagSet &tagset, const LogDecorators &decorators) : _level(level), _tagset(tagset), _millis(-1) { create_decorations(decorators); } +void LogDecorations::initialize(jlong vm_start_time) { + char buffer[1024]; + if (os::get_host_name(buffer, sizeof(buffer))){ + _host_name = os::strdup_check_oom(buffer); + } + _vm_start_time_millis = vm_start_time; +} + void LogDecorations::create_decorations(const LogDecorators &decorators) { char* position = _decorations_buffer; #define DECORATOR(full_name, abbr) \ @@ -109,3 +118,9 @@ int written = _tagset.label(pos, DecorationsBufferSize - (pos - _decorations_buffer)); ASSERT_AND_RETURN(written, pos) } + +char* LogDecorations::create_hostname_decoration(char* pos) { + int written = jio_snprintf(pos, DecorationsBufferSize - (pos - _decorations_buffer), "%s", _host_name); + ASSERT_AND_RETURN(written, pos) +} + diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/logging/logDecorations.hpp --- a/hotspot/src/share/vm/logging/logDecorations.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/logging/logDecorations.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -39,6 +39,7 @@ LogTagSet _tagset; jlong _millis; static jlong _vm_start_time_millis; + static const char* _host_name; jlong java_millis(); void create_decorations(const LogDecorators& decorators); @@ -48,15 +49,13 @@ #undef DECORATOR public: + static void initialize(jlong vm_start_time); + LogDecorations(LogLevelType level, const LogTagSet& tagset, const LogDecorators& decorators); const char* decoration(LogDecorators::Decorator decorator) const { return _decoration_offset[decorator]; } - - static void set_vm_start_time_millis(jlong start_time) { - _vm_start_time_millis = start_time; - } }; #endif // SHARE_VM_LOGGING_LOGDECORATIONS_HPP diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/logging/logDecorators.hpp --- a/hotspot/src/share/vm/logging/logDecorators.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/logging/logDecorators.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +34,7 @@ // uptimemillis - Milliseconds since the JVM started // timenanos - The same value as generated by System.nanoTime() // uptimenanos - Nanoseconds since the JVM started +// hostname - The hostname // pid - The process identifier // tid - The thread identifier // level - The level associated with the log message @@ -45,6 +46,7 @@ DECORATOR(uptimemillis, um) \ DECORATOR(timenanos, tn) \ DECORATOR(uptimenanos, un) \ + DECORATOR(hostname, hn) \ DECORATOR(pid, p) \ DECORATOR(tid, ti) \ DECORATOR(level, l) \ diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/logging/logTag.hpp --- a/hotspot/src/share/vm/logging/logTag.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/logging/logTag.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +34,7 @@ LOG_TAG(alloc) \ LOG_TAG(age) \ LOG_TAG(barrier) \ + LOG_TAG(biasedlocking) \ LOG_TAG(bot) \ LOG_TAG(census) \ LOG_TAG(classhisto) \ @@ -73,6 +74,7 @@ LOG_TAG(scavenge) \ LOG_TAG(scrub) \ LOG_TAG(start) \ + LOG_TAG(startuptime) \ LOG_TAG(state) \ LOG_TAG(stats) \ LOG_TAG(stringdedup) \ diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/memory/metaspace.cpp --- a/hotspot/src/share/vm/memory/metaspace.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/memory/metaspace.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -791,7 +791,6 @@ void VirtualSpaceNode::inc_container_count() { assert_lock_strong(SpaceManager::expand_lock()); _container_count++; - DEBUG_ONLY(verify_container_count();) } void VirtualSpaceNode::dec_container_count() { @@ -1073,6 +1072,7 @@ VirtualSpaceNode* next_vsl = prev_vsl; while (next_vsl != NULL) { VirtualSpaceNode* vsl = next_vsl; + DEBUG_ONLY(vsl->verify_container_count();) next_vsl = vsl->next(); // Don't free the current virtual space since it will likely // be needed soon. @@ -1137,19 +1137,19 @@ } void VirtualSpaceNode::retire(ChunkManager* chunk_manager) { + DEBUG_ONLY(verify_container_count();) for (int i = (int)MediumIndex; i >= (int)ZeroIndex; --i) { ChunkIndex index = (ChunkIndex)i; size_t chunk_size = chunk_manager->free_chunks(index)->size(); while (free_words_in_vs() >= chunk_size) { - DEBUG_ONLY(verify_container_count();) Metachunk* chunk = get_chunk_vs(chunk_size); assert(chunk != NULL, "allocation should have been successful"); chunk_manager->return_chunks(index, chunk); chunk_manager->inc_free_chunks_total(chunk_size); - DEBUG_ONLY(verify_container_count();) } + DEBUG_ONLY(verify_container_count();) } assert(free_words_in_vs() == 0, "should be empty now"); } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/memory/metaspaceShared.cpp --- a/hotspot/src/share/vm/memory/metaspaceShared.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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 @@ -40,6 +40,7 @@ #include "memory/metaspaceShared.hpp" #include "oops/objArrayOop.hpp" #include "oops/oop.inline.hpp" +#include "runtime/logTimer.hpp" #include "runtime/os.hpp" #include "runtime/signature.hpp" #include "runtime/vmThread.hpp" @@ -771,88 +772,89 @@ // Preload classes from a list, populate the shared spaces and dump to a // file. void MetaspaceShared::preload_and_dump(TRAPS) { - TraceTime timer("Dump Shared Spaces", TraceStartupTime); - ResourceMark rm; - char class_list_path_str[JVM_MAXPATHLEN]; + { TraceStartupTime timer("Dump Shared Spaces"); + ResourceMark rm; + char class_list_path_str[JVM_MAXPATHLEN]; - tty->print_cr("Allocated shared space: " SIZE_FORMAT " bytes at " PTR_FORMAT, - MetaspaceShared::shared_rs()->size(), - p2i(MetaspaceShared::shared_rs()->base())); + tty->print_cr("Allocated shared space: " SIZE_FORMAT " bytes at " PTR_FORMAT, + MetaspaceShared::shared_rs()->size(), + p2i(MetaspaceShared::shared_rs()->base())); - // Preload classes to be shared. - // Should use some os:: method rather than fopen() here. aB. - const char* class_list_path; - if (SharedClassListFile == NULL) { - // Construct the path to the class list (in jre/lib) - // Walk up two directories from the location of the VM and - // optionally tack on "lib" (depending on platform) - os::jvm_path(class_list_path_str, sizeof(class_list_path_str)); - for (int i = 0; i < 3; i++) { - char *end = strrchr(class_list_path_str, *os::file_separator()); - if (end != NULL) *end = '\0'; - } - int class_list_path_len = (int)strlen(class_list_path_str); - if (class_list_path_len >= 3) { - if (strcmp(class_list_path_str + class_list_path_len - 3, "lib") != 0) { - if (class_list_path_len < JVM_MAXPATHLEN - 4) { - jio_snprintf(class_list_path_str + class_list_path_len, - sizeof(class_list_path_str) - class_list_path_len, - "%slib", os::file_separator()); - class_list_path_len += 4; + // Preload classes to be shared. + // Should use some os:: method rather than fopen() here. aB. + const char* class_list_path; + if (SharedClassListFile == NULL) { + // Construct the path to the class list (in jre/lib) + // Walk up two directories from the location of the VM and + // optionally tack on "lib" (depending on platform) + os::jvm_path(class_list_path_str, sizeof(class_list_path_str)); + for (int i = 0; i < 3; i++) { + char *end = strrchr(class_list_path_str, *os::file_separator()); + if (end != NULL) *end = '\0'; + } + int class_list_path_len = (int)strlen(class_list_path_str); + if (class_list_path_len >= 3) { + if (strcmp(class_list_path_str + class_list_path_len - 3, "lib") != 0) { + if (class_list_path_len < JVM_MAXPATHLEN - 4) { + jio_snprintf(class_list_path_str + class_list_path_len, + sizeof(class_list_path_str) - class_list_path_len, + "%slib", os::file_separator()); + class_list_path_len += 4; + } } } + if (class_list_path_len < JVM_MAXPATHLEN - 10) { + jio_snprintf(class_list_path_str + class_list_path_len, + sizeof(class_list_path_str) - class_list_path_len, + "%sclasslist", os::file_separator()); + } + class_list_path = class_list_path_str; + } else { + class_list_path = SharedClassListFile; } - if (class_list_path_len < JVM_MAXPATHLEN - 10) { - jio_snprintf(class_list_path_str + class_list_path_len, - sizeof(class_list_path_str) - class_list_path_len, - "%sclasslist", os::file_separator()); - } - class_list_path = class_list_path_str; - } else { - class_list_path = SharedClassListFile; - } + + int class_count = 0; + GrowableArray* class_promote_order = new GrowableArray(); - int class_count = 0; - GrowableArray* class_promote_order = new GrowableArray(); + // sun.io.Converters + static const char obj_array_sig[] = "[[Ljava/lang/Object;"; + SymbolTable::new_permanent_symbol(obj_array_sig, THREAD); - // sun.io.Converters - static const char obj_array_sig[] = "[[Ljava/lang/Object;"; - SymbolTable::new_permanent_symbol(obj_array_sig, THREAD); + // java.util.HashMap + static const char map_entry_array_sig[] = "[Ljava/util/Map$Entry;"; + SymbolTable::new_permanent_symbol(map_entry_array_sig, THREAD); - // java.util.HashMap - static const char map_entry_array_sig[] = "[Ljava/util/Map$Entry;"; - SymbolTable::new_permanent_symbol(map_entry_array_sig, THREAD); + // Need to allocate the op here: + // op.misc_data_space_alloc() will be called during preload_and_dump(). + ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); + VM_PopulateDumpSharedSpace op(loader_data, class_promote_order); - // Need to allocate the op here: - // op.misc_data_space_alloc() will be called during preload_and_dump(). - ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); - VM_PopulateDumpSharedSpace op(loader_data, class_promote_order); - - tty->print_cr("Loading classes to share ..."); - _has_error_classes = false; - class_count += preload_and_dump(class_list_path, class_promote_order, - THREAD); - if (ExtraSharedClassListFile) { - class_count += preload_and_dump(ExtraSharedClassListFile, class_promote_order, + tty->print_cr("Loading classes to share ..."); + _has_error_classes = false; + class_count += preload_and_dump(class_list_path, class_promote_order, THREAD); - } - tty->print_cr("Loading classes to share: done."); + if (ExtraSharedClassListFile) { + class_count += preload_and_dump(ExtraSharedClassListFile, class_promote_order, + THREAD); + } + tty->print_cr("Loading classes to share: done."); - if (PrintSharedSpaces) { - tty->print_cr("Shared spaces: preloaded %d classes", class_count); - } + if (PrintSharedSpaces) { + tty->print_cr("Shared spaces: preloaded %d classes", class_count); + } - // Rewrite and link classes - tty->print_cr("Rewriting and linking classes ..."); + // Rewrite and link classes + tty->print_cr("Rewriting and linking classes ..."); - // Link any classes which got missed. This would happen if we have loaded classes that - // were not explicitly specified in the classlist. E.g., if an interface implemented by class K - // fails verification, all other interfaces that were not specified in the classlist but - // are implemented by K are not verified. - link_and_cleanup_shared_classes(CATCH); - tty->print_cr("Rewriting and linking classes: done"); + // Link any classes which got missed. This would happen if we have loaded classes that + // were not explicitly specified in the classlist. E.g., if an interface implemented by class K + // fails verification, all other interfaces that were not specified in the classlist but + // are implemented by K are not verified. + link_and_cleanup_shared_classes(CATCH); + tty->print_cr("Rewriting and linking classes: done"); - VMThread::execute(&op); + VMThread::execute(&op); + } // Since various initialization steps have been undone by this process, // it is not reasonable to continue running a java process. exit(0); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/memory/universe.cpp --- a/hotspot/src/share/vm/memory/universe.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/memory/universe.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -64,6 +64,7 @@ #include "runtime/init.hpp" #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" +#include "runtime/logTimer.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/synchronizer.hpp" #include "runtime/thread.inline.hpp" @@ -626,7 +627,9 @@ guarantee(sizeof(oop) >= sizeof(HeapWord), "HeapWord larger than oop?"); guarantee(sizeof(oop) % sizeof(HeapWord) == 0, "oop size is not not a multiple of HeapWord size"); - TraceTime timer("Genesis", TraceStartupTime); + + TraceStartupTime timer("Genesis"); + JavaClasses::compute_hard_coded_offsets(); jint status = Universe::initialize_heap(); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/prims/jni.cpp --- a/hotspot/src/share/vm/prims/jni.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -930,13 +930,7 @@ _arguments->push_oop(Handle((oop *)l, false)); } inline void set_ap(va_list rap) { -#ifdef va_copy va_copy(_ap, rap); -#elif defined (__va_copy) - __va_copy(_ap, rap); -#else - _ap = rap; -#endif } public: diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/prims/jvmtiExport.cpp --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -2200,6 +2200,16 @@ } jint JvmtiExport::load_agent_library(AttachOperation* op, outputStream* st) { + // get agent name and options + const char* agent = op->arg(0); + const char* absParam = op->arg(1); + const char* options = op->arg(2); + + return load_agent_library(agent, absParam, options, st); +} + +jint JvmtiExport::load_agent_library(const char *agent, const char *absParam, + const char *options, outputStream* st) { char ebuf[1024]; char buffer[JVM_MAXPATHLEN]; void* library = NULL; @@ -2207,11 +2217,6 @@ const char *on_attach_symbols[] = AGENT_ONATTACH_SYMBOLS; size_t num_symbol_entries = ARRAY_SIZE(on_attach_symbols); - // get agent name and options - const char* agent = op->arg(0); - const char* absParam = op->arg(1); - const char* options = op->arg(2); - // The abs paramter should be "true" or "false" bool is_absolute_path = (absParam != NULL) && (strcmp(absParam,"true")==0); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/prims/jvmtiExport.hpp --- a/hotspot/src/share/vm/prims/jvmtiExport.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -372,6 +372,7 @@ static void transition_pending_onload_raw_monitors() NOT_JVMTI_RETURN; // attach support + static jint load_agent_library(const char *agent, const char *absParam, const char *options, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR); static jint load_agent_library(AttachOperation* op, outputStream* out) NOT_JVMTI_RETURN_(JNI_ERR); // SetNativeMethodPrefix support diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/prims/methodHandles.cpp --- a/hotspot/src/share/vm/prims/methodHandles.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/prims/methodHandles.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2016, 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 @@ -40,6 +40,7 @@ #include "prims/jvmtiRedefineClassesTrace.hpp" #include "runtime/compilationPolicy.hpp" #include "runtime/javaCalls.hpp" +#include "runtime/logTimer.hpp" #include "runtime/reflection.hpp" #include "runtime/signature.hpp" #include "runtime/stubRoutines.hpp" @@ -72,7 +73,7 @@ assert(_adapter_code == NULL, "generate only once"); ResourceMark rm; - TraceTime timer("MethodHandles adapters generation", TraceStartupTime); + TraceStartupTime timer("MethodHandles adapters generation"); _adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size); CodeBuffer code(_adapter_code); MethodHandlesAdapterGenerator g(&code); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -409,6 +409,7 @@ { "TraceClassResolution", LogLevel::Info, true, LogTag::_classresolve }, { "TraceExceptions", LogLevel::Info, true, LogTag::_exceptions }, { "TraceMonitorInflation", LogLevel::Debug, true, LogTag::_monitorinflation }, + { "TraceBiasedLocking", LogLevel::Info, true, LogTag::_biasedlocking }, { NULL, LogLevel::Off, false, LogTag::__NO_TAG } }; diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/biasedLocking.cpp --- a/hotspot/src/share/vm/runtime/biasedLocking.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -23,6 +23,8 @@ */ #include "precompiled.hpp" +#include "logging/log.hpp" +#include "memory/resourceArea.hpp" #include "oops/klass.inline.hpp" #include "oops/markOop.hpp" #include "oops/oop.inline.hpp" @@ -60,9 +62,7 @@ // Indicate that future instances should enable it as well _biased_locking_enabled = true; - if (TraceBiasedLocking) { - tty->print_cr("Biased locking enabled"); - } + log_info(biasedlocking)("Biased locking enabled"); } bool allow_nested_vm_operations() const { return false; } @@ -144,14 +144,14 @@ return info; } - static BiasedLocking::Condition revoke_bias(oop obj, bool allow_rebias, bool is_bulk, JavaThread* requesting_thread) { markOop mark = obj->mark(); if (!mark->has_bias_pattern()) { - if (TraceBiasedLocking) { + if (log_is_enabled(Info, biasedlocking)) { ResourceMark rm; - tty->print_cr(" (Skipping revocation of object of type %s because it's no longer biased)", - obj->klass()->external_name()); + log_info(biasedlocking)(" (Skipping revocation of object of type %s " + "because it's no longer biased)", + obj->klass()->external_name()); } return BiasedLocking::NOT_BIASED; } @@ -160,10 +160,29 @@ markOop biased_prototype = markOopDesc::biased_locking_prototype()->set_age(age); markOop unbiased_prototype = markOopDesc::prototype()->set_age(age); - if (TraceBiasedLocking && (Verbose || !is_bulk)) { + // Log at "info" level if not bulk, else "trace" level + if (!is_bulk) { ResourceMark rm; - tty->print_cr("Revoking bias of object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s , prototype header " INTPTR_FORMAT " , allow rebias %d , requesting thread " INTPTR_FORMAT, - p2i((void *)obj), (intptr_t) mark, obj->klass()->external_name(), (intptr_t) obj->klass()->prototype_header(), (allow_rebias ? 1 : 0), (intptr_t) requesting_thread); + log_info(biasedlocking)("Revoking bias of object " INTPTR_FORMAT " , mark " + INTPTR_FORMAT " , type %s , prototype header " INTPTR_FORMAT + " , allow rebias %d , requesting thread " INTPTR_FORMAT, + p2i((void *)obj), + (intptr_t) mark, + obj->klass()->external_name(), + (intptr_t) obj->klass()->prototype_header(), + (allow_rebias ? 1 : 0), + (intptr_t) requesting_thread); + } else { + ResourceMark rm; + log_trace(biasedlocking)("Revoking bias of object " INTPTR_FORMAT " , mark " + INTPTR_FORMAT " , type %s , prototype header " INTPTR_FORMAT + " , allow rebias %d , requesting thread " INTPTR_FORMAT, + p2i((void *)obj), + (intptr_t) mark, + obj->klass()->external_name(), + (intptr_t) obj->klass()->prototype_header(), + (allow_rebias ? 1 : 0), + (intptr_t) requesting_thread); } JavaThread* biased_thread = mark->biased_locker(); @@ -174,8 +193,11 @@ if (!allow_rebias) { obj->set_mark(unbiased_prototype); } - if (TraceBiasedLocking && (Verbose || !is_bulk)) { - tty->print_cr(" Revoked bias of anonymously-biased object"); + // Log at "info" level if not bulk, else "trace" level + if (!is_bulk) { + log_info(biasedlocking)(" Revoked bias of anonymously-biased object"); + } else { + log_trace(biasedlocking)(" Revoked bias of anonymously-biased object"); } return BiasedLocking::BIAS_REVOKED; } @@ -198,8 +220,11 @@ } else { obj->set_mark(unbiased_prototype); } - if (TraceBiasedLocking && (Verbose || !is_bulk)) { - tty->print_cr(" Revoked bias of object biased toward dead thread"); + // Log at "info" level if not bulk, else "trace" level + if (!is_bulk) { + log_info(biasedlocking)(" Revoked bias of object biased toward dead thread"); + } else { + log_trace(biasedlocking)(" Revoked bias of object biased toward dead thread"); } return BiasedLocking::BIAS_REVOKED; } @@ -214,21 +239,17 @@ for (int i = 0; i < cached_monitor_info->length(); i++) { MonitorInfo* mon_info = cached_monitor_info->at(i); if (mon_info->owner() == obj) { - if (TraceBiasedLocking && Verbose) { - tty->print_cr(" mon_info->owner (" PTR_FORMAT ") == obj (" PTR_FORMAT ")", - p2i((void *) mon_info->owner()), - p2i((void *) obj)); - } + log_trace(biasedlocking)(" mon_info->owner (" PTR_FORMAT ") == obj (" PTR_FORMAT ")", + p2i((void *) mon_info->owner()), + p2i((void *) obj)); // Assume recursive case and fix up highest lock later markOop mark = markOopDesc::encode((BasicLock*) NULL); highest_lock = mon_info->lock(); highest_lock->set_displaced_header(mark); } else { - if (TraceBiasedLocking && Verbose) { - tty->print_cr(" mon_info->owner (" PTR_FORMAT ") != obj (" PTR_FORMAT ")", - p2i((void *) mon_info->owner()), - p2i((void *) obj)); - } + log_trace(biasedlocking)(" mon_info->owner (" PTR_FORMAT ") != obj (" PTR_FORMAT ")", + p2i((void *) mon_info->owner()), + p2i((void *) obj)); } } if (highest_lock != NULL) { @@ -240,12 +261,18 @@ // ordering (e.g. ppc). obj->release_set_mark(markOopDesc::encode(highest_lock)); assert(!obj->mark()->has_bias_pattern(), "illegal mark state: stack lock used bias bit"); - if (TraceBiasedLocking && (Verbose || !is_bulk)) { - tty->print_cr(" Revoked bias of currently-locked object"); + // Log at "info" level if not bulk, else "trace" level + if (!is_bulk) { + log_info(biasedlocking)(" Revoked bias of currently-locked object"); + } else { + log_trace(biasedlocking)(" Revoked bias of currently-locked object"); } } else { - if (TraceBiasedLocking && (Verbose || !is_bulk)) { - tty->print_cr(" Revoked bias of currently-unlocked object"); + // Log at "info" level if not bulk, else "trace" level + if (!is_bulk) { + log_info(biasedlocking)(" Revoked bias of currently-unlocked object"); + } else { + log_trace(biasedlocking)(" Revoked bias of currently-unlocked object"); } if (allow_rebias) { obj->set_mark(biased_prototype); @@ -326,12 +353,12 @@ JavaThread* requesting_thread) { assert(SafepointSynchronize::is_at_safepoint(), "must be done at safepoint"); - if (TraceBiasedLocking) { - tty->print_cr("* Beginning bulk revocation (kind == %s) because of object " - INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s", - (bulk_rebias ? "rebias" : "revoke"), - p2i((void *) o), (intptr_t) o->mark(), o->klass()->external_name()); - } + log_info(biasedlocking)("* Beginning bulk revocation (kind == %s) because of object " + INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s", + (bulk_rebias ? "rebias" : "revoke"), + p2i((void *) o), + (intptr_t) o->mark(), + o->klass()->external_name()); jlong cur_time = os::javaTimeMillis(); o->klass()->set_last_biased_lock_bulk_revocation_time(cur_time); @@ -377,9 +404,9 @@ // adjust the header of the given object to revoke its bias. revoke_bias(o, attempt_rebias_of_object && klass->prototype_header()->has_bias_pattern(), true, requesting_thread); } else { - if (TraceBiasedLocking) { + if (log_is_enabled(Info, biasedlocking)) { ResourceMark rm; - tty->print_cr("* Disabling biased locking for type %s", klass->external_name()); + log_info(biasedlocking)("* Disabling biased locking for type %s", klass->external_name()); } // Disable biased locking for this data type. Not only will this @@ -407,9 +434,7 @@ revoke_bias(o, false, true, requesting_thread); } - if (TraceBiasedLocking) { - tty->print_cr("* Ending bulk revocation"); - } + log_info(biasedlocking)("* Ending bulk revocation"); BiasedLocking::Condition status_code = BiasedLocking::BIAS_REVOKED; @@ -420,9 +445,7 @@ klass->prototype_header()->bias_epoch()); o->set_mark(new_mark); status_code = BiasedLocking::BIAS_REVOKED_AND_REBIASED; - if (TraceBiasedLocking) { - tty->print_cr(" Rebiased object toward thread " INTPTR_FORMAT, (intptr_t) requesting_thread); - } + log_info(biasedlocking)(" Rebiased object toward thread " INTPTR_FORMAT, (intptr_t) requesting_thread); } assert(!o->mark()->has_bias_pattern() || @@ -485,16 +508,12 @@ virtual void doit() { if (_obj != NULL) { - if (TraceBiasedLocking) { - tty->print_cr("Revoking bias with potentially per-thread safepoint:"); - } + log_info(biasedlocking)("Revoking bias with potentially per-thread safepoint:"); _status_code = revoke_bias((*_obj)(), false, false, _requesting_thread); clean_up_cached_monitor_info(); return; } else { - if (TraceBiasedLocking) { - tty->print_cr("Revoking bias with global safepoint:"); - } + log_info(biasedlocking)("Revoking bias with global safepoint:"); BiasedLocking::revoke_at_safepoint(_objs); } } @@ -608,9 +627,7 @@ // can come in with a CAS to steal the bias of an object that has a // stale epoch. ResourceMark rm; - if (TraceBiasedLocking) { - tty->print_cr("Revoking bias by walking my own stack:"); - } + log_info(biasedlocking)("Revoking bias by walking my own stack:"); BiasedLocking::Condition cond = revoke_bias(obj(), false, false, (JavaThread*) THREAD); ((JavaThread*) THREAD)->set_cached_monitor_info(NULL); assert(cond == BIAS_REVOKED, "why not?"); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/globals.cpp --- a/hotspot/src/share/vm/runtime/globals.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/globals.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -403,25 +403,20 @@ st->cr(); } else if (!is_bool() && !is_ccstr()) { - - if (printRanges) { - - st->print("%9s %-50s ", _type, _name); + st->print("%9s %-50s ", _type, _name); - CommandLineFlagRangeList::print(_name, st, true); + CommandLineFlagRangeList::print(_name, st, true); - st->print(" %-20s", " "); - print_kind(st); + st->print(" %-20s", " "); + print_kind(st); #ifndef PRODUCT - if (withComments) { - st->print("%s", _doc); - } + if (withComments) { + st->print("%s", _doc); + } #endif - st->cr(); - - } + st->cr(); } } @@ -1255,8 +1250,6 @@ #endif // PRODUCT -#define ONLY_PRINT_PRODUCT_FLAGS - void CommandLineFlags::printFlags(outputStream* out, bool withComments, bool printRanges) { // Print the flags sorted by name // note: this method is called before the thread structure is in place @@ -1281,9 +1274,6 @@ for (size_t i = 0; i < length; i++) { if (array[i]->is_unlocked()) { -#ifdef ONLY_PRINT_PRODUCT_FLAGS - if (!array[i]->is_notproduct() && !array[i]->is_develop()) -#endif // ONLY_PRINT_PRODUCT_FLAGS array[i]->print_on(out, withComments, printRanges); } } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1482,18 +1482,12 @@ develop(bool, TraceCompiledIC, false, \ "Trace changes of compiled IC") \ \ - develop(bool, TraceStartupTime, false, \ - "Trace setup time") \ - \ develop(bool, TraceProtectionDomainVerification, false, \ "Trace protection domain verification") \ \ develop(bool, TraceClearedExceptions, false, \ "Print when an exception is forcibly cleared") \ \ - product(bool, TraceBiasedLocking, false, \ - "Trace biased locking in JVM") \ - \ /* gc */ \ \ product(bool, UseSerialGC, false, \ diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/logTimer.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/src/share/vm/runtime/logTimer.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, 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. + * + */ + +#ifndef SHARE_VM_RUNTIME_LOG_TIMER_HPP +#define SHARE_VM_RUNTIME_LOG_TIMER_HPP + +#include "logging/log.hpp" +#include "runtime/timer.hpp" + +// TraceStartupTime is used for tracing the execution time of a block with logging +// Usage: +// { TraceStartupTime t("block time") +// some_code(); +// } +// + +class TraceStartupTime : public TraceTime { + public: + TraceStartupTime(const char* s) : TraceTime(s, log_is_enabled(Info, startuptime), LogTag::_startuptime) {} +}; + +#endif // SHARE_VM_RUNTIME_LOG_TIMER_HPP diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/os.hpp --- a/hotspot/src/share/vm/runtime/os.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/os.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -152,7 +152,6 @@ static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned); // Get summary strings for system information in buffer provided - static bool get_host_name(char* buf, size_t buflen) PRODUCT_RETURN_(return false;); // true if available static void get_summary_cpu_info(char* buf, size_t buflen); static void get_summary_os_info(char* buf, size_t buflen); @@ -595,6 +594,9 @@ // Write to stream static int log_vsnprintf(char* buf, size_t len, const char* fmt, va_list args) ATTRIBUTE_PRINTF(3, 0); + // Get host name in buffer provided + static bool get_host_name(char* buf, size_t buflen); + // Print out system information; they are called by fatal error handler. // Output format may be different on different platforms. static void print_os_info(outputStream* st); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/stubRoutines.cpp --- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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,9 +28,9 @@ #include "memory/resourceArea.hpp" #include "oops/oop.inline.hpp" #include "runtime/interfaceSupport.hpp" +#include "runtime/logTimer.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/timer.hpp" #include "utilities/copy.hpp" #ifdef COMPILER2 #include "opto/runtime.hpp" @@ -183,7 +183,7 @@ void StubRoutines::initialize1() { if (_code1 == NULL) { ResourceMark rm; - TraceTime timer("StubRoutines generation 1", TraceStartupTime); + TraceStartupTime timer("StubRoutines generation 1"); _code1 = BufferBlob::create("StubRoutines (1)", code_size1); if (_code1 == NULL) { vm_exit_out_of_memory(code_size1, OOM_MALLOC_ERROR, "CodeCache: no room for StubRoutines (1)"); @@ -276,7 +276,7 @@ void StubRoutines::initialize2() { if (_code2 == NULL) { ResourceMark rm; - TraceTime timer("StubRoutines generation 2", TraceStartupTime); + TraceStartupTime timer("StubRoutines generation 2"); _code2 = BufferBlob::create("StubRoutines (2)", code_size2); if (_code2 == NULL) { vm_exit_out_of_memory(code_size2, OOM_MALLOC_ERROR, "CodeCache: no room for StubRoutines (2)"); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/thread.cpp --- a/hotspot/src/share/vm/runtime/thread.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -67,6 +67,7 @@ #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" #include "runtime/jniPeriodicChecker.hpp" +#include "runtime/logTimer.hpp" #include "runtime/memprofiler.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" @@ -169,11 +170,10 @@ assert(((uintptr_t) aligned_addr + (uintptr_t) size) <= ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size), "JavaThread alignment code overflowed allocated storage"); - if (TraceBiasedLocking) { - if (aligned_addr != real_malloc_addr) { - tty->print_cr("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT, - p2i(real_malloc_addr), p2i(aligned_addr)); - } + if (aligned_addr != real_malloc_addr) { + log_info(biasedlocking)("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT, + p2i(real_malloc_addr), + p2i(aligned_addr)); } ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr; return aligned_addr; @@ -1005,9 +1005,9 @@ char java_runtime_name[128] = ""; char java_runtime_version[128] = ""; -// extract the JRE name from sun.misc.Version.java_runtime_name +// extract the JRE name from java.lang.VersionProps.java_runtime_name static const char* get_java_runtime_name(TRAPS) { - Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(), + Klass* k = SystemDictionary::find(vmSymbols::java_lang_VersionProps(), Handle(), Handle(), CHECK_AND_CLEAR_NULL); fieldDescriptor fd; bool found = k != NULL && @@ -1027,9 +1027,9 @@ } } -// extract the JRE version from sun.misc.Version.java_runtime_version +// extract the JRE version from java.lang.VersionProps.java_runtime_version static const char* get_java_runtime_version(TRAPS) { - Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(), + Klass* k = SystemDictionary::find(vmSymbols::java_lang_VersionProps(), Handle(), Handle(), CHECK_AND_CLEAR_NULL); fieldDescriptor fd; bool found = k != NULL && @@ -3341,7 +3341,7 @@ } void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) { - TraceTime timer("Initialize java.lang classes", TraceStartupTime); + TraceStartupTime timer("Initialize java.lang classes"); if (EagerXrunInit && Arguments::init_libraries_at_startup()) { create_vm_init_libraries(); @@ -3388,6 +3388,8 @@ } void Threads::initialize_jsr292_core_classes(TRAPS) { + TraceStartupTime timer("Initialize java.lang.invoke classes"); + initialize_class(vmSymbols::java_lang_invoke_MethodHandle(), CHECK); initialize_class(vmSymbols::java_lang_invoke_MemberName(), CHECK); initialize_class(vmSymbols::java_lang_invoke_MethodHandleNatives(), CHECK); @@ -3457,7 +3459,7 @@ HOTSPOT_VM_INIT_BEGIN(); // Timing (must come after argument parsing) - TraceTime timer("Create VM", TraceStartupTime); + TraceStartupTime timer("Create VM"); // Initialize the os module after parsing the args jint os_init_2_result = os::init_2(); @@ -3542,8 +3544,9 @@ JvmtiExport::transition_pending_onload_raw_monitors(); // Create the VMThread - { TraceTime timer("Start VMThread", TraceStartupTime); - VMThread::create(); + { TraceStartupTime timer("Start VMThread"); + + VMThread::create(); Thread* vmthread = VMThread::vm_thread(); if (!os::create_thread(vmthread, os::vm_thread)) { diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/timer.cpp --- a/hotspot/src/share/vm/runtime/timer.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/timer.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "logging/log.hpp" #include "oops/oop.inline.hpp" #include "runtime/timer.hpp" #include "utilities/ostream.hpp" @@ -114,14 +115,15 @@ } TraceTime::TraceTime(const char* title, - bool doit) { + bool doit, + LogTagType tag) { _active = doit; _verbose = true; + _tag = tag; + _title = title; if (_active) { _accum = NULL; - tty->print("[%s", title); - tty->flush(); _t.start(); } } @@ -129,14 +131,14 @@ TraceTime::TraceTime(const char* title, elapsedTimer* accumulator, bool doit, - bool verbose) { - _active = doit; - _verbose = verbose; + bool verbose, + LogTagType tag) { + _active = doit; + _verbose = verbose; + _tag = tag; + _title = title; + if (_active) { - if (_verbose) { - tty->print("[%s", title); - tty->flush(); - } _accum = accumulator; _t.start(); } @@ -147,8 +149,15 @@ _t.stop(); if (_accum!=NULL) _accum->add(_t); if (_verbose) { - tty->print_cr(", %3.7f secs]", _t.seconds()); - tty->flush(); + switch (_tag) { + case LogTag::_startuptime : + log_info(startuptime)("%s, %3.7f secs", _title, _t.seconds()); + break; + case LogTag::__NO_TAG : + default : + tty->print_cr("[%s, %3.7f secs]", _title, _t.seconds()); + tty->flush(); + } } } } diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/runtime/timer.hpp --- a/hotspot/src/share/vm/runtime/timer.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/runtime/timer.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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,6 +25,7 @@ #ifndef SHARE_VM_RUNTIME_TIMER_HPP #define SHARE_VM_RUNTIME_TIMER_HPP +#include "logging/logTag.hpp" #include "utilities/globalDefinitions.hpp" // Timers for simple measurement. @@ -85,14 +86,19 @@ bool _verbose; // report every timing elapsedTimer _t; // timer elapsedTimer* _accum; // accumulator + const char* _title; // name of timer + LogTagType _tag; // stream to print to + public: // Constructors TraceTime(const char* title, - bool doit = true); + bool doit = true, + LogTagType tag = LogTag::__NO_TAG); TraceTime(const char* title, elapsedTimer* accumulator, bool doit = true, - bool verbose = false); + bool verbose = false, + LogTagType tag = LogTag::__NO_TAG); ~TraceTime(); // Accessors diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/services/diagnosticCommand.cpp --- a/hotspot/src/share/vm/services/diagnosticCommand.cpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp Wed Jul 05 21:25:29 2017 +0200 @@ -71,6 +71,7 @@ #endif // INCLUDE_SERVICES #if INCLUDE_JVMTI DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); #endif // INCLUDE_JVMTI DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); @@ -254,6 +255,66 @@ } } +JVMTIAgentLoadDCmd::JVMTIAgentLoadDCmd(outputStream* output, bool heap) : + DCmdWithParser(output, heap), + _libpath("library path", "Absolute path of the JVMTI agent to load.", + "STRING", true), + _option("agent option", "Option string to pass the agent.", "STRING", false) { + _dcmdparser.add_dcmd_argument(&_libpath); + _dcmdparser.add_dcmd_argument(&_option); +} + +void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) { + + if (_libpath.value() == NULL) { + output()->print_cr("JVMTI.agent_load dcmd needs library path."); + return; + } + + char *suffix = strrchr(_libpath.value(), '.'); + bool is_java_agent = (suffix != NULL) && (strncmp(".jar", suffix, 4) == 0); + + if (is_java_agent) { + if (_option.value() == NULL) { + JvmtiExport::load_agent_library("instrument", "false", + _libpath.value(), output()); + } else { + size_t opt_len = strlen(_libpath.value()) + strlen(_option.value()) + 2; + if (opt_len > 4096) { + output()->print_cr("JVMTI agent attach failed: Options is too long."); + return; + } + + char *opt = (char *)os::malloc(opt_len, mtInternal); + if (opt == NULL) { + output()->print_cr("JVMTI agent attach failed: " + "Could not allocate %zu bytes for argument.", + opt_len); + return; + } + + jio_snprintf(opt, opt_len, "%s=%s", _libpath.value(), _option.value()); + JvmtiExport::load_agent_library("instrument", "false", opt, output()); + + os::free(opt); + } + } else { + JvmtiExport::load_agent_library(_libpath.value(), "true", + _option.value(), output()); + } +} + +int JVMTIAgentLoadDCmd::num_arguments() { + ResourceMark rm; + JVMTIAgentLoadDCmd* dcmd = new JVMTIAgentLoadDCmd(NULL, false); + if (dcmd != NULL) { + DCmdMark mark(dcmd); + return dcmd->_dcmdparser.num_arguments(); + } else { + return 0; + } +} + void PrintSystemPropertiesDCmd::execute(DCmdSource source, TRAPS) { // load sun.misc.VMSupport Symbol* klass = vmSymbols::sun_misc_VMSupport(); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/services/diagnosticCommand.hpp --- a/hotspot/src/share/vm/services/diagnosticCommand.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/services/diagnosticCommand.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -174,6 +174,26 @@ virtual void execute(DCmdSource source, TRAPS); }; +class JVMTIAgentLoadDCmd : public DCmdWithParser { +protected: + DCmdArgument _libpath; + DCmdArgument _option; +public: + JVMTIAgentLoadDCmd(outputStream* output, bool heap); + static const char* name() { return "JVMTI.agent_load"; } + static const char* description() { + return "Load JVMTI native agent."; + } + static const char* impact() { return "Low"; } + static const JavaPermission permission() { + JavaPermission p = {"java.lang.management.ManagementPermission", + "control", NULL}; + return p; + } + static int num_arguments(); + virtual void execute(DCmdSource source, TRAPS); +}; + class VMDynamicLibrariesDCmd : public DCmd { public: VMDynamicLibrariesDCmd(outputStream* output, bool heap); diff -r f74f056dc069 -r a090823529e7 hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp --- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp Wed Jul 05 21:25:29 2017 +0200 @@ -174,6 +174,8 @@ #if _MSC_VER < 1800 // Visual Studio 2013 introduced strtoull(); before, one has to use _strtoui64() instead. #define strtoull _strtoui64 +// Visual Studio prior to 2013 had no va_copy, but could safely copy va_list by assignement +#define va_copy(dest, src) dest = src // Fixes some wrong warnings about 'this' : used in base member initializer list #pragma warning( disable : 4355 ) #endif diff -r f74f056dc069 -r a090823529e7 hotspot/test/TEST.ROOT --- a/hotspot/test/TEST.ROOT Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/TEST.ROOT Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2016, 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 @@ -30,7 +30,7 @@ keys=cte_test jcmd nmt regression gc stress groups=TEST.groups [closed/TEST.groups] -requires.properties=sun.arch.data.model java.version +requires.properties=sun.arch.data.model # Tests using jtreg 4.1 b12 features requiredVersion=4.1 b12 diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java --- a/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java --- a/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java --- a/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java --- a/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java --- a/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java --- a/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +24,10 @@ /* * @test * @library /test/lib /testlibrary / + * @modules java.base/jdk.internal.org.objectweb.asm * @build compiler.calls.common.InvokeDynamic * @build compiler.calls.common.InvokeDynamicPatcher - * @run driver compiler.calls.common.InvokeDynamicPatcher + * @run main compiler.calls.common.InvokeDynamicPatcher * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/codecache/jmx/PeakUsageTest.java --- a/hotspot/test/compiler/codecache/jmx/PeakUsageTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/codecache/jmx/PeakUsageTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,6 +27,7 @@ /* * @test PeakUsageTest + * @ignore 8151345 * @library /testlibrary /test/lib * @modules java.base/sun.misc * java.management diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java --- a/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ * @test * @bug 8136473 * @summary Mismatched stores on same slice possible with Unsafe.Put*Unaligned methods + * @modules java.base/jdk.internal.misc * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation TestUnsafeUnalignedMismatchedAccesses * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UnlockDiagnosticVMOptions -XX:-UseUnalignedAccesses TestUnsafeUnalignedMismatchedAccesses * diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/JVM_GetJVMCIRuntimeTest.java --- a/hotspot/test/compiler/jvmci/JVM_GetJVMCIRuntimeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/JVM_GetJVMCIRuntimeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +27,7 @@ * @bug 8136421 * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") * @library /testlibrary / + * @modules jdk.vm.ci/jdk.vm.ci.runtime * @run main/othervm -XX:+UnlockExperimentalVMOptions * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=true * -XX:+EnableJVMCI diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/code/InterpreterFrameSizeTest.java --- a/hotspot/test/compiler/jvmci/code/InterpreterFrameSizeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/code/InterpreterFrameSizeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,6 +24,14 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9") & os.arch != "aarch64" + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.code.site + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime + * jdk.vm.ci/jdk.vm.ci.common + * jdk.vm.ci/jdk.vm.ci.amd64 + * jdk.vm.ci/jdk.vm.ci.sparc * @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.InterpreterFrameSizeTest */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java --- a/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +27,8 @@ * @bug 8136421 * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") * @library /testlibrary / + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.runtime * @run main/othervm -XX:+UnlockExperimentalVMOptions * -Dcompiler.jvmci.compilerToVM.JVM_RegisterJVMCINatives.positive=true * -XX:+EnableJVMCI diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/errors/TestInvalidCompilationResult.java --- a/hotspot/test/compiler/jvmci/errors/TestInvalidCompilationResult.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/errors/TestInvalidCompilationResult.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,7 +24,14 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.code.site + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime + * jdk.vm.ci/jdk.vm.ci.common * @compile CodeInstallerTest.java + * @build compiler.jvmci.errors.TestInvalidCompilationResult * @run junit/othervm -da:jdk.vm.ci... -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.errors.TestInvalidCompilationResult */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/errors/TestInvalidDebugInfo.java --- a/hotspot/test/compiler/jvmci/errors/TestInvalidDebugInfo.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/errors/TestInvalidDebugInfo.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,6 +24,12 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.code.site + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime + * jdk.vm.ci/jdk.vm.ci.common * @compile CodeInstallerTest.java * @run junit/othervm -da:jdk.vm.ci... -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.errors.TestInvalidDebugInfo */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/errors/TestInvalidOopMap.java --- a/hotspot/test/compiler/jvmci/errors/TestInvalidOopMap.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/errors/TestInvalidOopMap.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,6 +24,12 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.code.site + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime + * jdk.vm.ci/jdk.vm.ci.common * @compile CodeInstallerTest.java * @run junit/othervm -da:jdk.vm.ci... -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.errors.TestInvalidOopMap */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/events/JvmciShutdownEventTest.java --- a/hotspot/test/compiler/jvmci/events/JvmciShutdownEventTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/events/JvmciShutdownEventTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,10 @@ * @bug 8136421 * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") * @library /testlibrary / + * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * jdk.vm.ci/jdk.vm.ci.code + * jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime * @build compiler.jvmci.common.JVMCIHelpers * compiler.jvmci.events.JvmciShutdownEventListener * compiler.jvmci.events.JvmciShutdownEventTest @@ -36,10 +40,11 @@ * compiler.jvmci.common.JVMCIHelpers$EmptyHotspotCompiler * compiler.jvmci.common.JVMCIHelpers$EmptyCompilerFactory * compiler.jvmci.events.JvmciShutdownEventListener - * @run driver - * compiler.jvmci.events.JvmciShutdownEventTest + * @run main/othervm compiler.jvmci.events.JvmciShutdownEventTest */ + // as soon as CODETOOLS-7901589 fixed, '@run main/othervm' at L43 should be replaced w/ '@run driver' + package compiler.jvmci.events; import jdk.test.lib.ExitCode; diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveConcreteMethodTest.java --- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveConcreteMethodTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveConcreteMethodTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,6 +24,8 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") + * @modules jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.runtime.test.ResolvedJavaTypeResolveConcreteMethodTest */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveMethodTest.java --- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveMethodTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/ResolvedJavaTypeResolveMethodTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,6 +24,8 @@ /** * @test * @requires (os.simpleArch == "x64" | os.simpleArch == "sparcv9" | os.simpleArch == "aarch64") + * @modules jdk.vm.ci/jdk.vm.ci.meta + * jdk.vm.ci/jdk.vm.ci.runtime * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.runtime.test.ResolvedJavaTypeResolveMethodTest */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/gc/g1/plab/TestPLABResize.java --- a/hotspot/test/gc/g1/plab/TestPLABResize.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/gc/g1/plab/TestPLABResize.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,6 +35,7 @@ * gc.g1.plab.lib.MemoryConsumer * gc.g1.plab.lib.PLABUtils * gc.g1.plab.lib.AppPLABResize + * @ignore 8150183 * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main gc.g1.plab.TestPLABResize diff -r f74f056dc069 -r a090823529e7 hotspot/test/gc/parallel/TestPrintGCDetailsVerbose.java --- a/hotspot/test/gc/parallel/TestPrintGCDetailsVerbose.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/gc/parallel/TestPrintGCDetailsVerbose.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,12 +24,11 @@ /* * @test TestPrintGCDetailsVerbose * @bug 8016740 - * @summary Tests that jvm with PrintGCDetails and Verbose flags do not crash when ParOldGC has no memory + * @summary Tests that jvm with maximally verbose GC logging does not crash when ParOldGC has no memory * @key gc - * @requires java.version ~= ".*fastdebug" * @requires vm.gc=="Parallel" | vm.gc=="null" * @library /testlibrary - * @run main/othervm -Xmx50m -XX:+UseParallelOldGC -XX:+PrintGCDetails -XX:+Verbose TestPrintGCDetailsVerbose + * @run main/othervm -Xmx50m -XX:+UseParallelGC -Xlog:gc*=trace TestPrintGCDetailsVerbose */ public class TestPrintGCDetailsVerbose { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java --- a/hotspot/test/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,7 +75,7 @@ int failedTests; List allOptions; - allOptionsAsMap = JVMOptionsUtils.getOptionsWithRangeAsMap(); + allOptionsAsMap = JVMOptionsUtils.getOptionsWithRangeAsMap(origin -> (!(origin.contains("develop") || origin.contains("notproduct")))); /* Shared flags can cause JVM to exit with error code 2 */ setAllowedExitCodes("SharedReadWriteSize", 2); @@ -84,6 +84,13 @@ setAllowedExitCodes("SharedMiscCodeSize", 2); /* + * JDK-8145204 + * Temporarily remove testing of max range for ParGCArrayScanChunk because + * JVM can hang when ParGCArrayScanChunk=4294967296 and ParallelGC is used + */ + excludeTestMaxRange("ParGCArrayScanChunk"); + + /* * Remove CICompilerCount from testing because currently it can hang system */ excludeTestMaxRange("CICompilerCount"); diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java --- a/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -37,6 +37,7 @@ import sun.tools.attach.HotSpotVirtualMachine; import static optionsvalidation.JVMOptionsUtils.failedMessage; +import static optionsvalidation.JVMOptionsUtils.GCType; import static optionsvalidation.JVMOptionsUtils.printOutputContent; import static optionsvalidation.JVMOptionsUtils.VMType; @@ -374,17 +375,21 @@ private boolean runJavaWithParam(String optionValue, boolean valid) throws Exception { int exitCode; boolean result = true; - String value = optionValue.substring(optionValue.lastIndexOf("=") + 1); - String fullOptionString = prependString.toString() + optionValue; + String errorMessage = null; List runJava = new ArrayList<>(); OutputAnalyzer out; if (VMType != null) { runJava.add(VMType); } + + if (GCType != null) { + runJava.add(GCType); + } + runJava.addAll(prepend); runJava.add(optionValue); - runJava.add(JVMOptionsUtils.class.getName()); + runJava.add(JVMStartup.class.getName()); out = new OutputAnalyzer(ProcessTools.createJavaProcessBuilder(runJava.toArray(new String[0])).start()); @@ -392,40 +397,37 @@ if (out.getOutput().contains("A fatal error has been detected by the Java Runtime Environment")) { /* Always consider "fatal error" in output as fail */ - failedMessage(name, fullOptionString, valid, "JVM output reports a fatal error. JVM exited with code " + exitCode + "!"); - printOutputContent(out); - result = false; + errorMessage = "JVM output reports a fatal error. JVM exited with code " + exitCode + "!"; } else if (valid == true) { if (!allowedExitCodes.contains(exitCode)) { - failedMessage(name, fullOptionString, valid, "JVM exited with unexpected error code = " + exitCode); - printOutputContent(out); - result = false; + errorMessage = "JVM exited with unexpected error code = " + exitCode; } else if ((exitCode != 0) && (out.getOutput().isEmpty() == true)) { - failedMessage(name, fullOptionString, valid, "JVM exited with error(exitcode == " + exitCode + - "), but with empty stdout and stderr. Description of error is needed!"); - result = false; + errorMessage = "JVM exited with error(exitcode == " + exitCode + "), but with empty stdout and stderr. " + + "Description of error is needed!"; } else if (out.getOutput().contains("is outside the allowed range")) { - failedMessage(name, fullOptionString, valid, "JVM output contains \"is outside the allowed range\""); - printOutputContent(out); - result = false; + errorMessage = "JVM output contains \"is outside the allowed range\""; } } else { // valid == false + String value = optionValue.substring(optionValue.lastIndexOf("=") + 1); + String errorMessageCommandLineValue = getErrorMessageCommandLine(value); if (exitCode == 0) { - failedMessage(name, fullOptionString, valid, "JVM successfully exit"); - result = false; + errorMessage = "JVM successfully exit"; } else if (exitCode != 1) { - failedMessage(name, fullOptionString, valid, "JVM exited with code " - + exitCode + " which not equal to 1"); - result = false; - } else if (!out.getOutput().contains(getErrorMessageCommandLine(value))) { - failedMessage(name, fullOptionString, valid, "JVM output does not contain " - + "expected output \"" + getErrorMessageCommandLine(value) + "\""); - printOutputContent(out); - result = false; + errorMessage = "JVM exited with code " + exitCode + " which not equal to 1"; + } else if (!out.getOutput().contains(errorMessageCommandLineValue)) { + errorMessage = "JVM output does not contain expected output \"" + errorMessageCommandLineValue + "\""; } } + if (errorMessage != null) { + String fullOptionString = String.format("%s %s %s %s", + VMType == null ? "" : VMType, GCType == null ? "" : GCType, prependString.toString(), optionValue).trim().replaceAll(" +", " "); + failedMessage(name, fullOptionString, valid, errorMessage); + printOutputContent(out); + result = false; + } + System.out.println(""); return result; diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java --- a/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOptionsUtils.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +27,8 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; @@ -50,6 +52,9 @@ /* Used to start the JVM with the same type as current */ static String VMType; + /* Used to start the JVM with the same GC type as current */ + static String GCType; + private static Map optionsAsMap; static { @@ -64,6 +69,27 @@ } else { VMType = null; } + + List gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans(); + + GCType = null; + + for (GarbageCollectorMXBean gcMxBean : gcMxBeans) { + switch (gcMxBean.getName()) { + case "ConcurrentMarkSweep": + GCType = "-XX:+UseConcMarkSweepGC"; + break; + case "MarkSweepCompact": + GCType = "-XX:+UseSerialGC"; + break; + case "PS Scavenge": + GCType = "-XX:+UseParallelGC"; + break; + case "G1 Old Generation": + GCType = "-XX:+UseG1GC"; + break; + } + } } public static boolean fitsRange(String optionName, BigDecimal number) throws Exception { @@ -443,6 +469,10 @@ if (VMType != null) { runJava.add(VMType); } + + if (GCType != null) { + runJava.add(GCType); + } runJava.add(PRINT_FLAGS_RANGES); runJava.add("-version"); @@ -534,9 +564,4 @@ public static Map getOptionsWithRangeAsMap(String... additionalArgs) throws Exception { return getOptionsWithRangeAsMap(origin -> true, additionalArgs); } - - /* Simple method to test that java start-up. Used for testing options. */ - public static void main(String[] args) { - System.out.print("Java start-up!"); - } } diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMStartup.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMStartup.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, 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 optionsvalidation; + +import java.lang.ref.WeakReference; + +class JVMStartup { + private static volatile WeakReference weakRef; + + private static synchronized void createWeakRef() { + Object o = new Object(); + weakRef = new WeakReference<>(o); + } + + /* Simple method to test that java start-up. Used for testing options. */ + public static void main(String[] args) throws Exception { + byte[] garbage = new byte[8192]; + int i = 0; + createWeakRef(); + do { + garbage = new byte[8192]; + i++; + /* Initiate GC after 5 iterations */ + if (i > 5) { + System.gc(); + } + } while(weakRef.get() != null); + System.out.println("Java start-up!"); + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/RedefineTests/RedefineRunningMethodsWithResolutionErrors.java --- a/hotspot/test/runtime/RedefineTests/RedefineRunningMethodsWithResolutionErrors.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/RedefineTests/RedefineRunningMethodsWithResolutionErrors.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,9 @@ * @bug 8076110 * @summary Redefine running methods that have cached resolution errors * @library /testlibrary - * @modules java.instrument - * java.base/jdk.internal.org.objectweb.asm + * @modules java.base/jdk.internal.org.objectweb.asm + * java.instrument + * jdk.jartool/sun.tools.jar * @build RedefineClassHelper * @run main RedefineClassHelper * @run main/othervm -javaagent:redefineagent.jar -XX:TraceRedefineClasses=0x600 RedefineRunningMethodsWithResolutionErrors diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/ReservedStack/ReservedStackTest.java --- a/hotspot/test/runtime/ReservedStack/ReservedStackTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/ReservedStack/ReservedStackTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +24,7 @@ /* * @test ReservedStackTest * @library /testlibrary + * @modules java.base/jdk.internal.vm.annotation * @build jdk.test.lib.* * @run main/othervm -XX:-Inline -XX:CompileCommand=exclude,java/util/concurrent/locks/AbstractOwnableSynchronizer.setExclusiveOwnerThread ReservedStackTest */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java --- a/hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/SharedArchiveFile/LimitSharedSizes.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ * @library /testlibrary /runtime/CommandLine/OptionsValidation/common * @modules java.base/sun.misc * java.management + * jdk.attach/sun.tools.attach * @run main LimitSharedSizes */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/Basic.java --- a/hotspot/test/runtime/contended/Basic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/Basic.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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,7 +42,7 @@ * @test * @bug 8003985 * @summary Support Contended Annotation - JEP 142 - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended Basic */ public class Basic { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/DefaultValue.java --- a/hotspot/test/runtime/contended/DefaultValue.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/DefaultValue.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -43,7 +43,7 @@ * @bug 8014509 * @summary \@Contended: explicit default value behaves differently from the implicit value * - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended DefaultValue */ public class DefaultValue { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/HasNonStatic.java --- a/hotspot/test/runtime/contended/HasNonStatic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/HasNonStatic.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -43,7 +43,7 @@ * @bug 8015270 * @summary \@Contended: fix multiple issues in the layout code * - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended HasNonStatic */ public class HasNonStatic { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/Inheritance1.java --- a/hotspot/test/runtime/contended/Inheritance1.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/Inheritance1.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -43,7 +43,7 @@ * @bug 8012939 * @summary \@Contended doesn't work correctly with inheritance * - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended Inheritance1 */ public class Inheritance1 { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/OopMaps.java --- a/hotspot/test/runtime/contended/OopMaps.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/OopMaps.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -44,7 +44,7 @@ * @bug 8015493 * @summary \@Contended: fix multiple issues in the layout code * - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended -XX:ContendedPaddingWidth=128 -Xmx128m OopMaps */ public class OopMaps { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/contended/OopMapsSameGroup.java --- a/hotspot/test/runtime/contended/OopMapsSameGroup.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/contended/OopMapsSameGroup.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -43,7 +43,7 @@ * @bug 8015272 * @summary \@Contended within the same group to use the same oop map * - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.vm.annotation * @run main/othervm -XX:-RestrictContended -XX:ContendedPaddingWidth=128 -Xmx128m OopMapsSameGroup */ public class OopMapsSameGroup { diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/lambda-features/TestStaticandInstance.java --- a/hotspot/test/runtime/lambda-features/TestStaticandInstance.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/runtime/lambda-features/TestStaticandInstance.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ * @test * @bug 8087342 * @summary Test linkresolver search static, instance and overpass duplicates + * @modules java.base/jdk.internal.org.objectweb.asm * @run main/othervm -Xverify:none TestStaticandInstance */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/logging/BiasedLockingTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/logging/BiasedLockingTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016, 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 8149383 + * @summary -Xlog:biasedlocking should have logging from statements in the source code + * @library /testlibrary + * @modules java.base/sun.misc + * java.management + * @build jdk.test.lib.OutputAnalyzer jdk.test.lib.ProcessTools + * @run driver BiasedLockingTest + */ + +import jdk.test.lib.OutputAnalyzer; +import jdk.test.lib.ProcessTools; + +public class BiasedLockingTest { + static void analyzeOutputOn(ProcessBuilder pb) throws Exception { + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain("Biased locking enabled"); + output.shouldHaveExitValue(0); + } + + static void analyzeOutputOff(ProcessBuilder pb) throws Exception { + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("[biasedlocking]"); + output.shouldHaveExitValue(0); + } + + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:biasedlocking", + "-XX:BiasedLockingStartupDelay=0", + InnerClass.class.getName()); + analyzeOutputOn(pb); + + pb = ProcessTools.createJavaProcessBuilder("-XX:+TraceBiasedLocking", + "-XX:BiasedLockingStartupDelay=0", + InnerClass.class.getName()); + analyzeOutputOn(pb); + + pb = ProcessTools.createJavaProcessBuilder("-Xlog:biasedlocking=off", + "-XX:BiasedLockingStartupDelay=0", + InnerClass.class.getName()); + analyzeOutputOff(pb); + + pb = ProcessTools.createJavaProcessBuilder("-XX:-TraceBiasedLocking", + "-XX:BiasedLockingStartupDelay=0", + InnerClass.class.getName()); + analyzeOutputOff(pb); + } + + public static class InnerClass { + public static void main(String[] args) { + System.out.println("Biased Locking test"); + } + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/runtime/logging/StartupTimeTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/logging/StartupTimeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015, 2016, 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 8148630 + * @summary -Xlog:startuptime should produce logging from the source code + * @library /testlibrary + * @modules java.base/sun.misc + * java.management + * @build jdk.test.lib.OutputAnalyzer jdk.test.lib.ProcessTools + * @run driver StartupTimeTest + */ + +import jdk.test.lib.OutputAnalyzer; +import jdk.test.lib.ProcessTools; + +public class StartupTimeTest { + static void analyzeOutputOn(ProcessBuilder pb) throws Exception { + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("(Genesis, [0-9]+.[0-9]+ secs)"); + output.shouldMatch("(Start VMThread, [0-9]+.[0-9]+ secs)"); + output.shouldMatch("(Create VM, [0-9]+.[0-9]+ secs)"); + output.shouldHaveExitValue(0); + } + + static void analyzeOutputOff(ProcessBuilder pb) throws Exception { + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("[startuptime]"); + output.shouldHaveExitValue(0); + } + + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:startuptime", + InnerClass.class.getName()); + analyzeOutputOn(pb); + + pb = ProcessTools.createJavaProcessBuilder("-Xlog:startuptime=off", + InnerClass.class.getName()); + analyzeOutputOff(pb); + } + + public static class InnerClass { + public static void main(String[] args) throws Exception { + System.out.println("Testing startuptime."); + } + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/attach/AttachSetGetFlag.java --- a/hotspot/test/serviceability/attach/AttachSetGetFlag.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/serviceability/attach/AttachSetGetFlag.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -32,7 +32,7 @@ * jdk.attach/sun.tools.attach * jdk.jvmstat/sun.jvmstat.monitor * @build jdk.test.lib.* AttachSetGetFlag - * @run driver AttachSetGetFlag + * @run main AttachSetGetFlag */ import java.io.BufferedReader; diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/attach/AttachWithStalePidFile.java --- a/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ * @bug 7162400 * @key regression * @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues + * @modules jdk.attach/sun.tools.attach * @library /testlibrary * @build jdk.test.lib.* AttachWithStalePidFileTarget * @run main AttachWithStalePidFile diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/dcmd/gc/HeapDumpAllTest.java --- a/hotspot/test/serviceability/dcmd/gc/HeapDumpAllTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/serviceability/dcmd/gc/HeapDumpAllTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,7 +35,7 @@ * @build jdk.test.lib.hprof.* * @build jdk.test.lib.hprof.model.* * @build jdk.test.lib.hprof.parser.* - * @build jdk.test.lib.hprof.utils.* + * @build jdk.test.lib.hprof.util.* * @build HeapDumpTest * @run testng HeapDumpAllTest */ diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/dcmd/gc/HeapDumpTest.java --- a/hotspot/test/serviceability/dcmd/gc/HeapDumpTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/serviceability/dcmd/gc/HeapDumpTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -51,7 +51,7 @@ * @build jdk.test.lib.hprof.* * @build jdk.test.lib.hprof.model.* * @build jdk.test.lib.hprof.parser.* - * @build jdk.test.lib.hprof.utils.* + * @build jdk.test.lib.hprof.util.* * @run testng HeapDumpTest */ public class HeapDumpTest { diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2016, 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.io.*; +import java.nio.file.*; +import jdk.test.lib.*; +import jdk.test.lib.dcmd.*; +import org.testng.annotations.Test; + +/* + * Test to attach JVMTI java agent. + * + * @test + * @bug 8147388 + * @library /testlibrary + * @modules java.base/sun.misc + * java.compiler + * java.instrument + * java.management + * jdk.jvmstat/sun.jvmstat.monitor + * @build ClassFileInstaller jdk.test.lib.* SimpleJvmtiAgent + * @ignore 8150318 + * @run main ClassFileInstaller SimpleJvmtiAgent + * @run testng LoadAgentDcmdTest + */ +public class LoadAgentDcmdTest { + + public String getLibInstrumentPath() throws FileNotFoundException { + String jdkPath = System.getProperty("test.jdk"); + + if (jdkPath == null) { + throw new RuntimeException( + "System property 'test.jdk' not set. " + + "This property is normally set by jtreg. " + + "When running test separately, set this property using " + + "'-Dtest.jdk=/path/to/jdk'."); + } + + Path libpath; + if (Platform.isWindows()) { + libpath = Paths.get(jdkPath, "bin", "instrument.dll"); + } else { + libpath = Paths.get(jdkPath, "lib", Platform.getOsArch(), "libinstrument.so"); + } + + if (!libpath.toFile().exists()) { + throw new FileNotFoundException( + "Could not find " + libpath.toAbsolutePath()); + } + + return libpath.toAbsolutePath().toString(); + } + + public void run(CommandExecutor executor) { + try{ + PrintWriter pw = new PrintWriter("MANIFEST.MF"); + pw.println("Agent-Class: SimpleJvmtiAgent"); + pw.close(); + + ProcessBuilder pb = new ProcessBuilder(); + pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), + "cmf", + "MANIFEST.MF", + "agent.jar", + "SimpleJvmtiAgent.class"}); + pb.start().waitFor(); + + String libpath = getLibInstrumentPath(); + + // Test 1: No argument + OutputAnalyzer output = executor.execute("JVMTI.agent_load " + + libpath + " agent.jar"); + output.stderrShouldBeEmpty(); + + // Test 2: With argument + output = executor.execute("JVMTI.agent_load " + + libpath + " \"agent.jar=foo=bar\""); + output.stderrShouldBeEmpty(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void jmx() throws Throwable { + run(new JMXExecutor()); + } + + @Test + public void cli() throws Throwable { + run(new PidJcmdExecutor()); + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/dcmd/jvmti/LoadJavaAgentDcmdTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/dcmd/jvmti/LoadJavaAgentDcmdTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2016, 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.io.*; +import jdk.test.lib.*; +import jdk.test.lib.dcmd.*; +import org.testng.annotations.Test; + +/* + * Test to attach JVMTI java agent. + * + * @test + * @bug 8147388 + * @library /testlibrary + * @modules java.base/sun.misc + * java.compiler + * java.instrument + * java.management + * jdk.jvmstat/sun.jvmstat.monitor + * @build ClassFileInstaller jdk.test.lib.* SimpleJvmtiAgent + * @run main ClassFileInstaller SimpleJvmtiAgent + * @run testng LoadJavaAgentDcmdTest + */ +public class LoadJavaAgentDcmdTest { + public void run(CommandExecutor executor) { + try{ + PrintWriter pw = new PrintWriter("MANIFEST.MF"); + pw.println("Agent-Class: SimpleJvmtiAgent"); + pw.close(); + + ProcessBuilder pb = new ProcessBuilder(); + pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), + "cmf", + "MANIFEST.MF", + "agent.jar", + "SimpleJvmtiAgent.class"}); + pb.start().waitFor(); + + // Test 1: No argument + OutputAnalyzer output = executor.execute("JVMTI.agent_load " + + "agent.jar"); + output.stderrShouldBeEmpty(); + + // Test 2: With argument + output = executor.execute("JVMTI.agent_load " + + "\"agent.jar=foo=bar\""); + output.stderrShouldBeEmpty(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + public void jmx() throws Throwable { + run(new JMXExecutor()); + } + + @Test + public void cli() throws Throwable { + run(new PidJcmdExecutor()); + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/dcmd/jvmti/SimpleJvmtiAgent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/dcmd/jvmti/SimpleJvmtiAgent.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, 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.lang.instrument.*; + +public class SimpleJvmtiAgent { + public static void agentmain(String agentArgs, Instrumentation instrumentation) { + System.out.println("attach succeeded (args: \"" + agentArgs + "\")"); + } +} diff -r f74f056dc069 -r a090823529e7 hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java --- a/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -27,6 +27,7 @@ * @test * @summary Test checks the consistency of the output * displayed with jstat -gccapacity. + * @ignore 8149778 * @library /test/lib/share/classes * @library ../share * @requires vm.opt.ExplicitGCInvokesConcurrent != true diff -r f74f056dc069 -r a090823529e7 hotspot/test/testlibrary_tests/ctw/ClassesDirTest.java --- a/hotspot/test/testlibrary_tests/ctw/ClassesDirTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/testlibrary_tests/ctw/ClassesDirTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ * @test * @bug 8012447 * @library /testlibrary /test/lib /testlibrary/ctw/src - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.misc * java.base/sun.reflect * java.management * @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar diff -r f74f056dc069 -r a090823529e7 hotspot/test/testlibrary_tests/ctw/ClassesListTest.java --- a/hotspot/test/testlibrary_tests/ctw/ClassesListTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/testlibrary_tests/ctw/ClassesListTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ * @test * @bug 8012447 * @library /testlibrary /test/lib /testlibrary/ctw/src - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.misc * java.base/sun.reflect * java.management * @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar diff -r f74f056dc069 -r a090823529e7 hotspot/test/testlibrary_tests/ctw/JarDirTest.java --- a/hotspot/test/testlibrary_tests/ctw/JarDirTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/testlibrary_tests/ctw/JarDirTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ * @test * @bug 8012447 * @library /testlibrary /test/lib /testlibrary/ctw/src - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.misc * java.base/sun.reflect * java.compiler * java.management diff -r f74f056dc069 -r a090823529e7 hotspot/test/testlibrary_tests/ctw/JarsTest.java --- a/hotspot/test/testlibrary_tests/ctw/JarsTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/hotspot/test/testlibrary_tests/ctw/JarsTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ * @test * @bug 8012447 * @library /testlibrary /test/lib /testlibrary/ctw/src - * @modules java.base/sun.misc + * @modules java.base/jdk.internal.misc * java.base/sun.reflect * java.compiler * java.management diff -r f74f056dc069 -r a090823529e7 jaxp/.hgtags --- a/jaxp/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxp/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -350,3 +350,4 @@ 5acf6071d4d610068a19c79e004ba8e59cf1b087 jdk-9+105 65d615f71e81bae46dcb4d053e590582e5705879 jdk-9+106 781b83dadcae89b8ae7545bb4044ddc62c6fa006 jdk-9+107 +3b9fa8b1491479f7ae18131a34036b58b647493e jdk-9+108 diff -r f74f056dc069 -r a090823529e7 jaxws/.hgtags --- a/jaxws/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -353,3 +353,4 @@ 45a666c58e4c7d07638878684ad09decb3229dc9 jdk-9+105 c072c572d14948563ef5d86e1921699b3a2396ab jdk-9+106 fafd694e801f0f5a7c737fb08630ced3ca8f772c jdk-9+107 +513eb2e432f64f85992442da9acdfcfbb36555d9 jdk-9+108 diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/reflect/opt/Const.java --- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/reflect/opt/Const.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/reflect/opt/Const.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -29,12 +29,12 @@ * @author Kohsuke Kawaguchi */ public final class Const { - public static byte default_value_byte = 0; - public static boolean default_value_boolean = false; - public static char default_value_char = 0; - public static float default_value_float = 0; - public static double default_value_double = 0; - public static int default_value_int = 0; - public static long default_value_long = 0; - public static short default_value_short = 0; + public static final byte default_value_byte = 0; + public static final boolean default_value_boolean = false; + public static final char default_value_char = 0; + public static final float default_value_float = 0; + public static final double default_value_double = 0; + public static final int default_value_int = 0; + public static final long default_value_long = 0; + public static final short default_value_short = 0; } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StructureLoader.java --- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StructureLoader.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StructureLoader.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -231,22 +231,11 @@ @Override public void childElement(UnmarshallingContext.State state, TagName arg) throws SAXException { ChildLoader child = childUnmarshallers.get(arg.uri,arg.local); - if(child==null) { - if ((beanInfo != null) && (beanInfo.getTypeNames() != null)) { - Iterator typeNamesIt = beanInfo.getTypeNames().iterator(); - QName parentQName = null; - if ((typeNamesIt != null) && (typeNamesIt.hasNext()) && (catchAll == null)) { - parentQName = (QName) typeNamesIt.next(); - String parentUri = parentQName.getNamespaceURI(); - child = childUnmarshallers.get(parentUri, arg.local); - } - } - if (child == null) { - child = catchAll; - if(child==null) { - super.childElement(state,arg); - return; - } + if (child == null) { + child = catchAll; + if (child==null) { + super.childElement(state,arg); + return; } } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/schemagen/XmlSchemaGenerator.java --- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/schemagen/XmlSchemaGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/schemagen/XmlSchemaGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -110,6 +110,7 @@ import com.sun.xml.internal.txw2.output.ResultFactory; import com.sun.xml.internal.txw2.output.XmlSerializer; import java.util.Collection; +import java.util.HashSet; import org.xml.sax.SAXParseException; /** @@ -436,7 +437,7 @@ if(logger.isLoggable(Level.FINE)) { // debug logging to see what's going on. - logger.log(Level.FINE,"Wrigin XML Schema for "+toString(),new StackRecorder()); + logger.log(Level.FINE,"Writing XML Schema for "+toString(),new StackRecorder()); } // make it fool-proof @@ -465,6 +466,8 @@ systemIds.put(n,output.getSystemId()); } } + //Clear the namespace specific set with already written classes + n.resetWritten(); } // then write'em all @@ -542,6 +545,11 @@ */ private boolean useMimeNs; + /** + * Container for already processed classes + */ + private final Set written = new HashSet(); + public Namespace(String uri) { this.uri = uri; assert !XmlSchemaGenerator.this.namespaces.containsKey(uri); @@ -549,6 +557,13 @@ } /** + * Clear out the set of already processed classes for this namespace + */ + void resetWritten() { + written.clear(); + } + + /** * Process the given PropertyInfo looking for references to namespaces that * are foreign to the given namespace. Any foreign namespace references * found are added to the given namespaces dependency list and an {@code } @@ -853,6 +868,10 @@ * @param parent the writer of the parent element into which the type will be defined */ private void writeClass(ClassInfo c, TypeHost parent) { + if (written.contains(c)) { // to avoid cycles let's check if we haven't already processed the class + return; + } + written.add(c); // special handling for value properties if (containsValueProp(c)) { if (c.getProperties().size() == 1) { @@ -1080,9 +1099,13 @@ } } } - if (cImpl != null) - e.ref(new QName(cImpl.getElementName().getNamespaceURI(), tn.getLocalPart())); - else + if (cImpl != null) { + if (tn.getNamespaceURI() != null && tn.getNamespaceURI().trim().length() != 0) { + e.ref(new QName(tn.getNamespaceURI(), tn.getLocalPart())); + } else { + e.ref(new QName(cImpl.getElementName().getNamespaceURI(), tn.getLocalPart())); + } + } else e.ref(new QName("", tn.getLocalPart())); } else e.ref(tn); diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/client/p2p/HttpSOAPConnection.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -512,13 +512,9 @@ : httpConnection.getInputStream()); // If no reply message is returned, // content-Length header field value is expected to be zero. - // java SE 6 documentation says : - // available() : an estimate of the number of bytes that can be read - //(or skipped over) from this input stream without blocking - //or 0 when it reaches the end of the input stream. + // InputStream#available() can't be used here - it just says no data *YET*! if ((httpIn == null ) - || (httpConnection.getContentLength() == 0) - || (httpIn.available() == 0)) { + || (httpConnection.getContentLength() == 0)) { response = null; log.warning("SAAJ0014.p2p.content.zero"); } else { diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/InternetHeaders.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/InternetHeaders.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/InternetHeaders.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -285,7 +285,7 @@ * * @return Header objects */ - public FinalArrayList getAllHeaders() { + public List getAllHeaders() { return headers; // conceptually it should be read-only, but for performance reason I'm not wrapping it here } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeBodyPart.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeBodyPart.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/packaging/mime/internet/MimeBodyPart.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -32,6 +32,7 @@ package com.sun.xml.internal.messaging.saaj.packaging.mime.internet; +import com.sun.xml.internal.messaging.saaj.packaging.mime.Header; import com.sun.xml.internal.messaging.saaj.packaging.mime.MessagingException; import com.sun.xml.internal.messaging.saaj.packaging.mime.util.OutputUtil; import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; @@ -1041,7 +1042,7 @@ * Return all the headers from this Message as an Enumeration of * Header objects. */ - public FinalArrayList getAllHeaders() { + public List getAllHeaders() { return headers.getAllHeaders(); } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/pipe/ThreadHelper.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/pipe/ThreadHelper.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/pipe/ThreadHelper.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -32,7 +32,7 @@ /** * Simple utility class to instantiate correct Thread instance - * depending on runtime context (jdk/non-jdk usage) and Java version. + * depending on Java version. * * @author miroslav.kos@oracle.com */ @@ -101,16 +101,16 @@ SunMiscThreadFactory(Constructor ctr) { this.ctr = ctr; } @Override public Thread newThread(Runnable r) { return AccessController.doPrivileged( - new PrivilegedAction() { - @Override - public Thread run() { - try { - return (Thread) ctr.newInstance(r); - } catch (Exception e) { - return new Thread(r); + new PrivilegedAction() { + @Override + public Thread run() { + try { + return (Thread) ctr.newInstance(r); + } catch (Exception e) { + return new Thread(r); + } } } - } ); } } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/Headers.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/Headers.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/transport/Headers.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -127,5 +127,17 @@ l.add (value); put(key, l); } + /** + * Added to fix issue + * putAll() is easier to deal with as it doesn't return anything + */ + public void putAll(Map> map) { + for (String k : map.keySet()) { + List list = map.get(k); + for (String v : list) { + add(k,v); + } + } + } } diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/ServiceFinder.java --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/ServiceFinder.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/ServiceFinder.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -338,13 +338,13 @@ int lc = 1; while ((lc = parseLine(service, u, r, lc, names, returned)) >= 0) ; } catch (IOException x) { - fail(service, ": " + x); + fail(service, ": " + x +";URL is :"+u.toString()); } finally { try { if (r != null) r.close(); if (in != null) in.close(); } catch (IOException y) { - fail(service, ": " + y); + fail(service, ": " + y +";URL is :"+u.toString()); } } return names.iterator(); diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/version.properties --- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/version.properties Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/version.properties Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2016, 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,4 +26,4 @@ build-id=2.3.0-SNAPSHOT build-version=JAX-WS RI 2.3.0-SNAPSHOT major-version=2.3.0 -svn-revision=ffaa49e66cc05e1bb2ddc103076a340dad5df997 +svn-revision=282759e2b822078de9ba78c743ed663541c16ead diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/javax/xml/soap/FactoryFinder.java --- a/jaxws/src/java.xml.ws/share/classes/javax/xml/soap/FactoryFinder.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/javax/xml/soap/FactoryFinder.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, 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 @@ -184,7 +184,7 @@ private static String fromJDKProperties(String factoryId, String deprecatedFactoryId) { Path path = null; try { - String JAVA_HOME = System.getProperty("java.home"); + String JAVA_HOME = getSystemProperty("java.home"); path = Paths.get(JAVA_HOME, "conf", "jaxm.properties"); logger.log(Level.FINE, "Checking configuration in {0}", path); diff -r f74f056dc069 -r a090823529e7 jaxws/src/java.xml.ws/share/classes/javax/xml/ws/spi/FactoryFinder.java --- a/jaxws/src/java.xml.ws/share/classes/javax/xml/ws/spi/FactoryFinder.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/java.xml.ws/share/classes/javax/xml/ws/spi/FactoryFinder.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -137,7 +137,8 @@ } catch (Exception ignored) { logger.log(Level.SEVERE, "Error reading JAX-WS configuration from [" + path + "] file. Check it is accessible and has correct format.", ignored); - } return null; + } + return null; } private static final String OSGI_SERVICE_LOADER_CLASS_NAME = "com.sun.org.glassfish.hk2.osgiresourcelocator.ServiceLoader"; diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/codemodel/internal/JJavaName.java --- a/jaxws/src/jdk.xml.bind/share/classes/com/sun/codemodel/internal/JJavaName.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/codemodel/internal/JJavaName.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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,7 @@ * ("my_children","MyChildren","myChildren", and "MY-CHILDREN", "CODE003-children" respectively) *

* Although this method only works for English words, it handles non-English - * words gracefully (by just returning it as-is.) For example, 日本語 + * words gracefully (by just returning it as-is.) For example, "日本語" * will be returned as-is without modified, not "日本語s" *

* This method doesn't handle suffixes very well. For example, passing diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,49 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = \ + Unexpected {0} appears at line {1} column {2} + +BASEDIR_DOESNT_EXIST = \ + Non-existent directory: {0} + +VERSION = \ + schemagen 2.3.0-SNAPSHOT + +FULLVERSION = \ + schemagen full version "2.3.0-SNAPSHOT" + +USAGE = \ +Usage: schemagen [-options ...] \n\ +Options: \n\ +\ \ \ \ -d : specify where to place processor and javac generated class files\n\ +\ \ \ \ -cp : specify where to find user specified files\n\ +\ \ \ \ -classpath : specify where to find user specified files\n\ +\ \ \ \ -encoding : specify encoding to be used for annotation processing/javac invocation \n\ +\ \ \ \ -episode : generate episode file for separate compilation\n\ +\ \ \ \ -disableXmlSecurity : disables XML security features for usage on xml parsing apis \n\ +\ \ \ \ -version : display version information\n\ +\ \ \ \ -fullversion : display full version information\n\ +\ \ \ \ -help : display this usage message diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_de.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_de.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = Nicht erkanntes {0} in Zeile {1} Spalte {2} + +BASEDIR_DOESNT_EXIST = Nicht vorhandenes Verzeichnis: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = schemagen vollst\u00E4ndige Version "2.3.0-SNAPSHOT" + +USAGE = Verwendung: schemagen [-options ...] \nOptionen: \n\\ \\ \\ \\ -d : Gibt an, wo die von Prozessor und javac generierten Klassendateien gespeichert werden sollen\n\\ \\ \\ \\ -cp : Gibt an, wo die vom Benutzer angegebenen Dateien gespeichert sind\n\\ \\ \\ \\ -classpath : Gibt an, wo die vom Benutzer angegebenen Dateien gespeichert sind\n\\ \\ \\ \\ -encoding : Gibt die Codierung f\u00FCr die Annotationsverarbeitung/den javac-Aufruf an \n\\ \\ \\ \\ -episode : Generiert Episodendatei f\u00FCr separate Kompilierung\n\\ \\ \\ \\ -version : Zeigt Versionsinformation an\n\\ \\ \\ \\ -fullversion : Zeigt vollst\u00E4ndige Versionsinformationen an\n\\ \\ \\ \\ -help : Zeigt diese Verwendungsmeldung an diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_es.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_es.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = Aparece un {0} inesperado en la l\u00EDnea {1} y la columna {2} + +BASEDIR_DOESNT_EXIST = Directorio no existente: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = versi\u00F3n completa de schemagen "2.3.0-SNAPSHOT" + +USAGE = Sintaxis: schemagen [-options ...] \nOpciones: \n\\ \\ \\ \\ -d : especifique d\u00F3nde se colocan los archivos de clase generados por javac y el procesador\n\\ \\ \\ \\ -cp : especifique d\u00F3nde se encuentran los archivos especificados por el usuario\n\\ \\ \\ \\ -encoding : especifique la codificaci\u00F3n que se va a utilizar para el procesamiento de anotaciones/llamada de javac\n\\ \\ \\ \\ -episode : genera un archivo de episodio para una compilaci\u00F3n diferente\n\\ \\ \\ \\ -version : muestra la informaci\u00F3n de la versi\u00F3n\n\\ \\ \\ \\ -fullversion : muestra la informaci\u00F3n completa de la versi\u00F3n\n\\ \\ \\ \\ -help : muestra este mensaje de sintaxis diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_fr.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_fr.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = Un \u00E9l\u00E9ment {0} inattendu appara\u00EEt \u00E0 la ligne {1}, colonne {2} + +BASEDIR_DOESNT_EXIST = R\u00E9pertoire {0} inexistant + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = version compl\u00E8te de schemagen "2.3.0-SNAPSHOT" + +USAGE = Syntaxe : schemagen [-options ...] \nOptions : \n\ \ \ \ -d : indiquez o\u00F9 placer les fichiers de classe g\u00E9n\u00E9r\u00E9s par le processeur et le compilateur javac\n\ \ \ \ -cp : indiquez o\u00F9 trouver les fichiers sp\u00E9cifi\u00E9s par l'utilisateur\n\ \ \ \ -classpath : indiquez o\u00F9 trouver les fichiers sp\u00E9cifi\u00E9s par l'utilisateur\n\ \ \ \ -encoding : indiquez l'encodage \u00E0 utiliser pour l'appel de javac/traitement de l'annotation \n\ \ \ \ -episode : g\u00E9n\u00E9rez un fichier d'\u00E9pisode pour la compilation s\u00E9par\u00E9e\n\ \ \ \ -version : affichez les informations de version\n\ \ \ \ -fullversion : affichez les informations compl\u00E8tes de version\n\ \ \ \ -help : affichez ce message de syntaxe diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_it.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_it.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = {0} imprevisto visualizzato sulla riga {1} colonna {2} + +BASEDIR_DOESNT_EXIST = Directory non esistente: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = versione completa schemagen "2.3.0-SNAPSHOT" + +USAGE = Uso: schemagen [-options ...] \nOpzioni: \n\ \ \ \ -d : specifica dove posizionare il processore e i file della classe generata javac\n\ \ \ \ -cp : specifica dove trovare i file specificati dall'utente\n\ \ \ \ -classpath : specifica dove trovare i file specificati dall'utente\n\ \ \ \ -encoding : specifica la codifica da usare per l'elaborazione dell'annotazione/richiamo javac \n\ \ \ \ -episode : genera il file di episodio per la compilazione separata\n\ \ \ \ -version : visualizza le informazioni sulla versione\n\ \ \ \ -fullversion : visualizza le informazioni sulla versione completa\n\ \ \ \ -help : visualizza questo messaggio sull'uso diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_ja.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_ja.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = \u4E88\u671F\u3057\u306A\u3044{0}\u304C\u884C{1}\u3001\u5217{2}\u306B\u3042\u308A\u307E\u3059 + +BASEDIR_DOESNT_EXIST = \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = schemagen\u30D5\u30EB\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3"2.3.0-SNAPSHOT" + +USAGE = \u4F7F\u7528\u65B9\u6CD5: schemagen [-options ...] \n\u30AA\u30D7\u30B7\u30E7\u30F3: \n\ \ \ \ -d : \u30D7\u30ED\u30BB\u30C3\u30B5\u304A\u3088\u3073javac\u304C\u751F\u6210\u3057\u305F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u7F6E\u304F\u4F4D\u7F6E\u3092\u6307\u5B9A\u3057\u307E\u3059\n\ \ \ \ -cp : \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3057\u307E\u3059\n\ \ \ \ -classpath : \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3057\u307E\u3059\n\ \ \ \ -encoding : \u6CE8\u91C8\u51E6\u7406/javac\u547C\u51FA\u3057\u306B\u4F7F\u7528\u3059\u308B\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u6307\u5B9A\u3057\u307E\u3059\n\ \ \ \ -episode : \u30B3\u30F3\u30D1\u30A4\u30EB\u3054\u3068\u306B\u30A8\u30D4\u30BD\u30FC\u30C9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u751F\u6210\u3057\u307E\u3059\n\ \ \ \ -version : \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\n\ \ \ \ -fullversion : \u30D5\u30EB\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\n\ \ \ \ -help : \u3053\u306E\u4F7F\u7528\u4F8B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u307E\u3059 diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_ko.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_ko.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = \uC608\uC0C1\uCE58 \uC54A\uC740 {0}\uC774(\uAC00) {1}\uD589 {2}\uC5F4\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4. + +BASEDIR_DOESNT_EXIST = \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uB514\uB809\uD1A0\uB9AC: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = schemagen \uC815\uC2DD \uBC84\uC804 "2.3.0-SNAPSHOT" + +USAGE = \uC0AC\uC6A9\uBC95: schemagen [-options ...] \n\uC635\uC158: \n\ \ \ \ -d : \uD504\uB85C\uC138\uC11C \uBC0F javac\uC5D0\uC11C \uC0DD\uC131\uD55C \uD074\uB798\uC2A4 \uD30C\uC77C\uC744 \uBC30\uCE58\uD560 \uC704\uCE58\uB97C \uC9C0\uC815\uD569\uB2C8\uB2E4.\n\ \ \ \ -cp : \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C \uD30C\uC77C\uC744 \uCC3E\uC744 \uC704\uCE58\uB97C \uC9C0\uC815\uD569\uB2C8\uB2E4.\n\ \ \ \ -classpath : \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C \uD30C\uC77C\uC744 \uCC3E\uC744 \uC704\uCE58\uB97C \uC9C0\uC815\uD569\uB2C8\uB2E4.\n\ \ \ \ -encoding : \uC8FC\uC11D \uCC98\uB9AC/javac \uD638\uCD9C\uC5D0 \uC0AC\uC6A9\uD560 \uC778\uCF54\uB529\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4. \n\ \ \ \ -episode : \uBCC4\uB3C4 \uCEF4\uD30C\uC77C\uC744 \uC704\uD574 episode \uD30C\uC77C\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n\ \ \ \ -version : \uBC84\uC804 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n\ \ \ \ -fullversion : \uC815\uC2DD \uBC84\uC804 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n\ \ \ \ -help : \uC774 \uC0AC\uC6A9\uBC95 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_pt_BR.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_pt_BR.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = {0} inesperado aparece na linha {1} coluna {2} + +BASEDIR_DOESNT_EXIST = Diret\u00F3rio n\u00E3o existente: {0} + +VERSION = gera\u00E7\u00E3o do esquema 2.3.0-SNAPSHOT + +FULLVERSION = vers\u00E3o completa da gera\u00E7\u00E3o do esquema "2.3.0-SNAPSHOT" + +USAGE = Uso: gera\u00E7\u00E3o do esquema [-options ...] \nOp\u00E7\u00F5es: \n\\ \\ \\ \\ -d : especificar onde colocar o processador e os arquivos da classe gerados por javac\n\\ \\ \\ \\ -cp : especificar onde localizar arquivos especificados pelo usu\u00E1rio\n\\ \\ \\ \\ -classpath : especificar onde localizar os arquivos especificados pelo usu\u00E1rio\n\\ \\ \\ \\ -encoding : especificar codifica\u00E7\u00E3o a ser usada para processamento de anota\u00E7\u00E3o/chamada javac \n\\ \\ \\ \\ -episode : gerar arquivo do epis\u00F3dio para compila\u00E7\u00E3o separada\n\\ \\ \\ \\ -version : exibir informa\u00E7\u00F5es da vers\u00E3o\n\\ \\ \\ \\ -fullversion : exibir informa\u00E7\u00F5es da vers\u00E3o completa\n\\ \\ \\ \\ -help : exibir esta mensagem de uso diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_zh_CN.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_zh_CN.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = \u5728\u7B2C {1} \u884C, \u7B2C {2} \u5217\u51FA\u73B0\u610F\u5916\u7684{0} + +BASEDIR_DOESNT_EXIST = \u4E0D\u5B58\u5728\u7684\u76EE\u5F55: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = schemagen \u5B8C\u6574\u7248\u672C "2.3.0-SNAPSHOT" + +USAGE = \u7528\u6CD5: schemagen [-options ...] \n\u9009\u9879: \n\ \ \ \ -d : \u6307\u5B9A\u653E\u7F6E\u5904\u7406\u7A0B\u5E8F\u548C javac \u751F\u6210\u7684\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n\ \ \ \ -cp : \u6307\u5B9A\u67E5\u627E\u7528\u6237\u6307\u5B9A\u6587\u4EF6\u7684\u4F4D\u7F6E\n\ \ \ \ -classpath : \u6307\u5B9A\u67E5\u627E\u7528\u6237\u6307\u5B9A\u6587\u4EF6\u7684\u4F4D\u7F6E\n\ \ \ \ -encoding : \u6307\u5B9A\u7528\u4E8E\u6CE8\u91CA\u5904\u7406/javac \u8C03\u7528\u7684\u7F16\u7801\n\ \ \ \ -episode : \u751F\u6210\u7247\u6BB5\u6587\u4EF6\u4EE5\u4F9B\u5355\u72EC\u7F16\u8BD1\n\ \ \ \ -version : \u663E\u793A\u7248\u672C\u4FE1\u606F\n\ \ \ \ -fullversion : \u663E\u793A\u5B8C\u6574\u7684\u7248\u672C\u4FE1\u606F\n\ \ \ \ -help : \u663E\u793A\u6B64\u7528\u6CD5\u6D88\u606F diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_zh_TW.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/MessageBundle_zh_TW.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,34 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +UNEXPECTED_NGCC_TOKEN = \u672A\u9810\u671F\u7684 {0} \u986F\u793A\u65BC\u884C {1} \u8CC7\u6599\u6B04 {2} + +BASEDIR_DOESNT_EXIST = \u4E0D\u5B58\u5728\u7684\u76EE\u9304: {0} + +VERSION = schemagen 2.3.0-SNAPSHOT + +FULLVERSION = schemagen \u5B8C\u6574\u7248\u672C "2.3.0-SNAPSHOT" + +USAGE = \u7528\u6CD5: schemagen [-options ...] \n\u9078\u9805: \n\\ \\ \\ \\ -d : \u6307\u5B9A\u8655\u7406\u5668\u4EE5\u53CA javac \u7522\u751F\u7684\u985E\u5225\u6A94\u6848\u653E\u7F6E\u4F4D\u7F6E\n\\ \\ \\ \\ -cp : \u6307\u5B9A\u8981\u5C0B\u627E\u4F7F\u7528\u8005\u6307\u5B9A\u6A94\u6848\u7684\u4F4D\u7F6E\n\\ \\ \\ \\ -classpath : \u6307\u5B9A\u8981\u5C0B\u627E\u4F7F\u7528\u8005\u6307\u5B9A\u6A94\u6848\u7684\u4F4D\u7F6E\n\\ \\ \\ \\ -encoding : \u6307\u5B9A\u8981\u7528\u65BC\u8A3B\u89E3\u8655\u7406/javac \u547C\u53EB\u7684\u7DE8\u78BC \n\\ \\ \\ \\ -episode : \u7522\u751F\u7368\u7ACB\u7DE8\u8B6F\u7684\u4E8B\u4EF6 (episode) \u6A94\u6848\n\\ \\ \\ \\ -version : \u986F\u793A\u7248\u672C\u8CC7\u8A0A\n\\ \\ \\ \\ -fullversion : \u986F\u793A\u5B8C\u6574\u7248\u672C\u8CC7\u8A0A\n\\ \\ \\ \\ -help : \u986F\u793A\u6B64\u7528\u6CD5\u8A0A\u606F diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,33 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = \ + Directory "{0}" doesn't exist. + +UNRECOGNIZED_PARAMETER = \ + Unrecognized option {0} is not valid. + +OPERAND_MISSING = \ + Option "{0}" is missing an operand. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_de.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_de.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = Verzeichnis "{0}" ist nicht vorhanden. + +UNRECOGNIZED_PARAMETER = Unbekannte Option {0} ist nicht g\u00FCltig. + +OPERAND_MISSING = In Option "{0}" fehlt ein Operand. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_es.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_es.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = El directorio "{0}" no existe. + +UNRECOGNIZED_PARAMETER = La opci\u00F3n no reconocida {0} no es v\u00E1lida. + +OPERAND_MISSING = A la opci\u00F3n "{0}" le falta un operando. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_fr.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_fr.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = Le r\u00E9pertoire "{0}" n''existe pas. + +UNRECOGNIZED_PARAMETER = L''option {0} non reconnue n''est pas valide. + +OPERAND_MISSING = Un op\u00E9rande est manquant dans l''option "{0}". diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_it.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_it.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = La directory "{0}" non esiste. + +UNRECOGNIZED_PARAMETER = L''opzione non riconosciuta {0} non \u00E8 valida. + +OPERAND_MISSING = Operando mancante nell''opzione "{0}". diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_ja.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_ja.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA"{0}"\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 + +UNRECOGNIZED_PARAMETER = \u8A8D\u8B58\u3055\u308C\u306A\u3044\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306F\u7121\u52B9\u3067\u3059\u3002 + +OPERAND_MISSING = \u30AA\u30D7\u30B7\u30E7\u30F3"{0}"\u306B\u30AA\u30DA\u30E9\u30F3\u30C9\u304C\u3042\u308A\u307E\u305B\u3093\u3002 diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_ko.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_ko.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = "{0}" \uB514\uB809\uD1A0\uB9AC\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. + +UNRECOGNIZED_PARAMETER = \uC778\uC2DD\uD560 \uC218 \uC5C6\uB294 \uC635\uC158 {0}\uC740(\uB294) \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. + +OPERAND_MISSING = "{0}" \uC635\uC158\uC5D0 \uD53C\uC5F0\uC0B0\uC790\uAC00 \uB204\uB77D\uB418\uC5C8\uC2B5\uB2C8\uB2E4. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_pt_BR.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_pt_BR.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = O diret\u00F3rio "{0}" n\u00E3o existe. + +UNRECOGNIZED_PARAMETER = A op\u00E7\u00E3o {0} n\u00E3o reconhecida \u00E9 inv\u00E1lida. + +OPERAND_MISSING = A op\u00E7\u00E3o "{0}" n\u00E3o encontrou um operando. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_zh_CN.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_zh_CN.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = \u76EE\u5F55 "{0}" \u4E0D\u5B58\u5728\u3002 + +UNRECOGNIZED_PARAMETER = \u65E0\u6CD5\u8BC6\u522B\u7684\u9009\u9879{0}, \u8BE5\u9009\u9879\u65E0\u6548\u3002 + +OPERAND_MISSING = \u9009\u9879 "{0}" \u7F3A\u5C11\u64CD\u4F5C\u6570\u3002 diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_zh_TW.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/ap/MessageBundle_zh_TW.properties Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,30 @@ +# +# Copyright (c) 1997, 2016, 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. +# + +NON_EXISTENT_FILE = \u76EE\u9304 "{0}" \u4E0D\u5B58\u5728. + +UNRECOGNIZED_PARAMETER = \u7121\u6CD5\u8FA8\u8B58\u7684\u9078\u9805 {0} \u7121\u6548. + +OPERAND_MISSING = \u9078\u9805 "{0}" \u907A\u6F0F\u904B\u7B97\u5143. diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/model/CTypeRef.java --- a/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/model/CTypeRef.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/model/CTypeRef.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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,7 +68,6 @@ public CTypeRef(CNonElement type, XSElementDecl decl) { this(type, BGMBuilder.getName(decl),getSimpleTypeName(decl), decl.isNillable(), decl.getDefaultValue() ); - } public QName getTypeName() { @@ -100,10 +99,15 @@ */ private static QName resolveSimpleTypeName(XSType declType) { QName name = BGMBuilder.getName(declType); - if (name != null && !XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(name.getNamespaceURI())) - return resolveSimpleTypeName(declType.getBaseType()); - else - return name; + QName result = null; + if (name != null && !XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(name.getNamespaceURI())) { + result = resolveSimpleTypeName(declType.getBaseType()); + } else { + if ( !"anySimpleType".equals(declType.getName()) ) { + result = name; + } + } + return result; } public CTypeRef(CNonElement type, QName elementName, QName typeName, boolean nillable, XmlString defaultValue) { diff -r f74f056dc069 -r a090823529e7 jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/version.properties --- a/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/version.properties Mon Mar 07 18:49:02 2016 +0530 +++ b/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/version.properties Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2016, 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,4 +26,4 @@ build-id=2.3.0-SNAPSHOT build-version=JAX-WS RI 2.3.0-SNAPSHOT major-version=2.3.0 -svn-revision=ffaa49e66cc05e1bb2ddc103076a340dad5df997 +svn-revision=282759e2b822078de9ba78c743ed663541c16ead diff -r f74f056dc069 -r a090823529e7 jdk/.hgtags --- a/jdk/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -350,3 +350,4 @@ 55518739e399a1066c8613e19100d51b38d9f223 jdk-9+105 6e9ecae50b4e0d37483fb2719202eea5dca026a4 jdk-9+106 8701b2bb1d2e1b9abc2a9be0933993c7150a9dbe jdk-9+107 +42794e648cfe9fd67461dcbe8b7594241a84bcff jdk-9+108 diff -r f74f056dc069 -r a090823529e7 jdk/make/gendata/GendataHtml32dtd.gmk --- a/jdk/make/gendata/GendataHtml32dtd.gmk Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/make/gendata/GendataHtml32dtd.gmk Wed Jul 05 21:25:29 2017 +0200 @@ -30,6 +30,6 @@ $(call LogInfo, Generating HTML DTD file) $(MKDIR) -p $(@D) $(RM) $@ - ($(TOOL_DTDBUILDER) $(LOG_INFO) html32 > $@) || exit 1 + ($(TOOL_DTDBUILDER) html32 > $@) || exit 1 TARGETS += $(HTML32DTD) diff -r f74f056dc069 -r a090823529e7 jdk/make/gensrc/GensrcCLDR.gmk --- a/jdk/make/gensrc/GensrcCLDR.gmk Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/make/gensrc/GensrcCLDR.gmk Wed Jul 05 21:25:29 2017 +0200 @@ -30,7 +30,7 @@ GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.localedata CLDR_BASEMETAINFO_FILE := $(GENSRC_BASEDIR)/sun/util/cldr/CLDRBaseLocaleDataMetaInfo.java -CLDR_METAINFO_FILE := $(GENSRC_DIR)/sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo_jdk_localedata.java +CLDR_METAINFO_FILE := $(GENSRC_DIR)/sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.java CLDR_BASE_LOCALES := "en-US" diff -r f74f056dc069 -r a090823529e7 jdk/make/gensrc/GensrcMisc.gmk --- a/jdk/make/gensrc/GensrcMisc.gmk Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/make/gensrc/GensrcMisc.gmk Wed Jul 05 21:25:29 2017 +0200 @@ -25,11 +25,11 @@ ########################################################################################## # Install the launcher name, release version string, full version -# string and the runtime name into the Version.java file. +# string and the runtime name into the VersionProps.java file. $(eval $(call SetupTextFileProcessing, BUILD_VERSION_JAVA, \ - SOURCE_FILES := $(JDK_TOPDIR)/src/java.base/share/classes/sun/misc/Version.java.template, \ - OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/misc/Version.java, \ + SOURCE_FILES := $(JDK_TOPDIR)/src/java.base/share/classes/java/lang/VersionProps.java.template, \ + OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/java/lang/VersionProps.java, \ REPLACEMENTS := \ @@LAUNCHER_NAME@@ => $(LAUNCHER_NAME) ; \ @@RUNTIME_NAME@@ => $(RUNTIME_NAME) ; \ diff -r f74f056dc069 -r a090823529e7 jdk/make/mapfiles/libjava/mapfile-vers --- a/jdk/make/mapfiles/libjava/mapfile-vers Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/make/mapfiles/libjava/mapfile-vers Wed Jul 05 21:25:29 2017 +0200 @@ -268,8 +268,6 @@ Java_sun_reflect_Reflection_getCallerClass__; Java_sun_reflect_Reflection_getCallerClass__I; Java_sun_reflect_Reflection_getClassAccessFlags; - Java_sun_misc_Version_getJdkVersionInfo; - Java_sun_misc_Version_getJvmVersionInfo; Java_jdk_internal_misc_VM_latestUserDefinedLoader; Java_jdk_internal_misc_VM_getuid; Java_jdk_internal_misc_VM_geteuid; diff -r f74f056dc069 -r a090823529e7 jdk/make/src/classes/build/tools/module/boot.modules --- a/jdk/make/src/classes/build/tools/module/boot.modules Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/make/src/classes/build/tools/module/boot.modules Wed Jul 05 21:25:29 2017 +0200 @@ -22,6 +22,7 @@ jdk.deploy.osx jdk.httpserver jdk.jfr +jdk.jsobject jdk.net jdk.vm.cds jdk.vm.ci diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/DHKeyPairGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -43,7 +43,7 @@ *

  • By providing the size in bits of the prime modulus - * This will be used to create a prime modulus and base generator, which will * then be used to create the Diffie-Hellman key pair. The default size of the - * prime modulus is 1024 bits. + * prime modulus is 2048 bits. *
  • By providing a prime modulus and base generator * * @@ -68,7 +68,7 @@ public DHKeyPairGenerator() { super(); - initialize(1024, null); + initialize(2048, null); } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/com/sun/crypto/provider/DHParameterGenerator.java --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/DHParameterGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/DHParameterGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2016, 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 @@ -37,7 +37,7 @@ * *

    The Diffie-Hellman parameter generation accepts the size in bits of the * prime modulus and the size in bits of the random exponent as input. - * The size of the prime modulus defaults to 1024 bits. + * The size of the prime modulus defaults to 2048 bits. * * @author Jan Luehe * @@ -50,7 +50,7 @@ extends AlgorithmParameterGeneratorSpi { // The size in bits of the prime modulus - private int primeSize = 1024; + private int primeSize = 2048; // The size in bits of the random exponent (private value) private int exponentSize = 0; diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/PKCS12PBECipherCore.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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 @@ -50,6 +50,7 @@ private CipherCore cipher; private int blockSize; private int keySize; + private int keyLength; // in bits private String algo = null; private String pbeAlgo = null; private byte[] salt = null; @@ -166,16 +167,18 @@ throws NoSuchAlgorithmException { algo = symmCipherAlg; + keyLength = defKeySize * 8; if (algo.equals("RC4")) { - pbeAlgo = "PBEWithSHA1AndRC4_" + defKeySize * 8; + pbeAlgo = "PBEWithSHA1AndRC4_" + keyLength; } else { SymmetricCipher symmCipher = null; if (algo.equals("DESede")) { symmCipher = new DESedeCrypt(); pbeAlgo = "PBEWithSHA1AndDESede"; + keyLength = 112; // effective key length } else if (algo.equals("RC2")) { symmCipher = new RC2Crypt(); - pbeAlgo = "PBEWithSHA1AndRC2_" + defKeySize * 8; + pbeAlgo = "PBEWithSHA1AndRC2_" + keyLength; } else { throw new NoSuchAlgorithmException("No Cipher implementation " + "for PBEWithSHA1And" + algo); @@ -406,7 +409,7 @@ } int implGetKeySize(Key key) throws InvalidKeyException { - return keySize; + return keyLength; } byte[] implWrap(Key key) throws IllegalBlockSizeException, diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java --- a/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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,39 +133,62 @@ } /** - * This method has the same contract as ensureCapacity, but is - * never synchronized. + * For positive values of {@code minimumCapacity}, this method + * behaves like {@code ensureCapacity}, however it is never + * synchronized. + * If {@code minimumCapacity} is non positive due to numeric + * overflow, this method throws {@code OutOfMemoryError}. */ private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code - int capacity = value.length >> coder; - if (minimumCapacity - capacity > 0) { - expandCapacity(minimumCapacity); + int oldCapacity = value.length >> coder; + if (minimumCapacity - oldCapacity > 0) { + value = Arrays.copyOf(value, + newCapacity(minimumCapacity) << coder); } } /** - * This implements the expansion semantics of ensureCapacity with no - * size check or synchronization. + * The maximum size of array to allocate (unless necessary). + * Some VMs reserve some header words in an array. + * Attempts to allocate larger arrays may result in + * OutOfMemoryError: Requested array size exceeds VM limit */ - private void expandCapacity(int minimumCapacity) { - int newCapacity = (value.length >> coder) * 2 + 2; - if (newCapacity - minimumCapacity < 0) { - newCapacity = minimumCapacity; + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + /** + * Returns a capacity at least as large as the given minimum capacity. + * Returns the current capacity increased by the same amount + 2 if + * that suffices. + * Will not return a capacity greater than + * {@code (MAX_ARRAY_SIZE >> coder)} unless the given minimum capacity + * is greater than that. + * + * @param minCapacity the desired minimum capacity + * @throws OutOfMemoryError if minCapacity is less than zero or + * greater than (Integer.MAX_VALUE >> coder) + */ + private int newCapacity(int minCapacity) { + // overflow-conscious code + int oldCapacity = value.length >> coder; + int newCapacity = (oldCapacity << 1) + 2; + if (newCapacity - minCapacity < 0) { + newCapacity = minCapacity; } - if (newCapacity < 0) { - if (minimumCapacity < 0) {// overflow - throw new OutOfMemoryError(); - } - newCapacity = Integer.MAX_VALUE; + int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; + return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0) + ? hugeCapacity(minCapacity) + : newCapacity; + } + + private int hugeCapacity(int minCapacity) { + int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; + int UNSAFE_BOUND = Integer.MAX_VALUE >> coder; + if (UNSAFE_BOUND - minCapacity < 0) { // overflow + throw new OutOfMemoryError(); } - if (coder != LATIN1 && newCapacity > StringUTF16.MAX_LENGTH) { - if (minimumCapacity >= StringUTF16.MAX_LENGTH) { - throw new OutOfMemoryError(); - } - newCapacity = StringUTF16.MAX_LENGTH; - } - this.value = Arrays.copyOf(value, newCapacity << coder); + return (minCapacity > SAFE_BOUND) + ? minCapacity : SAFE_BOUND; } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/lang/System.java --- a/jdk/src/java.base/share/classes/java/lang/System.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/System.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2016, 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 @@ -1418,8 +1418,7 @@ * for the given {@code caller}. * * @param name the name of the logger. - * @param caller the class for which the logger is being requested; - * can be {@code null}. + * @param caller the class for which the logger is being requested. * * @return a {@link Logger logger} suitable for the given caller's * use. @@ -1831,7 +1830,7 @@ lineSeparator = props.getProperty("line.separator"); - sun.misc.Version.init(); + VersionProps.init(); FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/lang/VersionProps.java.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/VersionProps.java.template Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1999, 2016, 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 java.lang; + +import java.io.PrintStream; + +class VersionProps { + + + private static final String launcher_name = + "@@LAUNCHER_NAME@@"; + + private static final String java_version = + "@@VERSION_SHORT@@"; + + private static final String java_runtime_name = + "@@RUNTIME_NAME@@"; + + private static final String java_runtime_version = + "@@VERSION_STRING@@"; + + static { + init(); + } + + public static void init() { + System.setProperty("java.version", java_version); + System.setProperty("java.runtime.version", java_runtime_version); + System.setProperty("java.runtime.name", java_runtime_name); + } + + /** + * In case you were wondering this method is called by java -version. + * Sad that it prints to stderr; would be nicer if default printed on + * stdout. + */ + public static void print() { + print(System.err); + } + + /** + * This is the same as print except that it adds an extra line-feed + * at the end, typically used by the -showversion in the launcher + */ + public static void println() { + print(System.err); + System.err.println(); + } + + /** + * Give a stream, it will print version info on it. + */ + public static void print(PrintStream ps) { + boolean isHeadless = false; + + /* Report that we're running headless if the property is true */ + String headless = System.getProperty("java.awt.headless"); + if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) { + isHeadless = true; + } + + /* First line: platform version. */ + ps.println(launcher_name + " version \"" + java_version + "\""); + + /* Second line: runtime version (ie, libraries). */ + + String jdk_debug_level = System.getProperty("jdk.debug", "release"); + /* Debug level is not printed for "release" builds */ + if ("release".equals(jdk_debug_level)) { + jdk_debug_level = ""; + } else { + jdk_debug_level = jdk_debug_level + " "; + } + + ps.print(java_runtime_name + " (" + jdk_debug_level + "build " + java_runtime_version); + + if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) { + // embedded builds report headless state + ps.print(", headless"); + } + ps.println(')'); + + /* Third line: JVM information. */ + String java_vm_name = System.getProperty("java.vm.name"); + String java_vm_version = System.getProperty("java.vm.version"); + String java_vm_info = System.getProperty("java.vm.info"); + ps.println(java_vm_name + " (" + jdk_debug_level + "build " + java_vm_version + ", " + + java_vm_info + ")"); + } + +} \ No newline at end of file diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Wed Jul 05 21:25:29 2017 +0200 @@ -3268,12 +3268,17 @@ *

  • This list of types is called the "common prefix". * *

    - * Step 1B: Determine loop parameters.

      - *
    1. Examine init function parameter lists. - *
    2. Omitted init functions are deemed to have {@code null} parameter lists. - *
    3. All init function parameter lists must be effectively identical. - *
    4. The longest parameter list (which is necessarily unique) is called the "common suffix". + * Step 1B: Determine loop parameters.
        + *
      • If at least one init function is given,
          + *
        1. Examine init function parameter lists. + *
        2. Omitted init functions are deemed to have {@code null} parameter lists. + *
        3. All init function parameter lists must be effectively identical. + *
        4. The longest parameter list (which is necessarily unique) is called the "common suffix". *
        + *
      • If no init function is given,
          + *
        1. Examine the suffixes of the step, pred, and fini parameter lists, after removing the "common prefix". + *
        2. The longest of these suffixes is taken as the "common suffix". + *
      *

      * Step 1C: Determine loop return type.

        *
      1. Examine fini function return types, disregarding omitted fini functions. @@ -3286,9 +3291,6 @@ *
      2. Every non-omitted pred function must have a {@code boolean} return type. *
      *

      - * (Implementation Note: Steps 1A, 1B, 1C, 1D are logically independent of each other, and may be performed in any - * order.) - *

      * Step 2: Determine parameter lists.

        *
      1. The parameter list for the resulting loop handle will be the "common suffix". *
      2. The parameter list for init functions will be adjusted to the "common suffix". (Note that their parameter @@ -3375,10 +3377,10 @@ *
        {@code
              * // iterative implementation of the factorial function as a loop handle
              * static int one(int k) { return 1; }
        -     * int inc(int i, int acc, int k) { return i + 1; }
        -     * int mult(int i, int acc, int k) { return i * acc; }
        -     * boolean pred(int i, int acc, int k) { return i < k; }
        -     * int fin(int i, int acc, int k) { return acc; }
        +     * static int inc(int i, int acc, int k) { return i + 1; }
        +     * static int mult(int i, int acc, int k) { return i * acc; }
        +     * static boolean pred(int i, int acc, int k) { return i < k; }
        +     * static int fin(int i, int acc, int k) { return acc; }
              * // assume MH_one, MH_inc, MH_mult, MH_pred, and MH_fin are handles to the above methods
              * // null initializer for counter, should initialize to 0
              * MethodHandle[] counterClause = new MethodHandle[]{null, MH_inc};
        @@ -3436,9 +3438,7 @@
                         collect(Collectors.toList());
         
                 // Step 1B: determine loop parameters.
        -        final List> empty = new ArrayList<>();
        -        final List> commonSuffix = init.stream().filter(Objects::nonNull).map(MethodHandle::type).
        -                map(MethodType::parameterList).reduce((p, q) -> p.size() >= q.size() ? p : q).orElse(empty);
        +        final List> commonSuffix = buildCommonSuffix(init, step, pred, fini, commonPrefix.size());
                 checkLoop1b(init, commonSuffix);
         
                 // Step 1C: determine loop return type.
        @@ -3520,15 +3520,15 @@
              * @apiNote Example:
              * 
        {@code
              * // implement the zip function for lists as a loop handle
        -     * List initZip(Iterator a, Iterator b) { return new ArrayList<>(); }
        -     * boolean zipPred(List zip, Iterator a, Iterator b) { return a.hasNext() && b.hasNext(); }
        -     * List zipStep(List zip, Iterator a, Iterator b) {
        +     * static List initZip(Iterator a, Iterator b) { return new ArrayList<>(); }
        +     * static boolean zipPred(List zip, Iterator a, Iterator b) { return a.hasNext() && b.hasNext(); }
        +     * static List zipStep(List zip, Iterator a, Iterator b) {
              *   zip.add(a.next());
              *   zip.add(b.next());
              *   return zip;
              * }
              * // assume MH_initZip, MH_zipPred, and MH_zipStep are handles to the above methods
        -     * MethodHandle loop = MethodHandles.doWhileLoop(MH_initZip, MH_zipStep, MH_zipPred);
        +     * MethodHandle loop = MethodHandles.whileLoop(MH_initZip, MH_zipPred, MH_zipStep);
              * List a = Arrays.asList("a", "b", "c", "d");
              * List b = Arrays.asList("e", "f", "g", "h");
              * List zipped = Arrays.asList("a", "e", "b", "f", "c", "g", "d", "h");
        @@ -3594,9 +3594,9 @@
              * @apiNote Example:
              * 
        {@code
              * // int i = 0; while (i < limit) { ++i; } return i; => limit
        -     * int zero(int limit) { return 0; }
        -     * int step(int i, int limit) { return i + 1; }
        -     * boolean pred(int i, int limit) { return i < limit; }
        +     * static int zero(int limit) { return 0; }
        +     * static int step(int i, int limit) { return i + 1; }
        +     * static boolean pred(int i, int limit) { return i < limit; }
              * // assume MH_zero, MH_step, and MH_pred are handles to the above methods
              * MethodHandle loop = MethodHandles.doWhileLoop(MH_zero, MH_step, MH_pred);
              * assertEquals(23, loop.invoke(23));
        @@ -3664,8 +3664,8 @@
              * 
        {@code
              * // String s = "Lambdaman!"; for (int i = 0; i < 13; ++i) { s = "na " + s; } return s;
              * // => a variation on a well known theme
        -     * String start(String arg) { return arg; }
        -     * String step(int counter, String v, String arg) { return "na " + v; }
        +     * static String start(String arg) { return arg; }
        +     * static String step(int counter, String v, String arg) { return "na " + v; }
              * // assume MH_start and MH_step are handles to the two methods above
              * MethodHandle fit13 = MethodHandles.constant(int.class, 13);
              * MethodHandle loop = MethodHandles.countedLoop(fit13, MH_start, MH_step);
        @@ -3808,11 +3808,11 @@
              * @apiNote Example:
              * 
        {@code
              * // reverse a list
        -     * List reverseStep(String e, List r, List l) {
        +     * static List reverseStep(String e, List r, List l) {
              *   r.add(0, e);
              *   return r;
              * }
        -     * List newArrayList(List l) { return new ArrayList<>(); }
        +     * static List newArrayList(List l) { return new ArrayList<>(); }
              * // assume MH_reverseStep, MH_newArrayList are handles to the above methods
              * MethodHandle loop = MethodHandles.iteratedLoop(null, MH_newArrayList, MH_reverseStep);
              * List list = Arrays.asList("a", "b", "c", "d", "e");
        @@ -4084,6 +4084,21 @@
                 }
             }
         
        +    private static List> buildCommonSuffix(List init, List step, List pred, List fini, int cpSize) {
        +        final List> empty = List.of();
        +        final List nonNullInits = init.stream().filter(Objects::nonNull).collect(Collectors.toList());
        +        if (nonNullInits.isEmpty()) {
        +            final List> longest = Stream.of(step, pred, fini).flatMap(List::stream).filter(Objects::nonNull).
        +                    // take only those that can contribute to a common suffix because they are longer than the prefix
        +                    map(MethodHandle::type).filter(t -> t.parameterCount() > cpSize).map(MethodType::parameterList).
        +                    reduce((p, q) -> p.size() >= q.size() ? p : q).orElse(empty);
        +            return longest.size() == 0 ? empty : longest.subList(cpSize, longest.size());
        +        } else {
        +            return nonNullInits.stream().map(MethodHandle::type).map(MethodType::parameterList).
        +                    reduce((p, q) -> p.size() >= q.size() ? p : q).get();
        +        }
        +    }
        +
             private static void checkLoop1b(List init, List> commonSuffix) {
                 if (init.stream().filter(Objects::nonNull).map(MethodHandle::type).map(MethodType::parameterList).
                         anyMatch(pl -> !pl.equals(commonSuffix.subList(0, pl.size())))) {
        @@ -4109,8 +4124,10 @@
             }
         
             private static void checkLoop2(List step, List pred, List fini, List> commonParameterSequence) {
        +        final int cpSize = commonParameterSequence.size();
                 if (Stream.of(step, pred, fini).flatMap(List::stream).filter(Objects::nonNull).map(MethodHandle::type).
        -                map(MethodType::parameterList).anyMatch(pl -> !pl.equals(commonParameterSequence.subList(0, pl.size())))) {
        +                map(MethodType::parameterList).
        +                anyMatch(pl -> pl.size() > cpSize || !pl.equals(commonParameterSequence.subList(0, pl.size())))) {
                     throw newIllegalArgumentException("found non-effectively identical parameter type lists:\nstep: " + step +
                             "\npred: " + pred + "\nfini: " + fini + " (common parameter sequence: " + commonParameterSequence + ")");
                 }
        diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/net/DatagramSocketImpl.java
        --- a/jdk/src/java.base/share/classes/java/net/DatagramSocketImpl.java	Mon Mar 07 18:49:02 2016 +0530
        +++ b/jdk/src/java.base/share/classes/java/net/DatagramSocketImpl.java	Wed Jul 05 21:25:29 2017 +0200
        @@ -27,9 +27,7 @@
         
         import java.io.FileDescriptor;
         import java.io.IOException;
        -import java.io.InterruptedIOException;
         import java.util.Set;
        -import java.util.HashSet;
         
         /**
          * Abstract datagram and multicast socket implementation base class.
        @@ -352,32 +350,32 @@
                 }
             }
         
        -    private static final  Set> dgSocketOptions =
        -        new HashSet<>();
        +    private static final Set> dgSocketOptions;
         
        -    private static final  Set> mcSocketOptions =
        -        new HashSet<>();
        +    private static final Set> mcSocketOptions;
         
             static {
        -        dgSocketOptions.add(StandardSocketOptions.SO_SNDBUF);
        -        dgSocketOptions.add(StandardSocketOptions.SO_RCVBUF);
        -        dgSocketOptions.add(StandardSocketOptions.SO_REUSEADDR);
        -        dgSocketOptions.add(StandardSocketOptions.IP_TOS);
        +        dgSocketOptions = Set.of(StandardSocketOptions.SO_SNDBUF,
        +                                 StandardSocketOptions.SO_RCVBUF,
        +                                 StandardSocketOptions.SO_REUSEADDR,
        +                                 StandardSocketOptions.IP_TOS);
         
        -        mcSocketOptions.add(StandardSocketOptions.SO_SNDBUF);
        -        mcSocketOptions.add(StandardSocketOptions.SO_RCVBUF);
        -        mcSocketOptions.add(StandardSocketOptions.SO_REUSEADDR);
        -        mcSocketOptions.add(StandardSocketOptions.IP_TOS);
        -        mcSocketOptions.add(StandardSocketOptions.IP_MULTICAST_IF);
        -        mcSocketOptions.add(StandardSocketOptions.IP_MULTICAST_TTL);
        -        mcSocketOptions.add(StandardSocketOptions.IP_MULTICAST_LOOP);
        -    };
        +        mcSocketOptions = Set.of(StandardSocketOptions.SO_SNDBUF,
        +                                 StandardSocketOptions.SO_RCVBUF,
        +                                 StandardSocketOptions.SO_REUSEADDR,
        +                                 StandardSocketOptions.IP_TOS,
        +                                 StandardSocketOptions.IP_MULTICAST_IF,
        +                                 StandardSocketOptions.IP_MULTICAST_TTL,
        +                                 StandardSocketOptions.IP_MULTICAST_LOOP);
        +    }
         
             /**
              * Returns a set of SocketOptions supported by this impl
              * and by this impl's socket (DatagramSocket or MulticastSocket)
              *
              * @return a Set of SocketOptions
        +     *
        +     * @since 9
              */
             protected Set> supportedOptions() {
                 if (getDatagramSocket() instanceof MulticastSocket) {
        diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/net/SocketImpl.java
        --- a/jdk/src/java.base/share/classes/java/net/SocketImpl.java	Mon Mar 07 18:49:02 2016 +0530
        +++ b/jdk/src/java.base/share/classes/java/net/SocketImpl.java	Wed Jul 05 21:25:29 2017 +0200
        @@ -30,8 +30,6 @@
         import java.io.OutputStream;
         import java.io.FileDescriptor;
         import java.util.Set;
        -import java.util.HashSet;
        -import java.util.Collections;
         
         /**
          * The abstract class {@code SocketImpl} is a common superclass
        @@ -445,31 +443,31 @@
                 }
             }
         
        -    private static final  Set> socketOptions =
        -        new HashSet<>();
        +    private static final Set> socketOptions;
         
        -    private static final  Set> serverSocketOptions =
        -        new HashSet<>();
        +    private static final Set> serverSocketOptions;
         
             static {
        -        socketOptions.add(StandardSocketOptions.SO_KEEPALIVE);
        -        socketOptions.add(StandardSocketOptions.SO_SNDBUF);
        -        socketOptions.add(StandardSocketOptions.SO_RCVBUF);
        -        socketOptions.add(StandardSocketOptions.SO_REUSEADDR);
        -        socketOptions.add(StandardSocketOptions.SO_LINGER);
        -        socketOptions.add(StandardSocketOptions.IP_TOS);
        -        socketOptions.add(StandardSocketOptions.TCP_NODELAY);
        +        socketOptions = Set.of(StandardSocketOptions.SO_KEEPALIVE,
        +                               StandardSocketOptions.SO_SNDBUF,
        +                               StandardSocketOptions.SO_RCVBUF,
        +                               StandardSocketOptions.SO_REUSEADDR,
        +                               StandardSocketOptions.SO_LINGER,
        +                               StandardSocketOptions.IP_TOS,
        +                               StandardSocketOptions.TCP_NODELAY);
         
        -        serverSocketOptions.add(StandardSocketOptions.SO_RCVBUF);
        -        serverSocketOptions.add(StandardSocketOptions.SO_REUSEADDR);
        -        serverSocketOptions.add(StandardSocketOptions.IP_TOS);
        -    };
        +        serverSocketOptions = Set.of(StandardSocketOptions.SO_RCVBUF,
        +                                     StandardSocketOptions.SO_REUSEADDR,
        +                                     StandardSocketOptions.IP_TOS);
        +    }
         
             /**
              * Returns a set of SocketOptions supported by this impl
              * and by this impl's socket (Socket or ServerSocket)
              *
              * @return a Set of SocketOptions
        +     *
        +     * @since 9
              */
             protected Set> supportedOptions() {
                 if (getSocket() != null) {
        diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/nio/Bits.java
        --- a/jdk/src/java.base/share/classes/java/nio/Bits.java	Mon Mar 07 18:49:02 2016 +0530
        +++ b/jdk/src/java.base/share/classes/java/nio/Bits.java	Wed Jul 05 21:25:29 2017 +0200
        @@ -736,202 +736,9 @@
                 });
             }
         
        -    // -- Bulk get/put acceleration --
        -
             // These numbers represent the point at which we have empirically
             // determined that the average cost of a JNI call exceeds the expense
             // of an element by element copy.  These numbers may change over time.
             static final int JNI_COPY_TO_ARRAY_THRESHOLD   = 6;
             static final int JNI_COPY_FROM_ARRAY_THRESHOLD = 6;
        -
        -    // This number limits the number of bytes to copy per call to Unsafe's
        -    // copyMemory method. A limit is imposed to allow for safepoint polling
        -    // during a large copy
        -    static final long UNSAFE_COPY_THRESHOLD = 1024L * 1024L;
        -
        -    // These methods do no bounds checking.  Verification that the copy will not
        -    // result in memory corruption should be done prior to invocation.
        -    // All positions and lengths are specified in bytes.
        -
        -    /**
        -     * Copy from given source array to destination address.
        -     *
        -     * @param   src
        -     *          source array
        -     * @param   srcBaseOffset
        -     *          offset of first element of storage in source array
        -     * @param   srcPos
        -     *          offset within source array of the first element to read
        -     * @param   dstAddr
        -     *          destination address
        -     * @param   length
        -     *          number of bytes to copy
        -     */
        -    static void copyFromArray(Object src, long srcBaseOffset, long srcPos,
        -                              long dstAddr, long length)
        -    {
        -        long offset = srcBaseOffset + srcPos;
        -        while (length > 0) {
        -            long size = (length > UNSAFE_COPY_THRESHOLD) ? UNSAFE_COPY_THRESHOLD : length;
        -            unsafe.copyMemory(src, offset, null, dstAddr, size);
        -            length -= size;
        -            offset += size;
        -            dstAddr += size;
        -        }
        -    }
        -
        -    /**
        -     * Copy from source address into given destination array.
        -     *
        -     * @param   srcAddr
        -     *          source address
        -     * @param   dst
        -     *          destination array
        -     * @param   dstBaseOffset
        -     *          offset of first element of storage in destination array
        -     * @param   dstPos
        -     *          offset within destination array of the first element to write
        -     * @param   length
        -     *          number of bytes to copy
        -     */
        -    static void copyToArray(long srcAddr, Object dst, long dstBaseOffset, long dstPos,
        -                            long length)
        -    {
        -        long offset = dstBaseOffset + dstPos;
        -        while (length > 0) {
        -            long size = (length > UNSAFE_COPY_THRESHOLD) ? UNSAFE_COPY_THRESHOLD : length;
        -            unsafe.copyMemory(null, srcAddr, dst, offset, size);
        -            length -= size;
        -            srcAddr += size;
        -            offset += size;
        -        }
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 16 bit elements from a heap array to off-heap memory
        -     *
        -     * @param src
        -     *        the source array, must be a 16-bit primitive array type
        -     * @param srcPos
        -     *        byte offset within source array of the first element to read
        -     * @param dstAddr
        -     *        destination address
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyFromCharArray(Object src, long srcPos, long dstAddr, long length) {
        -        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 2);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 16 bit elements from off-heap memory to a heap array
        -     *
        -     * @param srcAddr
        -     *        source address
        -     * @param dst
        -     *        destination array, must be a 16-bit primitive array type
        -     * @param dstPos
        -     *        byte offset within the destination array of the first element to write
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyToCharArray(long srcAddr, Object dst, long dstPos, long length) {
        -        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 2);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 16 bit elements from a heap array to off-heap memory
        -     *
        -     * @param src
        -     *        the source array, must be a 16-bit primitive array type
        -     * @param srcPos
        -     *        byte offset within source array of the first element to read
        -     * @param dstAddr
        -     *        destination address
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyFromShortArray(Object src, long srcPos, long dstAddr, long length) {
        -        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 2);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 16 bit elements from off-heap memory to a heap array
        -     *
        -     * @param srcAddr
        -     *        source address
        -     * @param dst
        -     *        destination array, must be a 16-bit primitive array type
        -     * @param dstPos
        -     *        byte offset within the destination array of the first element to write
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyToShortArray(long srcAddr, Object dst, long dstPos, long length) {
        -        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 2);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 32 bit elements from a heap array to off-heap memory
        -     *
        -     * @param src
        -     *        the source array, must be a 32-bit primitive array type
        -     * @param srcPos
        -     *        byte offset within source array of the first element to read
        -     * @param dstAddr
        -     *        destination address
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyFromIntArray(Object src, long srcPos, long dstAddr, long length) {
        -        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 4);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 32 bit elements from off-heap memory to a heap array
        -     *
        -     * @param srcAddr
        -     *        source address
        -     * @param dst
        -     *        destination array, must be a 32-bit primitive array type
        -     * @param dstPos
        -     *        byte offset within the destination array of the first element to write
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyToIntArray(long srcAddr, Object dst, long dstPos, long length) {
        -        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 4);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 64 bit elements from a heap array to off-heap memory
        -     *
        -     * @param src
        -     *        the source array, must be a 64-bit primitive array type
        -     * @param srcPos
        -     *        byte offset within source array of the first element to read
        -     * @param dstAddr
        -     *        destination address
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyFromLongArray(Object src, long srcPos, long dstAddr, long length) {
        -        unsafe.copySwapMemory(src, unsafe.arrayBaseOffset(src.getClass()) + srcPos, null, dstAddr, length, 8);
        -    }
        -
        -    /**
        -     * Copy and unconditionally byte swap 64 bit elements from off-heap memory to a heap array
        -     *
        -     * @param srcAddr
        -     *        source address
        -     * @param dst
        -     *        destination array, must be a 64-bit primitive array type
        -     * @param dstPos
        -     *        byte offset within the destination array of the first element to write
        -     * @param length
        -     *        number of bytes to copy
        -     */
        -    static void copyToLongArray(long srcAddr, Object dst, long dstPos, long length) {
        -        unsafe.copySwapMemory(null, srcAddr, dst, unsafe.arrayBaseOffset(dst.getClass()) + dstPos, length, 8);
        -    }
         }
        diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template
        --- a/jdk/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template	Mon Mar 07 18:49:02 2016 +0530
        +++ b/jdk/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template	Wed Jul 05 21:25:29 2017 +0200
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2000, 2016, 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
        @@ -270,16 +270,22 @@
                     if (length > rem)
                         throw new BufferUnderflowException();
         
        +            long dstOffset = arrayBaseOffset + ((long)offset << $LG_BYTES_PER_VALUE$);
         #if[!byte]
                     if (order() != ByteOrder.nativeOrder())
        -                Bits.copyTo$Memtype$Array(ix(pos), dst,
        -                                          (long)offset << $LG_BYTES_PER_VALUE$,
        -                                          (long)length << $LG_BYTES_PER_VALUE$);
        +                unsafe.copySwapMemory(null,
        +                                      ix(pos),
        +                                      dst,
        +                                      dstOffset,
        +                                      (long)length << $LG_BYTES_PER_VALUE$,
        +                                      (long)1 << $LG_BYTES_PER_VALUE$);
                     else
         #end[!byte]
        -                Bits.copyToArray(ix(pos), dst, arrayBaseOffset,
        -                                 (long)offset << $LG_BYTES_PER_VALUE$,
        -                                 (long)length << $LG_BYTES_PER_VALUE$);
        +                unsafe.copyMemory(null,
        +                                  ix(pos),
        +                                  dst,
        +                                  dstOffset,
        +                                  (long)length << $LG_BYTES_PER_VALUE$);
                     position(pos + length);
                 } else {
                     super.get(dst, offset, length);
        @@ -362,18 +368,22 @@
                     if (length > rem)
                         throw new BufferOverflowException();
         
        +            long srcOffset = arrayBaseOffset + ((long)offset << $LG_BYTES_PER_VALUE$);
         #if[!byte]
                     if (order() != ByteOrder.nativeOrder())
        -                Bits.copyFrom$Memtype$Array(src,
        -                                            (long)offset << $LG_BYTES_PER_VALUE$,
        -                                            ix(pos),
        -                                            (long)length << $LG_BYTES_PER_VALUE$);
        +                unsafe.copySwapMemory(src,
        +                                      srcOffset,
        +                                      null,
        +                                      ix(pos),
        +                                      (long)length << $LG_BYTES_PER_VALUE$,
        +                                      (long)1 << $LG_BYTES_PER_VALUE$);
                     else
         #end[!byte]
        -                Bits.copyFromArray(src, arrayBaseOffset,
        -                                   (long)offset << $LG_BYTES_PER_VALUE$,
        -                                   ix(pos),
        -                                   (long)length << $LG_BYTES_PER_VALUE$);
        +                unsafe.copyMemory(src,
        +                                  srcOffset,
        +                                  null,
        +                                  ix(pos),
        +                                  (long)length << $LG_BYTES_PER_VALUE$);
                     position(pos + length);
                 } else {
                     super.put(src, offset, length);
        diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/security/KeyPairGenerator.java
        --- a/jdk/src/java.base/share/classes/java/security/KeyPairGenerator.java	Mon Mar 07 18:49:02 2016 +0530
        +++ b/jdk/src/java.base/share/classes/java/security/KeyPairGenerator.java	Wed Jul 05 21:25:29 2017 +0200
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 1997, 2016, 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
        @@ -71,7 +71,7 @@
          * associated with each of the keys.
          *
          * 

        If the algorithm is the DSA algorithm, and the keysize (modulus - * size) is 512, 768, or 1024, then the Sun provider uses a set of + * size) is 512, 768, 1024, or 2048, then the Sun provider uses a set of * precomputed values for the {@code p}, {@code q}, and * {@code g} parameters. If the modulus size is not one of the above * values, the Sun provider creates a new set of parameters. Other @@ -96,7 +96,7 @@ * (via a call to an {@code initialize} method), each provider must * supply (and document) a default initialization. * For example, the Sun provider uses a default modulus size (keysize) - * of 1024 bits. + * of 1024 bits for DSA key pairs. * *

        Note that this class is abstract and extends from * {@code KeyPairGeneratorSpi} for historical reasons. diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/SplittableRandom.java --- a/jdk/src/java.base/share/classes/java/util/SplittableRandom.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/SplittableRandom.java Wed Jul 05 21:25:29 2017 +0200 @@ -219,12 +219,20 @@ return seed += gamma; } + // IllegalArgumentException messages + static final String BAD_BOUND = "bound must be positive"; + static final String BAD_RANGE = "bound must be greater than origin"; + static final String BAD_SIZE = "size must be non-negative"; + /** * The seed generator for default constructors. */ - private static final AtomicLong defaultGen = new AtomicLong(initialSeed()); + private static final AtomicLong defaultGen + = new AtomicLong(mix64(System.currentTimeMillis()) ^ + mix64(System.nanoTime())); - private static long initialSeed() { + // at end of to survive static initialization circularity + static { if (java.security.AccessController.doPrivileged( new java.security.PrivilegedAction() { public Boolean run() { @@ -234,17 +242,10 @@ long s = (long)seedBytes[0] & 0xffL; for (int i = 1; i < 8; ++i) s = (s << 8) | ((long)seedBytes[i] & 0xffL); - return s; + defaultGen.set(s); } - return (mix64(System.currentTimeMillis()) ^ - mix64(System.nanoTime())); } - // IllegalArgumentException messages - static final String BAD_BOUND = "bound must be positive"; - static final String BAD_RANGE = "bound must be greater than origin"; - static final String BAD_SIZE = "size must be non-negative"; - /* * Internal versions of nextX methods used by streams, as well as * the public nextX(origin, bound) methods. These exist mainly to diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/concurrent/ThreadLocalRandom.java --- a/jdk/src/java.base/share/classes/java/util/concurrent/ThreadLocalRandom.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/concurrent/ThreadLocalRandom.java Wed Jul 05 21:25:29 2017 +0200 @@ -125,53 +125,6 @@ * but we provide identical statistical properties. */ - /** Generates per-thread initialization/probe field */ - private static final AtomicInteger probeGenerator = new AtomicInteger(); - - /** - * The next seed for default constructors. - */ - private static final AtomicLong seeder = new AtomicLong(initialSeed()); - - private static long initialSeed() { - if (java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Boolean run() { - return Boolean.getBoolean("java.util.secureRandomSeed"); - }})) { - byte[] seedBytes = java.security.SecureRandom.getSeed(8); - long s = (long)seedBytes[0] & 0xffL; - for (int i = 1; i < 8; ++i) - s = (s << 8) | ((long)seedBytes[i] & 0xffL); - return s; - } - return (mix64(System.currentTimeMillis()) ^ - mix64(System.nanoTime())); - } - - /** - * The seed increment. - */ - private static final long GAMMA = 0x9e3779b97f4a7c15L; - - /** - * The increment for generating probe values. - */ - private static final int PROBE_INCREMENT = 0x9e3779b9; - - /** - * The increment of seeder per new instance. - */ - private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL; - - // Constants from SplittableRandom - private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53) - private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24) - - /** Rarely-used holder for the second of a pair of Gaussians */ - private static final ThreadLocal nextLocalGaussian = - new ThreadLocal<>(); - private static long mix64(long z) { z = (z ^ (z >>> 33)) * 0xff51afd7ed558ccdL; z = (z ^ (z >>> 33)) * 0xc4ceb9fe1a85ec53L; @@ -194,9 +147,6 @@ initialized = true; // false during super() call } - /** The common ThreadLocalRandom */ - static final ThreadLocalRandom instance = new ThreadLocalRandom(); - /** * Initialize Thread fields for the current thread. Called only * when Thread.threadLocalRandomProbe is zero, indicating that a @@ -248,11 +198,6 @@ return (int)(mix64(nextSeed()) >>> (64 - bits)); } - // IllegalArgumentException messages - static final String BAD_BOUND = "bound must be positive"; - static final String BAD_RANGE = "bound must be greater than origin"; - static final String BAD_SIZE = "size must be non-negative"; - /** * The form of nextLong used by LongStream Spliterators. If * origin is greater than bound, acts as unbounded form of @@ -1050,6 +995,32 @@ return current(); } + // Static initialization + + /** + * The seed increment. + */ + private static final long GAMMA = 0x9e3779b97f4a7c15L; + + /** + * The increment for generating probe values. + */ + private static final int PROBE_INCREMENT = 0x9e3779b9; + + /** + * The increment of seeder per new instance. + */ + private static final long SEEDER_INCREMENT = 0xbb67ae8584caa73bL; + + // Constants from SplittableRandom + private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53) + private static final float FLOAT_UNIT = 0x1.0p-24f; // 1.0f / (1 << 24) + + // IllegalArgumentException messages + static final String BAD_BOUND = "bound must be positive"; + static final String BAD_RANGE = "bound must be greater than origin"; + static final String BAD_SIZE = "size must be non-negative"; + // Unsafe mechanics private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe(); private static final long SEED; @@ -1067,4 +1038,36 @@ throw new Error(e); } } + + /** Rarely-used holder for the second of a pair of Gaussians */ + private static final ThreadLocal nextLocalGaussian = + new ThreadLocal<>(); + + /** Generates per-thread initialization/probe field */ + private static final AtomicInteger probeGenerator = new AtomicInteger(); + + /** The common ThreadLocalRandom */ + static final ThreadLocalRandom instance = new ThreadLocalRandom(); + + /** + * The next seed for default constructors. + */ + private static final AtomicLong seeder + = new AtomicLong(mix64(System.currentTimeMillis()) ^ + mix64(System.nanoTime())); + + // at end of to survive static initialization circularity + static { + if (java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + public Boolean run() { + return Boolean.getBoolean("java.util.secureRandomSeed"); + }})) { + byte[] seedBytes = java.security.SecureRandom.getSeed(8); + long s = (long)seedBytes[0] & 0xffL; + for (int i = 1; i < 8; ++i) + s = (s << 8) | ((long)seedBytes[i] & 0xffL); + seeder.set(s); + } + } } diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/jar/JarFile.java --- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Wed Jul 05 21:25:29 2017 +0200 @@ -158,7 +158,7 @@ RUNTIME_VERSION = AccessController.doPrivileged( new PrivilegedAction() { public Integer run() { - Integer v = sun.misc.Version.jdkMajorVersion(); // fixme when JEP 223 Version integrated + Integer v = jdk.Version.current().major(); Integer i = Integer.getInteger("jdk.util.jar.version", v); i = i < 0 ? 0 : i; return i > v ? v : i; @@ -359,7 +359,7 @@ } private boolean runtimeVersionExists() { - int version = sun.misc.Version.jdkMajorVersion(); // fixme when JEP 223 integrated + int version = jdk.Version.current().major(); try { Release.valueOf(version); return true; @@ -893,11 +893,15 @@ } private JarEntry verifiableEntry(ZipEntry ze) { - if (!(ze instanceof JarFileEntry)) { - ze = getJarEntry(ze.getName()); + if (ze instanceof JarFileEntry) { + // assure the name and entry match for verification + return ((JarFileEntry)ze).reifiedEntry(); } - // assure the name and entry match for verification - return ze == null ? null : ((JarFileEntry)ze).reifiedEntry(); + ze = getJarEntry(ze.getName()); + if (ze instanceof JarFileEntry) { + return ((JarFileEntry)ze).reifiedEntry(); + } + return (JarEntry)ze; } // Statics for hand-coded Boyer-Moore search diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java --- a/jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/AbstractPipeline.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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 @@ -327,6 +327,8 @@ @Override @SuppressWarnings("unchecked") public S onClose(Runnable closeHandler) { + if (linkedOrConsumed) + throw new IllegalStateException(MSG_STREAM_LINKED); Objects.requireNonNull(closeHandler); Runnable existingHandler = sourceStage.sourceCloseAction; sourceStage.sourceCloseAction = diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java --- a/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/DoubleStream.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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 @@ -949,24 +949,100 @@ */ public static DoubleStream iterate(final double seed, final DoubleUnaryOperator f) { Objects.requireNonNull(f); - final PrimitiveIterator.OfDouble iterator = new PrimitiveIterator.OfDouble() { - double t = seed; + Spliterator.OfDouble spliterator = new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + double prev; + boolean started; @Override - public boolean hasNext() { + public boolean tryAdvance(DoubleConsumer action) { + Objects.requireNonNull(action); + double t; + if (started) + t = f.applyAsDouble(prev); + else { + t = seed; + started = true; + } + action.accept(prev = t); + return true; + } + }; + return StreamSupport.doubleStream(spliterator, false); + } + + /** + * Returns a sequential ordered {@code DoubleStream} produced by iterative + * application of a function to an initial element, conditioned on + * satisfying the supplied predicate. The stream terminates as soon as + * the predicate returns false. + * + *

        + * {@code DoubleStream.iterate} should produce the same sequence of + * elements as produced by the corresponding for-loop: + *

        {@code
        +     *     for (double index=seed; predicate.test(index); index = f.apply(index)) {
        +     *         ...
        +     *     }
        +     * }
        + * + *

        + * The resulting sequence may be empty if the predicate does not hold on + * the seed value. Otherwise the first element will be the supplied seed + * value, the next element (if present) will be the result of applying the + * function f to the seed value, and so on iteratively until the predicate + * indicates that the stream should terminate. + * + * @param seed the initial element + * @param predicate a predicate to apply to elements to determine when the + * stream must terminate. + * @param f a function to be applied to the previous element to produce + * a new element + * @return a new sequential {@code DoubleStream} + * @since 9 + */ + public static DoubleStream iterate(double seed, DoublePredicate predicate, DoubleUnaryOperator f) { + Objects.requireNonNull(f); + Objects.requireNonNull(predicate); + Spliterator.OfDouble spliterator = new Spliterators.AbstractDoubleSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + double prev; + boolean started, finished; + + @Override + public boolean tryAdvance(DoubleConsumer action) { + Objects.requireNonNull(action); + if (finished) + return false; + double t; + if (started) + t = f.applyAsDouble(prev); + else { + t = seed; + started = true; + } + if (!predicate.test(t)) { + finished = true; + return false; + } + action.accept(prev = t); return true; } @Override - public double nextDouble() { - double v = t; - t = f.applyAsDouble(t); - return v; + public void forEachRemaining(DoubleConsumer action) { + Objects.requireNonNull(action); + if (finished) + return; + finished = true; + double t = started ? f.applyAsDouble(prev) : seed; + while (predicate.test(t)) { + action.accept(t); + t = f.applyAsDouble(t); + } } }; - return StreamSupport.doubleStream(Spliterators.spliteratorUnknownSize( - iterator, - Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL), false); + return StreamSupport.doubleStream(spliterator, false); } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/IntStream.java --- a/jdk/src/java.base/share/classes/java/util/stream/IntStream.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/IntStream.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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 @@ -885,28 +885,104 @@ * @param seed the initial element * @param f a function to be applied to the previous element to produce * a new element - * @return A new sequential {@code IntStream} + * @return a new sequential {@code IntStream} */ public static IntStream iterate(final int seed, final IntUnaryOperator f) { Objects.requireNonNull(f); - final PrimitiveIterator.OfInt iterator = new PrimitiveIterator.OfInt() { - int t = seed; + Spliterator.OfInt spliterator = new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + int prev; + boolean started; @Override - public boolean hasNext() { + public boolean tryAdvance(IntConsumer action) { + Objects.requireNonNull(action); + int t; + if (started) + t = f.applyAsInt(prev); + else { + t = seed; + started = true; + } + action.accept(prev = t); + return true; + } + }; + return StreamSupport.intStream(spliterator, false); + } + + /** + * Returns a sequential ordered {@code IntStream} produced by iterative + * application of a function to an initial element, conditioned on + * satisfying the supplied predicate. The stream terminates as soon as + * the predicate returns false. + * + *

        + * {@code IntStream.iterate} should produce the same sequence of elements + * as produced by the corresponding for-loop: + *

        {@code
        +     *     for (int index=seed; predicate.test(index); index = f.apply(index)) {
        +     *         ...
        +     *     }
        +     * }
        + * + *

        + * The resulting sequence may be empty if the predicate does not hold on + * the seed value. Otherwise the first element will be the supplied seed + * value, the next element (if present) will be the result of applying the + * function f to the seed value, and so on iteratively until the predicate + * indicates that the stream should terminate. + * + * @param seed the initial element + * @param predicate a predicate to apply to elements to determine when the + * stream must terminate. + * @param f a function to be applied to the previous element to produce + * a new element + * @return a new sequential {@code IntStream} + * @since 9 + */ + public static IntStream iterate(int seed, IntPredicate predicate, IntUnaryOperator f) { + Objects.requireNonNull(f); + Objects.requireNonNull(predicate); + Spliterator.OfInt spliterator = new Spliterators.AbstractIntSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + int prev; + boolean started, finished; + + @Override + public boolean tryAdvance(IntConsumer action) { + Objects.requireNonNull(action); + if (finished) + return false; + int t; + if (started) + t = f.applyAsInt(prev); + else { + t = seed; + started = true; + } + if (!predicate.test(t)) { + finished = true; + return false; + } + action.accept(prev = t); return true; } @Override - public int nextInt() { - int v = t; - t = f.applyAsInt(t); - return v; + public void forEachRemaining(IntConsumer action) { + Objects.requireNonNull(action); + if (finished) + return; + finished = true; + int t = started ? f.applyAsInt(prev) : seed; + while (predicate.test(t)) { + action.accept(t); + t = f.applyAsInt(t); + } } }; - return StreamSupport.intStream(Spliterators.spliteratorUnknownSize( - iterator, - Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL), false); + return StreamSupport.intStream(spliterator, false); } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/LongStream.java --- a/jdk/src/java.base/share/classes/java/util/stream/LongStream.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/LongStream.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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 @@ -879,24 +879,100 @@ */ public static LongStream iterate(final long seed, final LongUnaryOperator f) { Objects.requireNonNull(f); - final PrimitiveIterator.OfLong iterator = new PrimitiveIterator.OfLong() { - long t = seed; + Spliterator.OfLong spliterator = new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + long prev; + boolean started; @Override - public boolean hasNext() { + public boolean tryAdvance(LongConsumer action) { + Objects.requireNonNull(action); + long t; + if (started) + t = f.applyAsLong(prev); + else { + t = seed; + started = true; + } + action.accept(prev = t); + return true; + } + }; + return StreamSupport.longStream(spliterator, false); + } + + /** + * Returns a sequential ordered {@code LongStream} produced by iterative + * application of a function to an initial element, conditioned on + * satisfying the supplied predicate. The stream terminates as soon as + * the predicate returns false. + * + *

        + * {@code LongStream.iterate} should produce the same sequence of elements + * as produced by the corresponding for-loop: + *

        {@code
        +     *     for (long index=seed; predicate.test(index); index = f.apply(index)) {
        +     *         ...
        +     *     }
        +     * }
        + * + *

        + * The resulting sequence may be empty if the predicate does not hold on + * the seed value. Otherwise the first element will be the supplied seed + * value, the next element (if present) will be the result of applying the + * function f to the seed value, and so on iteratively until the predicate + * indicates that the stream should terminate. + * + * @param seed the initial element + * @param predicate a predicate to apply to elements to determine when the + * stream must terminate. + * @param f a function to be applied to the previous element to produce + * a new element + * @return a new sequential {@code LongStream} + * @since 9 + */ + public static LongStream iterate(long seed, LongPredicate predicate, LongUnaryOperator f) { + Objects.requireNonNull(f); + Objects.requireNonNull(predicate); + Spliterator.OfLong spliterator = new Spliterators.AbstractLongSpliterator(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL) { + long prev; + boolean started, finished; + + @Override + public boolean tryAdvance(LongConsumer action) { + Objects.requireNonNull(action); + if (finished) + return false; + long t; + if (started) + t = f.applyAsLong(prev); + else { + t = seed; + started = true; + } + if (!predicate.test(t)) { + finished = true; + return false; + } + action.accept(prev = t); return true; } @Override - public long nextLong() { - long v = t; - t = f.applyAsLong(t); - return v; + public void forEachRemaining(LongConsumer action) { + Objects.requireNonNull(action); + if (finished) + return; + finished = true; + long t = started ? f.applyAsLong(prev) : seed; + while (predicate.test(t)) { + action.accept(t); + t = f.applyAsLong(t); + } } }; - return StreamSupport.longStream(Spliterators.spliteratorUnknownSize( - iterator, - Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL), false); + return StreamSupport.longStream(spliterator, false); } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/Stream.java --- a/jdk/src/java.base/share/classes/java/util/stream/Stream.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/Stream.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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 @@ -29,7 +29,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Comparator; -import java.util.Iterator; import java.util.Objects; import java.util.Optional; import java.util.Spliterator; @@ -1185,23 +1184,103 @@ */ public static Stream iterate(final T seed, final UnaryOperator f) { Objects.requireNonNull(f); - final Iterator iterator = new Iterator() { - @SuppressWarnings("unchecked") - T t = (T) Streams.NONE; + Spliterator spliterator = new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE) { + T prev; + boolean started; @Override - public boolean hasNext() { + public boolean tryAdvance(Consumer action) { + Objects.requireNonNull(action); + T t; + if (started) + t = f.apply(prev); + else { + t = seed; + started = true; + } + action.accept(prev = t); + return true; + } + }; + return StreamSupport.stream(spliterator, false); + } + + /** + * Returns a sequential ordered {@code Stream} produced by iterative + * application of a function to an initial element, conditioned on + * satisfying the supplied predicate. The stream terminates as soon as + * the predicate returns false. + * + *

        + * {@code Stream.iterate} should produce the same sequence of elements as + * produced by the corresponding for-loop: + *

        {@code
        +     *     for (T index=seed; predicate.test(index); index = f.apply(index)) {
        +     *         ...
        +     *     }
        +     * }
        + * + *

        + * The resulting sequence may be empty if the predicate does not hold on + * the seed value. Otherwise the first element will be the supplied seed + * value, the next element (if present) will be the result of applying the + * function f to the seed value, and so on iteratively until the predicate + * indicates that the stream should terminate. + * + * @param the type of stream elements + * @param seed the initial element + * @param predicate a predicate to apply to elements to determine when the + * stream must terminate. + * @param f a function to be applied to the previous element to produce + * a new element + * @return a new sequential {@code Stream} + * @since 9 + */ + public static Stream iterate(T seed, Predicate predicate, UnaryOperator f) { + Objects.requireNonNull(f); + Objects.requireNonNull(predicate); + Spliterator spliterator = new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, + Spliterator.ORDERED | Spliterator.IMMUTABLE) { + T prev; + boolean started, finished; + + @Override + public boolean tryAdvance(Consumer action) { + Objects.requireNonNull(action); + if (finished) + return false; + T t; + if (started) + t = f.apply(prev); + else { + t = seed; + started = true; + } + if (!predicate.test(t)) { + prev = null; + finished = true; + return false; + } + action.accept(prev = t); return true; } @Override - public T next() { - return t = (t == Streams.NONE) ? seed : f.apply(t); + public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); + if (finished) + return; + finished = true; + T t = started ? f.apply(prev) : seed; + prev = null; + while (predicate.test(t)) { + action.accept(t); + t = f.apply(t); + } } }; - return StreamSupport.stream(Spliterators.spliteratorUnknownSize( - iterator, - Spliterator.ORDERED | Spliterator.IMMUTABLE), false); + return StreamSupport.stream(spliterator, false); } /** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/java/util/stream/Streams.java --- a/jdk/src/java.base/share/classes/java/util/stream/Streams.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/java/util/stream/Streams.java Wed Jul 05 21:25:29 2017 +0200 @@ -49,14 +49,6 @@ } /** - * An object instance representing no value, that cannot be an actual - * data element of a stream. Used when processing streams that can contain - * {@code null} elements to distinguish between a {@code null} value and no - * value. - */ - static final Object NONE = new Object(); - - /** * An {@code int} range spliterator. */ static final class RangeIntSpliterator implements Spliterator.OfInt { diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/jdk/Version.java --- a/jdk/src/java.base/share/classes/jdk/Version.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/jdk/Version.java Wed Jul 05 21:25:29 2017 +0200 @@ -28,10 +28,10 @@ import java.math.BigInteger; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -208,11 +208,10 @@ + s + "'"); // $VNUM is a dot-separated list of integers of arbitrary length - version - = Collections.unmodifiableList( - Arrays.stream(m.group(VNUM_GROUP).split("\\.")) - .map(Integer::parseInt) - .collect(Collectors.toList())); + List list = new ArrayList<>(); + for (String i : m.group(VNUM_GROUP).split("\\.")) + list.add(Integer.parseInt(i)); + version = Collections.unmodifiableList(list); pre = Optional.ofNullable(m.group(PRE_GROUP)); diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java --- a/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java Wed Jul 05 21:25:29 2017 +0200 @@ -118,6 +118,8 @@ } public static JavaNetInetAddressAccess getJavaNetInetAddressAccess() { + if (javaNetInetAddressAccess == null) + unsafe.ensureClassInitialized(java.net.InetAddress.class); return javaNetInetAddressAccess; } diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/sun/misc/URLClassPath.java --- a/jdk/src/java.base/share/classes/sun/misc/URLClassPath.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/sun/misc/URLClassPath.java Wed Jul 05 21:25:29 2017 +0200 @@ -758,9 +758,13 @@ final URL url; try { - // add #runtime fragment to tell JarURLConnection to use - // runtime versioning if the underlying jar file is multi-release - url = new URL(getBaseURL(), ParseUtil.encodePath(name, false) + "#runtime"); + if (jar.isMultiRelease()) { + // add #runtime fragment to tell JarURLConnection to use + // runtime versioning if the underlying jar file is multi-release + url = new URL(getBaseURL(), ParseUtil.encodePath(name, false) + "#runtime"); + } else { + url = new URL(getBaseURL(), ParseUtil.encodePath(name, false)); + } if (check) { URLClassPath.check(url); } diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/sun/misc/Version.java.template --- a/jdk/src/java.base/share/classes/sun/misc/Version.java.template Mon Mar 07 18:49:02 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,268 +0,0 @@ -/* - * Copyright (c) 1999, 2015, 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.misc; -import java.io.PrintStream; - -public class Version { - - - private static final String launcher_name = - "@@LAUNCHER_NAME@@"; - - private static final String java_version = - "@@VERSION_SHORT@@"; - - private static final String java_runtime_name = - "@@RUNTIME_NAME@@"; - - private static final String java_runtime_version = - "@@VERSION_STRING@@"; - - static { - init(); - } - - public static void init() { - System.setProperty("java.version", java_version); - System.setProperty("java.runtime.version", java_runtime_version); - System.setProperty("java.runtime.name", java_runtime_name); - } - - private static boolean versionsInitialized = false; - private static int jvm_major_version = 0; - private static int jvm_minor_version = 0; - private static int jvm_security_version = 0; - private static int jvm_patch_version = 0; - private static int jvm_build_number = 0; - private static int jdk_major_version = 0; - private static int jdk_minor_version = 0; - private static int jdk_security_version = 0; - private static int jdk_patch_version = 0; - private static int jdk_build_number = 0; - - /** - * In case you were wondering this method is called by java -version. - * Sad that it prints to stderr; would be nicer if default printed on - * stdout. - */ - public static void print() { - print(System.err); - } - - /** - * This is the same as print except that it adds an extra line-feed - * at the end, typically used by the -showversion in the launcher - */ - public static void println() { - print(System.err); - System.err.println(); - } - - /** - * Give a stream, it will print version info on it. - */ - public static void print(PrintStream ps) { - boolean isHeadless = false; - - /* Report that we're running headless if the property is true */ - String headless = System.getProperty("java.awt.headless"); - if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) { - isHeadless = true; - } - - /* First line: platform version. */ - ps.println(launcher_name + " version \"" + java_version + "\""); - - /* Second line: runtime version (ie, libraries). */ - - String jdk_debug_level = System.getProperty("jdk.debug", "release"); - /* Debug level is not printed for "release" builds */ - if ("release".equals(jdk_debug_level)) { - jdk_debug_level = ""; - } else { - jdk_debug_level = jdk_debug_level + " "; - } - - ps.print(java_runtime_name + " (" + jdk_debug_level + "build " + java_runtime_version); - - if (java_runtime_name.indexOf("Embedded") != -1 && isHeadless) { - // embedded builds report headless state - ps.print(", headless"); - } - ps.println(')'); - - /* Third line: JVM information. */ - String java_vm_name = System.getProperty("java.vm.name"); - String java_vm_version = System.getProperty("java.vm.version"); - String java_vm_info = System.getProperty("java.vm.info"); - ps.println(java_vm_name + " (" + jdk_debug_level + "build " + java_vm_version + ", " + - java_vm_info + ")"); - } - - - /** - * Returns the major version of the running JVM. - * @return the major version of the running JVM - * @since 1.6 - */ - public static synchronized int jvmMajorVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jvm_major_version; - } - - /** - * Returns the minor version of the running JVM. - * @return the minor version of the running JVM - * @since 1.6 - */ - public static synchronized int jvmMinorVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jvm_minor_version; - } - - - /** - * Returns the security version of the running JVM. - * @return the security version of the running JVM - * @since 9 - */ - public static synchronized int jvmSecurityVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jvm_security_version; - } - - /** - * Returns the patch release version of the running JVM. - * @return the patch release version of the running JVM - * @since 9 - */ - public static synchronized int jvmPatchVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jvm_patch_version; - } - - /** - * Returns the build number of the running JVM. - * @return the build number of the running JVM - * @since 1.6 - */ - public static synchronized int jvmBuildNumber() { - if (!versionsInitialized) { - initVersions(); - } - return jvm_build_number; - } - - /** - * Returns the major version of the running JDK. - * @return the major version of the running JDK - * @since 1.6 - */ - public static synchronized int jdkMajorVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jdk_major_version; - } - - /** - * Returns the minor version of the running JDK. - * @return the minor version of the running JDK - * @since 1.6 - */ - public static synchronized int jdkMinorVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jdk_minor_version; - } - - /** - * Returns the security version of the running JDK. - * @return the security version of the running JDK - * @since 9 - */ - public static synchronized int jdkSecurityVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jdk_security_version; - } - - /** - * Returns the patch release version of the running JDK. - * @return the patch release version of the running JDK - * @since 9 - */ - public static synchronized int jdkPatchVersion() { - if (!versionsInitialized) { - initVersions(); - } - return jdk_patch_version; - } - - /** - * Returns the build number of the running JDK. - * @return the build number of the running JDK - * @since 1.6 - */ - public static synchronized int jdkBuildNumber() { - if (!versionsInitialized) { - initVersions(); - } - return jdk_build_number; - } - - private static synchronized void initVersions() { - if (versionsInitialized) { - return; - } - if (!getJvmVersionInfo()) { - throw new InternalError("Unable to obtain JVM version info"); - } - getJdkVersionInfo(); - versionsInitialized = true; - } - - // Gets the JVM version info if available and sets the jvm_*_version fields - // and its capabilities. - private static native boolean getJvmVersionInfo(); - private static native void getJdkVersionInfo(); -} - -// Help Emacs a little because this file doesn't end in .java. -// -// Local Variables: *** -// mode: java *** -// End: *** diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyPairGenerator.java --- a/jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyPairGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyPairGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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,7 +55,7 @@ public RSAKeyPairGenerator() { // initialize to default in case the app does not call initialize() - initialize(1024, null); + initialize(2048, null); } // initialize the generator. See JCA doc diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/conf/security/java.security --- a/jdk/src/java.base/share/conf/security/java.security Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/conf/security/java.security Wed Jul 05 21:25:29 2017 +0200 @@ -578,7 +578,7 @@ # # Example: # jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048 -jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768 +jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024 # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS) # processing in JSSE implementation. diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/native/libjava/Version.c --- a/jdk/src/java.base/share/native/libjava/Version.c Mon Mar 07 18:49:02 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2005, 2015, 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. - */ - -#include "jni.h" -#include "jni_util.h" -#include "jvm.h" -#include "jdk_util.h" - -#include "sun_misc_Version.h" - -static void setStaticIntField(JNIEnv* env, jclass cls, const char* name, jint value) -{ - jfieldID fid; - fid = (*env)->GetStaticFieldID(env, cls, name, "I"); - if (fid != 0) { - (*env)->SetStaticIntField(env, cls, fid, value); - } -} - -typedef void (JNICALL *GetJvmVersionInfo_fp)(JNIEnv*, jvm_version_info*, size_t); - -JNIEXPORT jboolean JNICALL -Java_sun_misc_Version_getJvmVersionInfo(JNIEnv *env, jclass cls) -{ - jvm_version_info info; - GetJvmVersionInfo_fp func_p; - - if (!JDK_InitJvmHandle()) { - JNU_ThrowInternalError(env, "Handle for JVM not found for symbol lookup"); - return JNI_FALSE; - } - func_p = (GetJvmVersionInfo_fp) JDK_FindJvmEntry("JVM_GetVersionInfo"); - if (func_p == NULL) { - return JNI_FALSE; - } - - (*func_p)(env, &info, sizeof(info)); - setStaticIntField(env, cls, "jvm_major_version", JVM_VERSION_MAJOR(info.jvm_version)); - JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); - setStaticIntField(env, cls, "jvm_minor_version", JVM_VERSION_MINOR(info.jvm_version)); - JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); - setStaticIntField(env, cls, "jvm_security_version", JVM_VERSION_SECURITY(info.jvm_version)); - JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); - setStaticIntField(env, cls, "jvm_build_number", JVM_VERSION_BUILD(info.jvm_version)); - JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); - setStaticIntField(env, cls, "jvm_patch_version", info.patch_version); - JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); - - return JNI_TRUE; -} - -JNIEXPORT void JNICALL -Java_sun_misc_Version_getJdkVersionInfo(JNIEnv *env, jclass cls) -{ - jdk_version_info info; - - JDK_GetVersionInfo0(&info, sizeof(info)); - setStaticIntField(env, cls, "jdk_major_version", JDK_VERSION_MAJOR(info.jdk_version)); - JNU_CHECK_EXCEPTION(env); - setStaticIntField(env, cls, "jdk_minor_version", JDK_VERSION_MINOR(info.jdk_version)); - JNU_CHECK_EXCEPTION(env); - setStaticIntField(env, cls, "jdk_security_version", JDK_VERSION_SECURITY(info.jdk_version)); - JNU_CHECK_EXCEPTION(env); - setStaticIntField(env, cls, "jdk_build_number", JDK_VERSION_BUILD(info.jdk_version)); - JNU_CHECK_EXCEPTION(env); - setStaticIntField(env, cls, "jdk_patch_version", info.patch_version); - JNU_CHECK_EXCEPTION(env); -} diff -r f74f056dc069 -r a090823529e7 jdk/src/java.base/share/native/libjli/java.c --- a/jdk/src/java.base/share/native/libjli/java.c Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.base/share/native/libjli/java.c Wed Jul 05 21:25:29 2017 +0200 @@ -1470,7 +1470,7 @@ jclass ver; jmethodID print; - NULL_CHECK(ver = FindBootStrapClass(env, "sun/misc/Version")); + NULL_CHECK(ver = FindBootStrapClass(env, "java/lang/VersionProps")); NULL_CHECK(print = (*env)->GetStaticMethodID(env, ver, (extraLF == JNI_TRUE) ? "println" : "print", diff -r f74f056dc069 -r a090823529e7 jdk/src/java.logging/share/classes/java/util/logging/Logger.java --- a/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Wed Jul 05 21:25:29 2017 +0200 @@ -839,6 +839,7 @@ * @param level One of the message level identifiers, e.g., SEVERE * @param msgSupplier A function, which when called, produces the * desired log message + * @since 1.8 */ public void log(Level level, Supplier msgSupplier) { if (!isLoggable(level)) { diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -46,7 +46,7 @@ // Supported by Microsoft Base, Strong and Enhanced Cryptographic Providers static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384 static final int KEY_SIZE_MAX = 16384; - private static final int KEY_SIZE_DEFAULT = 1024; + private static final int KEY_SIZE_DEFAULT = 2048; // size of the key to generate, KEY_SIZE_MIN <= keySize <= KEY_SIZE_MAX private int keySize; diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java --- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/SunMSCAPI.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -182,7 +182,7 @@ * Key Pair Generator engines */ attrs.clear(); - attrs.put("KeySize", "1024"); + attrs.put("KeySize", "16384"); putService(new ProviderService(p, "KeyPairGenerator", "RSA", "sun.security.mscapi.RSAKeyPairGenerator", null, attrs)); diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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 @@ -106,8 +106,15 @@ maxKeyLen = 2048; } } else { - // RSA, DH, and DSA - keySize = 1024; + if (algorithm.equals("DSA")) { + // keep default keysize at 1024 since larger keysizes may be + // incompatible with SHA1withDSA and SHA-2 Signature algs + // may not be supported by native pkcs11 implementations + keySize = 1024; + } else { + // RSA and DH + keySize = 2048; + } if ((minKeyLen == -1) || (minKeyLen < 512)) { minKeyLen = 512; } diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.jsobject/share/classes/jdk/internal/netscape/javascript/spi/JSObjectProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jsobject/share/classes/jdk/internal/netscape/javascript/spi/JSObjectProvider.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.netscape.javascript.spi; + +import java.applet.Applet; +import netscape.javascript.JSException; +import netscape.javascript.JSObject; + +public interface JSObjectProvider { + /** + * Return a JSObject for the window containing the given applet. + * Implementations of this class should return null if not connected to a + * browser, for example, when running in AppletViewer. + * + * @param applet The applet. + * @return JSObject for the window containing the given applet or null if we + * are not connected to a browser. + * @throws JSException when an error is encountered. + */ + public JSObject getWindow(Applet applet) throws JSException; +} diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.jsobject/share/classes/netscape/javascript/JSException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jsobject/share/classes/netscape/javascript/JSException.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006, 2016, 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 netscape.javascript; + +/** + * Thrown when an exception is raised in the JavaScript engine. This is merely + * a marker class to indicate an exception relating to the JavaScript + * interface. + */ +public class JSException extends RuntimeException { + private static final long serialVersionUID = 2778103758223661489L; + + /** + * Constructs a new JavaScript exception with null as it's detail message. + */ + public JSException() { + super(); + } + + /** + * Construct a new JavaScript exception with the specified detail message. + * + * @param s The detail message + */ + public JSException(String s) { + super(s); + } + + /** + * Construct a new JavaScript exception with the specified cause. + * + * @param t Throwable cause + */ + public JSException(Throwable t) { + super(t); + } +} diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.jsobject/share/classes/netscape/javascript/JSObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jsobject/share/classes/netscape/javascript/JSObject.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2006, 2016, 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 netscape.javascript; + +import jdk.internal.netscape.javascript.spi.JSObjectProvider; +import java.applet.Applet; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Iterator; +import java.util.ServiceLoader; + +/** + *

        + * Allows Java code to manipulate JavaScript objects. + *

        + * + *

        + * When a JavaScript object is passed or returned to Java code, it + * is wrapped in an instance of {@code JSObject}. When a + * {@code JSObject} instance is passed to the JavaScript engine, + * it is unwrapped back to its original JavaScript object. The + * {@code JSObject} class provides a way to invoke JavaScript + * methods and examine JavaScript properties. + *

        + * + *

        Any data returned from the JavaScript engine to Java is + * converted to Java data types. Certain data passed to the JavaScript + * engine is converted to JavaScript data types. + *

        + * + */ +public abstract class JSObject { + /** + * Constructs a new JSObject. Users should neither call this method nor + * subclass JSObject. + */ + protected JSObject() { + } + + /** + * Calls a JavaScript method. Equivalent to + * "this.methodName(args[0], args[1], ...)" in JavaScript. + * + * @param methodName The name of the JavaScript method to be invoked. + * @param args the Java objects passed as arguments to the method. + * @return Result of the method. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object call(String methodName, Object... args) throws JSException; + + /** + * Evaluates a JavaScript expression. The expression is a string of + * JavaScript source code which will be evaluated in the context given by + * "this". + * + * @param s The JavaScript expression. + * @return Result of the JavaScript evaluation. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object eval(String s) throws JSException; + + /** + * Retrieves a named member of a JavaScript object. Equivalent to + * "this.name" in JavaScript. + * + * @param name The name of the JavaScript property to be accessed. + * @return The value of the propery. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object getMember(String name) throws JSException; + + /** + * Sets a named member of a JavaScript object. Equivalent to + * "this.name = value" in JavaScript. + * + * @param name The name of the JavaScript property to be accessed. + * @param value The value of the propery. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void setMember(String name, Object value) throws JSException; + + /** + * Removes a named member of a JavaScript object. Equivalent + * to "delete this.name" in JavaScript. + * + * @param name The name of the JavaScript property to be removed. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void removeMember(String name) throws JSException; + + /** + * Retrieves an indexed member of a JavaScript object. Equivalent to + * "this[index]" in JavaScript. + * + * @param index The index of the array to be accessed. + * @return The value of the indexed member. + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract Object getSlot(int index) throws JSException; + + /** + * Sets an indexed member of a JavaScript object. Equivalent to + * "this[index] = value" in JavaScript. + * + * @param index The index of the array to be accessed. + * @param value The value to set + * @throws JSException when an error is reported from the browser or + * JavaScript engine. + */ + public abstract void setSlot(int index, Object value) throws JSException; + + /** + * Returns a JSObject for the window containing the given applet. This + * method only works when the Java code is running in a browser as an + * applet. The object returned may be used to access the HTML DOM directly. + * + * @param applet The applet. + * @return JSObject representing the window containing the given applet or + * {@code null} if we are not connected to a browser. + * @throws JSException when an error is reported from the browser or + * JavaScript engine or if applet is {@code null} + */ + public static JSObject getWindow(Applet applet) throws JSException { + return ProviderLoader.callGetWindow(applet); + } + + private static class ProviderLoader { + private static final JSObjectProvider provider; + + static { + provider = AccessController.doPrivileged( + new PrivilegedAction<>() { + @Override + public JSObjectProvider run() { + Iterator providers = + ServiceLoader.loadInstalled(JSObjectProvider.class).iterator(); + if (providers.hasNext()) { + return providers.next(); + } + return null; + } + } + ); + } + + private static JSObject callGetWindow(Applet applet) { + if (provider != null) { + return provider.getWindow(applet); + } + return null; + } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jsobject/share/classes/netscape/javascript/package-info.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2008, 2016, 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. + */ + +/** + *

        + * Provides Java code the ability to access the JavaScript engine and the + * HTML DOM in the web browser. + *

        + * + *

        + * The classes in this package were initially specified by Netscape, and are the + * de facto standard mechanism for calling JavaScript from the Java runtime. + *

        + */ + +package netscape.javascript; diff -r f74f056dc069 -r a090823529e7 jdk/test/TEST.groups --- a/jdk/test/TEST.groups Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/TEST.groups Wed Jul 05 21:25:29 2017 +0200 @@ -28,7 +28,6 @@ tier1 = \ :jdk_lang \ -java/lang/ProcessHandle/TreeTest.java \ - -java/util/zip/TestLocalTime.java \ :jdk_util \ -java/util/WeakHashMap/GCDuringIteration.java \ -java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ @@ -40,7 +39,6 @@ tier2 = \ java/lang/ProcessHandle/TreeTest.java \ - java/util/zip/TestLocalTime.java \ java/util/WeakHashMap/GCDuringIteration.java \ java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ java/util/concurrent/forkjoin/FJExceptionTableLeak.java \ diff -r f74f056dc069 -r a090823529e7 jdk/test/com/sun/crypto/provider/Cipher/PBE/CheckPBEKeySize.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/crypto/provider/Cipher/PBE/CheckPBEKeySize.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016, 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 8151149 + * @modules java.base/com.sun.crypto.provider + */ + +import java.lang.reflect.*; +import java.security.*; +import javax.crypto.*; +import javax.crypto.spec.*; +import com.sun.crypto.provider.*; + +public class CheckPBEKeySize { + + private static final String ALGO = "PBEWithSHA1AndDESede"; + private static final int KEYSIZE = 112; // Triple DES effective key size + + public static final void main(String[] args) throws Exception { + + // Generate a PBE key + SecretKeyFactory skFac = SecretKeyFactory.getInstance("PBE"); + SecretKey skey = + skFac.generateSecret(new PBEKeySpec("test123".toCharArray())); + + // Initialize the PBE cipher + Cipher cipher = Cipher.getInstance(ALGO); + cipher.init(Cipher.ENCRYPT_MODE, skey); + + // Permit access to the Cipher.spi field (a CipherSpi object) + Field spi = Cipher.class.getDeclaredField("spi"); + spi.setAccessible(true); + Object value = spi.get(cipher); + + // Permit access to the CipherSpi.engineGetKeySize method + Method engineGetKeySize = + PKCS12PBECipherCore$PBEWithSHA1AndDESede.class + .getDeclaredMethod("engineGetKeySize", Key.class); + engineGetKeySize.setAccessible(true); + + // Check the key size + int keySize = (int) engineGetKeySize.invoke(value, skey); + if (keySize == KEYSIZE) { + System.out.println(ALGO + ".engineGetKeySize returns " + keySize + + " bits, as expected"); + System.out.println("OK"); + } else { + throw new Exception("ERROR: " + ALGO + " key size is incorrect"); + } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java --- a/jdk/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/com/sun/crypto/provider/KeyAgreement/TestExponentSize.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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 @@ -83,10 +83,10 @@ KeyPair kp; KeyPairGenerator kpg = KeyPairGenerator.getInstance("DH", "SunJCE"); - // Sun's default uses a default psize of 1024 and + // Sun's default uses a default psize of 2048 and // lsize of (pSize / 2) but at least 384 bits kp = kpg.generateKeyPair(); - checkKeyPair(kp, Sizes.ten24, Sizes.five12); + checkKeyPair(kp, Sizes.twenty48, Sizes.ten24); DHPublicKey publicKey = (DHPublicKey)kp.getPublic(); BigInteger p = publicKey.getParams().getP(); @@ -98,15 +98,15 @@ kpg.initialize(new DHParameterSpec(p, g, Sizes.ten24.getIntSize())); kp = kpg.generateKeyPair(); - checkKeyPair(kp, Sizes.ten24, Sizes.ten24); + checkKeyPair(kp, Sizes.twenty48, Sizes.ten24); kpg.initialize(new DHParameterSpec(p, g, Sizes.five12.getIntSize())); kp = kpg.generateKeyPair(); - checkKeyPair(kp, Sizes.ten24, Sizes.five12); + checkKeyPair(kp, Sizes.twenty48, Sizes.five12); kpg.initialize(new DHParameterSpec(p, g, Sizes.two56.getIntSize())); kp = kpg.generateKeyPair(); - checkKeyPair(kp, Sizes.ten24, Sizes.two56); + checkKeyPair(kp, Sizes.twenty48, Sizes.two56); kpg.initialize(Sizes.five12.getIntSize()); kp = kpg.generateKeyPair(); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/ProcessHandle/Basic.java --- a/jdk/test/java/lang/ProcessHandle/Basic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/ProcessHandle/Basic.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -37,7 +37,8 @@ /* * @test * @library /test/lib/share/classes - * @run testng InfoTest + * @modules jdk.management + * @run testng Basic * @summary Basic tests for ProcessHandler * @author Roger Riggs */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/ProcessHandle/InfoTest.java --- a/jdk/test/java/lang/ProcessHandle/InfoTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/ProcessHandle/InfoTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -49,6 +49,7 @@ * @test * @bug 8077350 8081566 8081567 8098852 8136597 * @library /test/lib/share/classes + * @modules jdk.management * @build jdk.test.lib.Platform jdk.test.lib.Utils * @run testng InfoTest * @summary Functions of ProcessHandle.Info @@ -114,9 +115,13 @@ long cpuLoopTime = 100; // 100 ms String[] extraArgs = {"pid", "parent", "stdin"}; JavaChild p1 = JavaChild.spawnJavaChild((Object[])extraArgs); - Instant afterStart = Instant.now(); + Instant afterStart = null; try (BufferedReader lines = p1.outputReader()) { + // Read the args line to know the subprocess has started + lines.readLine(); + afterStart = Instant.now(); + Duration lastCpu = Duration.ofMillis(0L); for (int j = 0; j < 10; j++) { @@ -126,8 +131,7 @@ // Read cputime from child Duration childCpuTime = null; // Read lines from the child until the result from cputime is returned - String s; - while ((s = lines.readLine()) != null) { + for (String s; (s = lines.readLine()) != null;) { String[] split = s.trim().split(" "); if (split.length == 3 && split[1].equals("cputime")) { long nanos = Long.valueOf(split[2]); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/ProcessHandle/OnExitTest.java --- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -39,6 +39,7 @@ /* * @test * @library /test/lib/share/classes + * @modules jdk.management * @build jdk.test.lib.Platform jdk.test.lib.Utils * @run testng OnExitTest * @summary Functions of Process.onExit and ProcessHandle.onExit diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/ProcessHandle/TreeTest.java --- a/jdk/test/java/lang/ProcessHandle/TreeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/ProcessHandle/TreeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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,6 +45,7 @@ /* * @test * @library /test/lib/share/classes + * @modules jdk.management * @build jdk.test.lib.Utils * @run testng/othervm TreeTest * @summary Test counting and JavaChild.spawning and counting of Processes. diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/StackWalker/StackStreamTest.java --- a/jdk/test/java/lang/StackWalker/StackStreamTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/StackWalker/StackStreamTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ * @test * @bug 8140450 * @summary Stack Stream Test + * @modules java.logging * @run main/othervm StackStreamTest */ public class StackStreamTest { diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/StringBuilder/Capacity.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/StringBuilder/Capacity.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2016, 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 8149330 + * @summary Basic set of tests of capacity management + * @run testng Capacity + */ + +import java.lang.reflect.Field; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.SplittableRandom; + +import org.testng.annotations.Test; +import org.testng.annotations.DataProvider; +import static org.testng.Assert.*; + +public class Capacity { + static final int DEFAULT_CAPACITY = 16; + + private static int newCapacity(int oldCapacity, + int desiredCapacity) + { + return Math.max(oldCapacity * 2 + 2, desiredCapacity); + } + + private static int nextNewCapacity(int oldCapacity) { + return newCapacity(oldCapacity, oldCapacity + 1); + } + + @Test(dataProvider = "singleChar") + public void defaultCapacity(Character ch) { + StringBuilder sb = new StringBuilder(); + assertEquals(sb.capacity(), DEFAULT_CAPACITY); + for (int i = 0; i < DEFAULT_CAPACITY; i++) { + sb.append(ch); + assertEquals(sb.capacity(), DEFAULT_CAPACITY); + } + sb.append(ch); + assertEquals(sb.capacity(), nextNewCapacity(DEFAULT_CAPACITY)); + } + + @Test(dataProvider = "charCapacity") + public void explicitCapacity(Character ch, int initCapacity) { + StringBuilder sb = new StringBuilder(initCapacity); + assertEquals(sb.capacity(), initCapacity); + for (int i = 0; i < initCapacity; i++) { + sb.append(ch); + assertEquals(sb.capacity(), initCapacity); + } + sb.append(ch); + assertEquals(sb.capacity(), nextNewCapacity(initCapacity)); + } + + @Test(dataProvider = "singleChar") + public void sbFromString(Character ch) { + String s = "string " + ch; + int expectedCapacity = s.length() + DEFAULT_CAPACITY; + StringBuilder sb = new StringBuilder(s); + assertEquals(sb.capacity(), expectedCapacity); + for (int i = 0; i < DEFAULT_CAPACITY; i++) { + sb.append(ch); + assertEquals(sb.capacity(), expectedCapacity); + } + sb.append(ch); + assertEquals(sb.capacity(), nextNewCapacity(expectedCapacity)); + } + + @Test(dataProvider = "singleChar") + public void sbFromCharSeq(Character ch) { + CharSequence cs = new MyCharSeq("char seq " + ch); + int expectedCapacity = cs.length() + DEFAULT_CAPACITY; + StringBuilder sb = new StringBuilder(cs); + assertEquals(sb.capacity(), expectedCapacity); + for (int i = 0; i < DEFAULT_CAPACITY; i++) { + sb.append(ch); + assertEquals(sb.capacity(), expectedCapacity); + } + sb.append(ch); + assertEquals(sb.capacity(), nextNewCapacity(expectedCapacity)); + } + + @Test(dataProvider = "charCapacity") + public void ensureCapacity(Character ch, int cap) { + StringBuilder sb = new StringBuilder(0); + assertEquals(sb.capacity(), 0); + sb.ensureCapacity(cap); // only has effect if cap > 0 + int newCap = (cap == 0) ? 0 : newCapacity(0, cap); + assertEquals(sb.capacity(), newCap); + sb.ensureCapacity(newCap + 1); + assertEquals(sb.capacity(), nextNewCapacity(newCap)); + sb.append(ch); + assertEquals(sb.capacity(), nextNewCapacity(newCap)); + } + + @Test(dataProvider = "negativeCapacity", + expectedExceptions = NegativeArraySizeException.class) + public void negativeInitialCapacity(int negCap) { + StringBuilder sb = new StringBuilder(negCap); + } + + @Test(dataProvider = "negativeCapacity") + public void ensureNegativeCapacity(int negCap) { + StringBuilder sb = new StringBuilder(); + sb.ensureCapacity(negCap); + assertEquals(sb.capacity(), DEFAULT_CAPACITY); + } + + @Test(dataProvider = "charCapacity") + public void trimToSize(Character ch, int cap) { + StringBuilder sb = new StringBuilder(cap); + int halfOfCap = cap / 2; + for (int i = 0; i < halfOfCap; i++) { + sb.append(ch); + } + sb.trimToSize(); + // according to the spec, capacity doesn't have to + // become exactly the size + assertTrue(sb.capacity() >= halfOfCap); + } + + @DataProvider + public Object[][] singleChar() { + return new Object[][] { {'J'}, {'\u042b'} }; + } + + @DataProvider + public Object[][] charCapacity() { + return new Object[][] { + {'J', 0}, + {'J', 1}, + {'J', 15}, + {'J', DEFAULT_CAPACITY}, + {'J', 1024}, + {'\u042b', 0}, + {'\u042b', 1}, + {'\u042b', 15}, + {'\u042b', DEFAULT_CAPACITY}, + {'\u042b', 1024}, + }; + } + + @DataProvider + public Object[][] negativeCapacity() { + return new Object[][] { {-1}, {Integer.MIN_VALUE} }; + } + + private static class MyCharSeq implements CharSequence { + private CharSequence s; + public MyCharSeq(CharSequence s) { this.s = s; } + public char charAt(int i) { return s.charAt(i); } + public int length() { return s.length(); } + public CharSequence subSequence(int st, int e) { + return s.subSequence(st, e); + } + public String toString() { return s.toString(); } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/StringBuilder/HugeCapacity.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/StringBuilder/HugeCapacity.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016, 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 8149330 + * @summary Capacity should not get close to Integer.MAX_VALUE unless + * necessary + * @run main/othervm -Xmx5G HugeCapacity + * @ignore This test has huge memory requirements + */ + +public class HugeCapacity { + private static int failures = 0; + + public static void main(String[] args) { + testLatin1(); + testUtf16(); + if (failures > 0) { + throw new RuntimeException(failures + " tests failed"); + } + } + + private static void testLatin1() { + try { + StringBuilder sb = new StringBuilder(); + sb.ensureCapacity(Integer.MAX_VALUE / 2); + sb.ensureCapacity(Integer.MAX_VALUE / 2 + 1); + } catch (OutOfMemoryError oom) { + oom.printStackTrace(); + failures++; + } + } + + private static void testUtf16() { + try { + StringBuilder sb = new StringBuilder(); + sb.append('\u042b'); + sb.ensureCapacity(Integer.MAX_VALUE / 4); + sb.ensureCapacity(Integer.MAX_VALUE / 4 + 1); + } catch (OutOfMemoryError oom) { + oom.printStackTrace(); + failures++; + } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/Logger/Level/LoggerLevelTest.java --- a/jdk/test/java/lang/System/Logger/Level/LoggerLevelTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/Logger/Level/LoggerLevelTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -30,6 +30,7 @@ * @bug 8140364 * @summary Tests System.Logger.Level names and severity. * @author danielfuchs + * @modules java.logging */ public class LoggerLevelTest { public static void main(String[] args) { diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/Logger/default/DefaultLoggerTest.java --- a/jdk/test/java/lang/System/Logger/default/DefaultLoggerTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/Logger/default/DefaultLoggerTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -56,7 +56,7 @@ * @summary Tests default loggers returned by System.getLogger, and in * particular the implementation of the the System.Logger method * performed by the default binding. - * + * @modules java.logging * @build DefaultLoggerTest AccessSystemLogger * @run driver AccessSystemLogger * @run main/othervm -Xbootclasspath/a:boot DefaultLoggerTest NOSECURITY diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java --- a/jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -52,6 +52,7 @@ * @bug 8140364 * @summary Tests the default implementation of System.Logger, when * JUL is the default backend. + * @modules java.logging * @build AccessSystemLogger DefaultLoggerFinderTest * @run driver AccessSystemLogger * @run main/othervm -Xbootclasspath/a:boot DefaultLoggerFinderTest NOSECURITY diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -52,6 +52,7 @@ Tests the behavior of bootstrap loggers (and SimpleConsoleLoggers * too). * @modules java.base/jdk.internal.logger + * java.logging * @build BootstrapLoggerUtils LogStream * @run main/othervm BootstrapLoggerTest NO_SECURITY * @run main/othervm BootstrapLoggerTest SECURE diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -58,7 +58,9 @@ * @summary JDK implementation specific unit test for JDK internal artifacts. * Tests all bridge methods with the a custom backend whose * loggers implement PlatformLogger.Bridge. - * @modules java.base/sun.util.logging java.base/jdk.internal.logger + * @modules java.base/sun.util.logging + * java.base/jdk.internal.logger + * java.logging * @build CustomSystemClassLoader LoggerBridgeTest * @run main/othervm -Djava.system.class.loader=CustomSystemClassLoader LoggerBridgeTest NOSECURITY * @run main/othervm -Djava.system.class.loader=CustomSystemClassLoader LoggerBridgeTest NOPERMISSIONS diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +57,7 @@ * Tests all bridge methods from PlatformLogger with the a custom * backend whose loggers implement PlatformLogger.Bridge. * @modules java.base/sun.util.logging + * java.logging * @build CustomSystemClassLoader PlatformLoggerBridgeTest * @run main/othervm -Djava.system.class.loader=CustomSystemClassLoader PlatformLoggerBridgeTest NOSECURITY * @run main/othervm -Djava.system.class.loader=CustomSystemClassLoader PlatformLoggerBridgeTest NOPERMISSIONS diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -29,6 +29,7 @@ * Tests the consistency of the LoggerFinder and JDK extensions. * @modules java.base/sun.util.logging * java.base/jdk.internal.logger + * java.logging * @run main LoggerFinderAPITest */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java --- a/jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/System/MacEncoding/TestFileEncoding.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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,6 +28,7 @@ * @bug 8011194 * @summary Test value of file.encoding for corresponding value of LANG, etc * @library ../../../../tools/launcher/ ../ + * @modules jdk.compiler * @build TestHelper TestFileEncoding ExpectedEncoding * @run main TestFileEncoding UTF-8 * @run main/othervm -Dfile.encoding=MyEncoding -DuserEncoding=MyEncoding TestFileEncoding MyEncoding diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/instrument/ManyMethodsBenchmarkAgent.java --- a/jdk/test/java/lang/instrument/ManyMethodsBenchmarkAgent.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/instrument/ManyMethodsBenchmarkAgent.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,9 +27,8 @@ * @summary Tests and benchmarks the JVMTI RedefineClasses when a * single class (and its parent) contains many methods. * - * @modules java.compiler + * @modules jdk.compiler * java.instrument - * jdk.compiler * @run build ManyMethodsBenchmarkApp ManyMethodsBenchmarkAgent * @run shell MakeJAR3.sh ManyMethodsBenchmarkAgent 'Can-Retransform-Classes: true' * @run main/othervm -javaagent:ManyMethodsBenchmarkAgent.jar ManyMethodsBenchmarkApp diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/instrument/RetransformAgent.java --- a/jdk/test/java/lang/instrument/RetransformAgent.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/instrument/RetransformAgent.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, 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,6 +28,7 @@ * @author Robert Field, Sun Microsystems * * @modules java.base/jdk.internal.org.objectweb.asm + * java.instrument * @run shell/timeout=240 MakeJAR2.sh RetransformAgent RetransformApp 'Can-Retransform-Classes: true' * @run main/othervm -javaagent:RetransformAgent.jar RetransformApp */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/FindAccessTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/FindAccessTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2015, 2016, 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. + */ + +/* @test + * @bug 8139885 + * @run testng/othervm -ea -esa test.java.lang.invoke.FindAccessTest + */ + +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +/** + * Tests for Lookup.findClass/accessClass extensions added in JEP 274. + */ +public class FindAccessTest { + + static final Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testFindSpecial() throws Throwable { + FindSpecial.C c = new FindSpecial.C(); + assertEquals("I1.m", c.m()); + MethodType t = MethodType.methodType(String.class); + MethodHandle ci1m = LOOKUP.findSpecial(FindSpecial.I1.class, "m", t, FindSpecial.C.class); + assertEquals("I1.m", (String) ci1m.invoke(c)); + } + + @Test + public static void testFindSpecialAbstract() throws Throwable { + FindSpecial.C c = new FindSpecial.C(); + assertEquals("q", c.q()); + MethodType t = MethodType.methodType(String.class); + boolean caught = false; + try { + MethodHandle ci3q = LOOKUP.findSpecial(FindSpecial.I3.class, "q", t, FindSpecial.C.class); + } catch (Throwable thrown) { + if (!(thrown instanceof IllegalAccessException) || !FindSpecial.ABSTRACT_ERROR.equals(thrown.getMessage())) { + throw new AssertionError(thrown.getMessage(), thrown); + } + caught = true; + } + assertTrue(caught); + } + + @Test(expectedExceptions = {ClassNotFoundException.class}) + public static void testFindClassCNFE() throws ClassNotFoundException, IllegalAccessException { + LOOKUP.findClass("does.not.Exist"); + } + + static class FindSpecial { + + interface I1 { + default String m() { + return "I1.m"; + } + } + + interface I2 { + default String m() { + return "I2.m"; + } + } + + interface I3 { + String q(); + } + + static class C implements I1, I2, I3 { + public String m() { + return I1.super.m(); + } + public String q() { + return "q"; + } + } + + static final String ABSTRACT_ERROR = "no such method: test.java.lang.invoke.FindAccessTest$FindSpecial$I3.q()String/invokeSpecial"; + + } + +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/FoldTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/FoldTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2015, 2016, 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. + */ + +/* @test + * @bug 8139885 + * @run testng/othervm -ea -esa test.java.lang.invoke.FoldTest + */ + +package test.java.lang.invoke; + +import java.io.StringWriter; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +/** + * Tests for the new fold method handle combinator added in JEP 274. + */ +public class FoldTest { + + static final Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testFold0a() throws Throwable { + // equivalence to foldArguments(MethodHandle,MethodHandle) + MethodHandle fold = MethodHandles.foldArguments(Fold.MH_multer, 0, Fold.MH_adder); + assertEquals(Fold.MT_folded1, fold.type()); + assertEquals(720, (int) fold.invoke(3, 4, 5)); + } + + @Test + public static void testFold1a() throws Throwable { + // test foldArguments for folding position 1 + MethodHandle fold = MethodHandles.foldArguments(Fold.MH_multer, 1, Fold.MH_adder1); + assertEquals(Fold.MT_folded1, fold.type()); + assertEquals(540, (int) fold.invoke(3, 4, 5)); + } + + @Test + public static void testFold0b() throws Throwable { + // test foldArguments equivalence with multiple types + MethodHandle fold = MethodHandles.foldArguments(Fold.MH_str, 0, Fold.MH_comb); + assertEquals(Fold.MT_folded2, fold.type()); + assertEquals(23, (int) fold.invoke("true", true, 23)); + } + + @Test + public static void testFold1b() throws Throwable { + // test folgArguments for folding position 1, with multiple types + MethodHandle fold = MethodHandles.foldArguments(Fold.MH_str, 1, Fold.MH_comb2); + assertEquals(Fold.MT_folded3, fold.type()); + assertEquals(1, (int) fold.invoke(true, true, 1)); + assertEquals(-1, (int) fold.invoke(true, false, -1)); + } + + @Test + public static void testFoldArgumentsExample() throws Throwable { + // test the JavaDoc foldArguments-with-pos example + StringWriter swr = new StringWriter(); + MethodHandle trace = LOOKUP.findVirtual(StringWriter.class, "write", methodType(void.class, String.class)).bindTo(swr); + MethodHandle cat = LOOKUP.findVirtual(String.class, "concat", methodType(String.class, String.class)); + assertEquals("boojum", (String) cat.invokeExact("boo", "jum")); + MethodHandle catTrace = MethodHandles.foldArguments(cat, 1, trace); + assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); + assertEquals("jum", swr.toString()); + } + + static class Fold { + + static int adder(int a, int b, int c) { + return a + b + c; + } + + static int adder1(int a, int b) { + return a + b; + } + + static int multer(int x, int q, int r, int s) { + return x * q * r * s; + } + + static int str(boolean b1, String s, boolean b2, int x) { + return b1 && s.equals(String.valueOf(b2)) ? x : -x; + } + + static boolean comb(String s, boolean b2) { + return !s.equals(b2); + } + + static String comb2(boolean b2, int x) { + int ib = b2 ? 1 : 0; + return ib == x ? "true" : "false"; + } + + static final Class FOLD = Fold.class; + + static final MethodType MT_adder = methodType(int.class, int.class, int.class, int.class); + static final MethodType MT_adder1 = methodType(int.class, int.class, int.class); + static final MethodType MT_multer = methodType(int.class, int.class, int.class, int.class, int.class); + static final MethodType MT_str = methodType(int.class, boolean.class, String.class, boolean.class, int.class); + static final MethodType MT_comb = methodType(boolean.class, String.class, boolean.class); + static final MethodType MT_comb2 = methodType(String.class, boolean.class, int.class); + + static final MethodHandle MH_adder; + static final MethodHandle MH_adder1; + static final MethodHandle MH_multer; + static final MethodHandle MH_str; + static final MethodHandle MH_comb; + static final MethodHandle MH_comb2; + + static final MethodType MT_folded1 = methodType(int.class, int.class, int.class, int.class); + static final MethodType MT_folded2 = methodType(int.class, String.class, boolean.class, int.class); + static final MethodType MT_folded3 = methodType(int.class, boolean.class, boolean.class, int.class); + + static { + try { + MH_adder = LOOKUP.findStatic(FOLD, "adder", MT_adder); + MH_adder1 = LOOKUP.findStatic(FOLD, "adder1", MT_adder1); + MH_multer = LOOKUP.findStatic(FOLD, "multer", MT_multer); + MH_str = LOOKUP.findStatic(FOLD, "str", MT_str); + MH_comb = LOOKUP.findStatic(FOLD, "comb", MT_comb); + MH_comb2 = LOOKUP.findStatic(FOLD, "comb2", MT_comb2); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + } + +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/JavaDocExamplesTest.java --- a/jdk/test/java/lang/invoke/JavaDocExamplesTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/invoke/JavaDocExamplesTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -690,7 +690,7 @@ {{ {} /// JAVADOC // implement the zip function for lists as a loop handle -MethodHandle loop = MethodHandles.doWhileLoop(MH_initZip, MH_zipStep, MH_zipPred); +MethodHandle loop = MethodHandles.whileLoop(MH_initZip, MH_zipPred, MH_zipStep); List a = Arrays.asList("a", "b", "c", "d"); List b = Arrays.asList("e", "f", "g", "h"); List zipped = Arrays.asList("a", "e", "b", "f", "c", "g", "d", "h"); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/LoopCombinatorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/LoopCombinatorTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,803 @@ +/* + * Copyright (c) 2015, 2016, 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. + */ + +/* @test + * @bug 8139885 + * @bug 8150635 + * @run testng/othervm -ea -esa test.java.lang.invoke.LoopCombinatorTest + */ + +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; +import java.util.*; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +/** + * Tests for the loop combinators introduced in JEP 274. + */ +public class LoopCombinatorTest { + + static final Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testLoopFac() throws Throwable { + MethodHandle[] counterClause = new MethodHandle[]{Fac.MH_zero, Fac.MH_inc}; + MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; + MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause); + assertEquals(Fac.MT_fac, loop.type()); + assertEquals(120, loop.invoke(5)); + } + + @Test + public static void testLoopFacNullInit() throws Throwable { + // null initializer for counter, should initialize to 0 + MethodHandle[] counterClause = new MethodHandle[]{null, Fac.MH_inc}; + MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; + MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause); + assertEquals(Fac.MT_fac, loop.type()); + assertEquals(120, loop.invoke(5)); + } + + @Test + public static void testLoopNullInit() throws Throwable { + // null initializer for counter, should initialize to 0, one-clause loop + MethodHandle[] counterClause = new MethodHandle[]{null, Loop.MH_inc, Loop.MH_pred, Loop.MH_fin}; + MethodHandle loop = MethodHandles.loop(counterClause); + assertEquals(Loop.MT_loop, loop.type()); + assertEquals(10, loop.invoke(10)); + } + + @Test + public static void testLoopVoid1() throws Throwable { + // construct a post-checked loop that only does one iteration and has a void body and void local state + MethodHandle loop = MethodHandles.loop(new MethodHandle[]{Empty.MH_f, Empty.MH_f, Empty.MH_pred, null}); + assertEquals(MethodType.methodType(void.class), loop.type()); + loop.invoke(); + } + + @Test + public static void testLoopVoid2() throws Throwable { + // construct a post-checked loop that only does one iteration and has a void body and void local state, + // initialized implicitly from the step type + MethodHandle loop = MethodHandles.loop(new MethodHandle[]{null, Empty.MH_f, Empty.MH_pred, null}); + assertEquals(MethodType.methodType(void.class), loop.type()); + loop.invoke(); + } + + @Test + public static void testLoopVoid3() throws Throwable { + // construct a post-checked loop that only does one iteration and has a void body and void local state, + // and that has a void finalizer + MethodHandle loop = MethodHandles.loop(new MethodHandle[]{null, Empty.MH_f, Empty.MH_pred, Empty.MH_f}); + assertEquals(MethodType.methodType(void.class), loop.type()); + loop.invoke(); + } + + @Test + public static void testLoopFacWithVoidState() throws Throwable { + // like testLoopFac, but with additional void state that outputs a dot + MethodHandle[] counterClause = new MethodHandle[]{Fac.MH_zero, Fac.MH_inc}; + MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; + MethodHandle[] dotClause = new MethodHandle[]{null, Fac.MH_dot}; + MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause, dotClause); + assertEquals(Fac.MT_fac, loop.type()); + assertEquals(120, loop.invoke(5)); + } + + @Test + public static void testLoopVoidInt() throws Throwable { + // construct a post-checked loop that only does one iteration and has a void body and void local state, + // and that returns a constant + MethodHandle loop = MethodHandles.loop(new MethodHandle[]{null, Empty.MH_f, Empty.MH_pred, Empty.MH_c}); + assertEquals(MethodType.methodType(int.class), loop.type()); + assertEquals(23, loop.invoke()); + } + + @Test + public static void testLoopWithVirtuals() throws Throwable { + // construct a loop (to calculate factorial) that uses a mix of static and virtual methods + MethodHandle[] counterClause = new MethodHandle[]{null, LoopWithVirtuals.permute(LoopWithVirtuals.MH_inc)}; + MethodHandle[] accumulatorClause = new MethodHandle[]{ + // init function must indicate the loop arguments (there is no other means to determine them) + MethodHandles.dropArguments(LoopWithVirtuals.MH_one, 0, LoopWithVirtuals.class), + LoopWithVirtuals.permute(LoopWithVirtuals.MH_mult), + LoopWithVirtuals.permute(LoopWithVirtuals.MH_pred), + LoopWithVirtuals.permute(LoopWithVirtuals.MH_fin) + }; + MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause); + assertEquals(LoopWithVirtuals.MT_loop, loop.type()); + assertEquals(120, loop.invoke(new LoopWithVirtuals(), 5)); + } + + @DataProvider + static Object[][] negativeTestData() { + MethodHandle i0 = MethodHandles.constant(int.class, 0); + MethodHandle ii = MethodHandles.dropArguments(i0, 0, int.class, int.class); + MethodHandle id = MethodHandles.dropArguments(i0, 0, int.class, double.class); + MethodHandle i3 = MethodHandles.dropArguments(i0, 0, int.class, int.class, int.class); + List inits = Arrays.asList(ii, id, i3); + List> ints = Arrays.asList(int.class, int.class, int.class); + List finis = Arrays.asList(Fac.MH_fin, Fac.MH_inc, Counted.MH_step); + List preds1 = Arrays.asList(null, null, null); + List preds2 = Arrays.asList(null, Fac.MH_fin, null); + MethodHandle eek = MethodHandles.dropArguments(i0, 0, int.class, int.class, double.class); + List nesteps = Arrays.asList(Fac.MH_inc, eek, Fac.MH_dot); + List nepreds = Arrays.asList(null, Fac.MH_pred, null); + List nefinis = Arrays.asList(null, Fac.MH_fin, null); + List lvsteps = Arrays.asList(LoopWithVirtuals.MH_inc, LoopWithVirtuals.MH_mult); + List lvpreds = Arrays.asList(null, LoopWithVirtuals.MH_pred); + List lvfinis = Arrays.asList(null, LoopWithVirtuals.MH_fin); + return new Object[][] { + {null, "null or no clauses passed"}, + {new MethodHandle[][]{}, "null or no clauses passed"}, + {new MethodHandle[][]{{null, Fac.MH_inc}, {Fac.MH_one, null, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}}, + "All loop clauses must be represented as MethodHandle arrays with at most 4 elements."}, + {new MethodHandle[][]{{null, Fac.MH_inc}, null}, "null clauses are not allowed"}, + {new MethodHandle[][]{{Fac.MH_zero, Fac.MH_dot}}, + "clause 0: init and step return types must match: int != void"}, + {new MethodHandle[][]{{ii}, {id}, {i3}}, + "found non-effectively identical init parameter type lists: " + inits + + " (common suffix: " + ints + ")"}, + {new MethodHandle[][]{{null, Fac.MH_inc, null, Fac.MH_fin}, {null, Fac.MH_inc, null, Fac.MH_inc}, + {null, Counted.MH_start, null, Counted.MH_step}}, + "found non-identical finalizer return types: " + finis + " (return type: int)"}, + {new MethodHandle[][]{{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, Fac.MH_mult, null, Fac.MH_fin}, + {null, Fac.MH_dot}}, "no predicate found: " + preds1}, + {new MethodHandle[][]{{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, Fac.MH_mult, Fac.MH_fin, Fac.MH_fin}, + {null, Fac.MH_dot}}, "predicates must have boolean return type: " + preds2}, + {new MethodHandle[][]{{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, eek, Fac.MH_pred, Fac.MH_fin}, + {null, Fac.MH_dot}}, + "found non-effectively identical parameter type lists:\nstep: " + nesteps + + "\npred: " + nepreds + "\nfini: " + nefinis + " (common parameter sequence: " + ints + ")"}, + {new MethodHandle[][]{{null, LoopWithVirtuals.MH_inc}, + {LoopWithVirtuals.MH_one, LoopWithVirtuals.MH_mult, LoopWithVirtuals.MH_pred, LoopWithVirtuals.MH_fin}}, + "found non-effectively identical parameter type lists:\nstep: " + lvsteps + + "\npred: " + lvpreds + "\nfini: " + lvfinis + " (common parameter sequence: " + ints + ")"} + }; + } + + static final MethodHandle MH_loop; + + static { + try { + MH_loop = LOOKUP.findStatic(MethodHandles.class, "loop", methodType(MethodHandle.class, MethodHandle[][].class)); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new ExceptionInInitializerError(e); + } + } + + @Test(dataProvider = "negativeTestData") + public static void testLoopNegative(MethodHandle[][] clauses, String expectedMessage) throws Throwable { + boolean caught = false; + try { + MH_loop.invokeWithArguments(clauses); + } catch (IllegalArgumentException iae) { + assertEquals(expectedMessage, iae.getMessage()); + caught = true; + } + assertTrue(caught); + } + + @Test + public static void testWhileLoop() throws Throwable { + // int i = 0; while (i < limit) { ++i; } return i; => limit + MethodHandle loop = MethodHandles.whileLoop(While.MH_zero, While.MH_pred, While.MH_step); + assertEquals(While.MT_while, loop.type()); + assertEquals(23, loop.invoke(23)); + } + + @Test + public static void testWhileLoopNoIteration() throws Throwable { + // a while loop that never executes its body because the predicate evaluates to false immediately + MethodHandle loop = MethodHandles.whileLoop(While.MH_initString, While.MH_predString, While.MH_stepString); + assertEquals(While.MT_string, loop.type()); + assertEquals("a", loop.invoke()); + } + + @Test + public static void testDoWhileLoop() throws Throwable { + // int i = 0; do { ++i; } while (i < limit); return i; => limit + MethodHandle loop = MethodHandles.doWhileLoop(While.MH_zero, While.MH_step, While.MH_pred); + assertEquals(While.MT_while, loop.type()); + assertEquals(23, loop.invoke(23)); + } + + @Test + public static void testDoWhileNullInit() throws Throwable { + While w = new While(); + int v = 5; + MethodHandle loop = MethodHandles.doWhileLoop(null, While.MH_voidBody.bindTo(w), While.MH_voidPred.bindTo(w)); + assertEquals(While.MT_void, loop.type()); + loop.invoke(v); + assertEquals(v, w.i); + } + + @Test + public static void testWhileZip() throws Throwable { + MethodHandle loop = MethodHandles.doWhileLoop(While.MH_zipInitZip, While.MH_zipStep, While.MH_zipPred); + assertEquals(While.MT_zip, loop.type()); + List a = Arrays.asList("a", "b", "c", "d"); + List b = Arrays.asList("e", "f", "g", "h"); + List zipped = Arrays.asList("a", "e", "b", "f", "c", "g", "d", "h"); + assertEquals(zipped, (List) loop.invoke(a.iterator(), b.iterator())); + } + + @Test + public static void testWhileNullInit() throws Throwable { + While w = new While(); + int v = 5; + MethodHandle loop = MethodHandles.whileLoop(null, While.MH_voidPred.bindTo(w), While.MH_voidBody.bindTo(w)); + assertEquals(While.MT_void, loop.type()); + loop.invoke(v); + assertEquals(v, w.i); + } + + @Test + public static void testCountedLoop() throws Throwable { + // String s = "Lambdaman!"; for (int i = 0; i < 13; ++i) { s = "na " + s; } return s; => a variation on a well known theme + MethodHandle fit13 = MethodHandles.constant(int.class, 13); + MethodHandle loop = MethodHandles.countedLoop(fit13, Counted.MH_start, Counted.MH_step); + assertEquals(Counted.MT_counted, loop.type()); + assertEquals("na na na na na na na na na na na na na Lambdaman!", loop.invoke("Lambdaman!")); + } + + @Test + public static void testCountedArrayLoop() throws Throwable { + // int[] a = new int[]{0}; for (int i = 0; i < 13; ++i) { ++a[0]; } => a[0] == 13 + MethodHandle fit13 = MethodHandles.dropArguments(MethodHandles.constant(int.class, 13), 0, int[].class); + MethodHandle loop = MethodHandles.countedLoop(fit13, null, Counted.MH_stepUpdateArray); + assertEquals(Counted.MT_arrayCounted, loop.type()); + int[] a = new int[]{0}; + loop.invoke(a); + assertEquals(13, a[0]); + } + + @Test + public static void testCountedPrintingLoop() throws Throwable { + MethodHandle fit5 = MethodHandles.constant(int.class, 5); + MethodHandle loop = MethodHandles.countedLoop(fit5, null, Counted.MH_printHello); + assertEquals(Counted.MT_countedPrinting, loop.type()); + loop.invoke(); + } + + @Test + public static void testCountedRangeLoop() throws Throwable { + // String s = "Lambdaman!"; for (int i = -5; i < 8; ++i) { s = "na " + s; } return s; => a well known theme + MethodHandle fitm5 = MethodHandles.dropArguments(Counted.MH_m5, 0, String.class); + MethodHandle fit8 = MethodHandles.dropArguments(Counted.MH_8, 0, String.class); + MethodHandle loop = MethodHandles.countedLoop(fitm5, fit8, Counted.MH_start, Counted.MH_step); + assertEquals(Counted.MT_counted, loop.type()); + assertEquals("na na na na na na na na na na na na na Lambdaman!", loop.invoke("Lambdaman!")); + } + + @Test + public static void testIterateSum() throws Throwable { + // Integer[] a = new Integer[]{1,2,3,4,5,6}; int sum = 0; for (int e : a) { sum += e; } return sum; => 21 + MethodHandle loop = MethodHandles.iteratedLoop(Iterate.MH_sumIterator, Iterate.MH_sumInit, Iterate.MH_sumStep); + assertEquals(Iterate.MT_sum, loop.type()); + assertEquals(21, loop.invoke(new Integer[]{1, 2, 3, 4, 5, 6})); + } + + @Test + public static void testIterateReverse() throws Throwable { + MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_reverseInit, Iterate.MH_reverseStep); + assertEquals(Iterate.MT_reverse, loop.type()); + List list = Arrays.asList("a", "b", "c", "d", "e"); + List reversedList = Arrays.asList("e", "d", "c", "b", "a"); + assertEquals(reversedList, (List) loop.invoke(list)); + } + + @Test + public static void testIterateLength() throws Throwable { + MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_lengthInit, Iterate.MH_lengthStep); + assertEquals(Iterate.MT_length, loop.type()); + List list = Arrays.asList(23.0, 148.0, 42.0); + assertEquals(list.size(), (int) loop.invoke(list)); + } + + @Test + public static void testIterateMap() throws Throwable { + MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_mapInit, Iterate.MH_mapStep); + assertEquals(Iterate.MT_map, loop.type()); + List list = Arrays.asList("Hello", "world", "!"); + List upList = Arrays.asList("HELLO", "WORLD", "!"); + assertEquals(upList, (List) loop.invoke(list)); + } + + @Test + public static void testIteratePrint() throws Throwable { + MethodHandle loop = MethodHandles.iteratedLoop(null, null, Iterate.MH_printStep); + assertEquals(Iterate.MT_print, loop.type()); + loop.invoke(Arrays.asList("hello", "world")); + } + + @Test + public static void testIterateNullBody() { + boolean caught = false; + try { + MethodHandles.iteratedLoop(MethodHandles.identity(int.class), MethodHandles.identity(int.class), null); + } catch (IllegalArgumentException iae) { + assertEquals("iterated loop body must not be null", iae.getMessage()); + caught = true; + } + assertTrue(caught); + } + + static class Empty { + + static void f() { } + + static boolean pred() { + return false; + } + + static int c() { + return 23; + } + + static final Class EMPTY = Empty.class; + + static final MethodType MT_f = methodType(void.class); + static final MethodType MT_pred = methodType(boolean.class); + static final MethodType MT_c = methodType(int.class); + + static final MethodHandle MH_f; + static final MethodHandle MH_pred; + static final MethodHandle MH_c; + + static { + try { + MH_f = LOOKUP.findStatic(EMPTY, "f", MT_f); + MH_pred = LOOKUP.findStatic(EMPTY, "pred", MT_pred); + MH_c = LOOKUP.findStatic(EMPTY, "c", MT_c); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + } + + static class Fac { + + static int zero(int k) { + return 0; + } + + static int one(int k) { + return 1; + } + + static boolean pred(int i, int acc, int k) { + return i < k; + } + + static int inc(int i, int acc, int k) { + return i + 1; + } + + static int mult(int i, int acc, int k) { + return i * acc; + } + + static void dot(int i, int acc, int k) { + System.out.print('.'); + } + + static int fin(int i, int acc, int k) { + return acc; + } + + static final Class FAC = Fac.class; + + static final MethodType MT_init = methodType(int.class, int.class); + static final MethodType MT_fn = methodType(int.class, int.class, int.class, int.class); + static final MethodType MT_dot = methodType(void.class, int.class, int.class, int.class); + static final MethodType MT_pred = methodType(boolean.class, int.class, int.class, int.class); + + static final MethodHandle MH_zero; + static final MethodHandle MH_one; + static final MethodHandle MH_pred; + static final MethodHandle MH_inc; + static final MethodHandle MH_mult; + static final MethodHandle MH_dot; + static final MethodHandle MH_fin; + + static final MethodType MT_fac = methodType(int.class, int.class); + + static { + try { + MH_zero = LOOKUP.findStatic(FAC, "zero", MT_init); + MH_one = LOOKUP.findStatic(FAC, "one", MT_init); + MH_pred = LOOKUP.findStatic(FAC, "pred", MT_pred); + MH_inc = LOOKUP.findStatic(FAC, "inc", MT_fn); + MH_mult = LOOKUP.findStatic(FAC, "mult", MT_fn); + MH_dot = LOOKUP.findStatic(FAC, "dot", MT_dot); + MH_fin = LOOKUP.findStatic(FAC, "fin", MT_fn); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + + static class Loop { + + static int inc(int i, int k) { + return i + 1; + } + + static boolean pred(int i, int k) { + return i < k; + } + + static int fin(int i, int k) { + return k; + } + + static final Class LOOP = Loop.class; + + static final MethodType MT_inc = methodType(int.class, int.class, int.class); + static final MethodType MT_pred = methodType(boolean.class, int.class, int.class); + static final MethodType MT_fin = methodType(int.class, int.class, int.class); + + static final MethodHandle MH_inc; + static final MethodHandle MH_pred; + static final MethodHandle MH_fin; + + static final MethodType MT_loop = methodType(int.class, int.class); + + static { + try { + MH_inc = LOOKUP.findStatic(LOOP, "inc", MT_inc); + MH_pred = LOOKUP.findStatic(LOOP, "pred", MT_pred); + MH_fin = LOOKUP.findStatic(LOOP, "fin", MT_fin); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + + static class LoopWithVirtuals { + + static int one(int k) { + return 1; + } + + int inc(int i, int acc, int k) { + return i + 1; + } + + int mult(int i, int acc, int k) { + return i * acc; + } + + boolean pred(int i, int acc, int k) { + return i < k; + } + + int fin(int i, int acc, int k) { + return acc; + } + + static final Class LOOP_WITH_VIRTUALS = LoopWithVirtuals.class; + + static final MethodType MT_one = methodType(int.class, int.class); + static final MethodType MT_inc = methodType(int.class, int.class, int.class, int.class); + static final MethodType MT_mult = methodType(int.class, int.class, int.class, int.class); + static final MethodType MT_pred = methodType(boolean.class, int.class, int.class, int.class); + static final MethodType MT_fin = methodType(int.class, int.class, int.class, int.class); + + static final MethodHandle MH_one; + static final MethodHandle MH_inc; + static final MethodHandle MH_mult; + static final MethodHandle MH_pred; + static final MethodHandle MH_fin; + + static final MethodType MT_loop = methodType(int.class, LOOP_WITH_VIRTUALS, int.class); + + static { + try { + MH_one = LOOKUP.findStatic(LOOP_WITH_VIRTUALS, "one", MT_one); + MH_inc = LOOKUP.findVirtual(LOOP_WITH_VIRTUALS, "inc", MT_inc); + MH_mult = LOOKUP.findVirtual(LOOP_WITH_VIRTUALS, "mult", MT_mult); + MH_pred = LOOKUP.findVirtual(LOOP_WITH_VIRTUALS, "pred", MT_pred); + MH_fin = LOOKUP.findVirtual(LOOP_WITH_VIRTUALS, "fin", MT_fin); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + static MethodHandle permute(MethodHandle h) { + // The handles representing virtual methods need to be rearranged to match the required order of arguments + // (loop-local state comes first, then loop arguments). As the receiver comes first in the signature but is + // a loop argument, it must be moved to the appropriate position in the signature. + return MethodHandles.permuteArguments(h, + methodType(h.type().returnType(), int.class, int.class, LOOP_WITH_VIRTUALS, int.class), 2, 0, 1, 3); + } + + } + + static class While { + + static int zero(int limit) { + return 0; + } + + static boolean pred(int i, int limit) { + return i < limit; + } + + static int step(int i, int limit) { + return i + 1; + } + + static String initString() { + return "a"; + } + + static boolean predString(String s) { + return s.length() != 1; + } + + static String stepString(String s) { + return s + "a"; + } + + static List zipInitZip(Iterator a, Iterator b) { + return new ArrayList<>(); + } + + static boolean zipPred(List zip, Iterator a, Iterator b) { + return a.hasNext() && b.hasNext(); + } + + static List zipStep(List zip, Iterator a, Iterator b) { + zip.add(a.next()); + zip.add(b.next()); + return zip; + } + + private int i = 0; + + void voidBody(int k) { + ++i; + } + + boolean voidPred(int k) { + return i < k; + } + + static final Class WHILE = While.class; + + static final MethodType MT_zero = methodType(int.class, int.class); + static final MethodType MT_pred = methodType(boolean.class, int.class, int.class); + static final MethodType MT_fn = methodType(int.class, int.class, int.class); + static final MethodType MT_initString = methodType(String.class); + static final MethodType MT_predString = methodType(boolean.class, String.class); + static final MethodType MT_stepString = methodType(String.class, String.class); + static final MethodType MT_zipInitZip = methodType(List.class, Iterator.class, Iterator.class); + static final MethodType MT_zipPred = methodType(boolean.class, List.class, Iterator.class, Iterator.class); + static final MethodType MT_zipStep = methodType(List.class, List.class, Iterator.class, Iterator.class); + static final MethodType MT_voidBody = methodType(void.class, int.class); + static final MethodType MT_voidPred = methodType(boolean.class, int.class); + + static final MethodHandle MH_zero; + static final MethodHandle MH_pred; + static final MethodHandle MH_step; + static final MethodHandle MH_initString; + static final MethodHandle MH_predString; + static final MethodHandle MH_stepString; + static final MethodHandle MH_zipInitZip; + static final MethodHandle MH_zipPred; + static final MethodHandle MH_zipStep; + static final MethodHandle MH_voidBody; + static final MethodHandle MH_voidPred; + + static final MethodType MT_while = methodType(int.class, int.class); + static final MethodType MT_string = methodType(String.class); + static final MethodType MT_zip = methodType(List.class, Iterator.class, Iterator.class); + static final MethodType MT_void = methodType(void.class, int.class); + + static { + try { + MH_zero = LOOKUP.findStatic(WHILE, "zero", MT_zero); + MH_pred = LOOKUP.findStatic(WHILE, "pred", MT_pred); + MH_step = LOOKUP.findStatic(WHILE, "step", MT_fn); + MH_initString = LOOKUP.findStatic(WHILE, "initString", MT_initString); + MH_predString = LOOKUP.findStatic(WHILE, "predString", MT_predString); + MH_stepString = LOOKUP.findStatic(WHILE, "stepString", MT_stepString); + MH_zipInitZip = LOOKUP.findStatic(WHILE, "zipInitZip", MT_zipInitZip); + MH_zipPred = LOOKUP.findStatic(WHILE, "zipPred", MT_zipPred); + MH_zipStep = LOOKUP.findStatic(WHILE, "zipStep", MT_zipStep); + MH_voidBody = LOOKUP.findVirtual(WHILE, "voidBody", MT_voidBody); + MH_voidPred = LOOKUP.findVirtual(WHILE, "voidPred", MT_voidPred); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + + static class Counted { + + static String start(String arg) { + return arg; + } + + static String step(int counter, String v, String arg) { + return "na " + v; + } + + static void stepUpdateArray(int counter, int[] a) { + ++a[0]; + } + + static void printHello(int counter) { + System.out.print("hello"); + } + + static final Class COUNTED = Counted.class; + + static final MethodType MT_start = methodType(String.class, String.class); + static final MethodType MT_step = methodType(String.class, int.class, String.class, String.class); + static final MethodType MT_stepUpdateArray = methodType(void.class, int.class, int[].class); + static final MethodType MT_printHello = methodType(void.class, int.class); + + static final MethodHandle MH_13; + static final MethodHandle MH_m5; + static final MethodHandle MH_8; + static final MethodHandle MH_start; + static final MethodHandle MH_step; + static final MethodHandle MH_stepUpdateArray; + static final MethodHandle MH_printHello; + + static final MethodType MT_counted = methodType(String.class, String.class); + static final MethodType MT_arrayCounted = methodType(void.class, int[].class); + static final MethodType MT_countedPrinting = methodType(void.class); + + static { + try { + MH_13 = MethodHandles.constant(int.class, 13); + MH_m5 = MethodHandles.constant(int.class, -5); + MH_8 = MethodHandles.constant(int.class, 8); + MH_start = LOOKUP.findStatic(COUNTED, "start", MT_start); + MH_step = LOOKUP.findStatic(COUNTED, "step", MT_step); + MH_stepUpdateArray = LOOKUP.findStatic(COUNTED, "stepUpdateArray", MT_stepUpdateArray); + MH_printHello = LOOKUP.findStatic(COUNTED, "printHello", MT_printHello); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + + static class Iterate { + + static Iterator sumIterator(Integer[] a) { + return Arrays.asList(a).iterator(); + } + + static int sumInit(Integer[] a) { + return 0; + } + + static int sumStep(int s, int e, Integer[] a) { + return s + e; + } + + static List reverseInit(List l) { + return new ArrayList<>(); + } + + static List reverseStep(String e, List r, List l) { + r.add(0, e); + return r; + } + + static int lengthInit(List l) { + return 0; + } + + static int lengthStep(Object o, int len, List l) { + return len + 1; + } + + static List mapInit(List l) { + return new ArrayList<>(); + } + + static List mapStep(String e, List r, List l) { + r.add(e.toUpperCase()); + return r; + } + + static void printStep(String s, List l) { + System.out.print(s); + } + + static final Class ITERATE = Iterate.class; + + static final MethodType MT_sumIterator = methodType(Iterator.class, Integer[].class); + + static final MethodType MT_sumInit = methodType(int.class, Integer[].class); + static final MethodType MT_reverseInit = methodType(List.class, List.class); + static final MethodType MT_lenghInit = methodType(int.class, List.class); + static final MethodType MT_mapInit = methodType(List.class, List.class); + + static final MethodType MT_sumStep = methodType(int.class, int.class, int.class, Integer[].class); + static final MethodType MT_reverseStep = methodType(List.class, String.class, List.class, List.class); + static final MethodType MT_lengthStep = methodType(int.class, Object.class, int.class, List.class); + static final MethodType MT_mapStep = methodType(List.class, String.class, List.class, List.class); + static final MethodType MT_printStep = methodType(void.class, String.class, List.class); + + static final MethodHandle MH_sumIterator; + static final MethodHandle MH_sumInit; + static final MethodHandle MH_sumStep; + static final MethodHandle MH_printStep; + + static final MethodHandle MH_reverseInit; + static final MethodHandle MH_reverseStep; + + static final MethodHandle MH_lengthInit; + static final MethodHandle MH_lengthStep; + + static final MethodHandle MH_mapInit; + static final MethodHandle MH_mapStep; + + static final MethodType MT_sum = methodType(int.class, Integer[].class); + static final MethodType MT_reverse = methodType(List.class, List.class); + static final MethodType MT_length = methodType(int.class, List.class); + static final MethodType MT_map = methodType(List.class, List.class); + static final MethodType MT_print = methodType(void.class, List.class); + + static { + try { + MH_sumIterator = LOOKUP.findStatic(ITERATE, "sumIterator", MT_sumIterator); + MH_sumInit = LOOKUP.findStatic(ITERATE, "sumInit", MT_sumInit); + MH_sumStep = LOOKUP.findStatic(ITERATE, "sumStep", MT_sumStep); + MH_reverseInit = LOOKUP.findStatic(ITERATE, "reverseInit", MT_reverseInit); + MH_reverseStep = LOOKUP.findStatic(ITERATE, "reverseStep", MT_reverseStep); + MH_lengthInit = LOOKUP.findStatic(ITERATE, "lengthInit", MT_lenghInit); + MH_lengthStep = LOOKUP.findStatic(ITERATE, "lengthStep", MT_lengthStep); + MH_mapInit = LOOKUP.findStatic(ITERATE, "mapInit", MT_mapInit); + MH_mapStep = LOOKUP.findStatic(ITERATE, "mapStep", MT_mapStep); + MH_printStep = LOOKUP.findStatic(ITERATE, "printStep", MT_printStep); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/SpreadCollectTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/SpreadCollectTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2015, 2016, 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. + */ + +/* @test + * @bug 8139885 + * @bug 8143798 + * @run testng/othervm -ea -esa test.java.lang.invoke.SpreadCollectTest + */ + +package test.java.lang.invoke; + +import java.io.StringWriter; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; +import java.lang.invoke.WrongMethodTypeException; +import java.util.*; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +/** + * Tests for the new asSpreader/asCollector API added in JEP 274. + */ +public class SpreadCollectTest { + + static final Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testAsSpreader() throws Throwable { + MethodHandle spreader = SpreadCollect.MH_forSpreading.asSpreader(1, int[].class, 3); + assertEquals(SpreadCollect.MT_spreader, spreader.type()); + assertEquals("A456B", (String) spreader.invoke("A", new int[]{4, 5, 6}, "B")); + } + + @Test + public static void testAsSpreaderExample() throws Throwable { + // test the JavaDoc asSpreader-with-pos example + MethodHandle compare = LOOKUP.findStatic(Objects.class, "compare", methodType(int.class, Object.class, Object.class, Comparator.class)); + MethodHandle compare2FromArray = compare.asSpreader(0, Object[].class, 2); + Object[] ints = new Object[]{3, 9, 7, 7}; + Comparator cmp = (a, b) -> a - b; + assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 0, 2), cmp) < 0); + assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 1, 3), cmp) > 0); + assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 2, 4), cmp) == 0); + } + + @DataProvider + static Object[][] asSpreaderIllegalPositions() { + return new Object[][]{{-7}, {3}, {19}}; + } + + @Test(dataProvider = "asSpreaderIllegalPositions") + public static void testAsSpreaderIllegalPos(int p) throws Throwable { + boolean caught = false; + try { + SpreadCollect.MH_forSpreading.asSpreader(p, Object[].class, 3); + } catch (IllegalArgumentException iae) { + assertEquals("bad spread position", iae.getMessage()); + caught = true; + } + assertTrue(caught); + } + + @Test(expectedExceptions = {WrongMethodTypeException.class}) + public static void testAsSpreaderIllegalMethodType() { + MethodHandle h = MethodHandles.dropArguments(MethodHandles.constant(String.class, ""), 0, int.class, int.class); + MethodHandle s = h.asSpreader(String[].class, 1); + } + + @Test + public static void testAsCollector() throws Throwable { + MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 1); + assertEquals(SpreadCollect.MT_collector1, collector.type()); + assertEquals("A4B", (String) collector.invoke("A", 4, "B")); + collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 2); + assertEquals(SpreadCollect.MT_collector2, collector.type()); + assertEquals("A45B", (String) collector.invoke("A", 4, 5, "B")); + collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 3); + assertEquals(SpreadCollect.MT_collector3, collector.type()); + assertEquals("A456B", (String) collector.invoke("A", 4, 5, 6, "B")); + } + + @Test + public static void testAsCollectorInvokeWithArguments() throws Throwable { + MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 1); + assertEquals(SpreadCollect.MT_collector1, collector.type()); + assertEquals("A4B", (String) collector.invokeWithArguments("A", 4, "B")); + collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 2); + assertEquals(SpreadCollect.MT_collector2, collector.type()); + assertEquals("A45B", (String) collector.invokeWithArguments("A", 4, 5, "B")); + collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 3); + assertEquals(SpreadCollect.MT_collector3, collector.type()); + assertEquals("A456B", (String) collector.invokeWithArguments("A", 4, 5, 6, "B")); + } + + @Test + public static void testAsCollectorLeading() throws Throwable { + MethodHandle collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 1); + assertEquals(SpreadCollect.MT_collectorLeading1, collector.type()); + assertEquals("7Q", (String) collector.invoke(7, "Q")); + collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 2); + assertEquals(SpreadCollect.MT_collectorLeading2, collector.type()); + assertEquals("78Q", (String) collector.invoke(7, 8, "Q")); + collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 3); + assertEquals(SpreadCollect.MT_collectorLeading3, collector.type()); + assertEquals("789Q", (String) collector.invoke(7, 8, 9, "Q")); + } + + @Test + public static void testAsCollectorLeadingInvokeWithArguments() throws Throwable { + MethodHandle collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 1); + assertEquals(SpreadCollect.MT_collectorLeading1, collector.type()); + assertEquals("7Q", (String) collector.invokeWithArguments(7, "Q")); + collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 2); + assertEquals(SpreadCollect.MT_collectorLeading2, collector.type()); + assertEquals("78Q", (String) collector.invokeWithArguments(7, 8, "Q")); + collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 3); + assertEquals(SpreadCollect.MT_collectorLeading3, collector.type()); + assertEquals("789Q", (String) collector.invokeWithArguments(7, 8, 9, "Q")); + } + + @Test + public static void testAsCollectorNone() throws Throwable { + MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 0); + assertEquals(SpreadCollect.MT_collector0, collector.type()); + assertEquals("AB", (String) collector.invoke("A", "B")); + } + + @DataProvider + static Object[][] asCollectorIllegalPositions() { + return new Object[][]{{-1}, {17}}; + } + + @Test(dataProvider = "asCollectorIllegalPositions") + public static void testAsCollectorIllegalPos(int p) { + boolean caught = false; + try { + SpreadCollect.MH_forCollecting.asCollector(p, int[].class, 0); + } catch (IllegalArgumentException iae) { + assertEquals("bad collect position", iae.getMessage()); + caught = true; + } + assertTrue(caught); + } + + @Test + public static void testAsCollectorExample() throws Throwable { + // test the JavaDoc asCollector-with-pos example + StringWriter swr = new StringWriter(); + MethodHandle swWrite = LOOKUP. + findVirtual(StringWriter.class, "write", methodType(void.class, char[].class, int.class, int.class)). + bindTo(swr); + MethodHandle swWrite4 = swWrite.asCollector(0, char[].class, 4); + swWrite4.invoke('A', 'B', 'C', 'D', 1, 2); + assertEquals("BC", swr.toString()); + swWrite4.invoke('P', 'Q', 'R', 'S', 0, 4); + assertEquals("BCPQRS", swr.toString()); + swWrite4.invoke('W', 'X', 'Y', 'Z', 3, 1); + assertEquals("BCPQRSZ", swr.toString()); + } + + static class SpreadCollect { + + static String forSpreading(String s1, int i1, int i2, int i3, String s2) { + return s1 + i1 + i2 + i3 + s2; + } + + static String forCollecting(String s1, int[] is, String s2) { + StringBuilder sb = new StringBuilder(s1); + for (int i : is) { + sb.append(i); + } + return sb.append(s2).toString(); + } + + static String forCollectingLeading(int[] is, String s) { + return forCollecting("", is, s); + } + + static final Class SPREAD_COLLECT = SpreadCollect.class; + + static final MethodType MT_forSpreading = methodType(String.class, String.class, int.class, int.class, int.class, String.class); + static final MethodType MT_forCollecting = methodType(String.class, String.class, int[].class, String.class); + static final MethodType MT_forCollectingLeading = methodType(String.class, int[].class, String.class); + + static final MethodHandle MH_forSpreading; + static final MethodHandle MH_forCollecting; + static final MethodHandle MH_forCollectingLeading; + + static final MethodType MT_spreader = methodType(String.class, String.class, int[].class, String.class); + static final MethodType MT_collector0 = methodType(String.class, String.class, String.class); + static final MethodType MT_collector1 = methodType(String.class, String.class, int.class, String.class); + static final MethodType MT_collector2 = methodType(String.class, String.class, int.class, int.class, String.class); + static final MethodType MT_collector3 = methodType(String.class, String.class, int.class, int.class, int.class, String.class); + static final MethodType MT_collectorLeading1 = methodType(String.class, int.class, String.class); + static final MethodType MT_collectorLeading2 = methodType(String.class, int.class, int.class, String.class); + static final MethodType MT_collectorLeading3 = methodType(String.class, int.class, int.class, int.class, String.class); + + static final String NONE_ERROR = "zero array length in MethodHandle.asCollector"; + + static { + try { + MH_forSpreading = LOOKUP.findStatic(SPREAD_COLLECT, "forSpreading", MT_forSpreading); + MH_forCollecting = LOOKUP.findStatic(SPREAD_COLLECT, "forCollecting", MT_forCollecting); + MH_forCollectingLeading = LOOKUP.findStatic(SPREAD_COLLECT, "forCollectingLeading", MT_forCollectingLeading); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/T8139885.java --- a/jdk/test/java/lang/invoke/T8139885.java Mon Mar 07 18:49:02 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1111 +0,0 @@ -/* - * Copyright (c) 2015, 2016, 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. - */ - -/* @test - * @bug 8139885 - * @bug 8143798 - * @bug 8150825 - * @run testng/othervm -ea -esa test.java.lang.invoke.T8139885 - */ - -package test.java.lang.invoke; - -import java.io.StringWriter; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodHandles.Lookup; -import java.lang.invoke.MethodType; -import java.lang.invoke.WrongMethodTypeException; -import java.util.*; - -import static java.lang.invoke.MethodType.methodType; - -import static org.testng.AssertJUnit.*; - -import org.testng.annotations.*; - -/** - * Example-scale and negative tests for JEP 274 extensions. - */ -public class T8139885 { - - static final Lookup LOOKUP = MethodHandles.lookup(); - - // - // Tests. - // - - @Test - public static void testLoopFac() throws Throwable { - MethodHandle[] counterClause = new MethodHandle[]{Fac.MH_zero, Fac.MH_inc}; - MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; - MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause); - assertEquals(Fac.MT_fac, loop.type()); - assertEquals(120, loop.invoke(5)); - } - - @Test - public static void testLoopFacNullInit() throws Throwable { - // null initializer for counter, should initialize to 0 - MethodHandle[] counterClause = new MethodHandle[]{null, Fac.MH_inc}; - MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; - MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause); - assertEquals(Fac.MT_fac, loop.type()); - assertEquals(120, loop.invoke(5)); - } - - @Test - public static void testLoopVoid1() throws Throwable { - // construct a post-checked loop that only does one iteration and has a void body and void local state - MethodHandle loop = MethodHandles.loop(new MethodHandle[]{Empty.MH_f, Empty.MH_f, Empty.MH_pred, null}); - assertEquals(MethodType.methodType(void.class), loop.type()); - loop.invoke(); - } - - @Test - public static void testLoopVoid2() throws Throwable { - // construct a post-checked loop that only does one iteration and has a void body and void local state, - // initialized implicitly from the step type - MethodHandle loop = MethodHandles.loop(new MethodHandle[]{null, Empty.MH_f, Empty.MH_pred, null}); - assertEquals(MethodType.methodType(void.class), loop.type()); - loop.invoke(); - } - - @Test - public static void testLoopFacWithVoidState() throws Throwable { - // like testLoopFac, but with additional void state that outputs a dot - MethodHandle[] counterClause = new MethodHandle[]{Fac.MH_zero, Fac.MH_inc}; - MethodHandle[] accumulatorClause = new MethodHandle[]{Fac.MH_one, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}; - MethodHandle[] dotClause = new MethodHandle[]{null, Fac.MH_dot}; - MethodHandle loop = MethodHandles.loop(counterClause, accumulatorClause, dotClause); - assertEquals(Fac.MT_fac, loop.type()); - assertEquals(120, loop.invoke(5)); - } - - @Test - public static void testLoopNegative() throws Throwable { - MethodHandle mh_loop = - LOOKUP.findStatic(MethodHandles.class, "loop", methodType(MethodHandle.class, MethodHandle[][].class)); - MethodHandle i0 = MethodHandles.constant(int.class, 0); - MethodHandle ii = MethodHandles.dropArguments(i0, 0, int.class, int.class); - MethodHandle id = MethodHandles.dropArguments(i0, 0, int.class, double.class); - MethodHandle i3 = MethodHandles.dropArguments(i0, 0, int.class, int.class, int.class); - List inits = Arrays.asList(ii, id, i3); - List> ints = Arrays.asList(int.class, int.class, int.class); - List finis = Arrays.asList(Fac.MH_fin, Fac.MH_inc, Counted.MH_step); - List preds1 = Arrays.asList(null, null, null); - List preds2 = Arrays.asList(null, Fac.MH_fin, null); - MethodHandle eek = MethodHandles.dropArguments(i0, 0, int.class, int.class, double.class); - List nesteps = Arrays.asList(Fac.MH_inc, eek, Fac.MH_dot); - List nepreds = Arrays.asList(null, Fac.MH_pred, null); - List nefinis = Arrays.asList(null, Fac.MH_fin, null); - MethodHandle[][][] cases = { - null, - {}, - {{null, Fac.MH_inc}, {Fac.MH_one, null, Fac.MH_mult, Fac.MH_pred, Fac.MH_fin}}, - {{null, Fac.MH_inc}, null}, - {{Fac.MH_zero, Fac.MH_dot}}, - {{ii}, {id}, {i3}}, - {{null, Fac.MH_inc, null, Fac.MH_fin}, {null, Fac.MH_inc, null, Fac.MH_inc}, - {null, Counted.MH_start, null, Counted.MH_step}}, - {{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, Fac.MH_mult, null, Fac.MH_fin}, {null, Fac.MH_dot}}, - {{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, Fac.MH_mult, Fac.MH_fin, Fac.MH_fin}, {null, Fac.MH_dot}}, - {{Fac.MH_zero, Fac.MH_inc}, {Fac.MH_one, eek, Fac.MH_pred, Fac.MH_fin}, {null, Fac.MH_dot}} - }; - String[] messages = { - "null or no clauses passed", - "null or no clauses passed", - "All loop clauses must be represented as MethodHandle arrays with at most 4 elements.", - "null clauses are not allowed", - "clause 0: init and step return types must match: int != void", - "found non-effectively identical init parameter type lists: " + inits + " (common suffix: " + ints + ")", - "found non-identical finalizer return types: " + finis + " (return type: int)", - "no predicate found: " + preds1, - "predicates must have boolean return type: " + preds2, - "found non-effectively identical parameter type lists:\nstep: " + nesteps + "\npred: " + nepreds + - "\nfini: " + nefinis + " (common parameter sequence: " + ints + ")" - }; - for (int i = 0; i < cases.length; ++i) { - boolean caught = false; - try { - mh_loop.invokeWithArguments(cases[i]); - } catch (IllegalArgumentException iae) { - assertEquals(messages[i], iae.getMessage()); - caught = true; - } - assertTrue(caught); - } - } - - @Test - public static void testWhileLoop() throws Throwable { - // int i = 0; while (i < limit) { ++i; } return i; => limit - MethodHandle loop = MethodHandles.whileLoop(While.MH_zero, While.MH_pred, While.MH_step); - assertEquals(While.MT_while, loop.type()); - assertEquals(23, loop.invoke(23)); - } - - @Test - public static void testWhileLoopNoIteration() throws Throwable { - // a while loop that never executes its body because the predicate evaluates to false immediately - MethodHandle loop = MethodHandles.whileLoop(While.MH_initString, While.MH_predString, While.MH_stepString); - assertEquals(While.MT_string, loop.type()); - assertEquals("a", loop.invoke()); - } - - @Test - public static void testDoWhileLoop() throws Throwable { - // int i = 0; do { ++i; } while (i < limit); return i; => limit - MethodHandle loop = MethodHandles.doWhileLoop(While.MH_zero, While.MH_step, While.MH_pred); - assertEquals(While.MT_while, loop.type()); - assertEquals(23, loop.invoke(23)); - } - - @Test - public static void testWhileZip() throws Throwable { - MethodHandle loop = MethodHandles.doWhileLoop(While.MH_zipInitZip, While.MH_zipStep, While.MH_zipPred); - assertEquals(While.MT_zip, loop.type()); - List a = Arrays.asList("a", "b", "c", "d"); - List b = Arrays.asList("e", "f", "g", "h"); - List zipped = Arrays.asList("a", "e", "b", "f", "c", "g", "d", "h"); - assertEquals(zipped, (List) loop.invoke(a.iterator(), b.iterator())); - } - - @Test - public static void testCountedLoop() throws Throwable { - // String s = "Lambdaman!"; for (int i = 0; i < 13; ++i) { s = "na " + s; } return s; => a variation on a well known theme - MethodHandle fit13 = MethodHandles.constant(int.class, 13); - MethodHandle loop = MethodHandles.countedLoop(fit13, Counted.MH_start, Counted.MH_step); - assertEquals(Counted.MT_counted, loop.type()); - assertEquals("na na na na na na na na na na na na na Lambdaman!", loop.invoke("Lambdaman!")); - } - - @Test - public static void testCountedArrayLoop() throws Throwable { - // int[] a = new int[]{0}; for (int i = 0; i < 13; ++i) { ++a[0]; } => a[0] == 13 - MethodHandle fit13 = MethodHandles.dropArguments(MethodHandles.constant(int.class, 13), 0, int[].class); - MethodHandle loop = MethodHandles.countedLoop(fit13, null, Counted.MH_stepUpdateArray); - assertEquals(Counted.MT_arrayCounted, loop.type()); - int[] a = new int[]{0}; - loop.invoke(a); - assertEquals(13, a[0]); - } - - @Test - public static void testCountedPrintingLoop() throws Throwable { - MethodHandle fit5 = MethodHandles.constant(int.class, 5); - MethodHandle loop = MethodHandles.countedLoop(fit5, null, Counted.MH_printHello); - assertEquals(Counted.MT_countedPrinting, loop.type()); - loop.invoke(); - } - - @Test - public static void testCountedRangeLoop() throws Throwable { - // String s = "Lambdaman!"; for (int i = -5; i < 8; ++i) { s = "na " + s; } return s; => a well known theme - MethodHandle fitm5 = MethodHandles.dropArguments(Counted.MH_m5, 0, String.class); - MethodHandle fit8 = MethodHandles.dropArguments(Counted.MH_8, 0, String.class); - MethodHandle loop = MethodHandles.countedLoop(fitm5, fit8, Counted.MH_start, Counted.MH_step); - assertEquals(Counted.MT_counted, loop.type()); - assertEquals("na na na na na na na na na na na na na Lambdaman!", loop.invoke("Lambdaman!")); - } - - @Test - public static void testIterateSum() throws Throwable { - // Integer[] a = new Integer[]{1,2,3,4,5,6}; int sum = 0; for (int e : a) { sum += e; } return sum; => 21 - MethodHandle loop = MethodHandles.iteratedLoop(Iterate.MH_sumIterator, Iterate.MH_sumInit, Iterate.MH_sumStep); - assertEquals(Iterate.MT_sum, loop.type()); - assertEquals(21, loop.invoke(new Integer[]{1, 2, 3, 4, 5, 6})); - } - - @Test - public static void testIterateReverse() throws Throwable { - MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_reverseInit, Iterate.MH_reverseStep); - assertEquals(Iterate.MT_reverse, loop.type()); - List list = Arrays.asList("a", "b", "c", "d", "e"); - List reversedList = Arrays.asList("e", "d", "c", "b", "a"); - assertEquals(reversedList, (List) loop.invoke(list)); - } - - @Test - public static void testIterateLength() throws Throwable { - MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_lengthInit, Iterate.MH_lengthStep); - assertEquals(Iterate.MT_length, loop.type()); - List list = Arrays.asList(23.0, 148.0, 42.0); - assertEquals(list.size(), (int) loop.invoke(list)); - } - - @Test - public static void testIterateMap() throws Throwable { - MethodHandle loop = MethodHandles.iteratedLoop(null, Iterate.MH_mapInit, Iterate.MH_mapStep); - assertEquals(Iterate.MT_map, loop.type()); - List list = Arrays.asList("Hello", "world", "!"); - List upList = Arrays.asList("HELLO", "WORLD", "!"); - assertEquals(upList, (List) loop.invoke(list)); - } - - @Test - public static void testIteratePrint() throws Throwable { - MethodHandle loop = MethodHandles.iteratedLoop(null, null, Iterate.MH_printStep); - assertEquals(Iterate.MT_print, loop.type()); - loop.invoke(Arrays.asList("hello", "world")); - } - - @Test - public static void testIterateNullBody() { - boolean caught = false; - try { - MethodHandles.iteratedLoop(MethodHandles.identity(int.class), MethodHandles.identity(int.class), null); - } catch (IllegalArgumentException iae) { - assertEquals("iterated loop body must not be null", iae.getMessage()); - caught = true; - } - assertTrue(caught); - } - - @Test - public static void testTryFinally() throws Throwable { - MethodHandle hello = MethodHandles.tryFinally(TryFinally.MH_greet, TryFinally.MH_exclaim); - assertEquals(TryFinally.MT_hello, hello.type()); - assertEquals("Hello, world!", hello.invoke("world")); - } - - @Test - public static void testTryFinallyVoid() throws Throwable { - MethodHandle tfVoid = MethodHandles.tryFinally(TryFinally.MH_print, TryFinally.MH_printMore); - assertEquals(TryFinally.MT_printHello, tfVoid.type()); - tfVoid.invoke("world"); - } - - @Test - public static void testTryFinallySublist() throws Throwable { - MethodHandle helloMore = MethodHandles.tryFinally(TryFinally.MH_greetMore, TryFinally.MH_exclaimMore); - assertEquals(TryFinally.MT_moreHello, helloMore.type()); - assertEquals("Hello, world and universe (but world first)!", helloMore.invoke("world", "universe")); - } - - @Test - public static void testTryFinallyNegative() { - MethodHandle intid = MethodHandles.identity(int.class); - MethodHandle intco = MethodHandles.constant(int.class, 0); - MethodHandle errTarget = MethodHandles.dropArguments(intco, 0, int.class, double.class, String.class, int.class); - MethodHandle errCleanup = MethodHandles.dropArguments(MethodHandles.constant(int.class, 0), 0, Throwable.class, - int.class, double.class, Object.class); - MethodHandle[][] cases = { - {intid, MethodHandles.identity(double.class)}, - {intid, MethodHandles.dropArguments(intid, 0, String.class)}, - {intid, MethodHandles.dropArguments(intid, 0, Throwable.class, double.class)}, - {errTarget, errCleanup}, - {TryFinally.MH_voidTarget, TryFinally.MH_voidCleanup} - }; - String[] messages = { - "target and return types must match: double != int", - "cleanup first argument and Throwable must match: (String,int)int != class java.lang.Throwable", - "cleanup second argument and target return type must match: (Throwable,double,int)int != int", - "cleanup parameters after (Throwable,result) and target parameter list prefix must match: " + - errCleanup.type() + " != " + errTarget.type(), - "cleanup parameters after (Throwable,result) and target parameter list prefix must match: " + - TryFinally.MH_voidCleanup.type() + " != " + TryFinally.MH_voidTarget.type() - }; - for (int i = 0; i < cases.length; ++i) { - boolean caught = false; - try { - MethodHandles.tryFinally(cases[i][0], cases[i][1]); - } catch (IllegalArgumentException iae) { - assertEquals(messages[i], iae.getMessage()); - caught = true; - } - assertTrue(caught); - } - } - - @Test - public static void testFold0a() throws Throwable { - // equivalence to foldArguments(MethodHandle,MethodHandle) - MethodHandle fold = MethodHandles.foldArguments(Fold.MH_multer, 0, Fold.MH_adder); - assertEquals(Fold.MT_folded1, fold.type()); - assertEquals(720, (int) fold.invoke(3, 4, 5)); - } - - @Test - public static void testFold1a() throws Throwable { - // test foldArguments for folding position 1 - MethodHandle fold = MethodHandles.foldArguments(Fold.MH_multer, 1, Fold.MH_adder1); - assertEquals(Fold.MT_folded1, fold.type()); - assertEquals(540, (int) fold.invoke(3, 4, 5)); - } - - @Test - public static void testFold0b() throws Throwable { - // test foldArguments equivalence with multiple types - MethodHandle fold = MethodHandles.foldArguments(Fold.MH_str, 0, Fold.MH_comb); - assertEquals(Fold.MT_folded2, fold.type()); - assertEquals(23, (int) fold.invoke("true", true, 23)); - } - - @Test - public static void testFold1b() throws Throwable { - // test folgArguments for folding position 1, with multiple types - MethodHandle fold = MethodHandles.foldArguments(Fold.MH_str, 1, Fold.MH_comb2); - assertEquals(Fold.MT_folded3, fold.type()); - assertEquals(1, (int) fold.invoke(true, true, 1)); - assertEquals(-1, (int) fold.invoke(true, false, -1)); - } - - @Test - public static void testFoldArgumentsExample() throws Throwable { - // test the JavaDoc foldArguments-with-pos example - StringWriter swr = new StringWriter(); - MethodHandle trace = LOOKUP.findVirtual(StringWriter.class, "write", methodType(void.class, String.class)).bindTo(swr); - MethodHandle cat = LOOKUP.findVirtual(String.class, "concat", methodType(String.class, String.class)); - assertEquals("boojum", (String) cat.invokeExact("boo", "jum")); - MethodHandle catTrace = MethodHandles.foldArguments(cat, 1, trace); - assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum")); - assertEquals("jum", swr.toString()); - } - - @Test - public static void testAsSpreader() throws Throwable { - MethodHandle spreader = SpreadCollect.MH_forSpreading.asSpreader(1, int[].class, 3); - assertEquals(SpreadCollect.MT_spreader, spreader.type()); - assertEquals("A456B", (String) spreader.invoke("A", new int[]{4, 5, 6}, "B")); - } - - @Test - public static void testAsSpreaderExample() throws Throwable { - // test the JavaDoc asSpreader-with-pos example - MethodHandle compare = LOOKUP.findStatic(Objects.class, "compare", methodType(int.class, Object.class, Object.class, Comparator.class)); - MethodHandle compare2FromArray = compare.asSpreader(0, Object[].class, 2); - Object[] ints = new Object[]{3, 9, 7, 7}; - Comparator cmp = (a, b) -> a - b; - assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 0, 2), cmp) < 0); - assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 1, 3), cmp) > 0); - assertTrue((int) compare2FromArray.invoke(Arrays.copyOfRange(ints, 2, 4), cmp) == 0); - } - - @Test - public static void testAsSpreaderIllegalPos() throws Throwable { - int[] illegalPos = {-7, 3, 19}; - int caught = 0; - for (int p : illegalPos) { - try { - SpreadCollect.MH_forSpreading.asSpreader(p, Object[].class, 3); - } catch (IllegalArgumentException iae) { - assertEquals("bad spread position", iae.getMessage()); - ++caught; - } - } - assertEquals(illegalPos.length, caught); - } - - @Test - public static void testAsSpreaderIllegalMethodType() throws Throwable { - MethodHandle h = MethodHandles.dropArguments(MethodHandles.constant(String.class, ""), 0, int.class, int.class); - boolean caught = false; - try { - MethodHandle s = h.asSpreader(String[].class, 1); - } catch (WrongMethodTypeException wmte) { - caught = true; - } - assertTrue(caught); - } - - @Test - public static void testAsCollector() throws Throwable { - MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 1); - assertEquals(SpreadCollect.MT_collector1, collector.type()); - assertEquals("A4B", (String) collector.invoke("A", 4, "B")); - collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 2); - assertEquals(SpreadCollect.MT_collector2, collector.type()); - assertEquals("A45B", (String) collector.invoke("A", 4, 5, "B")); - collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 3); - assertEquals(SpreadCollect.MT_collector3, collector.type()); - assertEquals("A456B", (String) collector.invoke("A", 4, 5, 6, "B")); - } - - @Test - public static void testAsCollectorInvokeWithArguments() throws Throwable { - MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 1); - assertEquals(SpreadCollect.MT_collector1, collector.type()); - assertEquals("A4B", (String) collector.invokeWithArguments("A", 4, "B")); - collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 2); - assertEquals(SpreadCollect.MT_collector2, collector.type()); - assertEquals("A45B", (String) collector.invokeWithArguments("A", 4, 5, "B")); - collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 3); - assertEquals(SpreadCollect.MT_collector3, collector.type()); - assertEquals("A456B", (String) collector.invokeWithArguments("A", 4, 5, 6, "B")); - } - - @Test - public static void testAsCollectorLeading() throws Throwable { - MethodHandle collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 1); - assertEquals(SpreadCollect.MT_collectorLeading1, collector.type()); - assertEquals("7Q", (String) collector.invoke(7, "Q")); - collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 2); - assertEquals(SpreadCollect.MT_collectorLeading2, collector.type()); - assertEquals("78Q", (String) collector.invoke(7, 8, "Q")); - collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 3); - assertEquals(SpreadCollect.MT_collectorLeading3, collector.type()); - assertEquals("789Q", (String) collector.invoke(7, 8, 9, "Q")); - } - - @Test - public static void testAsCollectorLeadingInvokeWithArguments() throws Throwable { - MethodHandle collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 1); - assertEquals(SpreadCollect.MT_collectorLeading1, collector.type()); - assertEquals("7Q", (String) collector.invokeWithArguments(7, "Q")); - collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 2); - assertEquals(SpreadCollect.MT_collectorLeading2, collector.type()); - assertEquals("78Q", (String) collector.invokeWithArguments(7, 8, "Q")); - collector = SpreadCollect.MH_forCollectingLeading.asCollector(0, int[].class, 3); - assertEquals(SpreadCollect.MT_collectorLeading3, collector.type()); - assertEquals("789Q", (String) collector.invokeWithArguments(7, 8, 9, "Q")); - } - - @Test - public static void testAsCollectorNone() throws Throwable { - MethodHandle collector = SpreadCollect.MH_forCollecting.asCollector(1, int[].class, 0); - assertEquals(SpreadCollect.MT_collector0, collector.type()); - assertEquals("AB", (String) collector.invoke("A", "B")); - } - - @Test - public static void testAsCollectorIllegalPos() throws Throwable { - int[] illegalPos = {-1, 17}; - int caught = 0; - for (int p : illegalPos) { - try { - SpreadCollect.MH_forCollecting.asCollector(p, int[].class, 0); - } catch (IllegalArgumentException iae) { - assertEquals("bad collect position", iae.getMessage()); - ++caught; - } - } - assertEquals(illegalPos.length, caught); - } - - @Test - public static void testAsCollectorExample() throws Throwable { - // test the JavaDoc asCollector-with-pos example - StringWriter swr = new StringWriter(); - MethodHandle swWrite = LOOKUP. - findVirtual(StringWriter.class, "write", methodType(void.class, char[].class, int.class, int.class)). - bindTo(swr); - MethodHandle swWrite4 = swWrite.asCollector(0, char[].class, 4); - swWrite4.invoke('A', 'B', 'C', 'D', 1, 2); - assertEquals("BC", swr.toString()); - swWrite4.invoke('P', 'Q', 'R', 'S', 0, 4); - assertEquals("BCPQRS", swr.toString()); - swWrite4.invoke('W', 'X', 'Y', 'Z', 3, 1); - assertEquals("BCPQRSZ", swr.toString()); - } - - @Test - public static void testFindSpecial() throws Throwable { - FindSpecial.C c = new FindSpecial.C(); - assertEquals("I1.m", c.m()); - MethodType t = MethodType.methodType(String.class); - MethodHandle ci1m = LOOKUP.findSpecial(FindSpecial.I1.class, "m", t, FindSpecial.C.class); - assertEquals("I1.m", (String) ci1m.invoke(c)); - } - - @Test - public static void testFindSpecialAbstract() throws Throwable { - FindSpecial.C c = new FindSpecial.C(); - assertEquals("q", c.q()); - MethodType t = MethodType.methodType(String.class); - boolean caught = false; - try { - MethodHandle ci3q = LOOKUP.findSpecial(FindSpecial.I3.class, "q", t, FindSpecial.C.class); - } catch (Throwable thrown) { - if (!(thrown instanceof IllegalAccessException) || !FindSpecial.ABSTRACT_ERROR.equals(thrown.getMessage())) { - throw new AssertionError(thrown.getMessage(), thrown); - } - caught = true; - } - assertTrue(caught); - } - - @Test - public static void testFindClassCNFE() throws Throwable { - boolean caught = false; - try { - LOOKUP.findClass("does.not.Exist"); - } catch (ClassNotFoundException cnfe) { - caught = true; - } - assertTrue(caught); - } - - // - // Methods used to assemble tests. - // - - static class Empty { - - static void f() { } - - static boolean pred() { - return false; - } - - static final Class EMPTY = Empty.class; - - static final MethodType MT_f = methodType(void.class); - static final MethodType MT_pred = methodType(boolean.class); - - static final MethodHandle MH_f; - static final MethodHandle MH_pred; - - static { - try { - MH_f = LOOKUP.findStatic(EMPTY, "f", MT_f); - MH_pred = LOOKUP.findStatic(EMPTY, "pred", MT_pred); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - } - - static class Fac { - - static int zero(int k) { - return 0; - } - - static int one(int k) { - return 1; - } - - static boolean pred(int i, int acc, int k) { - return i < k; - } - - static int inc(int i, int acc, int k) { - return i + 1; - } - - static int mult(int i, int acc, int k) { - return i * acc; - } - - static void dot(int i, int acc, int k) { - System.out.print('.'); - } - - static int fin(int i, int acc, int k) { - return acc; - } - - static final Class FAC = Fac.class; - - static final MethodType MT_init = methodType(int.class, int.class); - static final MethodType MT_fn = methodType(int.class, int.class, int.class, int.class); - static final MethodType MT_dot = methodType(void.class, int.class, int.class, int.class); - static final MethodType MT_pred = methodType(boolean.class, int.class, int.class, int.class); - - static final MethodHandle MH_zero; - static final MethodHandle MH_one; - static final MethodHandle MH_pred; - static final MethodHandle MH_inc; - static final MethodHandle MH_mult; - static final MethodHandle MH_dot; - static final MethodHandle MH_fin; - - static final MethodType MT_fac = methodType(int.class, int.class); - - static { - try { - MH_zero = LOOKUP.findStatic(FAC, "zero", MT_init); - MH_one = LOOKUP.findStatic(FAC, "one", MT_init); - MH_pred = LOOKUP.findStatic(FAC, "pred", MT_pred); - MH_inc = LOOKUP.findStatic(FAC, "inc", MT_fn); - MH_mult = LOOKUP.findStatic(FAC, "mult", MT_fn); - MH_dot = LOOKUP.findStatic(FAC, "dot", MT_dot); - MH_fin = LOOKUP.findStatic(FAC, "fin", MT_fn); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class While { - - static int zero(int limit) { - return 0; - } - - static boolean pred(int i, int limit) { - return i < limit; - } - - static int step(int i, int limit) { - return i + 1; - } - - static String initString() { - return "a"; - } - - static boolean predString(String s) { - return s.length() != 1; - } - - static String stepString(String s) { - return s + "a"; - } - - static List zipInitZip(Iterator a, Iterator b) { - return new ArrayList<>(); - } - - static boolean zipPred(List zip, Iterator a, Iterator b) { - return a.hasNext() && b.hasNext(); - } - - static List zipStep(List zip, Iterator a, Iterator b) { - zip.add(a.next()); - zip.add(b.next()); - return zip; - } - - static final Class WHILE = While.class; - - static final MethodType MT_zero = methodType(int.class, int.class); - static final MethodType MT_pred = methodType(boolean.class, int.class, int.class); - static final MethodType MT_fn = methodType(int.class, int.class, int.class); - static final MethodType MT_initString = methodType(String.class); - static final MethodType MT_predString = methodType(boolean.class, String.class); - static final MethodType MT_stepString = methodType(String.class, String.class); - static final MethodType MT_zipInitZip = methodType(List.class, Iterator.class, Iterator.class); - static final MethodType MT_zipPred = methodType(boolean.class, List.class, Iterator.class, Iterator.class); - static final MethodType MT_zipStep = methodType(List.class, List.class, Iterator.class, Iterator.class); - - static final MethodHandle MH_zero; - static final MethodHandle MH_pred; - static final MethodHandle MH_step; - static final MethodHandle MH_initString; - static final MethodHandle MH_predString; - static final MethodHandle MH_stepString; - static final MethodHandle MH_zipInitZip; - static final MethodHandle MH_zipPred; - static final MethodHandle MH_zipStep; - - static final MethodType MT_while = methodType(int.class, int.class); - static final MethodType MT_string = methodType(String.class); - static final MethodType MT_zip = methodType(List.class, Iterator.class, Iterator.class); - - static { - try { - MH_zero = LOOKUP.findStatic(WHILE, "zero", MT_zero); - MH_pred = LOOKUP.findStatic(WHILE, "pred", MT_pred); - MH_step = LOOKUP.findStatic(WHILE, "step", MT_fn); - MH_initString = LOOKUP.findStatic(WHILE, "initString", MT_initString); - MH_predString = LOOKUP.findStatic(WHILE, "predString", MT_predString); - MH_stepString = LOOKUP.findStatic(WHILE, "stepString", MT_stepString); - MH_zipInitZip = LOOKUP.findStatic(WHILE, "zipInitZip", MT_zipInitZip); - MH_zipPred = LOOKUP.findStatic(WHILE, "zipPred", MT_zipPred); - MH_zipStep = LOOKUP.findStatic(WHILE, "zipStep", MT_zipStep); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class Counted { - - static String start(String arg) { - return arg; - } - - static String step(int counter, String v, String arg) { - return "na " + v; - } - - static void stepUpdateArray(int counter, int[] a) { - ++a[0]; - } - - static void printHello(int counter) { - System.out.print("hello"); - } - - static final Class COUNTED = Counted.class; - - static final MethodType MT_start = methodType(String.class, String.class); - static final MethodType MT_step = methodType(String.class, int.class, String.class, String.class); - static final MethodType MT_stepUpdateArray = methodType(void.class, int.class, int[].class); - static final MethodType MT_printHello = methodType(void.class, int.class); - - static final MethodHandle MH_13; - static final MethodHandle MH_m5; - static final MethodHandle MH_8; - static final MethodHandle MH_start; - static final MethodHandle MH_step; - static final MethodHandle MH_stepUpdateArray; - static final MethodHandle MH_printHello; - - static final MethodType MT_counted = methodType(String.class, String.class); - static final MethodType MT_arrayCounted = methodType(void.class, int[].class); - static final MethodType MT_countedPrinting = methodType(void.class); - - static { - try { - MH_13 = MethodHandles.constant(int.class, 13); - MH_m5 = MethodHandles.constant(int.class, -5); - MH_8 = MethodHandles.constant(int.class, 8); - MH_start = LOOKUP.findStatic(COUNTED, "start", MT_start); - MH_step = LOOKUP.findStatic(COUNTED, "step", MT_step); - MH_stepUpdateArray = LOOKUP.findStatic(COUNTED, "stepUpdateArray", MT_stepUpdateArray); - MH_printHello = LOOKUP.findStatic(COUNTED, "printHello", MT_printHello); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class Iterate { - - static Iterator sumIterator(Integer[] a) { - return Arrays.asList(a).iterator(); - } - - static int sumInit(Integer[] a) { - return 0; - } - - static int sumStep(int s, int e, Integer[] a) { - return s + e; - } - - static List reverseInit(List l) { - return new ArrayList<>(); - } - - static List reverseStep(String e, List r, List l) { - r.add(0, e); - return r; - } - - static int lengthInit(List l) { - return 0; - } - - static int lengthStep(Object o, int len, List l) { - return len + 1; - } - - static List mapInit(List l) { - return new ArrayList<>(); - } - - static List mapStep(String e, List r, List l) { - r.add(e.toUpperCase()); - return r; - } - - static void printStep(String s, List l) { - System.out.print(s); - } - - static final Class ITERATE = Iterate.class; - - static final MethodType MT_sumIterator = methodType(Iterator.class, Integer[].class); - - static final MethodType MT_sumInit = methodType(int.class, Integer[].class); - static final MethodType MT_reverseInit = methodType(List.class, List.class); - static final MethodType MT_lenghInit = methodType(int.class, List.class); - static final MethodType MT_mapInit = methodType(List.class, List.class); - - static final MethodType MT_sumStep = methodType(int.class, int.class, int.class, Integer[].class); - static final MethodType MT_reverseStep = methodType(List.class, String.class, List.class, List.class); - static final MethodType MT_lengthStep = methodType(int.class, Object.class, int.class, List.class); - static final MethodType MT_mapStep = methodType(List.class, String.class, List.class, List.class); - static final MethodType MT_printStep = methodType(void.class, String.class, List.class); - - static final MethodHandle MH_sumIterator; - static final MethodHandle MH_sumInit; - static final MethodHandle MH_sumStep; - static final MethodHandle MH_printStep; - - static final MethodHandle MH_reverseInit; - static final MethodHandle MH_reverseStep; - - static final MethodHandle MH_lengthInit; - static final MethodHandle MH_lengthStep; - - static final MethodHandle MH_mapInit; - static final MethodHandle MH_mapStep; - - static final MethodType MT_sum = methodType(int.class, Integer[].class); - static final MethodType MT_reverse = methodType(List.class, List.class); - static final MethodType MT_length = methodType(int.class, List.class); - static final MethodType MT_map = methodType(List.class, List.class); - static final MethodType MT_print = methodType(void.class, List.class); - - static { - try { - MH_sumIterator = LOOKUP.findStatic(ITERATE, "sumIterator", MT_sumIterator); - MH_sumInit = LOOKUP.findStatic(ITERATE, "sumInit", MT_sumInit); - MH_sumStep = LOOKUP.findStatic(ITERATE, "sumStep", MT_sumStep); - MH_reverseInit = LOOKUP.findStatic(ITERATE, "reverseInit", MT_reverseInit); - MH_reverseStep = LOOKUP.findStatic(ITERATE, "reverseStep", MT_reverseStep); - MH_lengthInit = LOOKUP.findStatic(ITERATE, "lengthInit", MT_lenghInit); - MH_lengthStep = LOOKUP.findStatic(ITERATE, "lengthStep", MT_lengthStep); - MH_mapInit = LOOKUP.findStatic(ITERATE, "mapInit", MT_mapInit); - MH_mapStep = LOOKUP.findStatic(ITERATE, "mapStep", MT_mapStep); - MH_printStep = LOOKUP.findStatic(ITERATE, "printStep", MT_printStep); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class TryFinally { - - static String greet(String whom) { - return "Hello, " + whom; - } - - static String exclaim(Throwable t, String r, String whom) { - return r + "!"; - } - - static void print(String what) { - System.out.print("Hello, " + what); - } - - static void printMore(Throwable t, String what) { - System.out.println("!"); - } - - static String greetMore(String first, String second) { - return "Hello, " + first + " and " + second; - } - - static String exclaimMore(Throwable t, String r, String first) { - return r + " (but " + first + " first)!"; - } - - static void voidTarget() {} - - static void voidCleanup(Throwable t, int a) {} - - static final Class TRY_FINALLY = TryFinally.class; - - static final MethodType MT_greet = methodType(String.class, String.class); - static final MethodType MT_exclaim = methodType(String.class, Throwable.class, String.class, String.class); - static final MethodType MT_print = methodType(void.class, String.class); - static final MethodType MT_printMore = methodType(void.class, Throwable.class, String.class); - static final MethodType MT_greetMore = methodType(String.class, String.class, String.class); - static final MethodType MT_exclaimMore = methodType(String.class, Throwable.class, String.class, String.class); - static final MethodType MT_voidTarget = methodType(void.class); - static final MethodType MT_voidCleanup = methodType(void.class, Throwable.class, int.class); - - static final MethodHandle MH_greet; - static final MethodHandle MH_exclaim; - static final MethodHandle MH_print; - static final MethodHandle MH_printMore; - static final MethodHandle MH_greetMore; - static final MethodHandle MH_exclaimMore; - static final MethodHandle MH_voidTarget; - static final MethodHandle MH_voidCleanup; - - static final MethodType MT_hello = methodType(String.class, String.class); - static final MethodType MT_printHello = methodType(void.class, String.class); - static final MethodType MT_moreHello = methodType(String.class, String.class, String.class); - - static { - try { - MH_greet = LOOKUP.findStatic(TRY_FINALLY, "greet", MT_greet); - MH_exclaim = LOOKUP.findStatic(TRY_FINALLY, "exclaim", MT_exclaim); - MH_print = LOOKUP.findStatic(TRY_FINALLY, "print", MT_print); - MH_printMore = LOOKUP.findStatic(TRY_FINALLY, "printMore", MT_printMore); - MH_greetMore = LOOKUP.findStatic(TRY_FINALLY, "greetMore", MT_greetMore); - MH_exclaimMore = LOOKUP.findStatic(TRY_FINALLY, "exclaimMore", MT_exclaimMore); - MH_voidTarget = LOOKUP.findStatic(TRY_FINALLY, "voidTarget", MT_voidTarget); - MH_voidCleanup = LOOKUP.findStatic(TRY_FINALLY, "voidCleanup", MT_voidCleanup); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class Fold { - - static int adder(int a, int b, int c) { - return a + b + c; - } - - static int adder1(int a, int b) { - return a + b; - } - - static int multer(int x, int q, int r, int s) { - return x * q * r * s; - } - - static int str(boolean b1, String s, boolean b2, int x) { - return b1 && s.equals(String.valueOf(b2)) ? x : -x; - } - - static boolean comb(String s, boolean b2) { - return !s.equals(b2); - } - - static String comb2(boolean b2, int x) { - int ib = b2 ? 1 : 0; - return ib == x ? "true" : "false"; - } - - static final Class FOLD = Fold.class; - - static final MethodType MT_adder = methodType(int.class, int.class, int.class, int.class); - static final MethodType MT_adder1 = methodType(int.class, int.class, int.class); - static final MethodType MT_multer = methodType(int.class, int.class, int.class, int.class, int.class); - static final MethodType MT_str = methodType(int.class, boolean.class, String.class, boolean.class, int.class); - static final MethodType MT_comb = methodType(boolean.class, String.class, boolean.class); - static final MethodType MT_comb2 = methodType(String.class, boolean.class, int.class); - - static final MethodHandle MH_adder; - static final MethodHandle MH_adder1; - static final MethodHandle MH_multer; - static final MethodHandle MH_str; - static final MethodHandle MH_comb; - static final MethodHandle MH_comb2; - - static final MethodType MT_folded1 = methodType(int.class, int.class, int.class, int.class); - static final MethodType MT_folded2 = methodType(int.class, String.class, boolean.class, int.class); - static final MethodType MT_folded3 = methodType(int.class, boolean.class, boolean.class, int.class); - - static { - try { - MH_adder = LOOKUP.findStatic(FOLD, "adder", MT_adder); - MH_adder1 = LOOKUP.findStatic(FOLD, "adder1", MT_adder1); - MH_multer = LOOKUP.findStatic(FOLD, "multer", MT_multer); - MH_str = LOOKUP.findStatic(FOLD, "str", MT_str); - MH_comb = LOOKUP.findStatic(FOLD, "comb", MT_comb); - MH_comb2 = LOOKUP.findStatic(FOLD, "comb2", MT_comb2); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - } - - static class SpreadCollect { - - static String forSpreading(String s1, int i1, int i2, int i3, String s2) { - return s1 + i1 + i2 + i3 + s2; - } - - static String forCollecting(String s1, int[] is, String s2) { - StringBuilder sb = new StringBuilder(s1); - for (int i : is) { - sb.append(i); - } - return sb.append(s2).toString(); - } - - static String forCollectingLeading(int[] is, String s) { - return forCollecting("", is, s); - } - - static final Class SPREAD_COLLECT = SpreadCollect.class; - - static final MethodType MT_forSpreading = methodType(String.class, String.class, int.class, int.class, int.class, String.class); - static final MethodType MT_forCollecting = methodType(String.class, String.class, int[].class, String.class); - static final MethodType MT_forCollectingLeading = methodType(String.class, int[].class, String.class); - - static final MethodHandle MH_forSpreading; - static final MethodHandle MH_forCollecting; - static final MethodHandle MH_forCollectingLeading; - - static final MethodType MT_spreader = methodType(String.class, String.class, int[].class, String.class); - static final MethodType MT_collector0 = methodType(String.class, String.class, String.class); - static final MethodType MT_collector1 = methodType(String.class, String.class, int.class, String.class); - static final MethodType MT_collector2 = methodType(String.class, String.class, int.class, int.class, String.class); - static final MethodType MT_collector3 = methodType(String.class, String.class, int.class, int.class, int.class, String.class); - static final MethodType MT_collectorLeading1 = methodType(String.class, int.class, String.class); - static final MethodType MT_collectorLeading2 = methodType(String.class, int.class, int.class, String.class); - static final MethodType MT_collectorLeading3 = methodType(String.class, int.class, int.class, int.class, String.class); - - static final String NONE_ERROR = "zero array length in MethodHandle.asCollector"; - - static { - try { - MH_forSpreading = LOOKUP.findStatic(SPREAD_COLLECT, "forSpreading", MT_forSpreading); - MH_forCollecting = LOOKUP.findStatic(SPREAD_COLLECT, "forCollecting", MT_forCollecting); - MH_forCollectingLeading = LOOKUP.findStatic(SPREAD_COLLECT, "forCollectingLeading", MT_forCollectingLeading); - } catch (Exception e) { - throw new ExceptionInInitializerError(e); - } - } - - } - - static class FindSpecial { - - interface I1 { - default String m() { - return "I1.m"; - } - } - - interface I2 { - default String m() { - return "I2.m"; - } - } - - interface I3 { - String q(); - } - - static class C implements I1, I2, I3 { - public String m() { - return I1.super.m(); - } - public String q() { - return "q"; - } - } - - static final String ABSTRACT_ERROR = "no such method: test.java.lang.invoke.T8139885$FindSpecial$I3.q()String/invokeSpecial"; - - } - - // - // Auxiliary methods. - // - - static MethodHandle[] mha(MethodHandle... mhs) { - return mhs; - } - -} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/TryFinallyTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/TryFinallyTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2015, 2016, 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. + */ + +/* @test + * @bug 8139885 + * @bug 8150825 + * @run testng/othervm -ea -esa test.java.lang.invoke.TryFinallyTest + */ + +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + +/** + * Tests for the tryFinally method handle combinator introduced in JEP 274. + */ +public class TryFinallyTest { + + static final Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testTryFinally() throws Throwable { + MethodHandle hello = MethodHandles.tryFinally(TryFinally.MH_greet, TryFinally.MH_exclaim); + assertEquals(TryFinally.MT_hello, hello.type()); + assertEquals("Hello, world!", hello.invoke("world")); + } + + @Test + public static void testTryFinallyVoid() throws Throwable { + MethodHandle tfVoid = MethodHandles.tryFinally(TryFinally.MH_print, TryFinally.MH_printMore); + assertEquals(TryFinally.MT_printHello, tfVoid.type()); + tfVoid.invoke("world"); + } + + @Test + public static void testTryFinallySublist() throws Throwable { + MethodHandle helloMore = MethodHandles.tryFinally(TryFinally.MH_greetMore, TryFinally.MH_exclaimMore); + assertEquals(TryFinally.MT_moreHello, helloMore.type()); + assertEquals("Hello, world and universe (but world first)!", helloMore.invoke("world", "universe")); + } + + @DataProvider + static Object[][] negativeTestData() { + MethodHandle intid = MethodHandles.identity(int.class); + MethodHandle intco = MethodHandles.constant(int.class, 0); + MethodHandle errTarget = MethodHandles.dropArguments(intco, 0, int.class, double.class, String.class, int.class); + MethodHandle errCleanup = MethodHandles.dropArguments(MethodHandles.constant(int.class, 0), 0, Throwable.class, + int.class, double.class, Object.class); + return new Object[][]{ + {intid, MethodHandles.identity(double.class), + "target and return types must match: double != int"}, + {intid, MethodHandles.dropArguments(intid, 0, String.class), + "cleanup first argument and Throwable must match: (String,int)int != class java.lang.Throwable"}, + {intid, MethodHandles.dropArguments(intid, 0, Throwable.class, double.class), + "cleanup second argument and target return type must match: (Throwable,double,int)int != int"}, + {errTarget, errCleanup, + "cleanup parameters after (Throwable,result) and target parameter list prefix must match: " + + errCleanup.type() + " != " + errTarget.type()}, + {TryFinally.MH_voidTarget, TryFinally.MH_voidCleanup, + "cleanup parameters after (Throwable,result) and target parameter list prefix must match: " + + TryFinally.MH_voidCleanup.type() + " != " + TryFinally.MH_voidTarget.type()} + }; + } + + @Test(dataProvider = "negativeTestData") + public static void testTryFinallyNegative(MethodHandle target, MethodHandle cleanup, String expectedMessage) { + boolean caught = false; + try { + MethodHandles.tryFinally(target, cleanup); + } catch (IllegalArgumentException iae) { + assertEquals(expectedMessage, iae.getMessage()); + caught = true; + } + assertTrue(caught); + } + + static class TryFinally { + + static String greet(String whom) { + return "Hello, " + whom; + } + + static String exclaim(Throwable t, String r, String whom) { + return r + "!"; + } + + static void print(String what) { + System.out.print("Hello, " + what); + } + + static void printMore(Throwable t, String what) { + System.out.println("!"); + } + + static String greetMore(String first, String second) { + return "Hello, " + first + " and " + second; + } + + static String exclaimMore(Throwable t, String r, String first) { + return r + " (but " + first + " first)!"; + } + + static void voidTarget() {} + + static void voidCleanup(Throwable t, int a) {} + + static final Class TRY_FINALLY = TryFinally.class; + + static final MethodType MT_greet = methodType(String.class, String.class); + static final MethodType MT_exclaim = methodType(String.class, Throwable.class, String.class, String.class); + static final MethodType MT_print = methodType(void.class, String.class); + static final MethodType MT_printMore = methodType(void.class, Throwable.class, String.class); + static final MethodType MT_greetMore = methodType(String.class, String.class, String.class); + static final MethodType MT_exclaimMore = methodType(String.class, Throwable.class, String.class, String.class); + static final MethodType MT_voidTarget = methodType(void.class); + static final MethodType MT_voidCleanup = methodType(void.class, Throwable.class, int.class); + + static final MethodHandle MH_greet; + static final MethodHandle MH_exclaim; + static final MethodHandle MH_print; + static final MethodHandle MH_printMore; + static final MethodHandle MH_greetMore; + static final MethodHandle MH_exclaimMore; + static final MethodHandle MH_voidTarget; + static final MethodHandle MH_voidCleanup; + + static final MethodType MT_hello = methodType(String.class, String.class); + static final MethodType MT_printHello = methodType(void.class, String.class); + static final MethodType MT_moreHello = methodType(String.class, String.class, String.class); + + static { + try { + MH_greet = LOOKUP.findStatic(TRY_FINALLY, "greet", MT_greet); + MH_exclaim = LOOKUP.findStatic(TRY_FINALLY, "exclaim", MT_exclaim); + MH_print = LOOKUP.findStatic(TRY_FINALLY, "print", MT_print); + MH_printMore = LOOKUP.findStatic(TRY_FINALLY, "printMore", MT_printMore); + MH_greetMore = LOOKUP.findStatic(TRY_FINALLY, "greetMore", MT_greetMore); + MH_exclaimMore = LOOKUP.findStatic(TRY_FINALLY, "exclaimMore", MT_exclaimMore); + MH_voidTarget = LOOKUP.findStatic(TRY_FINALLY, "voidTarget", MT_voidTarget); + MH_voidCleanup = LOOKUP.findStatic(TRY_FINALLY, "voidCleanup", MT_voidCleanup); + } catch (Exception e) { + throw new ExceptionInInitializerError(e); + } + } + + } + +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/lambda/LambdaAccessControlDoPrivilegedTest.java --- a/jdk/test/java/lang/invoke/lambda/LambdaAccessControlDoPrivilegedTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/invoke/lambda/LambdaAccessControlDoPrivilegedTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2016, 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,6 +27,7 @@ * @summary tests DoPrivileged action (implemented as lambda expressions) by * inserting them into the BootClassPath. * @modules jdk.compiler + * jdk.zipfs * @compile -XDignore.symbol.file LambdaAccessControlDoPrivilegedTest.java LUtils.java * @run main/othervm LambdaAccessControlDoPrivilegedTest */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/lambda/LambdaAsm.java --- a/jdk/test/java/lang/invoke/lambda/LambdaAsm.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/invoke/lambda/LambdaAsm.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, 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,6 +28,7 @@ * generate bytecodes with correct constant pool references * @modules java.base/jdk.internal.org.objectweb.asm * jdk.jdeps/com.sun.tools.classfile + * jdk.zipfs * @compile -XDignore.symbol.file LambdaAsm.java LUtils.java * @run main/othervm LambdaAsm */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java --- a/jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -26,6 +26,8 @@ * @bug 8023524 * @summary tests logging generated classes for lambda * @library /java/nio/file + * @modules jdk.compiler + * jdk.zipfs * @run testng LogGeneratedClassesTest */ import java.io.File; diff -r f74f056dc069 -r a090823529e7 jdk/test/java/lang/ref/CleanerTest.java --- a/jdk/test/java/lang/ref/CleanerTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/lang/ref/CleanerTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -52,7 +52,10 @@ * @library /test/lib/share/classes /lib/testlibrary /test/lib * @build sun.hotspot.WhiteBox * @build jdk.test.lib.Utils - * @modules java.base/jdk.internal.misc java.base/jdk.internal.ref + * @modules java.base/jdk.internal + * java.base/jdk.internal.misc + * java.base/jdk.internal.ref + * java.management * @run main ClassFileInstaller sun.hotspot.WhiteBox * @run testng/othervm * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff -r f74f056dc069 -r a090823529e7 jdk/test/java/net/SocketOption/ImmutableOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/SocketOption/ImmutableOptions.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2016, 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 8148609 + * @run testng/othervm ImmutableOptions + * @summary Assert that the set of socket options are immutable + */ +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.*; +import java.util.Set; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +public class ImmutableOptions { + + @BeforeTest + void setupServerSocketFactory() throws IOException { + ServerSocket.setSocketFactory(new ServerSocketImplFactory()); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void socketThrows() throws IOException { + CustomSocketImpl impl = new CustomSocketImpl(); + Socket socket = new CustomSocket(impl); + socket.supportedOptions().clear(); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void socketImplThrows() throws IOException { + CustomSocketImpl impl = new CustomSocketImpl(); + impl.supportedOptions().clear(); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void serverSocketThrows() throws IOException { + ServerSocket ss = new ServerSocket(); + ss.supportedOptions().clear(); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void serverSocketImplThrows() throws IOException { + ServerSocket ss = new ServerSocket(); + ServerSocketImplFactory.mostRecentlyCreated.supportedOptions().clear(); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void datagramSocketThrows() throws IOException { + CustomDatagramSocketImpl impl = new CustomDatagramSocketImpl(); + DatagramSocket socket = new CustomDatagramSocket(impl); + socket.supportedOptions().clear(); + } + + @Test(expectedExceptions = UnsupportedOperationException.class) + public void datagramSocketImplThrows() throws IOException { + CustomDatagramSocketImpl impl = new CustomDatagramSocketImpl(); + impl.supportedOptions().clear(); + } + + + // Socket descendants + static class CustomSocket extends Socket { + public CustomSocket(SocketImpl impl) throws IOException { + super(impl); + } + } + + static class CustomDatagramSocket extends DatagramSocket { + public CustomDatagramSocket(DatagramSocketImpl impl) { + super(impl); + } + } + + static class ServerSocketImplFactory implements SocketImplFactory { + static volatile CustomSocketImpl mostRecentlyCreated; + + @Override public SocketImpl createSocketImpl() { + return mostRecentlyCreated = new CustomSocketImpl(); + } + } + + // Custom impl's + static class CustomSocketImpl extends SocketImpl { + // The only method interesting to this test. + @Override public Set> supportedOptions() { + return super.supportedOptions(); + } + + public void create(boolean stream) throws IOException { } + + public void connect(String host, int port) throws IOException { } + + public void connect(InetAddress addr, int port) throws IOException { } + + public void connect(SocketAddress addr, int timeout) throws IOException { } + + public void bind(InetAddress host, int port) throws IOException { } + + public void listen(int backlog) throws IOException { } + + public void accept(SocketImpl s) throws IOException { } + + public InputStream getInputStream() throws IOException { return null; } + + public OutputStream getOutputStream() throws IOException { return null; } + + public int available() throws IOException { return 0; } + + public void close() throws IOException { } + + public void sendUrgentData(int data) throws IOException { } + + public Object getOption(int i) throws SocketException { return null; } + + public void setOption(int i, Object o) throws SocketException { } + } + + static class CustomDatagramSocketImpl extends DatagramSocketImpl { + // The only method interesting to this test. + @Override public Set> supportedOptions() { + return super.supportedOptions(); + } + + protected void create() throws SocketException { } + + protected void bind(int lport, InetAddress laddr) throws SocketException { } + + protected void send(DatagramPacket p) throws IOException { } + + protected int peek(InetAddress i) throws IOException { return 0; } + + protected int peekData(DatagramPacket p) throws IOException { return 0; } + + protected void receive(DatagramPacket p) throws IOException { } + + protected void setTTL(byte ttl) throws IOException { } + + protected byte getTTL() throws IOException { return 0; } + + protected void setTimeToLive(int ttl) throws IOException { } + + protected int getTimeToLive() throws IOException { return 0; } + + protected void join(InetAddress inetaddr) throws IOException { } + + protected void leave(InetAddress inetaddr) throws IOException { } + + protected void joinGroup(SocketAddress x, NetworkInterface y) + throws IOException { } + + protected void leaveGroup(SocketAddress x, NetworkInterface y) + throws IOException { } + + protected void close() { } + + public void setOption(int optID, Object value) throws SocketException { } + + public Object getOption(int optID) throws SocketException { return null; } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/net/ipv6tests/UdpTest.java --- a/jdk/test/java/net/ipv6tests/UdpTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/net/ipv6tests/UdpTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, 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,6 +24,7 @@ /* * @test * @bug 4868820 + * @key intermittent * @summary IPv6 support for Windows XP and 2003 server */ diff -r f74f056dc069 -r a090823529e7 jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval.java --- a/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/rmi/server/Unreferenced/leaseCheckInterval/LeaseCheckInterval.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, 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 @@ -43,6 +43,7 @@ * java.rmi/sun.rmi.transport.tcp * @build TestLibrary JavaVM LeaseCheckInterval_Stub SelfTerminator * @run main/othervm LeaseCheckInterval + * @key intermittent */ import java.rmi.Remote; diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/WeakHashMap/GCDuringIteration.java --- a/jdk/test/java/util/WeakHashMap/GCDuringIteration.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/WeakHashMap/GCDuringIteration.java Wed Jul 05 21:25:29 2017 +0200 @@ -29,26 +29,50 @@ * @run main GCDuringIteration * @summary Check that iterators work properly in the presence of * concurrent finalization and removal of elements. - * @key randomness intermittent + * @key randomness */ -import java.util.*; +import static java.util.concurrent.TimeUnit.SECONDS; + +import java.lang.ref.WeakReference; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Random; +import java.util.WeakHashMap; import java.util.concurrent.CountDownLatch; +import java.util.function.BooleanSupplier; import jdk.testlibrary.RandomFactory; public class GCDuringIteration { - private static void waitForFinalizersToRun() { - for (int i = 0; i < 2; i++) - tryWaitForFinalizersToRun(); + + /** No guarantees, but effective in practice. */ + static void forceFullGc() { + CountDownLatch finalizeDone = new CountDownLatch(1); + WeakReference ref = new WeakReference(new Object() { + protected void finalize() { finalizeDone.countDown(); }}); + try { + for (int i = 0; i < 10; i++) { + System.gc(); + if (finalizeDone.await(1L, SECONDS) && ref.get() == null) { + System.runFinalization(); // try to pick up stragglers + return; + } + } + } catch (InterruptedException unexpected) { + throw new AssertionError("unexpected InterruptedException"); + } + throw new AssertionError("failed to do a \"full\" gc"); } - private static void tryWaitForFinalizersToRun() { - System.gc(); - final CountDownLatch fin = new CountDownLatch(1); - new Object() { protected void finalize() { fin.countDown(); }}; - System.gc(); - try { fin.await(); } - catch (InterruptedException ie) { throw new Error(ie); } + static void gcAwait(BooleanSupplier s) { + for (int i = 0; i < 10; i++) { + if (s.getAsBoolean()) + return; + forceFullGc(); + } + throw new AssertionError("failed to satisfy condition"); } // A class with the traditional pessimal hashCode implementation, @@ -76,9 +100,13 @@ if (rnd.nextBoolean()) check(it.hasNext()); equal(it.next().getValue(), i); } - if (rnd.nextBoolean()) - THROWS(NoSuchElementException.class, - new F(){void f(){it.next();}}); + if (rnd.nextBoolean()) { + try { + it.next(); + throw new AssertionError("should throw"); + } catch (NoSuchElementException success) {} + } + if (rnd.nextBoolean()) check(! it.hasNext()); } @@ -106,9 +134,7 @@ int first = firstValue(map); final Iterator> it = map.entrySet().iterator(); foos[first] = null; - for (int i = 0; i < 10 && map.size() != first; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first); + gcAwait(() -> map.size() == first); checkIterator(it, first-1); equal(map.size(), first); equal(firstValue(map), first-1); @@ -119,15 +145,14 @@ final Iterator> it = map.entrySet().iterator(); it.next(); // protects first entry System.out.println(map.values()); + int oldSize = map.size(); foos[first] = null; - tryWaitForFinalizersToRun(); - equal(map.size(), first+1); + forceFullGc(); + equal(map.size(), oldSize); System.out.println(map.values()); checkIterator(it, first-1); // first entry no longer protected - for (int i = 0; i < 10 && map.size() != first; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first); + gcAwait(() -> map.size() == first); equal(firstValue(map), first-1); } @@ -137,15 +162,12 @@ it.next(); // protects first entry System.out.println(map.values()); foos[first] = foos[first-1] = null; - tryWaitForFinalizersToRun(); - equal(map.size(), first); + gcAwait(() -> map.size() == first); equal(firstValue(map), first); System.out.println(map.values()); checkIterator(it, first-2); // first entry no longer protected - for (int i = 0; i < 10 && map.size() != first-1; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first-1); + gcAwait(() -> map.size() == first-1); equal(firstValue(map), first-2); } @@ -155,16 +177,15 @@ it.next(); // protects first entry it.hasNext(); // protects second entry System.out.println(map.values()); + int oldSize = map.size(); foos[first] = foos[first-1] = null; - tryWaitForFinalizersToRun(); + forceFullGc(); + equal(map.size(), oldSize); equal(firstValue(map), first); - equal(map.size(), first+1); System.out.println(map.values()); checkIterator(it, first-1); // first entry no longer protected - for (int i = 0; i < 10 && map.size() != first-1; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first-1); + gcAwait(() -> map.size() == first-1); equal(firstValue(map), first-2); } @@ -173,17 +194,16 @@ final Iterator> it = map.entrySet().iterator(); it.next(); // protects first entry System.out.println(map.values()); + equal(map.size(), first+1); foos[first] = foos[first-1] = null; - tryWaitForFinalizersToRun(); + gcAwait(() -> map.size() == first); it.remove(); equal(firstValue(map), first-2); equal(map.size(), first-1); System.out.println(map.values()); checkIterator(it, first-2); // first entry no longer protected - for (int i = 0; i < 10 && map.size() != first-1; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first-1); + gcAwait(() -> map.size() == first-1); equal(firstValue(map), first-2); } @@ -194,15 +214,14 @@ it.remove(); it.hasNext(); // protects second entry System.out.println(map.values()); + equal(map.size(), first); foos[first] = foos[first-1] = null; - tryWaitForFinalizersToRun(); + forceFullGc(); equal(firstValue(map), first-1); equal(map.size(), first); System.out.println(map.values()); checkIterator(it, first-1); - for (int i = 0; i < 10 && map.size() != first-1; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), first-1); + gcAwait(() -> map.size() == first-1); equal(firstValue(map), first-2); } @@ -211,14 +230,11 @@ final Iterator> it = map.entrySet().iterator(); it.hasNext(); // protects first entry Arrays.fill(foos, null); - tryWaitForFinalizersToRun(); - equal(map.size(), 1); + gcAwait(() -> map.size() == 1); System.out.println(map.values()); equal(it.next().getValue(), first); check(! it.hasNext()); - for (int i = 0; i < 10 && map.size() != 0; i++) - tryWaitForFinalizersToRun(); - equal(map.size(), 0); + gcAwait(() -> map.size() == 0); check(map.isEmpty()); } } @@ -239,11 +255,4 @@ try {test(args);} catch (Throwable t) {unexpected(t);} System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); if (failed > 0) throw new AssertionError("Some tests failed");} - abstract class F {abstract void f() throws Throwable;} - void THROWS(Class k, F... fs) { - for (F f : fs) - try {f.f(); fail("Expected " + k.getName() + " not thrown");} - catch (Throwable t) { - if (k.isAssignableFrom(t.getClass())) pass(); - else unexpected(t);}} } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,8 +35,11 @@ * @test * @bug 4486658 * @summary Checks for responsiveness of blocking queues to cancellation. + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.ArrayList; import java.util.List; import java.util.SplittableRandom; @@ -53,8 +56,10 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class CancelledProducerConsumerLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static ExecutorService pool; public static void main(String[] args) throws Exception { @@ -73,7 +78,7 @@ new CancelledProducerConsumerLoops(i, queue).run(); } pool.shutdown(); - if (! pool.awaitTermination(10L, TimeUnit.SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError("timed out"); pool = null; } @@ -117,18 +122,18 @@ assertCancelled(cons[i]); } - if (!producersInterrupted.await(10L, TimeUnit.SECONDS)) + if (!producersInterrupted.await(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError("timed out"); - if (!consumersInterrupted.await(10L, TimeUnit.SECONDS)) + if (!consumersInterrupted.await(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError("timed out"); if (prods[0].isDone() || prods[0].isCancelled()) throw new AssertionError("completed too early"); done = true; - if (! (prods[0].get(10L, TimeUnit.SECONDS) instanceof Integer)) + if (! (prods[0].get(LONG_DELAY_MS, MILLISECONDS) instanceof Integer)) throw new AssertionError("expected Integer"); - if (! (cons[0].get(10L, TimeUnit.SECONDS) instanceof Integer)) + if (! (cons[0].get(LONG_DELAY_MS, MILLISECONDS) instanceof Integer)) throw new AssertionError("expected Integer"); } @@ -138,7 +143,7 @@ if (!future.isCancelled()) throw new AssertionError("not cancelled"); try { - future.get(10L, TimeUnit.SECONDS); + future.get(LONG_DELAY_MS, MILLISECONDS); throw new AssertionError("should throw CancellationException"); } catch (CancellationException success) {} } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/BlockingQueue/Interrupt.java --- a/jdk/test/java/util/concurrent/BlockingQueue/Interrupt.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/BlockingQueue/Interrupt.java Wed Jul 05 21:25:29 2017 +0200 @@ -26,10 +26,10 @@ * @bug 6384064 * @summary Check proper handling of interrupts * @author Martin Buchholz + * @library /lib/testlibrary/ */ import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.ArrayList; import java.util.List; @@ -41,8 +41,10 @@ import java.util.concurrent.SynchronousQueue; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledThreadPoolExecutor; +import jdk.testlibrary.Utils; public class Interrupt { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static void checkInterrupted0(Iterable fs, Executor ex) { for (Fun f : fs) { @@ -71,7 +73,7 @@ checkInterrupted0(fs, immediateExecutor); checkInterrupted0(fs, delayedExecutor); stpe.shutdown(); - check(stpe.awaitTermination(10L, SECONDS)); + check(stpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } static void testQueue(final BlockingQueue q) { @@ -82,12 +84,12 @@ q.clear(); List fs = new ArrayList(); fs.add(() -> q.take()); - fs.add(() -> q.poll(60, SECONDS)); + fs.add(() -> q.poll(LONG_DELAY_MS, MILLISECONDS)); if (deq != null) { fs.add(() -> deq.takeFirst()); fs.add(() -> deq.takeLast()); - fs.add(() -> deq.pollFirst(7, SECONDS)); - fs.add(() -> deq.pollLast(7, SECONDS)); + fs.add(() -> deq.pollFirst(LONG_DELAY_MS, MILLISECONDS)); + fs.add(() -> deq.pollLast(LONG_DELAY_MS, MILLISECONDS)); } checkInterrupted(fs); @@ -99,12 +101,12 @@ fs.clear(); fs.add(() -> q.put(1)); - fs.add(() -> q.offer(1, 7, SECONDS)); + fs.add(() -> q.offer(1, LONG_DELAY_MS, MILLISECONDS)); if (deq != null) { fs.add(() -> deq.putFirst(1)); fs.add(() -> deq.putLast(1)); - fs.add(() -> deq.offerFirst(1, 7, SECONDS)); - fs.add(() -> deq.offerLast(1, 7, SECONDS)); + fs.add(() -> deq.offerFirst(1, LONG_DELAY_MS, MILLISECONDS)); + fs.add(() -> deq.offerLast(1, LONG_DELAY_MS, MILLISECONDS)); } checkInterrupted(fs); } catch (Throwable t) { diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,10 +35,11 @@ * @test * @bug 4486658 * @summary multiple producers and single consumer using blocking queues + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -51,8 +52,10 @@ import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.atomic.AtomicInteger; +import jdk.testlibrary.Utils; public class MultipleProducersSingleConsumerLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static ExecutorService pool; public static void main(String[] args) throws Exception { @@ -77,7 +80,7 @@ } pool.shutdown(); - if (! pool.awaitTermination(10L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); pool = null; } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,10 +35,11 @@ * @test * @bug 4486658 * @summary multiple producers and consumers using blocking queues + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -51,8 +52,10 @@ import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.atomic.AtomicInteger; +import jdk.testlibrary.Utils; public class ProducerConsumerLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static ExecutorService pool; public static void main(String[] args) throws Exception { @@ -77,7 +80,7 @@ run(new ArrayBlockingQueue(100, true), i, 100); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); pool = null; } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,10 +35,11 @@ * @test * @bug 4486658 * @summary check ordering for blocking queues with 1 producer and multiple consumers + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -50,8 +51,10 @@ import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.SynchronousQueue; +import jdk.testlibrary.Utils; public class SingleProducerMultipleConsumerLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static ExecutorService pool; public static void main(String[] args) throws Exception { @@ -75,7 +78,7 @@ run(new ArrayBlockingQueue(100, true), i, 100); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); pool = null; } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/CompletableFuture/Basic.java --- a/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,15 +34,17 @@ /* * @test * @bug 8005696 + * @summary Basic tests for CompletableFuture + * @library /lib/testlibrary/ * @run main Basic * @run main/othervm -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 Basic - * @summary Basic tests for CompletableFuture * @author Chris Hegarty */ import static java.util.concurrent.CompletableFuture.runAsync; import static java.util.concurrent.CompletableFuture.supplyAsync; import static java.util.concurrent.ForkJoinPool.commonPool; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import java.lang.reflect.Array; @@ -54,8 +56,10 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; +import jdk.testlibrary.Utils; public class Basic { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static void checkCompletedNormally(CompletableFuture cf, Object value) { checkCompletedNormally(cf, value == null ? null : new Object[] { value }); @@ -109,12 +113,13 @@ } private static void realMain(String[] args) throws Throwable { - ExecutorService executor = Executors.newFixedThreadPool(2); + ExecutorService pool = Executors.newFixedThreadPool(2); try { - test(executor); + test(pool); } finally { - executor.shutdown(); - executor.awaitTermination(30L, SECONDS); + pool.shutdown(); + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) + throw new Error(); } } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java --- a/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,7 +34,6 @@ /* * @test * @bug 4486658 - * @run main/timeout=1600 MapLoops * @summary Exercise multithreaded maps, by default ConcurrentHashMap. * Multithreaded hash table test. Each thread does a random walk * though elements of "key" array. On each iteration, it checks if @@ -42,9 +41,11 @@ * inserts it, and if present, with probability premove it removes * it. (pinsert and premove are expressed as percentages to simplify * parsing from command line.) + * @library /lib/testlibrary/ + * @run main/timeout=1600 MapLoops */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.List; import java.util.Map; @@ -53,8 +54,10 @@ import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import jdk.testlibrary.Utils; public class MapLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static int nkeys = 1000; // 10_000 static int pinsert = 60; static int premove = 2; @@ -126,7 +129,7 @@ i = k; } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); if (! throwables.isEmpty()) diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ConcurrentQueues/ConcurrentQueueLoops.java --- a/jdk/test/java/util/concurrent/ConcurrentQueues/ConcurrentQueueLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ConcurrentQueues/ConcurrentQueueLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,11 +34,12 @@ /* * @test * @bug 4486658 6785442 + * @summary Checks that a set of threads can repeatedly get and modify items + * @library /lib/testlibrary/ * @run main ConcurrentQueueLoops 8 123456 - * @summary Checks that a set of threads can repeatedly get and modify items */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.ArrayList; import java.util.Collection; @@ -57,8 +58,10 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.atomic.AtomicInteger; +import jdk.testlibrary.Utils; public class ConcurrentQueueLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); ExecutorService pool; AtomicInteger totalItems; boolean print; @@ -106,16 +109,14 @@ print = false; System.out.println("Warmup..."); oneRun(1, items, q); - //Thread.sleep(100); oneRun(3, items, q); - Thread.sleep(100); print = true; for (int i = 1; i <= maxStages; i += (i+1) >>> 1) { oneRun(i, items, q); } pool.shutdown(); - check(pool.awaitTermination(60L, SECONDS)); + check(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } class Stage implements Callable { diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ConcurrentQueues/GCRetention.java --- a/jdk/test/java/util/concurrent/ConcurrentQueues/GCRetention.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ConcurrentQueues/GCRetention.java Wed Jul 05 21:25:29 2017 +0200 @@ -38,10 +38,14 @@ * @run main GCRetention 12345 */ +import static java.util.concurrent.TimeUnit.SECONDS; + +import java.lang.ref.WeakReference; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedTransferQueue; @@ -59,6 +63,25 @@ // Suitable for benchmarking. Overridden by args[0] for testing. int count = 1024 * 1024; + /** No guarantees, but effective in practice. */ + static void forceFullGc() { + CountDownLatch finalizeDone = new CountDownLatch(1); + WeakReference ref = new WeakReference(new Object() { + protected void finalize() { finalizeDone.countDown(); }}); + try { + for (int i = 0; i < 10; i++) { + System.gc(); + if (finalizeDone.await(1L, SECONDS) && ref.get() == null) { + System.runFinalization(); // try to pick up stragglers + return; + } + } + } catch (InterruptedException unexpected) { + throw new AssertionError("unexpected InterruptedException"); + } + throw new AssertionError("failed to do a \"full\" gc"); + } + final Map results = new ConcurrentHashMap(); Collection> queues() { @@ -117,8 +140,8 @@ long t0 = System.nanoTime(); for (int i = 0; i < count; i++) check(q.add(Boolean.TRUE)); - System.gc(); - System.gc(); + forceFullGc(); + // forceFullGc(); Boolean x; while ((x = q.poll()) != null) equal(x, Boolean.TRUE); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/CyclicBarrier/Basic.java --- a/jdk/test/java/util/concurrent/CyclicBarrier/Basic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/CyclicBarrier/Basic.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,11 +25,11 @@ * @test * @bug 6253848 6366811 * @summary Basic tests for CyclicBarrier + * @library /lib/testlibrary/ * @author Martin Buchholz, David Holmes */ import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.ArrayList; import java.util.Iterator; @@ -39,8 +39,10 @@ import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; +import jdk.testlibrary.Utils; public class Basic { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); private static void checkBroken(final CyclicBarrier barrier) { check(barrier.isBroken()); @@ -77,7 +79,7 @@ private static final CyclicBarrier atTheStartingGate = new CyclicBarrier(3); private static void toTheStartingGate() { - try { atTheStartingGate.await(10, SECONDS); pass(); } + try { atTheStartingGate.await(LONG_DELAY_MS, MILLISECONDS); pass(); } catch (Throwable t) { unexpected(t); reset(atTheStartingGate); @@ -314,13 +316,13 @@ Throwable throwable() { return this.throwable; } boolean interruptBit() { return this.interrupted; } void realRun() throws Throwable { - startingGate.await(10, SECONDS); + startingGate.await(LONG_DELAY_MS, MILLISECONDS); try { - if (timed) barrier.await(10, SECONDS); + if (timed) barrier.await(LONG_DELAY_MS, MILLISECONDS); else barrier.await(); } catch (Throwable throwable) { this.throwable = throwable; } - try { doneSignal.await(10, SECONDS); } + try { doneSignal.await(LONG_DELAY_MS, MILLISECONDS); } catch (InterruptedException e) { interrupted = true; } } } @@ -354,7 +356,7 @@ waiter.start(); waiters.add(waiter); } - startingGate.await(10, SECONDS); + startingGate.await(LONG_DELAY_MS, MILLISECONDS); while (barrier.getNumberWaiting() < N) Thread.yield(); barrier.await(); doneSignal.countDown(); @@ -383,7 +385,7 @@ waiter.start(); waiters.add(waiter); } - startingGate.await(10, SECONDS); + startingGate.await(LONG_DELAY_MS, MILLISECONDS); while (barrier.getNumberWaiting() < N) Thread.yield(); for (int i = 0; i < N/2; i++) waiters.get(i).interrupt(); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/DelayQueue/Stress.java --- a/jdk/test/java/util/concurrent/DelayQueue/Stress.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/DelayQueue/Stress.java Wed Jul 05 21:25:29 2017 +0200 @@ -26,6 +26,7 @@ import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; /** * This is not a regression test, but a stress benchmark test for diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java --- a/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,18 +34,20 @@ /* * @test * @bug 4486658 - * @run main/timeout=720 ExchangeLoops * @summary checks to make sure a pipeline of exchangers passes data. + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import jdk.testlibrary.Utils; public class ExchangeLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final ExecutorService pool = Executors.newCachedThreadPool(); static boolean print = false; @@ -56,14 +58,14 @@ public static void main(String[] args) throws Exception { int maxStages = 5; - int iters = 10000; + int iters = 2000; if (args.length > 0) maxStages = Integer.parseInt(args[0]); print = false; System.out.println("Warmup..."); - oneRun(2, 100000); + oneRun(2, iters); print = true; for (int i = 2; i <= maxStages; i += (i+1) >>> 1) { @@ -71,7 +73,7 @@ oneRun(i, iters); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java --- a/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,19 +34,21 @@ /* * @test * @bug 4965960 - * @run main/timeout=3600 ExecutorCompletionServiceLoops - * @summary Exercise ExecutorCompletionServiceLoops + * @summary Exercise ExecutorCompletionService + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import jdk.testlibrary.Utils; public class ExecutorCompletionServiceLoops { - static final int POOLSIZE = 100; + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + static final int POOLSIZE = 10; static final ExecutorService pool = Executors.newFixedThreadPool(POOLSIZE); static final ExecutorCompletionService ecs = @@ -55,23 +57,21 @@ public static void main(String[] args) throws Exception { int max = 8; - int base = 10000; + int base = 2000; if (args.length > 0) max = Integer.parseInt(args[0]); System.out.println("Warmup..."); oneTest(base); - Thread.sleep(100); print = true; for (int i = 1; i <= max; i += (i+1) >>> 1) { System.out.print("n: " + i * base); oneTest(i * base); - Thread.sleep(100); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/Executors/AutoShutdown.java --- a/jdk/test/java/util/concurrent/Executors/AutoShutdown.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/Executors/AutoShutdown.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,26 +24,32 @@ /* * @test * @bug 6399443 + * @summary Check for auto-shutdown and gc of singleThreadExecutors + * @library /lib/testlibrary/ * @run main/othervm/timeout=1000 AutoShutdown - * @summary Check for auto-shutdown and gc of singleThreadExecutors * @author Martin Buchholz */ +import static java.util.concurrent.Executors.defaultThreadFactory; +import static java.util.concurrent.Executors.newFixedThreadPool; +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; +import static java.util.concurrent.Executors.newSingleThreadExecutor; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; -import static java.util.concurrent.Executors.defaultThreadFactory; -import static java.util.concurrent.Executors.newFixedThreadPool; -import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; -import static java.util.concurrent.Executors.newSingleThreadExecutor; +import jdk.testlibrary.Utils; public class AutoShutdown { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static void await(CountDownLatch latch) throws InterruptedException { - if (!latch.await(100L, TimeUnit.SECONDS)) + if (!latch.await(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError("timed out waiting for latch"); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java --- a/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,13 +34,14 @@ /* * @test * @bug 4486658 - * @run main/timeout=2000 CancelledFutureLoops * @summary Checks for responsiveness of futures to cancellation. * Runs under the assumption that ITERS computations require more than * TIMEOUT msecs to complete. + * @library /lib/testlibrary/ + * @run main/timeout=2000 CancelledFutureLoops */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.SplittableRandom; import java.util.concurrent.BrokenBarrierException; @@ -51,8 +52,10 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; +import jdk.testlibrary.Utils; public final class CancelledFutureLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final ExecutorService pool = Executors.newCachedThreadPool(); static final SplittableRandom rnd = new SplittableRandom(); static boolean print = false; @@ -80,7 +83,7 @@ Thread.sleep(TIMEOUT); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(6 * LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/FutureTask/DoneMeansDone.java --- a/jdk/test/java/util/concurrent/FutureTask/DoneMeansDone.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/FutureTask/DoneMeansDone.java Wed Jul 05 21:25:29 2017 +0200 @@ -36,8 +36,11 @@ * @bug 8073704 * @summary Checks that once isDone() returns true, * get() never throws InterruptedException or TimeoutException + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; @@ -49,8 +52,11 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import jdk.testlibrary.Utils; public class DoneMeansDone { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + public static void main(String[] args) throws Throwable { final int iters = 1000; final int nThreads = 2; @@ -92,7 +98,7 @@ } done.set(true); pool.shutdown(); - if (!pool.awaitTermination(10L, TimeUnit.SECONDS)) + if (!pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError(); for (Future future : futures) future.get(); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/DelayOverflow.java --- a/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/DelayOverflow.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/DelayOverflow.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,14 +35,21 @@ * @test * @bug 6725789 * @summary Check for long overflow in task time comparison. + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.DAYS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class DelayOverflow { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + static void waitForNanoTimeTick() { for (long t0 = System.nanoTime(); t0 == System.nanoTime(); ) ; @@ -52,16 +59,16 @@ Runnable r, int how) { switch (how) { case 0: - pool.schedule(r, 0, TimeUnit.MILLISECONDS); + pool.schedule(r, 0, MILLISECONDS); break; case 1: - pool.schedule(Executors.callable(r), 0, TimeUnit.DAYS); + pool.schedule(Executors.callable(r), 0, DAYS); break; case 2: - pool.scheduleWithFixedDelay(r, 0, 1000, TimeUnit.NANOSECONDS); + pool.scheduleWithFixedDelay(r, 0, 1000, NANOSECONDS); break; case 3: - pool.scheduleAtFixedRate(r, 0, 1000, TimeUnit.MILLISECONDS); + pool.scheduleAtFixedRate(r, 0, 1000, MILLISECONDS); break; default: fail(String.valueOf(how)); @@ -72,16 +79,16 @@ Runnable r, int how) { switch (how) { case 0: - pool.schedule(r, Long.MAX_VALUE, TimeUnit.MILLISECONDS); + pool.schedule(r, Long.MAX_VALUE, MILLISECONDS); break; case 1: - pool.schedule(Executors.callable(r), Long.MAX_VALUE, TimeUnit.DAYS); + pool.schedule(Executors.callable(r), Long.MAX_VALUE, DAYS); break; case 2: - pool.scheduleWithFixedDelay(r, Long.MAX_VALUE, 1000, TimeUnit.NANOSECONDS); + pool.scheduleWithFixedDelay(r, Long.MAX_VALUE, 1000, NANOSECONDS); break; case 3: - pool.scheduleAtFixedRate(r, Long.MAX_VALUE, 1000, TimeUnit.MILLISECONDS); + pool.scheduleAtFixedRate(r, Long.MAX_VALUE, 1000, MILLISECONDS); break; default: fail(String.valueOf(how)); @@ -114,14 +121,14 @@ proceedLatch.await(); } catch (Throwable t) { unexpected(t); } }}; - pool.schedule(keepPoolBusy, 0, TimeUnit.SECONDS); + pool.schedule(keepPoolBusy, 0, DAYS); busyLatch.await(); scheduleNow(pool, notifier, nowHow); waitForNanoTimeTick(); scheduleAtTheEndOfTime(pool, neverRuns, thenHow); proceedLatch.countDown(); - check(runLatch.await(10L, TimeUnit.SECONDS)); + check(runLatch.await(LONG_DELAY_MS, MILLISECONDS)); equal(runLatch.getCount(), 0L); pool.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); @@ -142,10 +149,9 @@ } catch (Throwable t) { unexpected(t); } }}; pool.scheduleWithFixedDelay(scheduleNowScheduler, - 0, Long.MAX_VALUE, - TimeUnit.NANOSECONDS); + 0, Long.MAX_VALUE, NANOSECONDS); - check(runLatch.await(10L, TimeUnit.SECONDS)); + check(runLatch.await(LONG_DELAY_MS, MILLISECONDS)); equal(runLatch.getCount(), 0L); pool.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/GCRetention.java --- a/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/GCRetention.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/GCRetention.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,8 +34,11 @@ /* * @test * @summary Ensure that waiting pool threads don't retain refs to tasks. + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.lang.ref.WeakReference; import java.util.concurrent.Delayed; import java.util.concurrent.ExecutionException; @@ -44,8 +47,11 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import jdk.testlibrary.Utils; public class GCRetention { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + /** * A custom thread pool with a custom RunnableScheduledFuture, for the * sole purpose of ensuring that the task retains a strong reference to @@ -116,7 +122,7 @@ Thread.sleep(10); } pool.shutdown(); - pool.awaitTermination(10L, TimeUnit.SECONDS); + pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS); if (cleared < size) throw new Error(String.format ("references to %d/%d tasks retained (\"leaked\")", diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCorePoolSize.java --- a/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCorePoolSize.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCorePoolSize.java Wed Jul 05 21:25:29 2017 +0200 @@ -26,16 +26,21 @@ * @bug 7091003 * @summary ScheduledExecutorService never executes Runnable * with corePoolSize of zero + * @library /lib/testlibrary/ * @author Chris Hegarty */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; /** * Verify that tasks can be run even with a core pool size of 0. */ public class ZeroCorePoolSize { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); volatile boolean taskRun; @@ -49,10 +54,10 @@ }; check(pool.getCorePoolSize() == 0); - pool.schedule(task, 1, TimeUnit.SECONDS); + pool.schedule(task, 12L, MILLISECONDS); pool.shutdown(); - check(pool.awaitTermination(20L, TimeUnit.SECONDS)); + check(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); check(pool.getCorePoolSize() == 0); check(taskRun); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCoreThreads.java --- a/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCoreThreads.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ScheduledThreadPoolExecutor/ZeroCoreThreads.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,9 +35,11 @@ * @test * @bug 8022642 8065320 8129861 * @summary Ensure relative sanity when zero core threads + * @library /lib/testlibrary/ */ import static java.util.concurrent.TimeUnit.HOURS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import java.lang.reflect.Field; @@ -45,8 +47,28 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BooleanSupplier; +import jdk.testlibrary.Utils; public class ZeroCoreThreads { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + + static long millisElapsedSince(long startTime) { + return (System.nanoTime() - startTime) / (1000L * 1000L); + } + + static void spinWaitUntil(BooleanSupplier predicate, long timeoutMillis) { + long startTime = -1L; + while (!predicate.getAsBoolean()) { + if (startTime == -1L) + startTime = System.nanoTime(); + else if (millisElapsedSince(startTime) > timeoutMillis) + throw new AssertionError( + String.format("timed out after %s ms", timeoutMillis)); + Thread.yield(); + } + } + static boolean hasWaiters(ReentrantLock lock, Condition condition) { lock.lock(); try { @@ -56,6 +78,11 @@ } } + static void awaitHasWaiters(ReentrantLock lock, Condition condition, + long timeoutMillis) { + spinWaitUntil(() -> hasWaiters(lock, condition), timeoutMillis); + } + static T getField(Object x, String fieldName) { try { Field field = x.getClass().getDeclaredField(fieldName); @@ -72,7 +99,7 @@ test(p); } finally { p.shutdownNow(); - check(p.awaitTermination(10L, SECONDS)); + check(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } } @@ -89,13 +116,7 @@ equal(0L, p.getCompletedTaskCount()); p.schedule(dummy, 1L, HOURS); // Ensure one pool thread actually waits in timed queue poll - long t0 = System.nanoTime(); - while (!hasWaiters(lock, available)) { - if (System.nanoTime() - t0 > SECONDS.toNanos(10L)) - throw new AssertionError - ("timed out waiting for a waiter to show up"); - Thread.yield(); - } + awaitHasWaiters(lock, available, LONG_DELAY_MS); equal(1, p.getPoolSize()); equal(1, p.getLargestPoolSize()); equal(1L, p.getTaskCount()); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/CoreThreadTimeOut.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,17 +25,22 @@ * @test * @bug 6233235 6268386 * @summary Test allowsCoreThreadTimeOut + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class CoreThreadTimeOut { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static class IdentifiableThreadFactory implements ThreadFactory { static ThreadFactory defaultThreadFactory @@ -60,8 +65,8 @@ return count; } - static long millisElapsedSince(long t0) { - return (System.nanoTime() - t0) / (1000L * 1000L); + static long millisElapsedSince(long startTime) { + return (System.nanoTime() - startTime) / (1000L * 1000L); } void test(String[] args) throws Throwable { @@ -89,7 +94,7 @@ equal(countExecutorThreads(), 0); tpe.shutdown(); check(tpe.allowsCoreThreadTimeOut()); - check(tpe.awaitTermination(10L, TimeUnit.SECONDS)); + check(tpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); if (failed > 0) throw new Exception("Some tests failed"); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,9 +25,12 @@ * @test * @bug 6277663 * @summary Test TPE extensibility framework + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; @@ -37,8 +40,11 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BooleanSupplier; +import jdk.testlibrary.Utils; public class Custom { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static volatile int passed = 0, failed = 0; static void pass() { passed++; } static void fail() { failed++; Thread.dumpStack(); } @@ -97,6 +103,22 @@ private static final int threadCount = 10; + static long millisElapsedSince(long startTime) { + return (System.nanoTime() - startTime) / (1000L * 1000L); + } + + static void spinWaitUntil(BooleanSupplier predicate, long timeoutMillis) { + long startTime = -1L; + while (!predicate.getAsBoolean()) { + if (startTime == -1L) + startTime = System.nanoTime(); + else if (millisElapsedSince(startTime) > timeoutMillis) + throw new AssertionError( + String.format("timed out after %s ms", timeoutMillis)); + Thread.yield(); + } + } + public static void main(String[] args) throws Throwable { CustomTPE tpe = new CustomTPE(); equal(tpe.getCorePoolSize(), threadCount); @@ -106,9 +128,8 @@ equal(countExecutorThreads(), threadCount); equal(CustomTask.births.get(), threadCount); tpe.shutdown(); - tpe.awaitTermination(120L, TimeUnit.SECONDS); - Thread.sleep(1000); - equal(countExecutorThreads(), 0); + tpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS); + spinWaitUntil(() -> countExecutorThreads() == 0, LONG_DELAY_MS); CustomSTPE stpe = new CustomSTPE(); for (int i = 0; i < threadCount; i++) @@ -116,9 +137,8 @@ equal(CustomSTPE.decorations.get(), threadCount); equal(countExecutorThreads(), threadCount); stpe.shutdown(); - stpe.awaitTermination(120L, TimeUnit.SECONDS); - Thread.sleep(1000); - equal(countExecutorThreads(), 0); + stpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS); + spinWaitUntil(() -> countExecutorThreads() == 0, LONG_DELAY_MS); System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); if (failed > 0) throw new Exception("Some tests failed"); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/FlakyThreadFactory.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/FlakyThreadFactory.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/FlakyThreadFactory.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,14 +35,20 @@ /* * @test * @summary Should be able to shutdown a pool when worker creation failed. + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class FlakyThreadFactory { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + void test(String[] args) throws Throwable { test(NullPointerException.class, new ThreadFactory() { @@ -89,7 +95,7 @@ check(exceptionClass.isInstance(t)); } pool.shutdown(); - check(pool.awaitTermination(10L, TimeUnit.SECONDS)); + check(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } //--------------------- Infrastructure --------------------------- diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/SelfInterrupt.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/SelfInterrupt.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/SelfInterrupt.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,14 +25,20 @@ * @test * @bug 6576792 * @summary non-idle worker threads should not be interrupted + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.CountDownLatch; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class SelfInterrupt { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + void test(String[] args) throws Throwable { final int n = 100; final ThreadPoolExecutor pool = @@ -58,7 +64,7 @@ } catch (Throwable t) { unexpected(t); }}}); finishLine.await(); pool.shutdown(); - check(pool.awaitTermination(1000L, TimeUnit.SECONDS)); + check(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } //--------------------- Infrastructure --------------------------- diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/ThreadRestarts.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/ThreadRestarts.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/ThreadRestarts.java Wed Jul 05 21:25:29 2017 +0200 @@ -36,6 +36,7 @@ * @test * @summary Only one thread should be created when a thread needs to * be kept alive to service a delayed task waiting in the queue. + * @library /lib/testlibrary/ */ import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -44,8 +45,12 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; +import jdk.testlibrary.Utils; public class ThreadRestarts { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + static final long FAR_FUTURE_MS = 10 * LONG_DELAY_MS; + public static void main(String[] args) throws Exception { test(false); test(true); @@ -56,14 +61,15 @@ ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10, ctf); try { + // schedule a dummy task in the "far future" Runnable nop = new Runnable() { public void run() {}}; - stpe.schedule(nop, 10*1000L, MILLISECONDS); + stpe.schedule(nop, FAR_FUTURE_MS, MILLISECONDS); stpe.setKeepAliveTime(1L, MILLISECONDS); stpe.allowCoreThreadTimeOut(allowTimeout); - MILLISECONDS.sleep(100L); + MILLISECONDS.sleep(12L); } finally { stpe.shutdownNow(); - if (!stpe.awaitTermination(60L, SECONDS)) + if (!stpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new AssertionError("timed out"); } if (ctf.count.get() > 1) @@ -76,8 +82,9 @@ final AtomicLong count = new AtomicLong(0L); public Thread newThread(Runnable r) { + count.getAndIncrement(); Thread t = new Thread(r); - count.getAndIncrement(); + t.setDaemon(true); return t; } } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/ThreadPoolExecutor/TimeOutShrink.java --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/TimeOutShrink.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/TimeOutShrink.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,15 +25,22 @@ * @test * @bug 6458662 * @summary poolSize might shrink below corePoolSize after timeout + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.concurrent.CyclicBarrier; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import jdk.testlibrary.Utils; public class TimeOutShrink { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + static final long KEEPALIVE_MS = 12L; + static void checkPoolSizes(ThreadPoolExecutor pool, int size, int core, int max) { equal(pool.getPoolSize(), size); @@ -45,7 +52,8 @@ final int n = 4; final CyclicBarrier barrier = new CyclicBarrier(2*n+1); final ThreadPoolExecutor pool - = new ThreadPoolExecutor(n, 2*n, 1L, TimeUnit.SECONDS, + = new ThreadPoolExecutor(n, 2*n, + KEEPALIVE_MS, MILLISECONDS, new SynchronousQueue()); final Runnable r = new Runnable() { public void run() { try { @@ -58,12 +66,16 @@ barrier.await(); checkPoolSizes(pool, 2*n, n, 2*n); barrier.await(); - while (pool.getPoolSize() > n) - Thread.sleep(100); - Thread.sleep(100); + long nap = KEEPALIVE_MS + (KEEPALIVE_MS >> 2); + for (long sleepyTime = 0L; pool.getPoolSize() > n; ) { + check((sleepyTime += nap) <= LONG_DELAY_MS); + Thread.sleep(nap); + } + checkPoolSizes(pool, n, n, 2*n); + Thread.sleep(nap); checkPoolSizes(pool, n, n, 2*n); pool.shutdown(); - check(pool.awaitTermination(60L, TimeUnit.SECONDS)); + check(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } //--------------------- Infrastructure --------------------------- diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/Lock/CheckedLockLoops.java --- a/jdk/test/java/util/concurrent/locks/Lock/CheckedLockLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/Lock/CheckedLockLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,9 +35,10 @@ * @test * @bug 4486658 * @summary basic safety and liveness of ReentrantLocks, and other locks based on them + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.SplittableRandom; import java.util.concurrent.CyclicBarrier; @@ -47,8 +48,10 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import jdk.testlibrary.Utils; public final class CheckedLockLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static ExecutorService pool; static final SplittableRandom rnd = new SplittableRandom(); @@ -63,7 +66,7 @@ oneTest(i, iters / i); } pool.shutdown(); - if (! pool.awaitTermination(10L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); pool = null; } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java --- a/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,9 +25,12 @@ * @test * @bug 6503247 6574123 * @summary Test resilience to tryAcquire methods that throw + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; @@ -36,6 +39,7 @@ import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; +import jdk.testlibrary.Utils; /** * This uses a variant of the standard Mutex demo, except with a @@ -44,6 +48,7 @@ */ @SuppressWarnings("serial") public class FlakyMutex implements Lock { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static class MyError extends Error {} static class MyException extends Exception {} static class MyRuntimeException extends RuntimeException {} @@ -91,7 +96,7 @@ } catch (Throwable t) { unexpected(t); }}});} barrier.await(); es.shutdown(); - check(es.awaitTermination(30L, TimeUnit.SECONDS)); + check(es.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } private static class FlakySync extends AbstractQueuedLongSynchronizer { diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java --- a/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,9 +25,11 @@ * @test * @bug 6460501 6236036 6500694 6490770 * @summary Repeated failed timed waits shouldn't leak memory + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; @@ -54,8 +56,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.regex.Matcher; import java.util.regex.Pattern; +import jdk.testlibrary.Utils; public class TimedAcquireLeak { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); + static String javahome() { String jh = System.getProperty("java.home"); return (jh.endsWith("jre")) ? jh.substring(0, jh.length() - 4) : jh; @@ -191,7 +196,7 @@ final String[] jobCmd = { java, "-Xmx8m", "-XX:+UsePerfData", - "-classpath", System.getProperty("test.classes", "."), + "-classpath", System.getProperty("test.class.path"), childClassName, uniqueID }; final Process p = new ProcessBuilder(jobCmd).start(); @@ -219,7 +224,7 @@ check(Math.abs(n1 - n0) < 10); check(n1 < 25); drainers.shutdown(); - if (!drainers.awaitTermination(10L, SECONDS)) { + if (!drainers.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) { drainers.shutdownNow(); // last resort throw new AssertionError("thread pool did not terminate"); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/LockSupport/ParkLoops.java --- a/jdk/test/java/util/concurrent/locks/LockSupport/ParkLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/LockSupport/ParkLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,11 +35,12 @@ * @test * @bug 8074773 * @summary Stress test looks for lost unparks + * @library /lib/testlibrary/ * @modules java.management - * @run main/timeout=1200 ParkLoops */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.util.SplittableRandom; @@ -49,13 +50,12 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.locks.LockSupport; +import jdk.testlibrary.Utils; public final class ParkLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final int THREADS = 4; - // static final int ITERS = 2_000_000; - // static final int TIMEOUT = 3500; // in seconds - static final int ITERS = 100_000; - static final int TIMEOUT = 1000; // in seconds + static final int ITERS = 30_000; static class Parker implements Runnable { static { @@ -130,13 +130,13 @@ pool.submit(unparker); } try { - if (!done.await(TIMEOUT, SECONDS)) { + if (!done.await(LONG_DELAY_MS, MILLISECONDS)) { dumpAllStacks(); throw new AssertionError("lost unpark"); } } finally { pool.shutdown(); - pool.awaitTermination(10L, SECONDS); + pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS); } } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,25 +34,27 @@ /* * @test * @bug 4486658 - * @run main/timeout=15000 LockOncePerThreadLoops * @summary Checks for missed signals by locking and unlocking each of an array of locks once per thread + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.SplittableRandom; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; +import jdk.testlibrary.Utils; public final class LockOncePerThreadLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final ExecutorService pool = Executors.newCachedThreadPool(); static final SplittableRandom rnd = new SplittableRandom(); static boolean print = false; - static int nlocks = 50000; - static int nthreads = 100; - static int replications = 5; + static int nlocks = 20_000; + static int nthreads = 20; + static int replications = 3; public static void main(String[] args) throws Exception { if (args.length > 0) @@ -66,10 +68,9 @@ for (int i = 0; i < replications; ++i) { System.out.print("Iteration: " + i); new ReentrantLockLoop().test(); - Thread.sleep(100); } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,23 +34,25 @@ /* * @test * @bug 4486658 - * @run main/timeout=4500 SimpleReentrantLockLoops * @summary multiple threads using a single lock + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.SplittableRandom; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; +import jdk.testlibrary.Utils; public final class SimpleReentrantLockLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final ExecutorService pool = Executors.newCachedThreadPool(); static final SplittableRandom rnd = new SplittableRandom(); static boolean print = false; - static int iters = 1000000; + static int iters = 100_000; public static void main(String[] args) throws Exception { int maxThreads = 5; @@ -66,11 +68,10 @@ while (n-- > 0) { System.out.print("Threads: " + i); new ReentrantLockLoop(i).test(); - Thread.sleep(100); } } pool.shutdown(); - if (! pool.awaitTermination(60L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,18 +34,22 @@ /* * @test * @bug 4486658 5031862 8140471 - * @run main TimeoutLockLoops * @summary Checks for responsiveness of locks to timeouts. + * @library /lib/testlibrary/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.util.SplittableRandom; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import jdk.testlibrary.Utils; public final class TimeoutLockLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final ExecutorService pool = Executors.newCachedThreadPool(); static final SplittableRandom rnd = new SplittableRandom(); static boolean print = false; @@ -63,7 +67,7 @@ new ReentrantLockLoop(i).test(); } pool.shutdown(); - if (! pool.awaitTermination(60L, TimeUnit.SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/Count.java --- a/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/Count.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/Count.java Wed Jul 05 21:25:29 2017 +0200 @@ -25,9 +25,12 @@ * @test * @bug 6207928 6328220 6378321 6625723 * @summary Recursive lock invariant sanity checks + * @library /lib/testlibrary/ * @author Martin Buchholz */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -42,9 +45,11 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import jdk.testlibrary.Utils; // I am the Cownt, and I lahve to cownt. public class Count { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); final Random rnd = new Random(); void lock(Lock lock) { @@ -102,7 +107,7 @@ barrier.await(); } catch (Throwable t) { unexpected(t); }}});} es.shutdown(); - check(es.awaitTermination(10L, TimeUnit.SECONDS)); + check(es.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); } void testReentrantLocks(final boolean fair, diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Wed Jul 05 21:25:29 2017 +0200 @@ -41,17 +41,20 @@ * inserts it, and if present, with probability premove it removes * it. (pinsert and premove are expressed as percentages to simplify * parsing from command line.) + * @library /lib/testlibrary/ */ -import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; import java.util.Map; import java.util.SplittableRandom; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import jdk.testlibrary.Utils; public class MapLoops { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static final int NKEYS = 100000; static int pinsert = 60; static int premove = 2; @@ -125,7 +128,7 @@ map.clear(); } pool.shutdown(); - if (! pool.awaitTermination(10L, SECONDS)) + if (! pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)) throw new Error(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/locks/StampedLock/Basic.java --- a/jdk/test/java/util/concurrent/locks/StampedLock/Basic.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/locks/StampedLock/Basic.java Wed Jul 05 21:25:29 2017 +0200 @@ -35,6 +35,7 @@ * @test * @bug 8005697 * @summary Basic tests for StampedLock + * @library /lib/testlibrary/ * @author Chris Hegarty */ @@ -49,8 +50,10 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.StampedLock; +import jdk.testlibrary.Utils; public class Basic { + static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000); static void checkResult(Locker l, Class c) { Throwable t = l.thrown(); @@ -268,7 +271,7 @@ case 2: case 5: return interruptibleReader(sl, -1, SECONDS, gate, view ^= true); default: - return interruptibleReader(sl, 30, SECONDS, gate, view ^= true); }} + return interruptibleReader(sl, LONG_DELAY_MS, MILLISECONDS, gate, view ^= true); }} public void remove() {throw new UnsupportedOperationException();}}; } @@ -286,7 +289,7 @@ case 2: case 5: return interruptibleWriter(sl, -1, SECONDS, gate, view ^= true); default: - return interruptibleWriter(sl, 30, SECONDS, gate, view ^= true); }} + return interruptibleWriter(sl, LONG_DELAY_MS, MILLISECONDS, gate, view ^= true); }} public void remove() {throw new UnsupportedOperationException();}}; } @@ -454,13 +457,13 @@ // We test interrupting both before and after trying to acquire boolean view = false; StampedLock sl = new StampedLock(); - for (long timeout : new long[] { -1L, 30L, -1L, 30L }) { + for (long timeout : new long[] { -1L, LONG_DELAY_MS, -1L, LONG_DELAY_MS }) { long stamp; Thread.State state; stamp = sl.writeLock(); try { - Reader r = interruptibleReader(sl, timeout, SECONDS, null, view); + Reader r = interruptibleReader(sl, timeout, MILLISECONDS, null, view); r.start(); r.interrupt(); r.join(); @@ -471,7 +474,7 @@ stamp = sl.writeLock(); try { - Reader r = interruptibleReader(sl, timeout, SECONDS, null, view); + Reader r = interruptibleReader(sl, timeout, MILLISECONDS, null, view); r.start(); waitForThreadToBlock(r); r.interrupt(); @@ -483,7 +486,7 @@ stamp = sl.readLock(); try { - Writer w = interruptibleWriter(sl, timeout, SECONDS, null, view); + Writer w = interruptibleWriter(sl, timeout, MILLISECONDS, null, view); w.start(); w.interrupt(); w.join(); @@ -494,7 +497,7 @@ stamp = sl.readLock(); try { - Writer w = interruptibleWriter(sl, timeout, SECONDS, null, view); + Writer w = interruptibleWriter(sl, timeout, MILLISECONDS, null, view); w.start(); waitForThreadToBlock(w); w.interrupt(); @@ -509,7 +512,7 @@ check(!sl.tryUnlockRead()); check(!sl.tryUnlockWrite()); check(sl.tryOptimisticRead() != 0L); - if (timeout == 30L) + if (timeout == LONG_DELAY_MS) view = true; } } catch (Throwable t) { unexpected(t); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/tck/Collection8Test.java --- a/jdk/test/java/util/concurrent/tck/Collection8Test.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/tck/Collection8Test.java Wed Jul 05 21:25:29 2017 +0200 @@ -37,6 +37,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -98,26 +99,29 @@ public void testForEachConcurrentStressTest() throws Throwable { if (!impl.isConcurrent()) return; final Collection c = impl.emptyCollection(); - final long testDurationMillis = SHORT_DELAY_MS; + final long testDurationMillis = timeoutMillis(); final AtomicBoolean done = new AtomicBoolean(false); final Object elt = impl.makeElement(1); - ExecutorService pool = Executors.newCachedThreadPool(); - Runnable checkElt = () -> { - while (!done.get()) - c.stream().forEach((x) -> { assertSame(x, elt); }); }; - Runnable addRemove = () -> { - while (!done.get()) { - assertTrue(c.add(elt)); - assertTrue(c.remove(elt)); - }}; - Future f1 = pool.submit(checkElt); - Future f2 = pool.submit(addRemove); - Thread.sleep(testDurationMillis); - done.set(true); - pool.shutdown(); - assertTrue(pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); - assertNull(f1.get(LONG_DELAY_MS, MILLISECONDS)); - assertNull(f2.get(LONG_DELAY_MS, MILLISECONDS)); + final Future f1, f2; + final ExecutorService pool = Executors.newCachedThreadPool(); + try (PoolCleaner cleaner = cleaner(pool, done)) { + final CountDownLatch threadsStarted = new CountDownLatch(2); + Runnable checkElt = () -> { + threadsStarted.countDown(); + while (!done.get()) + c.stream().forEach((x) -> { assertSame(x, elt); }); }; + Runnable addRemove = () -> { + threadsStarted.countDown(); + while (!done.get()) { + assertTrue(c.add(elt)); + assertTrue(c.remove(elt)); + }}; + f1 = pool.submit(checkElt); + f2 = pool.submit(addRemove); + Thread.sleep(testDurationMillis); + } + assertNull(f1.get(0L, MILLISECONDS)); + assertNull(f2.get(0L, MILLISECONDS)); } // public void testCollection8DebugFail() { fail(); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/tck/JSR166TestCase.java --- a/jdk/test/java/util/concurrent/tck/JSR166TestCase.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/tck/JSR166TestCase.java Wed Jul 05 21:25:29 2017 +0200 @@ -88,6 +88,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -210,11 +211,31 @@ private static final int suiteRuns = Integer.getInteger("jsr166.suiteRuns", 1); + private static float systemPropertyValue(String name, float defaultValue) { + String floatString = System.getProperty(name); + if (floatString == null) + return defaultValue; + try { + return Float.parseFloat(floatString); + } catch (NumberFormatException ex) { + throw new IllegalArgumentException( + String.format("Bad float value in system property %s=%s", + name, floatString)); + } + } + /** * The scaling factor to apply to standard delays used in tests. */ - private static final int delayFactor = - Integer.getInteger("jsr166.delay.factor", 1); + private static final float delayFactor = + systemPropertyValue("jsr166.delay.factor", 1.0f); + + /** + * The timeout factor as used in the jtreg test harness. + * See: http://openjdk.java.net/jtreg/tag-spec.html + */ + private static final float jtregTestTimeoutFactor + = systemPropertyValue("test.timeout.factor", 1.0f); public JSR166TestCase() { super(); } public JSR166TestCase(String name) { super(name); } @@ -590,10 +611,12 @@ /** * Returns the shortest timed delay. This can be scaled up for - * slow machines using the jsr166.delay.factor system property. + * slow machines using the jsr166.delay.factor system property, + * or via jtreg's -timeoutFactor: flag. + * http://openjdk.java.net/jtreg/command-help.html */ protected long getShortDelay() { - return 50 * delayFactor; + return (long) (50 * delayFactor * jtregTestTimeoutFactor); } /** @@ -906,6 +929,14 @@ }}; } + PoolCleaner cleaner(ExecutorService pool, AtomicBoolean flag) { + return new PoolCleanerWithReleaser(pool, releaser(flag)); + } + + Runnable releaser(final AtomicBoolean flag) { + return new Runnable() { public void run() { flag.set(true); }}; + } + /** * Waits out termination of a thread pool or fails doing so. */ @@ -1462,16 +1493,20 @@ return new LatchAwaiter(latch); } - public void await(CountDownLatch latch) { + public void await(CountDownLatch latch, long timeoutMillis) { try { - if (!latch.await(LONG_DELAY_MS, MILLISECONDS)) + if (!latch.await(timeoutMillis, MILLISECONDS)) fail("timed out waiting for CountDownLatch for " - + (LONG_DELAY_MS/1000) + " sec"); + + (timeoutMillis/1000) + " sec"); } catch (Throwable fail) { threadUnexpectedException(fail); } } + public void await(CountDownLatch latch) { + await(latch, LONG_DELAY_MS); + } + public void await(Semaphore semaphore) { try { if (!semaphore.tryAcquire(LONG_DELAY_MS, MILLISECONDS)) diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/tck/ScheduledExecutorSubclassTest.java --- a/jdk/test/java/util/concurrent/tck/ScheduledExecutorSubclassTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/tck/ScheduledExecutorSubclassTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -32,6 +32,7 @@ */ import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.ArrayList; @@ -55,7 +56,9 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import junit.framework.Test; import junit.framework.TestSuite; @@ -226,52 +229,75 @@ } /** - * scheduleAtFixedRate executes series of tasks at given rate + * scheduleAtFixedRate executes series of tasks at given rate. + * Eventually, it must hold that: + * cycles - 1 <= elapsedMillis/delay < cycles */ public void testFixedRateSequence() throws InterruptedException { final CustomExecutor p = new CustomExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { - long startTime = System.nanoTime(); - int cycles = 10; + final long startTime = System.nanoTime(); + final int cycles = 8; final CountDownLatch done = new CountDownLatch(cycles); - Runnable task = new CheckedRunnable() { + final Runnable task = new CheckedRunnable() { public void realRun() { done.countDown(); }}; - ScheduledFuture h = + final ScheduledFuture periodicTask = p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS); - await(done); - h.cancel(true); - double normalizedTime = - (double) millisElapsedSince(startTime) / delay; - if (normalizedTime >= cycles - 1 && - normalizedTime <= cycles) + final int totalDelayMillis = (cycles - 1) * delay; + await(done, totalDelayMillis + LONG_DELAY_MS); + periodicTask.cancel(true); + final long elapsedMillis = millisElapsedSince(startTime); + assertTrue(elapsedMillis >= totalDelayMillis); + if (elapsedMillis <= cycles * delay) return; + // else retry with longer delay } fail("unexpected execution rate"); } } /** - * scheduleWithFixedDelay executes series of tasks with given period + * scheduleWithFixedDelay executes series of tasks with given period. + * Eventually, it must hold that each task starts at least delay and at + * most 2 * delay after the termination of the previous task. */ public void testFixedDelaySequence() throws InterruptedException { final CustomExecutor p = new CustomExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { - long startTime = System.nanoTime(); - int cycles = 10; + final long startTime = System.nanoTime(); + final AtomicLong previous = new AtomicLong(startTime); + final AtomicBoolean tryLongerDelay = new AtomicBoolean(false); + final int cycles = 8; final CountDownLatch done = new CountDownLatch(cycles); - Runnable task = new CheckedRunnable() { - public void realRun() { done.countDown(); }}; - ScheduledFuture h = + final int d = delay; + final Runnable task = new CheckedRunnable() { + public void realRun() { + long now = System.nanoTime(); + long elapsedMillis + = NANOSECONDS.toMillis(now - previous.get()); + if (done.getCount() == cycles) { // first execution + if (elapsedMillis >= d) + tryLongerDelay.set(true); + } else { + assertTrue(elapsedMillis >= d); + if (elapsedMillis >= 2 * d) + tryLongerDelay.set(true); + } + previous.set(now); + done.countDown(); + }}; + final ScheduledFuture periodicTask = p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS); - await(done); - h.cancel(true); - double normalizedTime = - (double) millisElapsedSince(startTime) / delay; - if (normalizedTime >= cycles - 1 && - normalizedTime <= cycles) + final int totalDelayMillis = (cycles - 1) * delay; + await(done, totalDelayMillis + cycles * LONG_DELAY_MS); + periodicTask.cancel(true); + final long elapsedMillis = millisElapsedSince(startTime); + assertTrue(elapsedMillis >= totalDelayMillis); + if (!tryLongerDelay.get()) return; + // else retry with longer delay } fail("unexpected execution rate"); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java --- a/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/tck/ScheduledExecutorTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -34,6 +34,7 @@ */ import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.ArrayList; @@ -52,7 +53,9 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import junit.framework.Test; import junit.framework.TestSuite; @@ -170,52 +173,75 @@ } /** - * scheduleAtFixedRate executes series of tasks at given rate + * scheduleAtFixedRate executes series of tasks at given rate. + * Eventually, it must hold that: + * cycles - 1 <= elapsedMillis/delay < cycles */ public void testFixedRateSequence() throws InterruptedException { final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { - long startTime = System.nanoTime(); - int cycles = 10; + final long startTime = System.nanoTime(); + final int cycles = 8; final CountDownLatch done = new CountDownLatch(cycles); - Runnable task = new CheckedRunnable() { + final Runnable task = new CheckedRunnable() { public void realRun() { done.countDown(); }}; - ScheduledFuture h = + final ScheduledFuture periodicTask = p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS); - await(done); - h.cancel(true); - double normalizedTime = - (double) millisElapsedSince(startTime) / delay; - if (normalizedTime >= cycles - 1 && - normalizedTime <= cycles) + final int totalDelayMillis = (cycles - 1) * delay; + await(done, totalDelayMillis + LONG_DELAY_MS); + periodicTask.cancel(true); + final long elapsedMillis = millisElapsedSince(startTime); + assertTrue(elapsedMillis >= totalDelayMillis); + if (elapsedMillis <= cycles * delay) return; + // else retry with longer delay } fail("unexpected execution rate"); } } /** - * scheduleWithFixedDelay executes series of tasks with given period + * scheduleWithFixedDelay executes series of tasks with given period. + * Eventually, it must hold that each task starts at least delay and at + * most 2 * delay after the termination of the previous task. */ public void testFixedDelaySequence() throws InterruptedException { final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { - long startTime = System.nanoTime(); - int cycles = 10; + final long startTime = System.nanoTime(); + final AtomicLong previous = new AtomicLong(startTime); + final AtomicBoolean tryLongerDelay = new AtomicBoolean(false); + final int cycles = 8; final CountDownLatch done = new CountDownLatch(cycles); - Runnable task = new CheckedRunnable() { - public void realRun() { done.countDown(); }}; - ScheduledFuture h = + final int d = delay; + final Runnable task = new CheckedRunnable() { + public void realRun() { + long now = System.nanoTime(); + long elapsedMillis + = NANOSECONDS.toMillis(now - previous.get()); + if (done.getCount() == cycles) { // first execution + if (elapsedMillis >= d) + tryLongerDelay.set(true); + } else { + assertTrue(elapsedMillis >= d); + if (elapsedMillis >= 2 * d) + tryLongerDelay.set(true); + } + previous.set(now); + done.countDown(); + }}; + final ScheduledFuture periodicTask = p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS); - await(done); - h.cancel(true); - double normalizedTime = - (double) millisElapsedSince(startTime) / delay; - if (normalizedTime >= cycles - 1 && - normalizedTime <= cycles) + final int totalDelayMillis = (cycles - 1) * delay; + await(done, totalDelayMillis + cycles * LONG_DELAY_MS); + periodicTask.cancel(true); + final long elapsedMillis = millisElapsedSince(startTime); + assertTrue(elapsedMillis >= totalDelayMillis); + if (!tryLongerDelay.get()) return; + // else retry with longer delay } fail("unexpected execution rate"); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/concurrent/tck/ThreadTest.java --- a/jdk/test/java/util/concurrent/tck/ThreadTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/concurrent/tck/ThreadTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -77,7 +77,7 @@ */ public void testGetAndSetDefaultUncaughtExceptionHandler() { assertEquals(null, Thread.getDefaultUncaughtExceptionHandler()); - // failure due to securityException is OK. + // failure due to SecurityException is OK. // Would be nice to explicitly test both ways, but cannot yet. Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/jar/JarFile/MultiReleaseJarAPI.java --- a/jdk/test/java/util/jar/JarFile/MultiReleaseJarAPI.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarAPI.java Wed Jul 05 21:25:29 2017 +0200 @@ -39,9 +39,9 @@ import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import jdk.Version; import static java.util.jar.JarFile.Release; -import static sun.misc.Version.jdkMajorVersion; // fixme JEP 223 Version import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -50,6 +50,9 @@ public class MultiReleaseJarAPI { + + static final int MAJOR_VERSION = Version.current().major(); + String userdir = System.getProperty("user.dir","."); File unversioned = new File(userdir, "unversioned.jar"); File multirelease = new File(userdir, "multi-release.jar"); @@ -106,7 +109,7 @@ } // assure that we have a Release object corresponding to the actual runtime version - String version = "VERSION_" + jdkMajorVersion(); + String version = "VERSION_" + MAJOR_VERSION; boolean runtimeVersionExists = false; for (Release value : values) { if (version.equals(value.name())) runtimeVersionExists = true; @@ -123,7 +126,7 @@ if (name.equals("BASE")) { prefix = ""; } else if (name.equals("RUNTIME")) { - prefix = "META-INF/versions/" + jdkMajorVersion() + "/"; + prefix = "META-INF/versions/" + MAJOR_VERSION + "/"; } else { prefix = "META-INF/versions/" + name.substring(8) + "/"; } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/jar/JarFile/MultiReleaseJarIterators.java --- a/jdk/test/java/util/jar/JarFile/MultiReleaseJarIterators.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarIterators.java Wed Jul 05 21:25:29 2017 +0200 @@ -42,9 +42,9 @@ import java.util.jar.JarFile; import java.util.stream.Collectors; import java.util.zip.ZipFile; +import jdk.Version; import static java.util.jar.JarFile.Release; -import static sun.misc.Version.jdkMajorVersion; // fixme JEP 223 Version import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -53,6 +53,9 @@ public class MultiReleaseJarIterators { + + static final int MAJOR_VERSION = Version.current().major(); + String userdir = System.getProperty("user.dir", "."); File unversioned = new File(userdir, "unversioned.jar"); File multirelease = new File(userdir, "multi-release.jar"); @@ -121,7 +124,7 @@ try (JarFile jf = new JarFile(multirelease, true, ZipFile.OPEN_READ, Release.RUNTIME)) { Map expectedEntries; - switch (jdkMajorVersion()) { + switch (MAJOR_VERSION) { case 9: expectedEntries = v9Entries; break; diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/jar/JarFile/MultiReleaseJarProperties.java --- a/jdk/test/java/util/jar/JarFile/MultiReleaseJarProperties.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarProperties.java Wed Jul 05 21:25:29 2017 +0200 @@ -54,8 +54,7 @@ import java.nio.file.Files; import java.util.jar.JarEntry; import java.util.jar.JarFile; - -import static sun.misc.Version.jdkMajorVersion; // fixme JEP 223 Version +import jdk.Version; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -63,6 +62,9 @@ import org.testng.annotations.Test; public class MultiReleaseJarProperties { + + static final int MAJOR_VERSION = Version.current().major(); + final static int ROOTVERSION = 8; // magic number from knowledge of internals final static String userdir = System.getProperty("user.dir", "."); final static File multirelease = new File(userdir, "multi-release.jar"); @@ -77,14 +79,14 @@ creator.compileEntries(); creator.buildMultiReleaseJar(); - rtVersion = Integer.getInteger("jdk.util.jar.version", jdkMajorVersion()); + rtVersion = Integer.getInteger("jdk.util.jar.version", MAJOR_VERSION); String mrprop = System.getProperty("jdk.util.jar.enableMultiRelease", ""); if (mrprop.equals("false")) { rtVersion = ROOTVERSION; } else if (rtVersion < ROOTVERSION) { rtVersion = ROOTVERSION; - } else if (rtVersion > jdkMajorVersion()) { - rtVersion = jdkMajorVersion(); + } else if (rtVersion > MAJOR_VERSION) { + rtVersion = MAJOR_VERSION; } force = mrprop.equals("force"); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/jar/JarFile/MultiReleaseJarSecurity.java --- a/jdk/test/java/util/jar/JarFile/MultiReleaseJarSecurity.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarSecurity.java Wed Jul 05 21:25:29 2017 +0200 @@ -40,6 +40,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipFile; +import jdk.Version; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -47,6 +48,9 @@ import org.testng.annotations.Test; public class MultiReleaseJarSecurity { + + static final int MAJOR_VERSION = Version.current().major(); + String userdir = System.getProperty("user.dir","."); File multirelease = new File(userdir, "multi-release.jar"); File signedmultirelease = new File(userdir, "signed-multi-release.jar"); @@ -68,9 +72,8 @@ @Test public void testCertsAndSigners() throws IOException { try (JarFile jf = new JarFile(signedmultirelease, true, ZipFile.OPEN_READ, JarFile.Release.RUNTIME)) { - int version = sun.misc.Version.jdkMajorVersion(); // fixme JEP 223 Version CertsAndSigners vcas = new CertsAndSigners(jf, jf.getJarEntry("version/Version.class")); - CertsAndSigners rcas = new CertsAndSigners(jf, jf.getJarEntry("META-INF/versions/" + version + "/version/Version.class")); + CertsAndSigners rcas = new CertsAndSigners(jf, jf.getJarEntry("META-INF/versions/" + MAJOR_VERSION + "/version/Version.class")); Assert.assertTrue(Arrays.equals(rcas.getCertificates(), vcas.getCertificates())); Assert.assertTrue(Arrays.equals(rcas.getCodeSigners(), vcas.getCodeSigners())); } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/bootlib/java.base/java/util/stream/DoubleStreamTestDataProvider.java --- a/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/DoubleStreamTestDataProvider.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/DoubleStreamTestDataProvider.java Wed Jul 05 21:25:29 2017 +0200 @@ -126,6 +126,9 @@ () -> Spliterators.spliterator(isl.iterator(), doubles.length, 0))); spliterators.add(splitDescr("Primitives.s(SpinedBuffer.iterator()):" + name, () -> Spliterators.spliteratorUnknownSize(isl.iterator(), 0))); + spliterators.add(splitDescr("DoubleStream.iterate(0,x->xx+1):" + name, + () -> DoubleStream.iterate(0.0, x -> x < doubles.length, x -> x + 1.0) + .spliterator())); // Need more! } spliteratorTestData = spliterators.toArray(new Object[0][]); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/bootlib/java.base/java/util/stream/IntStreamTestDataProvider.java --- a/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/IntStreamTestDataProvider.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/IntStreamTestDataProvider.java Wed Jul 05 21:25:29 2017 +0200 @@ -136,6 +136,8 @@ () -> IntStream.range(0, ints.length).spliterator())); spliterators.add(splitDescr("IntStream.intRangeClosed(0,l):" + name, () -> IntStream.rangeClosed(0, ints.length).spliterator())); + spliterators.add(splitDescr("IntStream.iterate(0,x->xx+1): " + name, + () -> IntStream.iterate(0, x -> x < ints.length, x -> x + 1).spliterator())); // Need more! } spliteratorTestData = spliterators.toArray(new Object[0][]); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/bootlib/java.base/java/util/stream/LongStreamTestDataProvider.java --- a/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/LongStreamTestDataProvider.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/LongStreamTestDataProvider.java Wed Jul 05 21:25:29 2017 +0200 @@ -136,6 +136,9 @@ () -> LongStream.range(0, longs.length).spliterator())); spliterators.add(splitDescr("LongStream.longRangeClosed(0,l):" + name, () -> LongStream.rangeClosed(0, longs.length).spliterator())); + spliterators.add(splitDescr("LongStream.iterate(0,x->xx+1):" + name, + () -> LongStream.iterate(0L, x -> x < longs.length, x -> x + 1L) + .spliterator())); // Need more! } spliteratorTestData = spliterators.toArray(new Object[0][]); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/bootlib/java.base/java/util/stream/StreamTestDataProvider.java --- a/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/StreamTestDataProvider.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/stream/bootlib/java.base/java/util/stream/StreamTestDataProvider.java Wed Jul 05 21:25:29 2017 +0200 @@ -171,6 +171,8 @@ () -> Spliterators.spliterator(Arrays.asList(ints).iterator(), ints.length, 0))); spliterators.add(splitDescr("Iterators.s(Arrays.s(array).iterator()):" + name, () -> Spliterators.spliteratorUnknownSize(Arrays.asList(ints).iterator(), 0))); + spliterators.add(splitDescr("Stream.iterate(0,x->xx+1): " + name, + () -> Stream.iterate(0, x -> x < ints.length, x -> x + 1).spliterator())); // @@@ Add map and collection spliterators when spliterator() is exposed on Collection or Iterable } spliteratorTestData = spliterators.toArray(new Object[0][]); diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/IterateTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/IterateTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2016, 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 8072727 + */ + +package org.openjdk.tests.java.util.stream; + +import java.util.List; +import java.util.Objects; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; +import java.util.stream.LongStream; +import java.util.stream.OpTestCase; +import java.util.stream.Stream; +import java.util.stream.TestData; +import java.util.stream.TestData.Factory; + +import static java.util.stream.ThowableHelper.checkNPE; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +@Test +public class IterateTest extends OpTestCase { + + @DataProvider(name = "IterateStreamsData") + public static Object[][] makeIterateStreamsTestData() { + Object[][] data = { + {List.of(), + Factory.ofSupplier("ref.empty", () -> Stream.iterate(1, x -> x < 0, x -> x * 2))}, + {List.of(1), + Factory.ofSupplier("ref.one", () -> Stream.iterate(1, x -> x < 2, x -> x * 2))}, + {List.of(1, 2, 4, 8, 16, 32, 64, 128, 256, 512), + Factory.ofSupplier("ref.ten", () -> Stream.iterate(1, x -> x < 1000, x -> x * 2))}, + {List.of(10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0), + Factory.ofSupplier("ref.nullCheck", () -> Stream.iterate(10, Objects::nonNull, x -> x > 0 ? x - 1 : null))}, + {List.of(), + Factory.ofIntSupplier("int.empty", () -> IntStream.iterate(1, x -> x < 0, x -> x + 1))}, + {List.of(1), + Factory.ofIntSupplier("int.one", () -> IntStream.iterate(1, x -> x < 2, x -> x + 1))}, + {List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), + Factory.ofIntSupplier("int.ten", () -> IntStream.iterate(1, x -> x <= 10, x -> x + 1))}, + {List.of(5, 4, 3, 2, 1), + Factory.ofIntSupplier("int.divZero", () -> IntStream.iterate(5, x -> x != 0, x -> x - 1/x/2 - 1))}, + {List.of(), + Factory.ofLongSupplier("long.empty", () -> LongStream.iterate(1L, x -> x < 0, x -> x + 1))}, + {List.of(1L), + Factory.ofLongSupplier("long.one", () -> LongStream.iterate(1L, x -> x < 2, x -> x + 1))}, + {List.of(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), + Factory.ofLongSupplier("long.ten", () -> LongStream.iterate(1L, x -> x <= 10, x -> x + 1))}, + {List.of(), + Factory.ofDoubleSupplier("double.empty", () -> DoubleStream.iterate(1.0, x -> x < 0, x -> x + 1))}, + {List.of(1.0), + Factory.ofDoubleSupplier("double.one", () -> DoubleStream.iterate(1.0, x -> x < 2, x -> x + 1))}, + {List.of(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0), + Factory.ofDoubleSupplier("double.ten", () -> DoubleStream.iterate(1.0, x -> x <= 10, x -> x + 1))} + }; + return data; + } + + @Test(dataProvider = "IterateStreamsData") + public void testIterate(List expected, TestData data) { + withData(data).stream(s -> s).expectedResult(expected).exercise(); + } + + @Test + public void testNPE() { + checkNPE(() -> Stream.iterate("", null, x -> x + "a")); + checkNPE(() -> Stream.iterate("", String::isEmpty, null)); + checkNPE(() -> IntStream.iterate(0, null, x -> x + 1)); + checkNPE(() -> IntStream.iterate(0, x -> x < 10, null)); + checkNPE(() -> LongStream.iterate(0, null, x -> x + 1)); + checkNPE(() -> LongStream.iterate(0, x -> x < 10, null)); + checkNPE(() -> DoubleStream.iterate(0, null, x -> x + 1)); + checkNPE(() -> DoubleStream.iterate(0, x -> x < 10, null)); + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamCloseTest.java --- a/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamCloseTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/StreamCloseTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 * @summary close handlers and closing streams - * @bug 8044047 + * @bug 8044047 8147505 */ package org.openjdk.tests.java.util.stream; @@ -37,6 +37,7 @@ import static java.util.stream.LambdaTestHelpers.countTo; import static java.util.stream.ThowableHelper.checkNPE; +import static java.util.stream.ThowableHelper.checkISE; @Test(groups = { "serialization-hostile" }) public class StreamCloseTest extends OpTestCase { @@ -170,4 +171,21 @@ for (int i=0; i s = countTo(100).stream()) { + s.forEach(i -> {}); + // Adding onClose handler when stream is consumed is illegal + // handler must not be registered + checkISE(() -> s.onClose(() -> fail("1"))); + } + + // close() must be idempotent: + // second close() invoked at the end of try-with-resources must have no effect + try(Stream s = countTo(100).stream()) { + s.close(); + // Adding onClose handler when stream is closed is also illegal + checkISE(() -> s.onClose(() -> fail("3"))); + } + } } diff -r f74f056dc069 -r a090823529e7 jdk/test/java/util/zip/TestLocalTime.java --- a/jdk/test/java/util/zip/TestLocalTime.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/java/util/zip/TestLocalTime.java Wed Jul 05 21:25:29 2017 +0200 @@ -24,7 +24,6 @@ /* * @test * @bug 8075526 8135108 - * @key intermittent * @summary Test timestamp via ZipEntry.get/setTimeLocal() */ diff -r f74f056dc069 -r a090823529e7 jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java --- a/jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,6 @@ import java.lang.ref.WeakReference; import java.net.URL; -import java.net.URLClassLoader; import java.util.Arrays; import java.util.Map; import javax.management.Attribute; @@ -70,16 +69,16 @@ + " some little extra check of Descriptors, MBean*Info."); ClassLoader myClassLoader = MXBeanLoadingTest1.class.getClassLoader(); + if(myClassLoader == null) + throw new RuntimeException("Test Failed : Null Classloader for test"); + URL url = myClassLoader.getResource( + MXBeanLoadingTest1.class.getCanonicalName() + .replace(".", "/") + ".class"); + String clsLoadPath = url.toURI().toString(). + replaceAll(MXBeanLoadingTest1.class.getSimpleName() + + ".class", ""); - if (!(myClassLoader instanceof URLClassLoader)) { - String message = "(ERROR) Test's class loader is not " + - "a URLClassLoader"; - System.out.println(message); - throw new RuntimeException(message); - } - - URLClassLoader myURLClassLoader = (URLClassLoader) myClassLoader; - URL[] urls = myURLClassLoader.getURLs(); + URL[] urls = new URL[]{new URL(clsLoadPath)}; PrivateMLet mlet = new PrivateMLet(urls, null, false); Class shadowClass = mlet.loadClass(TestMXBean.class.getName()); diff -r f74f056dc069 -r a090823529e7 jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java --- a/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -44,7 +44,7 @@ import org.testng.annotations.*; public class MultiReleaseJarTest { - final private int MAJOR_VERSION= Version.current().major(); + final private int MAJOR_VERSION = Version.current().major(); final private String userdir = System.getProperty("user.dir","."); final private Map stringEnv = new HashMap<>(); diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/misc/Version/Version.java --- a/jdk/test/sun/misc/Version/Version.java Mon Mar 07 18:49:02 2016 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2010, 2015, 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 6994413 8134365 - * @summary Check the JDK and JVM version returned by sun.misc.Version - * matches the versions defined in the system properties. - * Should use the API described in JDK-8136651 when available - * @modules java.base/sun.misc - * @compile -XDignore.symbol.file Version.java - * @run main Version - */ - -import static sun.misc.Version.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Version { - - public static void main(String[] args) throws Exception { - VersionInfo jdk = newVersionInfo(System.getProperty("java.runtime.version")); - VersionInfo v1 = new VersionInfo(jdkMajorVersion(), - jdkMinorVersion(), - jdkSecurityVersion(), - jdkPatchVersion(), - jdkBuildNumber()); - System.out.println("JDK version = " + jdk + " " + v1); - if (!jdk.equals(v1)) { - throw new RuntimeException("Unmatched version: " + jdk + " vs " + v1); - } - VersionInfo jvm = newVersionInfo(System.getProperty("java.vm.version")); - VersionInfo v2 = new VersionInfo(jvmMajorVersion(), - jvmMinorVersion(), - jvmSecurityVersion(), - jvmPatchVersion(), - jvmBuildNumber()); - System.out.println("JVM version = " + jvm + " " + v2); - if (!jvm.equals(v2)) { - throw new RuntimeException("Unmatched version: " + jvm + " vs " + v2); - } - } - - static class VersionInfo { - final int major; - final int minor; - final int security; - final int patch; - final int build; - VersionInfo(int major, int minor, int security, - int patch, int build) { - this.major = major; - this.minor = minor; - this.security = security; - this.patch = patch; - this.build = build; - } - - VersionInfo(int[] fields) { - this.major = fields[0]; - this.minor = fields[1]; - this.security = fields[2]; - this.patch = fields[3]; - this.build = fields[4]; - } - - public boolean equals(VersionInfo v) { - return (this.major == v.major && this.minor == v.minor && - this.security == v.security && this.patch == v.patch && - this.build == v.build); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - // Do not include trailing zeros - if (patch > 0) { - sb.insert(0, "." + patch); - } - if (security > 0 || sb.length() > 0) { - sb.insert(0, "." + security); - } - if (minor > 0 || sb.length() > 0) { - sb.insert(0, "." + minor); - } - sb.insert(0, major); - - if (build >= 0) - sb.append("+" + build); - - return sb.toString(); - } - } - - private static VersionInfo newVersionInfo(String version) throws Exception { - // Version string fromat as defined by JEP-223 - String jep223Pattern = - "^([0-9]+)(\\.([0-9]+))?(\\.([0-9]+))?(\\.([0-9]+))?" + // $VNUM - "(-([a-zA-Z]+))?(\\.([a-zA-Z]+))?" + // $PRE - "(\\+([0-9]+))?" + // Build Number - "(([-a-zA-Z0-9.]+))?$"; // $OPT - - // Pattern group index for: Major, Minor, Security, Patch, Build - int[] groups = {1, 3, 5, 7, 13}; - // Default values for Major, Minor, Security, Patch, Build - int[] versionFields = {0, 0, 0, 0, 0}; - - Pattern pattern = Pattern.compile(jep223Pattern); - Matcher matcher = pattern.matcher(version); - if (matcher.matches()) { - for (int i = 0; i < versionFields.length; i++) { - String field = matcher.group(groups[i]); - versionFields[i] = (field != null) ? Integer.parseInt(field) : 0; - } - } - - VersionInfo vi = new VersionInfo(versionFields); - System.out.printf("newVersionInfo: input=%s output=%s\n", version, vi); - return vi; - } -} diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java --- a/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java Wed Jul 05 21:25:29 2017 +0200 @@ -42,27 +42,40 @@ import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class MultiReleaseJarURLConnection { String userdir = System.getProperty("user.dir","."); - String urlFile = "jar:file:" + userdir + "/multi-release.jar!/"; - String urlEntry = urlFile + "version/Version.java"; + String file = userdir + "/signed-multi-release.jar"; @BeforeClass public void initialize() throws Exception { CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); creator.compileEntries(); creator.buildMultiReleaseJar(); + creator.buildSignedMultiReleaseJar(); } @AfterClass public void close() throws IOException { Files.delete(Paths.get(userdir, "multi-release.jar")); + Files.delete(Paths.get(userdir, "signed-multi-release.jar")); } - @Test - public void testRuntimeVersioning() throws Exception { + @DataProvider(name = "data") + public Object[][] createData() { + return new Object[][]{ + {"unsigned file", userdir + "/multi-release.jar"}, + {"signed file", userdir + "/signed-multi-release.jar"}, + }; + } + + @Test(dataProvider = "data") + public void testRuntimeVersioning(String ignore, String file) throws Exception { + String urlFile = "jar:file:" + file + "!/"; + String urlEntry = urlFile + "version/Version.java"; + Assert.assertTrue(readAndCompare(new URL(urlEntry), "return 8")); // #runtime is "magic" Assert.assertTrue(readAndCompare(new URL(urlEntry + "#runtime"), "return 9")); @@ -72,8 +85,10 @@ Assert.assertTrue(readAndCompare(new URL(urlEntry), "return 8")); } - @Test - public void testCachedJars() throws Exception { + @Test(dataProvider = "data") + public void testCachedJars(String ignore, String file) throws Exception { + String urlFile = "jar:file:" + file + "!/"; + URL rootUrl = new URL(urlFile); JarURLConnection juc = (JarURLConnection)rootUrl.openConnection(); JarFile rootJar = juc.getJarFile(); diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/security/pkcs11/PKCS11Test.java --- a/jdk/test/sun/security/pkcs11/PKCS11Test.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/sun/security/pkcs11/PKCS11Test.java Wed Jul 05 21:25:29 2017 +0200 @@ -380,7 +380,9 @@ } static double getNSSInfo(String library) { - String nssHeader = "$Header: NSS"; + // look for two types of headers in NSS libraries + String nssHeader1 = "$Header: NSS"; + String nssHeader2 = "Version: NSS"; boolean found = false; String s = null; int i = 0; @@ -408,7 +410,8 @@ } s = new String(data, 0, read); - if ((i = s.indexOf(nssHeader)) > 0) { + i = s.indexOf(nssHeader1); + if (i > 0 || (i = s.indexOf(nssHeader2)) > 0) { found = true; // If the nssHeader is before 920 we can break, otherwise // we may not have the whole header so do another read. If diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/security/provider/NSASuiteB/TestDSAGenParameterSpec.java --- a/jdk/test/sun/security/provider/NSASuiteB/TestDSAGenParameterSpec.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/sun/security/provider/NSASuiteB/TestDSAGenParameterSpec.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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 @@ -37,6 +37,7 @@ /* * @test * @bug 8075286 + * @key intermittent * @summary Verify that DSAGenParameterSpec can and can only be used to generate * DSA within some certain range of key sizes as described in the class * specification (L, N) as (1024, 160), (2048, 224), (2048, 256) and diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/security/rsa/SpecTest.java --- a/jdk/test/sun/security/rsa/SpecTest.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/sun/security/rsa/SpecTest.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, 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,6 +34,7 @@ /** * @test * @bug 8044199 + * @key intermittent * @summary Check same KeyPair's private key and public key have same modulus. * also check public key's public exponent equals to given spec's public * exponent. diff -r f74f056dc069 -r a090823529e7 jdk/test/sun/security/ssl/DHKeyExchange/LegacyDHEKeyExchange.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/ssl/DHKeyExchange/LegacyDHEKeyExchange.java Wed Jul 05 21:25:29 2017 +0200 @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2016, 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. + */ + +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. + +/* + * @test + * @bug 8148108 + * @summary Disable Diffie-Hellman keys less than 1024 bits + * @run main/othervm -Djdk.tls.ephemeralDHKeySize=legacy LegacyDHEKeyExchange + */ + +import java.io.*; +import javax.net.ssl.*; + +public class LegacyDHEKeyExchange { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../javax/net/ssl/etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + SSLServerSocketFactory sslssf = + (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + SSLServerSocket sslServerSocket = + (SSLServerSocket) sslssf.createServerSocket(serverPort); + + serverPort = sslServerSocket.getLocalPort(); + + /* + * Signal Client, we're ready for his connect. + */ + serverReady = true; + + try (SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept()) { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + throw new Exception( + "Leagcy DH keys (< 1024) should be restricted"); + } catch (SSLHandshakeException she) { + // ignore, client should terminate the connection + } finally { + sslServerSocket.close(); + } + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + String[] suites = new String [] {"TLS_DHE_RSA_WITH_AES_128_CBC_SHA"}; + sslSocket.setEnabledCipherSuites(suites); + + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + throw new Exception("Leagcy DH keys (< 1024) should be restricted"); + } catch (SSLHandshakeException she) { + // ignore, should be caused by algorithm constraints + } finally { + sslSocket.close(); + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) { + System.setProperty("javax.net.debug", "all"); + } + + /* + * Start the tests. + */ + new LegacyDHEKeyExchange(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + LegacyDHEKeyExchange() throws Exception { + Exception startException = null; + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + startException = e; + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + if (serverThread != null) { + serverThread.join(); + } + } else { + if (clientThread != null) { + clientThread.join(); + } + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + } else { + remote = clientException; + local = serverException; + } + + Exception exception = null; + + /* + * Check various exception conditions. + */ + if ((local != null) && (remote != null)) { + // If both failed, return the curthread's exception. + local.initCause(remote); + exception = local; + } else if (local != null) { + exception = local; + } else if (remote != null) { + exception = remote; + } else if (startException != null) { + exception = startException; + } + + /* + * If there was an exception *AND* a startException, + * output it. + */ + if (exception != null) { + if (exception != startException && startException != null) { + exception.addSuppressed(startException); + } + throw exception; + } + + // Fall-through: no exception to throw! + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + @Override + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + @Override + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff -r f74f056dc069 -r a090823529e7 jdk/test/tools/jar/JarEntryTime.java --- a/jdk/test/tools/jar/JarEntryTime.java Mon Mar 07 18:49:02 2016 +0530 +++ b/jdk/test/tools/jar/JarEntryTime.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, 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 @@ -31,6 +31,8 @@ import java.io.File; import java.io.PrintWriter; import java.nio.file.attribute.FileTime; +import java.util.Date; +import java.util.TimeZone; import sun.tools.jar.Main; public class JarEntryTime { @@ -39,6 +41,9 @@ // allow for e.g. rounding/truncation and networked/samba drives. static final long PRECISION = 10000L; + static final TimeZone TZ = TimeZone.getDefault(); + static final boolean DST = TZ.inDaylightTime(new Date()); + static boolean cleanup(File dir) throws Throwable { boolean rc = true; File[] x = dir.listFiles(); @@ -75,11 +80,13 @@ File dirOuter = new File("outer"); File dirInner = new File(dirOuter, "inner"); File jarFile = new File("JarEntryTime.jar"); + File testFile = new File("JarEntryTimeTest.txt"); // Remove any leftovers from prior run cleanup(dirInner); cleanup(dirOuter); jarFile.delete(); + testFile.delete(); /* Create a directory structure * outer/ @@ -129,23 +136,39 @@ check(cleanup(dirInner)); check(cleanup(dirOuter)); + try (PrintWriter pw = new PrintWriter(testFile)) { + pw.println("hello, world"); + } + final long start = testFile.lastModified(); + // Extract and check the last modified values are the current times. // See sun.tools.jar.Main extractJar(jarFile, true); + + try (PrintWriter pw = new PrintWriter(testFile)) { + pw.println("hello, world"); + } + final long end = testFile.lastModified(); + check(dirOuter.exists()); check(dirInner.exists()); check(fileInner.exists()); - checkFileTime(dirOuter.lastModified(), now); - checkFileTime(dirInner.lastModified(), now); - checkFileTime(fileInner.lastModified(), now); + checkFileTime(start, dirOuter.lastModified(), end); + checkFileTime(start, dirInner.lastModified(), end); + checkFileTime(start, fileInner.lastModified(), end); check(cleanup(dirInner)); check(cleanup(dirOuter)); check(jarFile.delete()); + check(testFile.delete()); } static void checkFileTime(long now, long original) { + if (isTimeSettingChanged()) { + return; + } + if (Math.abs(now - original) > PRECISION) { System.out.format("Extracted to %s, expected to be close to %s%n", FileTime.fromMillis(now), FileTime.fromMillis(original)); @@ -153,6 +176,27 @@ } } + static void checkFileTime(long start, long now, long end) { + if (isTimeSettingChanged()) { + return; + } + + if (now < start || now > end) { + System.out.format("Extracted to %s, " + + "expected to be after %s and before %s%n", + FileTime.fromMillis(now), + FileTime.fromMillis(start), + FileTime.fromMillis(end)); + fail(); + } + } + + private static boolean isTimeSettingChanged() { + TimeZone currentTZ = TimeZone.getDefault(); + boolean currentDST = currentTZ.inDaylightTime(new Date()); + return (!currentTZ.equals(TZ) || currentDST != DST); + } + //--------------------- Infrastructure --------------------------- static volatile int passed = 0, failed = 0; static void pass() {passed++;} diff -r f74f056dc069 -r a090823529e7 make/Images.gmk --- a/make/Images.gmk Mon Mar 07 18:49:02 2016 +0530 +++ b/make/Images.gmk Wed Jul 05 21:25:29 2017 +0200 @@ -42,7 +42,7 @@ jdk.security.auth jdk.security.jgss jdk.pack200 jdk.xml.dom \ jdk.accessibility jdk.internal.le jdk.dynalink \ jdk.scripting.nashorn jdk.scripting.nashorn.shell \ - jdk.vm.ci jdk.management + jdk.vm.ci jdk.management jdk.jsobject # providers PROVIDER_MODULES += jdk.charsets jdk.crypto.ec jdk.crypto.pkcs11 jdk.jvmstat jdk.jvmstat.rmi \ diff -r f74f056dc069 -r a090823529e7 make/common/MakeBase.gmk --- a/make/common/MakeBase.gmk Mon Mar 07 18:49:02 2016 +0530 +++ b/make/common/MakeBase.gmk Wed Jul 05 21:25:29 2017 +0200 @@ -282,7 +282,7 @@ # Default shell seems to always be /bin/sh. Must override with bash to get this to work on Solaris. # Only use time if it's GNU time which supports format and output file. WRAPPER_SHELL := $$(BASH) $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log $$(SHELL) - SHELL := $$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) + SHELL = $$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) endif # The warn level can never be turned off LogWarn = $$(info $$(strip $$1)) diff -r f74f056dc069 -r a090823529e7 modules.xml --- a/modules.xml Mon Mar 07 18:49:02 2016 +0530 +++ b/modules.xml Wed Jul 05 21:25:29 2017 +0200 @@ -844,6 +844,18 @@ + jdk.jsobject + java.base + java.desktop + + netscape.javascript + + + jdk.internal.netscape.javascript.spi + jdk.plugin + + + java.httpclient java.base @@ -1802,10 +1814,10 @@ com.sun.tools.javadoc - jdk.javadoc.doclet + jdk.javadoc.doclet - jdk.javadoc.doclet.taglet + jdk.javadoc.doclet.taglet diff -r f74f056dc069 -r a090823529e7 nashorn/.hgtags --- a/nashorn/.hgtags Mon Mar 07 18:49:02 2016 +0530 +++ b/nashorn/.hgtags Wed Jul 05 21:25:29 2017 +0200 @@ -341,3 +341,4 @@ 4e9749cc32f15251d9b2d0eab4373529952902a3 jdk-9+105 cfb3167456932b14c16a6d4cffd5fe295fbe01ff jdk-9+106 8042e81b530e480dfdad41fd53a7a26f69ebba26 jdk-9+107 +58409eff7e3e0c07f12f543341769964619c0acf jdk-9+108 diff -r f74f056dc069 -r a090823529e7 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeStore.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeStore.java Mon Mar 07 18:49:02 2016 +0530 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/CodeStore.java Wed Jul 05 21:25:29 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2016, 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,13 +34,10 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; -import java.security.AccessControlException; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.util.Iterator; import java.util.Map; -import java.util.ServiceLoader; import jdk.nashorn.internal.codegen.OptimisticTypesPersistence; import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.runtime.logging.DebugLogger; @@ -54,11 +51,6 @@ @Logger(name="codestore") public abstract class CodeStore implements Loggable { - /** - * Permission needed to provide a CodeStore instance via ServiceLoader. - */ - public final static String NASHORN_PROVIDE_CODE_STORE = "nashorn.provideCodeStore"; - private DebugLogger log; /** @@ -85,23 +77,6 @@ * @return The instance, or null if code store could not be created */ public static CodeStore newCodeStore(final Context context) { - final Class baseClass = CodeStore.class; - try { - // security check first - final SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(new RuntimePermission(NASHORN_PROVIDE_CODE_STORE)); - } - final ServiceLoader services = ServiceLoader.load(baseClass); - final Iterator iterator = services.iterator(); - if (iterator.hasNext()) { - final CodeStore store = iterator.next(); - store.initLogger(context).info("using code store provider ", store.getClass().getCanonicalName()); - return store; - } - } catch (final AccessControlException e) { - context.getLogger(CodeStore.class).warning("failed to load code store provider ", e); - } try { final CodeStore store = new DirectoryCodeStore(context); store.initLogger(context);