# HG changeset patch # User amurillo # Date 1450234870 28800 # Node ID a6cf6a790a356abb45698f88dc0598cd4d2537e4 # Parent 92e32436d4713620d307adb47f28fd751fd7aebc# Parent 6f6c1be8c224ca2b5700802626a49742142ebe07 Merge diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/CompileDemos.gmk --- a/jdk/make/CompileDemos.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/CompileDemos.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -309,7 +309,7 @@ ifeq ($$($1_TOOLCHAIN), TOOLCHAIN_LINK_CXX) # For C++, we also need some special treatment. - $1_LDFLAGS := $(LDFLAGS_CXX_JDK) + $1_LDFLAGS := $$(LDFLAGS_CXX_JDK) $1_LIBS := $(LIBCXX) ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc) @@ -324,9 +324,9 @@ OPTIMIZATION := LOW, \ CFLAGS := $$($1_CFLAGS_INCLUDE) $$(CFLAGS_JDKLIB) $$(CFLAGS_DEBUG_SYMBOLS), \ CXXFLAGS := $$($1_CXXFLAGS), \ - LDFLAGS := $(filter-out -incremental:no -opt:ref, $(LDFLAGS_JDKLIB)) \ + LDFLAGS := $(filter-out -incremental:no -opt:ref, $$(LDFLAGS_JDKLIB)) \ $$($1_LDFLAGS), \ - LDFLAGS_macosx := $(call SET_EXECUTABLE_ORIGIN), \ + LDFLAGS_macosx := $$(call SET_EXECUTABLE_ORIGIN), \ LIBS := $$($1_LIBS), \ LIBS_solaris := -lc, \ VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/launcher/Launcher-java.base.gmk --- a/jdk/make/launcher/Launcher-java.base.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/launcher/Launcher-java.base.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -127,8 +127,7 @@ $(BUILD_JEXEC_INC), \ CFLAGS_linux := -fPIC, \ CFLAGS_solaris := -KPIC, \ - LDFLAGS := $(LDFLAGS_JDKEXE) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)), \ + LDFLAGS := $(LDFLAGS_JDKEXE), \ OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/jexec_obj, \ OUTPUT_DIR := $(BUILD_JEXEC_DST_DIR), \ DEBUG_SYMBOLS := true, \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/launcher/Launcher-jdk.pack200.gmk --- a/jdk/make/launcher/Launcher-jdk.pack200.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/launcher/Launcher-jdk.pack200.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -89,7 +89,6 @@ MAPFILE := $(UNPACK_MAPFILE),\ LDFLAGS := $(UNPACKEXE_ZIPOBJS) \ $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)unpack$(SHARED_LIBRARY_SUFFIX)) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LIBS := $(UNPACKEXE_LIBS) $(LIBCXX), \ LIBS_solaris := -lc, \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/launcher/LauncherCommon.gmk --- a/jdk/make/launcher/LauncherCommon.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/launcher/LauncherCommon.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -25,6 +25,12 @@ include NativeCompilation.gmk +# SetupNativeCompilation now supports debug symbols on macosx for hotspot. +# Disable it here for the jdk binaries until we decide to enable them. +ifeq ($(OPENJDK_TARGET_OS), macosx) + ENABLE_DEBUG_SYMBOLS := false +endif + # Prepare the find cache. $(eval $(call FillCacheFind, $(JDK_TOPDIR)/src/java.base/share/native/launcher)) @@ -180,15 +186,12 @@ CFLAGS_linux := -fPIC, \ CFLAGS_solaris := -KPIC -DHAVE_GETHRTIME, \ CFLAGS_windows := $$($1_CFLAGS_windows), \ - LDFLAGS := $(LDFLAGS_JDKEXE) \ + LDFLAGS := $$(LDFLAGS_JDKEXE) \ $$(ORIGIN_ARG) \ $$($1_LDFLAGS), \ LDFLAGS_linux := \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)) \ -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.base$(OPENJDK_TARGET_CPU_LIBDIR)/jli, \ - LDFLAGS_macosx := $(call SET_SHARED_LIBRARY_NAME,$1), \ LDFLAGS_solaris := $$($1_LDFLAGS_solaris) \ - $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)) \ -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.base$(OPENJDK_TARGET_CPU_LIBDIR)/jli, \ MAPFILE := $$($1_MAPFILE), \ LIBS := $(JDKEXE_LIBS) $$($1_LIBS), \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/lib/Awt2dLibraries.gmk --- a/jdk/make/lib/Awt2dLibraries.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/lib/Awt2dLibraries.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -683,7 +683,7 @@ WARNINGS_AS_ERRORS_gcc := false, \ WARNINGS_AS_ERRORS_solstudio := false, \ MAPFILE := $(BUILD_LIBFONTMANAGER_MAPFILE), \ - LDFLAGS := $(subst -Xlinker -z -Xlinker defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \ + LDFLAGS := $(subst -Wl$(COMMA)-z$(COMMA)defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_macosx := -undefined dynamic_lookup, \ @@ -799,7 +799,7 @@ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ - LDFLAGS_macosx := -Xlinker -rpath -Xlinker @loader_path, \ + LDFLAGS_macosx := -Wl$(COMMA)-rpath$(COMMA)@loader_path, \ LIBS_unix := $(JAWT_LIBS) $(JDKLIB_LIBS), \ LIBS_solaris := $(X_LIBS) -lXrender, \ LIBS_macosx := -framework Cocoa, \ @@ -1034,7 +1034,7 @@ -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ - -Xlinker -rpath -Xlinker @loader_path \ + -Wl$(COMMA)-rpath$(COMMA)@loader_path \ -L$(INSTALL_LIBRARIES_HERE), \ LIBS := -lawt -losxapp -lawt_lwawt \ -framework Cocoa \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/lib/Lib-java.instrument.gmk --- a/jdk/make/lib/Lib-java.instrument.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/lib/Lib-java.instrument.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -65,7 +65,7 @@ -L$(call FindLibDirForModule, java.base)/jli, \ LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/jli) \ -L$(call FindLibDirForModule, java.base)/jli, \ - LDFLAGS_macosx := -Xlinker -all_load $(SUPPORT_OUTPUTDIR)/native/java.base/libjli_static.a, \ + LDFLAGS_macosx := -Wl$(COMMA)-all_load, \ LDFLAGS_aix := -L$(SUPPORT_OUTPUTDIR)/native/java.base, \ LDFLAGS_windows := -export:Agent_OnAttach, \ LIBS := $(JDKLIB_LIBS), \ @@ -74,7 +74,8 @@ LIBS_solaris := -ljli $(LIBDL), \ LIBS_aix := -liconv -ljli_static $(LIBDL), \ LIBS_macosx := -liconv -framework Cocoa -framework Security \ - -framework ApplicationServices, \ + -framework ApplicationServices \ + $(SUPPORT_OUTPUTDIR)/native/java.base/libjli_static.a, \ LIBS_windows := $(WIN_JAVA_LIB) advapi32.lib \ $(SUPPORT_OUTPUTDIR)/native/java.base/jli_static.lib, \ VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/make/lib/LibCommon.gmk --- a/jdk/make/lib/LibCommon.gmk Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/make/lib/LibCommon.gmk Tue Dec 15 19:01:10 2015 -0800 @@ -46,6 +46,12 @@ endif endif +# SetupNativeCompilation now supports debug symbols on macosx for hotspot. +# Disable it here for the jdk libraries until we decide to enable them. +ifeq ($(OPENJDK_TARGET_OS), macosx) + ENABLE_DEBUG_SYMBOLS := false +endif + ################################################################################ # Find the default set of src dirs for a native library. # Param 1 - module name diff -r 92e32436d471 -r a6cf6a790a35 jdk/src/java.base/share/classes/java/io/CharArrayReader.java --- a/jdk/src/java.base/share/classes/java/io/CharArrayReader.java Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/src/java.base/share/classes/java/io/CharArrayReader.java Tue Dec 15 19:01:10 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -225,9 +225,12 @@ * Closes the stream and releases any system resources associated with * it. Once the stream has been closed, further read(), ready(), * mark(), reset(), or skip() invocations will throw an IOException. - * Closing a previously closed stream has no effect. + * Closing a previously closed stream has no effect. This method will block + * while there is another thread blocking on the reader. */ public void close() { - buf = null; + synchronized (lock) { + buf = null; + } } } diff -r 92e32436d471 -r a6cf6a790a35 jdk/src/java.base/share/classes/java/io/PushbackReader.java --- a/jdk/src/java.base/share/classes/java/io/PushbackReader.java Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/src/java.base/share/classes/java/io/PushbackReader.java Tue Dec 15 19:01:10 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -241,13 +241,16 @@ * Closes the stream and releases any system resources associated with * it. Once the stream has been closed, further read(), * unread(), ready(), or skip() invocations will throw an IOException. - * Closing a previously closed stream has no effect. + * Closing a previously closed stream has no effect. This method will block + * while there is another thread blocking on the reader. * * @exception IOException If an I/O error occurs */ public void close() throws IOException { - super.close(); - buf = null; + synchronized (lock) { + super.close(); + buf = null; + } } /** diff -r 92e32436d471 -r a6cf6a790a35 jdk/src/java.base/share/classes/java/io/StringReader.java --- a/jdk/src/java.base/share/classes/java/io/StringReader.java Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/src/java.base/share/classes/java/io/StringReader.java Tue Dec 15 19:01:10 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -194,9 +194,12 @@ * Closes the stream and releases any system resources associated with * it. Once the stream has been closed, further read(), * ready(), mark(), or reset() invocations will throw an IOException. - * Closing a previously closed stream has no effect. + * Closing a previously closed stream has no effect. This method will block + * while there is another thread blocking on the reader. */ public void close() { - str = null; + synchronized (lock) { + str = null; + } } } diff -r 92e32436d471 -r a6cf6a790a35 jdk/src/java.base/share/classes/java/lang/StackWalker.java --- a/jdk/src/java.base/share/classes/java/lang/StackWalker.java Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/src/java.base/share/classes/java/lang/StackWalker.java Tue Dec 15 19:01:10 2015 -0800 @@ -304,8 +304,8 @@ } /** - * Returns a {@code StackWalker} instance with the given {@ocde options} specifying - * the stack frame information it can access. If the given {@ocde options} + * Returns a {@code StackWalker} instance with the given {@code options} specifying + * the stack frame information it can access. If the given {@code options} * is empty, this {@code StackWalker} is configured to skip all * {@linkplain Option#SHOW_HIDDEN_FRAMES hidden frames} and no * {@linkplain Option#RETAIN_CLASS_REFERENCE class reference} is retained. diff -r 92e32436d471 -r a6cf6a790a35 jdk/test/TEST.groups --- a/jdk/test/TEST.groups Tue Dec 15 09:50:07 2015 -0800 +++ b/jdk/test/TEST.groups Tue Dec 15 19:01:10 2015 -0800 @@ -95,16 +95,19 @@ -:jdk_concurrent \ -:jdk_stream -# java.util.concurrent (JSR-166) +# All collections, core and concurrent +jdk_collections = \ + :jdk_collections_core \ + :jdk_concurrent + +# java.util.concurrent +# Includes concurrent collections plus other stuff # Maintained by JSR-166 EG (Doug Lea et al) -# Deque and PriorityQueue are also generally maintained by JSR-166 jdk_concurrent = \ - java/util/concurrent \ - java/util/Deque \ - java/util/PriorityQueue + java/util/concurrent -# Java Collections Framework -jdk_collections = \ +# Java Collections Framework core classes +jdk_collections_core = \ java/util/AbstractCollection \ java/util/AbstractList \ java/util/AbstractMap \ @@ -114,19 +117,22 @@ java/util/BitSet \ java/util/Collection \ java/util/Collections \ + java/util/Comparator \ + java/util/Deque \ java/util/EnumMap \ java/util/EnumSet \ - java/util/Comparator \ - java/util/Iterator \ java/util/HashMap \ + java/util/HashSet \ java/util/Hashtable \ java/util/IdentityHashMap \ - java/util/List \ + java/util/Iterator \ java/util/LinkedHashMap \ java/util/LinkedHashSet \ java/util/LinkedList \ + java/util/List \ java/util/Map \ java/util/NavigableMap \ + java/util/PriorityQueue \ java/util/TimSort \ java/util/TreeMap \ java/util/Vector \ diff -r 92e32436d471 -r a6cf6a790a35 jdk/test/java/io/PushbackReader/ReadCloseRaceNPE.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/io/PushbackReader/ReadCloseRaceNPE.java Tue Dec 15 19:01:10 2015 -0800 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 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 8143394 + * @summary Check for NullPointerException in race between read() and close(). + */ +import java.io.CharArrayReader; +import java.io.IOException; +import java.io.PushbackReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public class ReadCloseRaceNPE { + + private static final int BUF_SIZE = 1000; + private static final long TIMEOUT_MS = 3000; + + private static final List failures = new ArrayList<>(); + + private static void testReader(final Supplier readerSupplier) + throws InterruptedException { + AtomicReference readerRef = + new AtomicReference<>(readerSupplier.get()); + + AtomicBoolean isFinished = new AtomicBoolean(); + + Runnable readTask = () -> { + long startTime = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTime < TIMEOUT_MS) { + try { + readerRef.get().read(); + } catch (Exception e) { + if (!(e instanceof IOException)) { + failures.add(e); + break; + } + readerRef.set(readerSupplier.get()); + } + } + isFinished.set(true); + }; + + Runnable closeTask = () -> { + while (!isFinished.get()) { + try { + readerRef.get().close(); + } catch (Exception e) { + if (!(e instanceof IOException)) { + e.printStackTrace(); + } + } + } + }; + + Thread readThread = new Thread(readTask); + Thread closeThread = new Thread(closeTask); + + readThread.start(); + closeThread.start(); + readThread.join(); + closeThread.join(); + } + + public static void main(String[] args) throws Throwable { + final String s = "Two riders were approaching.\\n"; + + Supplier charPushbackReaderSupplier = () -> { + char buf[] = new char[s.length()]; + s.getChars(0, s.length(), buf, 0); + CharArrayReader in = new CharArrayReader(buf); + return new PushbackReader(in, BUF_SIZE); + }; + + testReader(charPushbackReaderSupplier); + + Supplier stringPushbackReaderSupplier = () -> { + StringReader in = new StringReader(s); + return new PushbackReader(in, BUF_SIZE); + }; + + testReader(stringPushbackReaderSupplier); + + if (!failures.isEmpty()) { + failures.stream().forEach((x) -> ((Exception) x).printStackTrace()); + throw new RuntimeException("PushbackReaderNPE failed"); + } + } +}