--- a/jdk/.hgtags Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/.hgtags Fri Mar 11 11:42:43 2016 -0800
@@ -351,3 +351,4 @@
6e9ecae50b4e0d37483fb2719202eea5dca026a4 jdk-9+106
8701b2bb1d2e1b9abc2a9be0933993c7150a9dbe jdk-9+107
42794e648cfe9fd67461dcbe8b7594241a84bcff jdk-9+108
+1c7bad0798900fe58f4db01ae7ffdc84f5baee8c jdk-9+109
--- a/jdk/make/lib/Lib-java.desktop.gmk Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/make/lib/Lib-java.desktop.gmk Fri Mar 11 11:42:43 2016 -0800
@@ -29,6 +29,7 @@
$(eval $(call FillCacheFind, $(wildcard $(JDK_TOPDIR)/src/java.desktop/*/native \
$(JDK_TOPDIR)/src/*/java.desktop/*/native)))
+include LibosxLibraries.gmk
include PlatformLibraries.gmk
include Awt2dLibraries.gmk
include SoundLibraries.gmk
--- a/jdk/make/lib/Lib-jdk.deploy.osx.gmk Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-#
-# Copyright (c) 2011, 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 LibCommon.gmk
-
-ifeq ($(OPENJDK_TARGET_OS), macosx)
-
- ################################################################################
-
- LIBOSX_DIRS := $(JDK_TOPDIR)/src/jdk.deploy.osx/macosx/native/libosx
- LIBOSX_CFLAGS := -I$(LIBOSX_DIRS) \
- -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libosxapp \
- $(LIBJAVA_HEADER_FLAGS) \
- -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop \
- -I$(SUPPORT_OUTPUTDIR)/headers/jdk.deploy.osx \
- #
-
- $(eval $(call SetupNativeCompilation,BUILD_LIBOSX, \
- LIBRARY := osx, \
- OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
- SRC := $(LIBOSX_DIRS), \
- OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) \
- $(LIBOSX_CFLAGS), \
- DISABLED_WARNINGS_clang := deprecated-declarations, \
- LDFLAGS := $(LDFLAGS_JDKLIB) \
- -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.desktop \
- $(call SET_SHARED_LIBRARY_ORIGIN), \
- LIBS := \
- -losxapp \
- -framework Cocoa \
- -framework ApplicationServices \
- -framework JavaNativeFoundation \
- -framework JavaRuntimeSupport \
- -framework SystemConfiguration \
- $(JDKLIB_LIBS), \
- OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libosx, \
- ))
-
- TARGETS += $(BUILD_LIBOSX)
-
- $(BUILD_LIBOSX): $(call FindLib, java.desktop, osxapp)
-
- $(BUILD_LIBOSX): $(call FindLib, java.base, java)
-
- ################################################################################
-
-endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/lib/LibosxLibraries.gmk Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2011, 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.
+#
+
+ifeq ($(OPENJDK_TARGET_OS), macosx)
+
+ ################################################################################
+
+ LIBOSX_DIRS := $(JDK_TOPDIR)/src/java.desktop/macosx/native/libosx
+ LIBOSX_CFLAGS := -I$(LIBOSX_DIRS) \
+ -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libosxapp \
+ $(LIBJAVA_HEADER_FLAGS) \
+ -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop \
+ #
+
+ $(eval $(call SetupNativeCompilation,BUILD_LIBOSX, \
+ LIBRARY := osx, \
+ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
+ SRC := $(LIBOSX_DIRS), \
+ OPTIMIZATION := LOW, \
+ CFLAGS := $(CFLAGS_JDKLIB) \
+ $(LIBOSX_CFLAGS), \
+ DISABLED_WARNINGS_clang := deprecated-declarations, \
+ LDFLAGS := $(LDFLAGS_JDKLIB) \
+ -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.desktop \
+ $(call SET_SHARED_LIBRARY_ORIGIN), \
+ LIBS := \
+ -losxapp \
+ -framework Cocoa \
+ -framework ApplicationServices \
+ -framework JavaNativeFoundation \
+ -framework JavaRuntimeSupport \
+ -framework SystemConfiguration \
+ $(JDKLIB_LIBS), \
+ OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libosx, \
+ ))
+
+ TARGETS += $(BUILD_LIBOSX)
+
+ $(BUILD_LIBOSX): $(call FindLib, java.desktop, osxapp)
+
+ $(BUILD_LIBOSX): $(call FindLib, java.base, java)
+
+ ################################################################################
+
+endif
--- a/jdk/make/mapfiles/libjfr/mapfile-vers Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-#
-# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
-# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-#
-
-# Define library interface.
-
-SUNWprivate_1.1 {
- global:
- Java_oracle_jrockit_jfr_Process_getpid;
- Java_oracle_jrockit_jfr_Timing_counterTime;
- Java_oracle_jrockit_jfr_Timing_init;
- Java_oracle_jrockit_jfr_Logger_output0;
- Java_oracle_jrockit_jfr_JFR_isCommercialFeaturesUnlocked;
- Java_oracle_jrockit_jfr_JFR_isStarted;
- Java_oracle_jrockit_jfr_JFR_isSupportedInVM;
- Java_oracle_jrockit_jfr_JFR_startFlightRecorder;
- Java_oracle_jrockit_jfr_JFR_isDisabledOnCommandLine;
- Java_oracle_jrockit_jfr_JFR_isEnabled;
- Java_oracle_jrockit_jfr_VMJFR_options;
- Java_oracle_jrockit_jfr_VMJFR_init;
- Java_oracle_jrockit_jfr_VMJFR_addConstPool;
- Java_oracle_jrockit_jfr_VMJFR_removeConstPool;
- Java_oracle_jrockit_jfr_VMJFR_storeConstPool;
- Java_oracle_jrockit_jfr_VMJFR_classID0;
- Java_oracle_jrockit_jfr_VMJFR_stackTraceID;
- Java_oracle_jrockit_jfr_VMJFR_threadID;
- Java_oracle_jrockit_jfr_VMJFR_rotate;
- Java_oracle_jrockit_jfr_VMJFR_shutdown;
- Java_oracle_jrockit_jfr_VMJFR_start;
- Java_oracle_jrockit_jfr_VMJFR_stop;
- Java_oracle_jrockit_jfr_VMJFR_buffer;
- Java_oracle_jrockit_jfr_VMJFR_flush;
- Java_oracle_jrockit_jfr_VMJFR_write;
- Java_oracle_jrockit_jfr_VMJFR_add;
- Java_oracle_jrockit_jfr_VMJFR_remove;
- Java_oracle_jrockit_jfr_VMJFR_setThreshold;
- Java_oracle_jrockit_jfr_VMJFR_setPeriod;
- Java_oracle_jrockit_jfr_VMJFR_getPeriod;
- Java_oracle_jrockit_jfr_VMJFR_descriptors;
- Java_oracle_jrockit_jfr_VMJFR_retransformClasses0;
- JNI_OnLoad;
- local:
- *;
-};
--- a/jdk/make/src/classes/build/tools/module/boot.modules Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/make/src/classes/build/tools/module/boot.modules Fri Mar 11 11:42:43 2016 -0800
@@ -19,7 +19,6 @@
java.xml.crypto
jdk.charsets
jdk.deploy
-jdk.deploy.osx
jdk.httpserver
jdk.jfr
jdk.jsobject
@@ -28,6 +27,7 @@
jdk.vm.ci
jdk.management
jdk.management.cmm
+jdk.management.jfr
jdk.management.resource
jdk.naming.rmi
jdk.sctp
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Fri Mar 11 11:42:43 2016 -0800
@@ -81,9 +81,8 @@
ThreadGroup systemThreadGroup = tg;
ThreadFactory threadFactory = grimReaper -> {
- // Our thread stack requirement is quite modest.
- Thread t = new Thread(systemThreadGroup, grimReaper,
- "process reaper", 32768);
+ long stackSize = Boolean.getBoolean("jdk.lang.processReaperUseDefaultStackSize") ? 0 : 32768;
+ Thread t = new Thread(systemThreadGroup, grimReaper, "process reaper", stackSize);
t.setDaemon(true);
// A small attempt (probably futile) to avoid priority inversion
t.setPriority(Thread.MAX_PRIORITY);
--- a/jdk/src/java.base/share/classes/java/lang/String.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Fri Mar 11 11:42:43 2016 -0800
@@ -42,6 +42,7 @@
import java.util.stream.IntStream;
import java.util.stream.StreamSupport;
import jdk.internal.HotSpotIntrinsicCandidate;
+import jdk.internal.vm.annotation.Stable;
/**
* The {@code String} class represents character strings. All
@@ -119,7 +120,18 @@
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
- /** The value is used for character storage. */
+ /**
+ * The value is used for character storage.
+ *
+ * @implNote This field is trusted by the VM, and is a subject to
+ * constant folding if String instance is constant. Overwriting this
+ * field after construction will cause problems.
+ *
+ * Additionally, it is marked with {@link Stable} to trust the contents
+ * of the array. No other facility in JDK provides this functionality (yet).
+ * {@link Stable} is safe here, because value is never null.
+ */
+ @Stable
private final byte[] value;
/**
@@ -129,6 +141,9 @@
* LATIN1
* UTF16
*
+ * @implNote This field is trusted by the VM, and is a subject to
+ * constant folding if String instance is constant. Overwriting this
+ * field after construction will cause problems.
*/
private final byte coder;
@@ -1222,30 +1237,12 @@
public int compare(String s1, String s2) {
byte v1[] = s1.value;
byte v2[] = s2.value;
- int n1 = s1.length();
- int n2 = s2.length();
- boolean s1IsLatin1 = s1.isLatin1();
- boolean s2IsLatin1 = s2.isLatin1();
- int min = Math.min(n1, n2);
- for (int i = 0; i < min; i++) {
- char c1 = s1IsLatin1 ? StringLatin1.getChar(v1, i)
- : StringUTF16.getChar(v1, i);
- char c2 = s2IsLatin1 ? StringLatin1.getChar(v2, i)
- : StringUTF16.getChar(v2, i);
- if (c1 != c2) {
- c1 = Character.toUpperCase(c1);
- c2 = Character.toUpperCase(c2);
- if (c1 != c2) {
- c1 = Character.toLowerCase(c1);
- c2 = Character.toLowerCase(c2);
- if (c1 != c2) {
- // No overflow because of numeric promotion
- return c1 - c2;
- }
- }
- }
+ if (s1.coder() == s2.coder()) {
+ return s1.isLatin1() ? StringLatin1.compareToCI(v1, v2)
+ : StringUTF16.compareToCI(v1, v2);
}
- return n1 - n2;
+ return s1.isLatin1() ? StringLatin1.compareToCI_UTF16(v1, v2)
+ : StringUTF16.compareToCI_Latin1(v1, v2);
}
/** Replaces the de-serialized object. */
--- a/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Fri Mar 11 11:42:43 2016 -0800
@@ -128,6 +128,48 @@
return len1 - len2;
}
+ public static int compareToCI(byte[] value, byte[] other) {
+ int len1 = value.length;
+ int len2 = other.length;
+ int lim = Math.min(len1, len2);
+ for (int k = 0; k < lim; k++) {
+ if (value[k] != other[k]) {
+ char c1 = (char) CharacterDataLatin1.instance.toUpperCase(getChar(value, k));
+ char c2 = (char) CharacterDataLatin1.instance.toUpperCase(getChar(other, k));
+ if (c1 != c2) {
+ c1 = (char) CharacterDataLatin1.instance.toLowerCase(c1);
+ c2 = (char) CharacterDataLatin1.instance.toLowerCase(c2);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+ }
+ }
+ return len1 - len2;
+ }
+
+ public static int compareToCI_UTF16(byte[] value, byte[] other) {
+ int len1 = length(value);
+ int len2 = StringUTF16.length(other);
+ int lim = Math.min(len1, len2);
+ for (int k = 0; k < lim; k++) {
+ char c1 = getChar(value, k);
+ char c2 = StringUTF16.getChar(other, k);
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 = Character.toLowerCase(c1);
+ c2 = Character.toLowerCase(c2);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+ }
+ }
+ return len1 - len2;
+ }
+
public static int hashCode(byte[] value) {
int h = 0;
for (byte v : value) {
--- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Fri Mar 11 11:42:43 2016 -0800
@@ -270,6 +270,50 @@
return len1 - len2;
}
+ public static int compareToCI(byte[] value, byte[] other) {
+ int len1 = length(value);
+ int len2 = length(other);
+ int lim = Math.min(len1, len2);
+ for (int k = 0; k < lim; k++) {
+ char c1 = getChar(value, k);
+ char c2 = getChar(other, k);
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 = Character.toLowerCase(c1);
+ c2 = Character.toLowerCase(c2);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+ }
+ }
+ return len1 - len2;
+ }
+
+ public static int compareToCI_Latin1(byte[] value, byte[] other) {
+ int len1 = length(value);
+ int len2 = StringLatin1.length(other);
+ int lim = Math.min(len1, len2);
+ for (int k = 0; k < lim; k++) {
+ char c1 = getChar(value, k);
+ char c2 = StringLatin1.getChar(other, k);
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 = Character.toLowerCase(c1);
+ c2 = Character.toLowerCase(c2);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+ }
+ }
+ return len1 - len2;
+ }
+
public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Fri Mar 11 11:42:43 2016 -0800
@@ -30,7 +30,7 @@
import static java.lang.invoke.MethodHandleNatives.Constants.*;
import static java.lang.invoke.MethodHandleStatics.*;
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
-import jdk.internal.ref.Cleaner;
+import jdk.internal.ref.CleanerFactory;
/**
* The JVM interface for the method handles package is all here.
@@ -68,10 +68,12 @@
static CallSiteContext make(CallSite cs) {
final CallSiteContext newContext = new CallSiteContext();
- // Cleaner is attached to CallSite instance and it clears native structures allocated for CallSite context.
- // Though the CallSite can become unreachable, its Context is retained by the Cleaner instance (which is
- // referenced from Cleaner class) until cleanup is performed.
- Cleaner.create(cs, newContext);
+ // CallSite instance is tracked by a Cleanable which clears native
+ // structures allocated for CallSite context. Though the CallSite can
+ // become unreachable, its Context is retained by the Cleanable instance
+ // (which is referenced from Cleaner instance which is referenced from
+ // CleanerFactory class) until cleanup is performed.
+ CleanerFactory.cleaner().register(cs, newContext);
return newContext;
}
--- a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java Fri Mar 11 11:42:43 2016 -0800
@@ -91,7 +91,7 @@
* can call with more than 255 slots. This limits the number of static and
* dynamic arguments one can pass to bootstrap method. Since there are potential
* concatenation strategies that use {@code MethodHandle} combinators, we need
- * to reserve a few empty slots on the parameter lists to to capture the
+ * to reserve a few empty slots on the parameter lists to capture the
* temporal results. This is why bootstrap methods in this factory do not accept
* more than 200 argument slots. Users requiring more than 200 argument slots in
* concatenation are expected to split the large concatenation in smaller
--- a/jdk/src/java.base/share/classes/java/lang/ref/Cleaner.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/lang/ref/Cleaner.java Fri Mar 11 11:42:43 2016 -0800
@@ -25,10 +25,11 @@
package java.lang.ref;
+import jdk.internal.ref.CleanerImpl;
+
import java.util.Objects;
import java.util.concurrent.ThreadFactory;
-
-import jdk.internal.ref.CleanerImpl;
+import java.util.function.Function;
/**
* {@code Cleaner} manages a set of object references and corresponding cleaning actions.
@@ -135,7 +136,12 @@
final CleanerImpl impl;
static {
- CleanerImpl.setCleanerImplAccess((Cleaner c) -> c.impl);
+ CleanerImpl.setCleanerImplAccess(new Function<Cleaner, CleanerImpl>() {
+ @Override
+ public CleanerImpl apply(Cleaner cleaner) {
+ return cleaner.impl;
+ }
+ });
}
/**
--- a/jdk/src/java.base/share/classes/java/nio/charset/Charset.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/nio/charset/Charset.java Fri Mar 11 11:42:43 2016 -0800
@@ -44,7 +44,6 @@
import java.util.SortedMap;
import java.util.TreeMap;
import jdk.internal.misc.VM;
-import sun.misc.ASCIICaseInsensitiveComparator;
import sun.nio.cs.StandardCharsets;
import sun.nio.cs.ThreadLocalCoders;
import sun.security.action.GetPropertyAction;
@@ -579,7 +578,7 @@
public SortedMap<String,Charset> run() {
TreeMap<String,Charset> m =
new TreeMap<>(
- ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
+ String.CASE_INSENSITIVE_ORDER);
put(standardProvider.charsets(), m);
CharsetProvider[] ecps = ExtendedProviderHolder.extendedProviders;
for (CharsetProvider ecp :ecps) {
--- a/jdk/src/java.base/share/classes/java/util/Collections.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/util/Collections.java Fri Mar 11 11:42:43 2016 -0800
@@ -2728,7 +2728,7 @@
* Set s2 = m2.keySet(); // Needn't be in synchronized block
* ...
* synchronized (m) { // Synchronizing on m, not m2 or s2!
- * Iterator i = s.iterator(); // Must be in synchronized block
+ * Iterator i = s2.iterator(); // Must be in synchronized block
* while (i.hasNext())
* foo(i.next());
* }
--- a/jdk/src/java.base/share/classes/java/util/jar/Attributes.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/java/util/jar/Attributes.java Fri Mar 11 11:42:43 2016 -0800
@@ -34,9 +34,9 @@
import java.util.Collection;
import java.util.AbstractSet;
import java.util.Iterator;
+import java.util.Locale;
import sun.util.logging.PlatformLogger;
import java.util.Comparator;
-import sun.misc.ASCIICaseInsensitiveComparator;
/**
* The Attributes class maps Manifest attribute names to associated string
@@ -501,7 +501,7 @@
*/
public boolean equals(Object o) {
if (o instanceof Name) {
- Comparator<String> c = ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER;
+ Comparator<String> c = String.CASE_INSENSITIVE_ORDER;
return c.compare(name, ((Name)o).name) == 0;
} else {
return false;
@@ -513,7 +513,7 @@
*/
public int hashCode() {
if (hashCode == -1) {
- hashCode = ASCIICaseInsensitiveComparator.lowerCaseHashCode(name);
+ hashCode = name.toLowerCase(Locale.ROOT).hashCode();
}
return hashCode;
}
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/InnocuousThread.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/InnocuousThread.java Fri Mar 11 11:42:43 2016 -0800
@@ -128,8 +128,12 @@
}
final ThreadGroup root = group;
INNOCUOUSTHREADGROUP = AccessController.doPrivileged(
- (PrivilegedAction<ThreadGroup>) () ->
- { return new ThreadGroup(root, "InnocuousThreadGroup"); });
+ new PrivilegedAction<ThreadGroup>() {
+ @Override
+ public ThreadGroup run() {
+ return new ThreadGroup(root, "InnocuousThreadGroup");
+ }
+ });
} catch (Exception e) {
throw new Error(e);
}
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Fri Mar 11 11:42:43 2016 -0800
@@ -782,6 +782,46 @@
Object expected,
Object x);
+ @HotSpotIntrinsicCandidate
+ public final native Object compareAndExchangeObjectVolatile(Object o, long offset,
+ Object expected,
+ Object x);
+
+ @HotSpotIntrinsicCandidate
+ public final Object compareAndExchangeObjectAcquire(Object o, long offset,
+ Object expected,
+ Object x) {
+ return compareAndExchangeObjectVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final Object compareAndExchangeObjectRelease(Object o, long offset,
+ Object expected,
+ Object x) {
+ return compareAndExchangeObjectVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapObject(Object o, long offset,
+ Object expected,
+ Object x) {
+ return compareAndSwapObject(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapObjectAcquire(Object o, long offset,
+ Object expected,
+ Object x) {
+ return compareAndSwapObject(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapObjectRelease(Object o, long offset,
+ Object expected,
+ Object x) {
+ return compareAndSwapObject(o, offset, expected, x);
+ }
+
/**
* Atomically updates Java variable to {@code x} if it is currently
* holding {@code expected}.
@@ -796,6 +836,46 @@
int expected,
int x);
+ @HotSpotIntrinsicCandidate
+ public final native int compareAndExchangeIntVolatile(Object o, long offset,
+ int expected,
+ int x);
+
+ @HotSpotIntrinsicCandidate
+ public final int compareAndExchangeIntAcquire(Object o, long offset,
+ int expected,
+ int x) {
+ return compareAndExchangeIntVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final int compareAndExchangeIntRelease(Object o, long offset,
+ int expected,
+ int x) {
+ return compareAndExchangeIntVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapInt(Object o, long offset,
+ int expected,
+ int x) {
+ return compareAndSwapInt(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapIntAcquire(Object o, long offset,
+ int expected,
+ int x) {
+ return compareAndSwapInt(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapIntRelease(Object o, long offset,
+ int expected,
+ int x) {
+ return compareAndSwapInt(o, offset, expected, x);
+ }
+
/**
* Atomically updates Java variable to {@code x} if it is currently
* holding {@code expected}.
@@ -810,6 +890,46 @@
long expected,
long x);
+ @HotSpotIntrinsicCandidate
+ public final native long compareAndExchangeLongVolatile(Object o, long offset,
+ long expected,
+ long x);
+
+ @HotSpotIntrinsicCandidate
+ public final long compareAndExchangeLongAcquire(Object o, long offset,
+ long expected,
+ long x) {
+ return compareAndExchangeLongVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final long compareAndExchangeLongRelease(Object o, long offset,
+ long expected,
+ long x) {
+ return compareAndExchangeLongVolatile(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapLong(Object o, long offset,
+ long expected,
+ long x) {
+ return compareAndSwapLong(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapLongAcquire(Object o, long offset,
+ long expected,
+ long x) {
+ return compareAndSwapLong(o, offset, expected, x);
+ }
+
+ @HotSpotIntrinsicCandidate
+ public final boolean weakCompareAndSwapLongRelease(Object o, long offset,
+ long expected,
+ long x) {
+ return compareAndSwapLong(o, offset, expected, x);
+ }
+
/**
* Fetches a reference value from a given Java variable, with volatile
* load semantics. Otherwise identical to {@link #getObject(Object, long)}
@@ -908,6 +1028,224 @@
@HotSpotIntrinsicCandidate
public native void putOrderedLong(Object o, long offset, long x);
+ /** Acquire version of {@link #getObjectVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final Object getObjectAcquire(Object o, long offset) {
+ return getObjectVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getBooleanVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final boolean getBooleanAcquire(Object o, long offset) {
+ return getBooleanVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getByteVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final byte getByteAcquire(Object o, long offset) {
+ return getByteVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getShortVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final short getShortAcquire(Object o, long offset) {
+ return getShortVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getCharVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final char getCharAcquire(Object o, long offset) {
+ return getCharVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getIntVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final int getIntAcquire(Object o, long offset) {
+ return getIntVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getFloatVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final float getFloatAcquire(Object o, long offset) {
+ return getFloatVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getLongVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final long getLongAcquire(Object o, long offset) {
+ return getLongVolatile(o, offset);
+ }
+
+ /** Acquire version of {@link #getDoubleVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final double getDoubleAcquire(Object o, long offset) {
+ return getDoubleVolatile(o, offset);
+ }
+
+ /** Release version of {@link #putObjectVolatile(Object, long, Object)} */
+ @HotSpotIntrinsicCandidate
+ public final void putObjectRelease(Object o, long offset, Object x) {
+ putObjectVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putBooleanVolatile(Object, long, boolean)} */
+ @HotSpotIntrinsicCandidate
+ public final void putBooleanRelease(Object o, long offset, boolean x) {
+ putBooleanVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putByteVolatile(Object, long, byte)} */
+ @HotSpotIntrinsicCandidate
+ public final void putByteRelease(Object o, long offset, byte x) {
+ putByteVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putShortVolatile(Object, long, short)} */
+ @HotSpotIntrinsicCandidate
+ public final void putShortRelease(Object o, long offset, short x) {
+ putShortVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putCharVolatile(Object, long, char)} */
+ @HotSpotIntrinsicCandidate
+ public final void putCharRelease(Object o, long offset, char x) {
+ putCharVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putIntVolatile(Object, long, int)} */
+ @HotSpotIntrinsicCandidate
+ public final void putIntRelease(Object o, long offset, int x) {
+ putIntVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putFloatVolatile(Object, long, float)} */
+ @HotSpotIntrinsicCandidate
+ public final void putFloatRelease(Object o, long offset, float x) {
+ putFloatVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putLongVolatile(Object, long, long)} */
+ @HotSpotIntrinsicCandidate
+ public final void putLongRelease(Object o, long offset, long x) {
+ putLongVolatile(o, offset, x);
+ }
+
+ /** Release version of {@link #putDoubleVolatile(Object, long, double)} */
+ @HotSpotIntrinsicCandidate
+ public final void putDoubleRelease(Object o, long offset, double x) {
+ putDoubleVolatile(o, offset, x);
+ }
+
+ // ------------------------------ Opaque --------------------------------------
+
+ /** Opaque version of {@link #getObjectVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final Object getObjectOpaque(Object o, long offset) {
+ return getObjectVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getBooleanVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final boolean getBooleanOpaque(Object o, long offset) {
+ return getBooleanVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getByteVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final byte getByteOpaque(Object o, long offset) {
+ return getByteVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getShortVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final short getShortOpaque(Object o, long offset) {
+ return getShortVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getCharVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final char getCharOpaque(Object o, long offset) {
+ return getCharVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getIntVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final int getIntOpaque(Object o, long offset) {
+ return getIntVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getFloatVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final float getFloatOpaque(Object o, long offset) {
+ return getFloatVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getLongVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final long getLongOpaque(Object o, long offset) {
+ return getLongVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #getDoubleVolatile(Object, long)} */
+ @HotSpotIntrinsicCandidate
+ public final double getDoubleOpaque(Object o, long offset) {
+ return getDoubleVolatile(o, offset);
+ }
+
+ /** Opaque version of {@link #putObjectVolatile(Object, long, Object)} */
+ @HotSpotIntrinsicCandidate
+ public final void putObjectOpaque(Object o, long offset, Object x) {
+ putObjectVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putBooleanVolatile(Object, long, boolean)} */
+ @HotSpotIntrinsicCandidate
+ public final void putBooleanOpaque(Object o, long offset, boolean x) {
+ putBooleanVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putByteVolatile(Object, long, byte)} */
+ @HotSpotIntrinsicCandidate
+ public final void putByteOpaque(Object o, long offset, byte x) {
+ putByteVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putShortVolatile(Object, long, short)} */
+ @HotSpotIntrinsicCandidate
+ public final void putShortOpaque(Object o, long offset, short x) {
+ putShortVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putCharVolatile(Object, long, char)} */
+ @HotSpotIntrinsicCandidate
+ public final void putCharOpaque(Object o, long offset, char x) {
+ putCharVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putIntVolatile(Object, long, int)} */
+ @HotSpotIntrinsicCandidate
+ public final void putIntOpaque(Object o, long offset, int x) {
+ putIntVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putFloatVolatile(Object, long, float)} */
+ @HotSpotIntrinsicCandidate
+ public final void putFloatOpaque(Object o, long offset, float x) {
+ putFloatVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putLongVolatile(Object, long, long)} */
+ @HotSpotIntrinsicCandidate
+ public final void putLongOpaque(Object o, long offset, long x) {
+ putLongVolatile(o, offset, x);
+ }
+
+ /** Opaque version of {@link #putDoubleVolatile(Object, long, double)} */
+ @HotSpotIntrinsicCandidate
+ public final void putDoubleOpaque(Object o, long offset, double x) {
+ putDoubleVolatile(o, offset, x);
+ }
+
/**
* Unblocks the given thread blocked on {@code park}, or, if it is
* not blocked, causes the subsequent call to {@code park} not to
@@ -1101,6 +1439,23 @@
public native void fullFence();
/**
+ * Ensures that loads before the fence will not be reordered with
+ * loads after the fence.
+ */
+ public final void loadLoadFence() {
+ loadFence();
+ }
+
+ /**
+ * Ensures that stores before the fence will not be reordered with
+ * stores after the fence.
+ */
+ public final void storeStoreFence() {
+ storeFence();
+ }
+
+
+ /**
* Throws IllegalAccessError; for use by the VM for access control
* error support.
* @since 1.8
--- a/jdk/src/java.base/share/classes/jdk/internal/ref/CleanerImpl.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/jdk/internal/ref/CleanerImpl.java Fri Mar 11 11:42:43 2016 -0800
@@ -31,6 +31,7 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import jdk.internal.misc.InnocuousThread;
@@ -39,7 +40,7 @@
* CleanerImpl manages a set of object references and corresponding cleaning actions.
* CleanerImpl provides the functionality of {@link java.lang.ref.Cleaner}.
*/
-public final class CleanerImpl {
+public final class CleanerImpl implements Runnable {
/**
* An object to access the CleanerImpl from a Cleaner; set by Cleaner init.
@@ -103,7 +104,7 @@
}
// schedule a nop cleaning action for the cleaner, so the associated thread
// will continue to run at least until the cleaner is reclaimable.
- new PhantomCleanableRef(cleaner, cleaner, () -> {});
+ new CleanerCleanable(cleaner);
if (threadFactory == null) {
threadFactory = CleanerImpl.InnocuousThreadFactory.factory();
@@ -112,7 +113,7 @@
// now that there's at least one cleaning action, for the cleaner,
// we can start the associated thread, which runs until
// all cleaning actions have been run.
- Thread thread = threadFactory.newThread(this::run);
+ Thread thread = threadFactory.newThread(this);
thread.setDaemon(true);
thread.start();
}
@@ -128,7 +129,8 @@
* If the thread is a ManagedLocalsThread, the threadlocals
* are erased before each cleanup
*/
- private void run() {
+ @Override
+ public void run() {
Thread t = Thread.currentThread();
InnocuousThread mlThread = (t instanceof InnocuousThread)
? (InnocuousThread) t
@@ -147,10 +149,9 @@
if (ref != null) {
ref.clean();
}
- } catch (InterruptedException i) {
- continue; // ignore the interruption
} catch (Throwable e) {
// ignore exceptions from the cleanup action
+ // (including interruption of cleanup thread)
}
}
}
@@ -320,14 +321,32 @@
return factory;
}
+ final AtomicInteger cleanerThreadNumber = new AtomicInteger();
+
public Thread newThread(Runnable r) {
- return AccessController.doPrivileged((PrivilegedAction<Thread>) () -> {
- Thread t = new InnocuousThread(r);
- t.setPriority(Thread.MAX_PRIORITY - 2);
- t.setName("Cleaner-" + t.getId());
- return t;
+ return AccessController.doPrivileged(new PrivilegedAction<Thread>() {
+ @Override
+ public Thread run() {
+ Thread t = new InnocuousThread(r);
+ t.setPriority(Thread.MAX_PRIORITY - 2);
+ t.setName("Cleaner-" + cleanerThreadNumber.getAndIncrement());
+ return t;
+ }
});
}
}
+ /**
+ * A PhantomCleanable implementation for tracking the Cleaner itself.
+ */
+ static final class CleanerCleanable extends PhantomCleanable<Cleaner> {
+ CleanerCleanable(Cleaner cleaner) {
+ super(cleaner, cleaner);
+ }
+
+ @Override
+ protected void performCleanup() {
+ // no action
+ }
+ }
}
--- a/jdk/src/java.base/share/classes/sun/misc/ASCIICaseInsensitiveComparator.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.util.Comparator;
-
-/** Implements a locale and case insensitive comparator suitable for
- strings that are known to only contain ASCII characters. Some
- tables internal to the JDK contain only ASCII data and are using
- the "generalized" java.lang.String case-insensitive comparator
- which converts each character to both upper and lower case. */
-
-public class ASCIICaseInsensitiveComparator implements Comparator<String> {
- public static final Comparator<String> CASE_INSENSITIVE_ORDER =
- new ASCIICaseInsensitiveComparator();
-
- public int compare(String s1, String s2) {
- int n1=s1.length(), n2=s2.length();
- int minLen = n1 < n2 ? n1 : n2;
- for (int i=0; i < minLen; i++) {
- char c1 = s1.charAt(i);
- char c2 = s2.charAt(i);
- assert c1 <= '\u007F' && c2 <= '\u007F';
- if (c1 != c2) {
- c1 = (char)toLower(c1);
- c2 = (char)toLower(c2);
- if (c1 != c2) {
- return c1 - c2;
- }
- }
- }
- return n1 - n2;
- }
-
- /**
- * A case insensitive hash code method to go with the case insensitive
- * compare() method.
- *
- * Returns a hash code for this ASCII string as if it were lower case.
- *
- * returns same answer as:<p>
- * <code>s.toLowerCase(Locale.US).hashCode();</code><p>
- * but does not allocate memory (it does NOT have the special
- * case Turkish rules).
- *
- * @param s a String to compute the hashcode on.
- * @return a hash code value for this object.
- */
- public static int lowerCaseHashCode(String s) {
- int h = 0;
- int len = s.length();
-
- for (int i = 0; i < len; i++) {
- h = 31*h + toLower(s.charAt(i));
- }
-
- return h;
- }
-
- /* If java.util.regex.ASCII ever becomes public or sun.*, use its code instead:*/
- static boolean isLower(int ch) {
- return ((ch-'a')|('z'-ch)) >= 0;
- }
-
- static boolean isUpper(int ch) {
- return ((ch-'A')|('Z'-ch)) >= 0;
- }
-
- static int toLower(int ch) {
- return isUpper(ch) ? (ch + 0x20) : ch;
- }
-
- static int toUpper(int ch) {
- return isLower(ch) ? (ch - 0x20) : ch;
- }
-}
--- a/jdk/src/java.base/share/classes/sun/nio/ch/IOVecWrapper.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/IOVecWrapper.java Fri Mar 11 11:42:43 2016 -0800
@@ -26,7 +26,7 @@
package sun.nio.ch;
import java.nio.ByteBuffer;
-import jdk.internal.ref.Cleaner;
+import jdk.internal.ref.CleanerFactory;
/**
@@ -101,7 +101,7 @@
}
if (wrapper == null) {
wrapper = new IOVecWrapper(size);
- Cleaner.create(wrapper, new Deallocator(wrapper.vecArray));
+ CleanerFactory.cleaner().register(wrapper, new Deallocator(wrapper.vecArray));
cached.set(wrapper);
}
return wrapper;
--- a/jdk/src/java.base/share/classes/sun/nio/ch/Util.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/Util.java Fri Mar 11 11:42:43 2016 -0800
@@ -33,7 +33,6 @@
import java.security.PrivilegedAction;
import java.util.*;
import jdk.internal.misc.Unsafe;
-import jdk.internal.ref.Cleaner;
import sun.security.action.GetPropertyAction;
--- a/jdk/src/java.base/share/classes/sun/nio/fs/NativeBuffer.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/nio/fs/NativeBuffer.java Fri Mar 11 11:42:43 2016 -0800
@@ -71,8 +71,8 @@
return size;
}
- Cleaner cleaner() {
- return cleaner;
+ void free() {
+ cleaner.clean();
}
// not synchronized; only safe for use by thread-local caches
--- a/jdk/src/java.base/share/classes/sun/nio/fs/NativeBuffers.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/nio/fs/NativeBuffers.java Fri Mar 11 11:42:43 2016 -0800
@@ -107,14 +107,14 @@
for (int i=0; i<TEMP_BUF_POOL_SIZE; i++) {
NativeBuffer existing = buffers[i];
if (existing.size() < buffer.size()) {
- existing.cleaner().clean();
+ existing.free();
buffers[i] = buffer;
return;
}
}
// free it
- buffer.cleaner().clean();
+ buffer.free();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Fri Mar 11 11:42:43 2016 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -700,7 +700,7 @@
* OCSP response data is provided.
*/
CertificateStatus(StatusRequestType type, X509Certificate[] chain,
- Map<X509Certificate, byte[]> responses) throws SSLException {
+ Map<X509Certificate, byte[]> responses) {
statusType = type;
encodedResponsesLen = 0;
encodedResponses = new ArrayList<>(chain.length);
@@ -715,7 +715,7 @@
encodedResponses.add(respDER);
encodedResponsesLen = 3 + respDER.length;
} else {
- throw new SSLHandshakeException("Zero-length or null " +
+ throw new IllegalArgumentException("Zero-length or null " +
"OCSP Response");
}
} else if (statusType == StatusRequestType.OCSP_MULTI) {
@@ -732,8 +732,8 @@
}
}
} else {
- throw new SSLHandshakeException("Unsupported StatusResponseType: " +
- statusType);
+ throw new IllegalArgumentException(
+ "Unsupported StatusResponseType: " + statusType);
}
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Fri Mar 11 11:42:43 2016 -0800
@@ -36,7 +36,6 @@
import java.math.BigInteger;
import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.*;
import sun.security.action.GetLongAction;
@@ -67,7 +66,6 @@
// our authentication info
private X509Certificate[] certs;
- private Map<X509Certificate, byte[]> responseMap;
private PrivateKey privateKey;
private Object serviceCreds;
@@ -118,7 +116,6 @@
LegacyAlgorithmConstraints.PROPERTY_TLS_LEGACY_ALGS,
new SSLAlgorithmDecomposer());
- private boolean staplingActive = false;
private long statusRespTimeout;
static {
@@ -578,16 +575,6 @@
}
}
- // Check if the client has asserted the status_request[_v2] extension(s)
- CertStatusReqExtension statReqExt = (CertStatusReqExtension)
- mesg.extensions.get(ExtensionType.EXT_STATUS_REQUEST);
- CertStatusReqListV2Extension statReqExtV2 =
- (CertStatusReqListV2Extension)mesg.extensions.get(
- ExtensionType.EXT_STATUS_REQUEST_V2);
- // Keep stapling active if at least one of the extensions has been set
- staplingActive = sslContext.isStaplingEnabled(false) &&
- (statReqExt != null || statReqExtV2 != null);
-
/*
* FIRST, construct the ServerHello using the options and priorities
* from the ClientHello. Update the (pending) cipher spec as we do
@@ -883,79 +870,17 @@
m1.extensions.add(maxFragLenExt);
}
- StatusRequestType statReqType = null;
- StatusRequest statReqData = null;
- if (staplingActive && !resumingSession) {
- ExtensionType statusRespExt = ExtensionType.EXT_STATUS_REQUEST;
-
- // Determine which type of stapling we are doing and assert the
- // proper extension in the server hello.
- // Favor status_request_v2 over status_request and ocsp_multi
- // over ocsp.
- // If multiple ocsp or ocsp_multi types exist, select the first
- // instance of a given type
- if (statReqExtV2 != null) { // RFC 6961 stapling
- statusRespExt = ExtensionType.EXT_STATUS_REQUEST_V2;
- List<CertStatusReqItemV2> reqItems =
- statReqExtV2.getRequestItems();
- int ocspIdx = -1;
- int ocspMultiIdx = -1;
- for (int pos = 0; pos < reqItems.size(); pos++) {
- CertStatusReqItemV2 item = reqItems.get(pos);
- if (ocspIdx < 0 && item.getType() ==
- StatusRequestType.OCSP) {
- ocspIdx = pos;
- } else if (ocspMultiIdx < 0 && item.getType() ==
- StatusRequestType.OCSP_MULTI) {
- ocspMultiIdx = pos;
- }
- }
- if (ocspMultiIdx >= 0) {
- statReqType = reqItems.get(ocspMultiIdx).getType();
- statReqData = reqItems.get(ocspMultiIdx).getRequest();
- } else if (ocspIdx >= 0) {
- statReqType = reqItems.get(ocspIdx).getType();
- statReqData = reqItems.get(ocspIdx).getRequest();
- } else {
- // Some unknown type. We will not do stapling for
- // this connection since we cannot understand the
- // requested type.
- staplingActive = false;
- }
- } else { // RFC 6066 stapling
- statReqType = StatusRequestType.OCSP;
- statReqData = statReqExt.getRequest();
- }
-
- if (statReqType != null && statReqData != null) {
- StatusResponseManager statRespMgr =
- sslContext.getStatusResponseManager();
- if (statRespMgr != null) {
- responseMap = statRespMgr.get(statReqType, statReqData,
- certs, statusRespTimeout, TimeUnit.MILLISECONDS);
- if (!responseMap.isEmpty()) {
- // We now can safely assert status_request[_v2] in our
- // ServerHello, and know for certain that we can provide
- // responses back to this client for this connection.
- if (statusRespExt == ExtensionType.EXT_STATUS_REQUEST) {
- m1.extensions.add(new CertStatusReqExtension());
- } else if (statusRespExt ==
- ExtensionType.EXT_STATUS_REQUEST_V2) {
- m1.extensions.add(
- new CertStatusReqListV2Extension());
- }
- }
- } else {
- // This should not happen if stapling is active, but
- // if lazy initialization of the StatusResponseManager
- // doesn't occur we should turn off stapling.
- if (debug != null && Debug.isOn("handshake")) {
- System.out.println("Warning: lazy initialization " +
- "of the StatusResponseManager failed. " +
- "Stapling has been disabled.");
- staplingActive = false;
- }
- }
+ StaplingParameters staplingParams = processStapling(mesg);
+ if (staplingParams != null) {
+ // We now can safely assert status_request[_v2] in our
+ // ServerHello, and know for certain that we can provide
+ // responses back to this client for this connection.
+ if (staplingParams.statusRespExt ==
+ ExtensionType.EXT_STATUS_REQUEST) {
+ m1.extensions.add(new CertStatusReqExtension());
+ } else if (staplingParams.statusRespExt ==
+ ExtensionType.EXT_STATUS_REQUEST_V2) {
+ m1.extensions.add(new CertStatusReqListV2Extension());
}
}
@@ -1031,24 +956,15 @@
* supports status stapling and there is at least one response to
* return to the client.
*/
- if (staplingActive && !responseMap.isEmpty()) {
- try {
- CertificateStatus csMsg = new CertificateStatus(statReqType,
- certs, responseMap);
- if (debug != null && Debug.isOn("handshake")) {
- csMsg.print(System.out);
- }
- csMsg.write(output);
- handshakeState.update(csMsg, resumingSession);
- responseMap = null;
- } catch (SSLException ssle) {
- // We don't want the exception to be fatal, we just won't
- // send the message if we fail on construction.
- if (debug != null && Debug.isOn("handshake")) {
- System.out.println("Failed during CertificateStatus " +
- "construction: " + ssle);
- }
+ if (staplingParams != null) {
+ CertificateStatus csMsg = new CertificateStatus(
+ staplingParams.statReqType, certs,
+ staplingParams.responseMap);
+ if (debug != null && Debug.isOn("handshake")) {
+ csMsg.print(System.out);
}
+ csMsg.write(output);
+ handshakeState.update(csMsg, resumingSession);
}
/*
@@ -2078,4 +1994,121 @@
session.setPeerCertificates(peerCerts);
}
+
+ private StaplingParameters processStapling(ClientHello mesg) {
+ StaplingParameters params = null;
+ ExtensionType ext;
+ StatusRequestType type = null;
+ StatusRequest req = null;
+ Map<X509Certificate, byte[]> responses;
+
+ // If this feature has not been enabled, then no more processing
+ // is necessary. Also we will only staple if we're doing a full
+ // handshake.
+ if (!sslContext.isStaplingEnabled(false) || resumingSession) {
+ return null;
+ }
+
+ // Check if the client has asserted the status_request[_v2] extension(s)
+ CertStatusReqExtension statReqExt = (CertStatusReqExtension)
+ mesg.extensions.get(ExtensionType.EXT_STATUS_REQUEST);
+ CertStatusReqListV2Extension statReqExtV2 =
+ (CertStatusReqListV2Extension)mesg.extensions.get(
+ ExtensionType.EXT_STATUS_REQUEST_V2);
+ // Keep processing only if either status_request or status_request_v2
+ // has been sent in the ClientHello.
+ if (statReqExt == null && statReqExtV2 == null) {
+ return null;
+ }
+
+ // Determine which type of stapling we are doing and assert the
+ // proper extension in the server hello.
+ // Favor status_request_v2 over status_request and ocsp_multi
+ // over ocsp.
+ // If multiple ocsp or ocsp_multi types exist, select the first
+ // instance of a given type
+ ext = ExtensionType.EXT_STATUS_REQUEST;
+ if (statReqExtV2 != null) { // RFC 6961 stapling
+ ext = ExtensionType.EXT_STATUS_REQUEST_V2;
+ List<CertStatusReqItemV2> reqItems =
+ statReqExtV2.getRequestItems();
+ int ocspIdx = -1;
+ int ocspMultiIdx = -1;
+ for (int pos = 0; pos < reqItems.size(); pos++) {
+ CertStatusReqItemV2 item = reqItems.get(pos);
+ if (ocspIdx < 0 && item.getType() ==
+ StatusRequestType.OCSP) {
+ ocspIdx = pos;
+ } else if (ocspMultiIdx < 0 && item.getType() ==
+ StatusRequestType.OCSP_MULTI) {
+ ocspMultiIdx = pos;
+ }
+ }
+ if (ocspMultiIdx >= 0) {
+ type = reqItems.get(ocspMultiIdx).getType();
+ req = reqItems.get(ocspMultiIdx).getRequest();
+ } else if (ocspIdx >= 0) {
+ type = reqItems.get(ocspIdx).getType();
+ req = reqItems.get(ocspIdx).getRequest();
+ }
+ } else { // RFC 6066 stapling
+ type = StatusRequestType.OCSP;
+ req = statReqExt.getRequest();
+ }
+
+ // If, after walking through the extensions we were unable to
+ // find a suitable StatusRequest, then stapling is disabled.
+ // Both statReqType and statReqData must have been set to continue.
+ if (type == null || req == null) {
+ return null;
+ }
+
+ // Get the OCSP responses from the StatusResponseManager
+ StatusResponseManager statRespMgr =
+ sslContext.getStatusResponseManager();
+ if (statRespMgr != null) {
+ responses = statRespMgr.get(type, req, certs, statusRespTimeout,
+ TimeUnit.MILLISECONDS);
+ if (!responses.isEmpty()) {
+ // If this RFC 6066-style stapling (SSL cert only) then the
+ // response cannot be zero length
+ if (type == StatusRequestType.OCSP) {
+ byte[] respDER = responses.get(certs[0]);
+ if (respDER == null || respDER.length <= 0) {
+ return null;
+ }
+ }
+ params = new StaplingParameters(ext, type, req, responses);
+ }
+ } else {
+ // This should not happen, but if lazy initialization of the
+ // StatusResponseManager doesn't occur we should turn off stapling.
+ if (debug != null && Debug.isOn("handshake")) {
+ System.out.println("Warning: lazy initialization " +
+ "of the StatusResponseManager failed. " +
+ "Stapling has been disabled.");
+ }
+ }
+
+ return params;
+ }
+
+ /**
+ * Inner class used to hold stapling parameters needed by the handshaker
+ * when stapling is active.
+ */
+ private class StaplingParameters {
+ private final ExtensionType statusRespExt;
+ private final StatusRequestType statReqType;
+ private final StatusRequest statReqData;
+ private final Map<X509Certificate, byte[]> responseMap;
+
+ StaplingParameters(ExtensionType ext, StatusRequestType type,
+ StatusRequest req, Map<X509Certificate, byte[]> responses) {
+ statusRespExt = ext;
+ statReqType = type;
+ statReqData = req;
+ responseMap = responses;
+ }
+ }
}
--- a/jdk/src/java.base/share/native/include/jni.h Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/share/native/include/jni.h Fri Mar 11 11:42:43 2016 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -1952,6 +1952,7 @@
#define JNI_VERSION_1_4 0x00010004
#define JNI_VERSION_1_6 0x00010006
#define JNI_VERSION_1_8 0x00010008
+#define JNI_VERSION_9 0x00090000
#ifdef __cplusplus
} /* extern "C" */
--- a/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsWatchService.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsWatchService.java Fri Mar 11 11:42:43 2016 -0800
@@ -463,7 +463,7 @@
}
CloseHandle(key.handle());
closeAttachedEvent(key.overlappedAddress());
- key.buffer().cleaner().clean();
+ key.buffer().free();
}
/**
--- a/jdk/src/java.base/windows/native/libjava/java_props_md.c Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.base/windows/native/libjava/java_props_md.c Fri Mar 11 11:42:43 2016 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -469,7 +469,9 @@
* Windows Server 2008 R2 6 1 (!VER_NT_WORKSTATION)
* Windows 8 6 2 (VER_NT_WORKSTATION)
* Windows Server 2012 6 2 (!VER_NT_WORKSTATION)
+ * Windows Server 2012 R2 6 3 (!VER_NT_WORKSTATION)
* Windows 10 10 0 (VER_NT_WORKSTATION)
+ * Windows Server 2016 10 0 (!VER_NT_WORKSTATION)
*
* This mapping will presumably be augmented as new Windows
* versions are released.
@@ -543,6 +545,7 @@
}
} else {
switch (minorVersion) {
+ case 0: sprops.os_name = "Windows Server 2016"; break;
default: sprops.os_name = "Windows NT (unknown)";
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/macosx/native/libosx/CFileManager.m Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2011, 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.
+ */
+
+#import "com_apple_eio_FileManager.h"
+
+#import <Cocoa/Cocoa.h>
+#import <JavaNativeFoundation/JavaNativeFoundation.h>
+
+#import "ThreadUtilities.h"
+
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _setFileTypeAndCreator
+ * Signature: (Ljava/lang/String;II)V
+ */
+JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileTypeAndCreator
+(JNIEnv *env, jclass clz, jstring javaFilename, jint type, jint creator)
+{
+JNF_COCOA_ENTER(env);
+ NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
+ NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt:type], NSFileHFSTypeCode,
+ [NSNumber numberWithInt:creator], NSFileHFSCreatorCode, nil];
+ [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _setFileType
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileType
+(JNIEnv *env, jclass ckz, jstring javaFilename, jint type)
+{
+JNF_COCOA_ENTER(env);
+ NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
+ NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:type] forKey:NSFileHFSTypeCode];
+ [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _setFileCreator
+ * Signature: (Ljava/lang/String;I)V
+ */
+JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileCreator
+(JNIEnv *env, jclass clz, jstring javaFilename, jint creator)
+{
+JNF_COCOA_ENTER(env);
+ NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
+ NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:creator] forKey:NSFileHFSCreatorCode];
+ [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _getFileType
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileType
+(JNIEnv *env, jclass clz, jstring javaFilename)
+{
+ jint type = 0;
+JNF_COCOA_ENTER(env);
+ NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
+ NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
+ NSNumber *val = [attributes objectForKey:NSFileHFSTypeCode];
+ type = [val intValue];
+JNF_COCOA_EXIT(env);
+ return type;
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _getFileCreator
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileCreator
+ (JNIEnv *env, jclass clz, jstring javaFilename)
+{
+ jint creator = 0;
+JNF_COCOA_ENTER(env);
+ NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
+ NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
+ NSNumber *val = [attributes objectForKey:NSFileHFSCreatorCode];
+ creator = [val intValue];
+JNF_COCOA_EXIT(env);
+ return creator;
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _findFolder
+ * Signature: (SIZ)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager__1findFolder__SIZ
+(JNIEnv *env, jclass clz, jshort domain, jint folderType, jboolean createIfNeeded)
+{
+ jstring filename = nil;
+JNF_COCOA_ENTER(env);
+
+ FSRef foundRef;
+ createIfNeeded = createIfNeeded || (folderType == kTemporaryFolderType) || (folderType == kChewableItemsFolderType);
+ if (FSFindFolder((SInt16)domain, (OSType)folderType, (Boolean)createIfNeeded, &foundRef) == noErr) {
+ char path[PATH_MAX];
+ if (FSRefMakePath(&foundRef, (UInt8 *)path, sizeof(path)) == noErr) {
+ NSString *filenameString = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:path length:strlen(path)];
+ filename = JNFNormalizedJavaStringForPath(env, filenameString);
+ }
+ }
+
+JNF_COCOA_EXIT(env);
+ return filename;
+}
+
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: _openURL
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1openURL
+(JNIEnv *env, jclass clz, jstring urlString)
+{
+JNF_COCOA_ENTER(env);
+
+ NSURL *url = [NSURL URLWithString:JNFNormalizedNSStringForPath(env, urlString)];
+
+ // Radar 3208005: Run this on the main thread; file:// style URLs will hang otherwise.
+ [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
+ [[NSWorkspace sharedWorkspace] openURL:url];
+ }];
+
+JNF_COCOA_EXIT(env);
+}
+
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: getNativeResourceFromBundle
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativeResourceFromBundle
+(JNIEnv *env, jclass clz, jstring javaResourceName, jstring javaSubDirName, jstring javaTypeName)
+{
+ jstring filename = NULL;
+JNF_COCOA_ENTER(env);
+
+ NSString *resourceName = JNFNormalizedNSStringForPath(env, javaResourceName);
+ NSString *subDirectory = JNFNormalizedNSStringForPath(env, javaSubDirName);
+ NSString *typeName = JNFNormalizedNSStringForPath(env, javaTypeName);
+
+ NSString *path = [[NSBundle mainBundle] pathForResource:resourceName
+ ofType:typeName
+ inDirectory:subDirectory];
+
+ filename = JNFNormalizedJavaStringForPath(env, path);
+
+JNF_COCOA_EXIT(env);
+ return filename;
+}
+
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: getNativePathToApplicationBundle
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativePathToApplicationBundle
+(JNIEnv *env, jclass clazz)
+{
+ jstring filename = nil;
+JNF_COCOA_ENTER(env);
+
+ NSBundle *mainBundle = [NSBundle mainBundle];
+ filename = JNFNormalizedJavaStringForPath(env, [mainBundle bundlePath]);
+
+JNF_COCOA_EXIT(env);
+ return filename;
+}
+
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: __moveToTrash
+ * Signature: (Ljava/lang/String;)V
+ */
+
+JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1moveToTrash
+(JNIEnv *env, jclass clz, jstring fileName)
+{
+ __block BOOL returnValue = NO;
+JNF_COCOA_ENTER(env);
+
+ NSString * path = JNFNormalizedNSStringForPath(env, fileName);
+ NSURL *url = [NSURL fileURLWithPath:path];
+ [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
+
+ returnValue = [[NSFileManager defaultManager] trashItemAtURL:url
+ resultingItemURL:nil
+ error:nil];
+ }];
+
+JNF_COCOA_EXIT(env);
+
+ return returnValue ? JNI_TRUE: JNI_FALSE;
+}
+
+/*
+ * Class: com_apple_eio_FileManager
+ * Method: __revealInFinder
+ * Signature: (Ljava/lang/String;)V
+ */
+
+JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1revealInFinder
+(JNIEnv *env, jclass clz, jstring url)
+{
+ __block jboolean returnValue = JNI_FALSE;
+JNF_COCOA_ENTER(env);
+
+ NSString *path = JNFNormalizedNSStringForPath(env, url);
+ [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
+ returnValue = [[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:@""];
+ }];
+
+JNF_COCOA_EXIT(env);
+
+ return returnValue;
+}
--- a/jdk/src/java.httpclient/share/classes/java/net/http/Exchange.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/Exchange.java Fri Mar 11 11:42:43 2016 -0800
@@ -214,21 +214,21 @@
.sendHeadersAsync()
.thenCompose((Void v) -> {
// send body and get response at same time
- exchImpl.sendBodyAsync();
- return exchImpl.getResponseAsync(null);
+ return exchImpl.sendBodyAsync()
+ .thenCompose(exchImpl::getResponseAsync);
})
- .thenCompose((HttpResponseImpl r1) -> {
- int rcode = r1.statusCode();
- CompletableFuture<HttpResponseImpl> cf =
- checkForUpgradeAsync(r1, exchImpl);
- if (cf != null) {
- return cf;
- } else {
- Exchange.this.response = r1;
- logResponse(r1);
- return CompletableFuture.completedFuture(r1);
- }
- })
+ .thenCompose((HttpResponseImpl r1) -> {
+ int rcode = r1.statusCode();
+ CompletableFuture<HttpResponseImpl> cf =
+ checkForUpgradeAsync(r1, exchImpl);
+ if (cf != null) {
+ return cf;
+ } else {
+ Exchange.this.response = r1;
+ logResponse(r1);
+ return CompletableFuture.completedFuture(r1);
+ }
+ })
.thenApply((HttpResponseImpl response) -> {
this.response = response;
logResponse(response);
--- a/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java Fri Mar 11 11:42:43 2016 -0800
@@ -30,19 +30,17 @@
import java.net.URI;
import static java.net.http.Utils.BUFSIZE;
import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import static java.nio.channels.SelectionKey.OP_CONNECT;
import static java.nio.channels.SelectionKey.OP_READ;
import static java.nio.channels.SelectionKey.OP_WRITE;
import java.nio.channels.Selector;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Stream;
import java.util.concurrent.ExecutorService;
import java.security.NoSuchAlgorithmException;
-import java.util.ListIterator;
-import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import javax.net.ssl.SSLContext;
@@ -72,12 +70,6 @@
private static final ThreadFactory defaultFactory = Executors.defaultThreadFactory();
private final LinkedList<TimeoutEvent> timeouts;
- //@Override
- void debugPrint() {
- selmgr.debugPrint();
- client2.debugPrint();
- }
-
public static HttpClientImpl create(HttpClientBuilderImpl builder) {
HttpClientImpl impl = new HttpClientImpl(builder);
impl.start();
@@ -173,19 +165,15 @@
// Main loop for this client's selector
class SelectorManager extends Thread {
-
final Selector selector;
boolean closed;
final List<AsyncEvent> readyList;
final List<AsyncEvent> registrations;
- List<AsyncEvent> debugList;
-
SelectorManager() throws IOException {
readyList = new LinkedList<>();
registrations = new LinkedList<>();
- debugList = new LinkedList<>();
selector = Selector.open();
}
@@ -216,13 +204,6 @@
return c;
}
- synchronized void debugPrint() {
- System.err.println("Selecting on:");
- for (AsyncEvent e : debugList) {
- System.err.println(opvals(e.interestOps()));
- }
- }
-
String opvals(int i) {
StringBuilder sb = new StringBuilder();
if ((i & OP_READ) != 0)
@@ -239,14 +220,18 @@
try {
while (true) {
synchronized (this) {
- debugList = copy(registrations);
for (AsyncEvent exchange : registrations) {
SelectableChannel c = exchange.channel();
try {
c.configureBlocking(false);
- c.register(selector,
- exchange.interestOps(),
- exchange);
+ SelectionKey key = c.keyFor(selector);
+ SelectorAttachment sa;
+ if (key == null) {
+ sa = new SelectorAttachment(c, selector);
+ } else {
+ sa = (SelectorAttachment)key.attachment();
+ }
+ sa.register(exchange);
} catch (IOException e) {
Log.logError("HttpClientImpl: " + e);
c.close();
@@ -266,11 +251,10 @@
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
- if (key.isReadable() || key.isConnectable() || key.isWritable()) {
- key.cancel();
- AsyncEvent exchange = (AsyncEvent) key.attachment();
- readyList.add(exchange);
- }
+ SelectorAttachment sa = (SelectorAttachment)key.attachment();
+ int eventsOccurred = key.readyOps();
+ sa.events(eventsOccurred).forEach(readyList::add);
+ sa.resetInterestOps(eventsOccurred);
}
selector.selectNow(); // complete cancellation
selector.selectedKeys().clear();
@@ -306,6 +290,80 @@
}
/**
+ * Tracks multiple user level registrations associated with one NIO
+ * registration (SelectionKey). In this implementation, registrations
+ * are one-off and when an event is posted the registration is cancelled
+ * until explicitly registered again.
+ *
+ * <p> No external synchronization required as this class is only used
+ * by the SelectorManager thread. One of these objects required per
+ * connection.
+ */
+ private static class SelectorAttachment {
+ private final SelectableChannel chan;
+ private final Selector selector;
+ private final ArrayList<AsyncEvent> pending;
+ private int interestops;
+
+ SelectorAttachment(SelectableChannel chan, Selector selector) {
+ this.pending = new ArrayList<>();
+ this.chan = chan;
+ this.selector = selector;
+ }
+
+ void register(AsyncEvent e) throws ClosedChannelException {
+ int newops = e.interestOps();
+ boolean reRegister = (interestops & newops) != newops;
+ interestops |= newops;
+ pending.add(e);
+ if (reRegister) {
+ // first time registration happens here also
+ chan.register(selector, interestops, this);
+ }
+ }
+
+ int interestOps() {
+ return interestops;
+ }
+
+ /**
+ * Returns a Stream<AsyncEvents> containing only events that are
+ * registered with the given {@code interestop}.
+ */
+ Stream<AsyncEvent> events(int interestop) {
+ return pending.stream()
+ .filter(ev -> (ev.interestOps() & interestop) != 0);
+ }
+
+ /**
+ * Removes any events with the given {@code interestop}, and if no
+ * events remaining, cancels the associated SelectionKey.
+ */
+ void resetInterestOps(int interestop) {
+ int newops = 0;
+
+ Iterator<AsyncEvent> itr = pending.iterator();
+ while (itr.hasNext()) {
+ AsyncEvent event = itr.next();
+ int evops = event.interestOps();
+ if ((evops & interestop) != 0) {
+ itr.remove();
+ } else {
+ newops |= evops;
+ }
+ }
+
+ interestops = newops;
+ SelectionKey key = chan.keyFor(selector);
+ if (newops == 0) {
+ key.cancel();
+ } else {
+ key.interestOps(newops);
+ }
+ }
+ }
+
+ /**
* Creates a HttpRequest associated with this group.
*
* @throws IllegalStateException if the group has been stopped
@@ -425,18 +483,9 @@
}
}
iter.add(event);
- //debugPrintList("register");
selmgr.wakeupSelector();
}
- void debugPrintList(String s) {
- System.err.printf("%s: {", s);
- for (TimeoutEvent e : timeouts) {
- System.err.printf("(%d,%d) ", e.delta, e.timeval);
- }
- System.err.println("}");
- }
-
synchronized void signalTimeouts(long then) {
if (timeouts.isEmpty()) {
return;
@@ -462,7 +511,6 @@
break;
}
}
- //debugPrintList("signalTimeouts");
}
synchronized void cancelTimer(TimeoutEvent event) {
--- a/jdk/src/java.naming/share/classes/javax/naming/CompoundName.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/java.naming/share/classes/javax/naming/CompoundName.java Fri Mar 11 11:42:43 2016 -0800
@@ -82,7 +82,7 @@
* attribute-value-assertions when specifying multiple attribute/value
* pairs. (e.g. "," in age=65,gender=male).
* <dt>jndi.syntax.separator.typeval
- * <dd>If present, specifies the string that separators attribute
+ * <dd>If present, specifies the string that separates attribute
* from value (e.g. "=" in "age=65")
*</dl>
* These properties are interpreted according to the following rules:
--- a/jdk/src/jdk.charsets/share/classes/sun/nio/cs/ext/AbstractCharsetProvider.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/src/jdk.charsets/share/classes/sun/nio/cs/ext/AbstractCharsetProvider.java Fri Mar 11 11:42:43 2016 -0800
@@ -33,7 +33,6 @@
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
-import sun.misc.ASCIICaseInsensitiveComparator;
/**
@@ -49,22 +48,22 @@
/* Maps canonical names to class names
*/
private Map<String,String> classMap
- = new TreeMap<>(ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
+ = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
/* Maps alias names to canonical names
*/
private Map<String,String> aliasMap
- = new TreeMap<>(ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
+ = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
/* Maps canonical names to alias-name arrays
*/
private Map<String,String[]> aliasNameMap
- = new TreeMap<>(ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
+ = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
/* Maps canonical names to soft references that hold cached instances
*/
private Map<String,SoftReference<Charset>> cache
- = new TreeMap<>(ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
+ = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private String packagePrefix;
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/Dispatch.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-import java.util.concurrent.*;
-
-/**
- * Factory for {@link Executor}s and {@link ExecutorService}s backed by
- * libdispatch.
- *
- * Access is controlled through the Dispatch.getInstance() method, because
- * performed tasks occur on threads owned by libdispatch. These threads are
- * not owned by any particular AppContext or have any specific context
- * classloader installed.
- *
- * @since Java for Mac OS X 10.6 Update 2
- */
-public final class Dispatch {
- /**
- * The priorities of the three default asynchronous queues.
- */
- public enum Priority {
- LOW(-2), NORMAL(0), HIGH(2); // values from <dispatch/queue.h>
-
- final int nativePriority;
- Priority(final int nativePriority) { this.nativePriority = nativePriority; }
- };
-
- final static Dispatch instance = new Dispatch();
-
- /**
- * Factory method returns an instnace of Dispatch if supported by the
- * underlying operating system, and if the caller's security manager
- * permits "canInvokeInSystemThreadGroup".
- *
- * @return a factory instance of Dispatch, or null if not available
- */
- public static Dispatch getInstance() {
- checkSecurity();
- if (!LibDispatchNative.nativeIsDispatchSupported()) return null;
-
- return instance;
- }
-
- private static void checkSecurity() {
- final SecurityManager security = System.getSecurityManager();
- if (security != null) security.checkPermission(new RuntimePermission("canInvokeInSystemThreadGroup"));
- }
-
- private Dispatch() { }
-
- /**
- * Creates an {@link Executor} that performs tasks asynchronously. The {@link Executor}
- * cannot be shutdown, and enqueued {@link Runnable}s cannot be canceled. Passing null
- * returns the {@link Priority.NORMAL} {@link Executor}.
- *
- * @param priority - the priority of the returned {@link Executor}
- * @return an asynchronous {@link Executor}
- */
- public Executor getAsyncExecutor(Priority priority) {
- if (priority == null) priority = Priority.NORMAL;
- final long nativeQueue = LibDispatchNative.nativeCreateConcurrentQueue(priority.nativePriority);
- if (nativeQueue == 0L) return null;
- return new LibDispatchConcurrentQueue(nativeQueue);
- }
-
- int queueIndex = 0;
- /**
- * Creates an {@link ExecutorService} that performs tasks synchronously in FIFO order.
- * Useful to protect a resource against concurrent modification, in lieu of a lock.
- * Passing null returns an {@link ExecutorService} with a uniquely labeled queue.
- *
- * @param label - a label to name the queue, shown in several debugging tools
- * @return a synchronous {@link ExecutorService}
- */
- public ExecutorService createSerialExecutor(String label) {
- if (label == null) label = "";
- if (label.length() > 256) label = label.substring(0, 256);
- String queueName = "com.apple.java.concurrent.";
- if ("".equals(label)) {
- synchronized (this) {
- queueName += queueIndex++;
- }
- } else {
- queueName += label;
- }
-
- final long nativeQueue = LibDispatchNative.nativeCreateSerialQueue(queueName);
- if (nativeQueue == 0) return null;
- return new LibDispatchSerialQueue(nativeQueue);
- }
-
- Executor nonBlockingMainQueue = null;
- /**
- * Returns an {@link Executor} that performs the provided Runnables on the main queue of the process.
- * Runnables submitted to this {@link Executor} will not run until the AWT is started or another native toolkit is running a CFRunLoop or NSRunLoop on the main thread.
- *
- * Submitting a Runnable to this {@link Executor} does not wait for the Runnable to complete.
- * @return an asynchronous {@link Executor} that is backed by the main queue
- */
- public synchronized Executor getNonBlockingMainQueueExecutor() {
- if (nonBlockingMainQueue != null) return nonBlockingMainQueue;
- return nonBlockingMainQueue = new LibDispatchMainQueue.ASync();
- }
-
- Executor blockingMainQueue = null;
- /**
- * Returns an {@link Executor} that performs the provided Runnables on the main queue of the process.
- * Runnables submitted to this {@link Executor} will not run until the AWT is started or another native toolkit is running a CFRunLoop or NSRunLoop on the main thread.
- *
- * Submitting a Runnable to this {@link Executor} will block until the Runnable has completed.
- * @return an {@link Executor} that is backed by the main queue
- */
- public synchronized Executor getBlockingMainQueueExecutor() {
- if (blockingMainQueue != null) return blockingMainQueue;
- return blockingMainQueue = new LibDispatchMainQueue.Sync();
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchConcurrentQueue.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-import java.util.concurrent.Executor;
-
-class LibDispatchConcurrentQueue extends LibDispatchQueue implements Executor {
- LibDispatchConcurrentQueue(final long queuePtr) {
- super(queuePtr);
- }
-
- @Override
- public void execute(final Runnable task) {
- LibDispatchNative.nativeExecuteAsync(ptr, task);
- }
-
- @Override
- protected synchronized void dispose() {
- // should not dispose the default concurrent queues
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchMainQueue.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-import java.util.concurrent.Executor;
-
-abstract class LibDispatchMainQueue extends LibDispatchQueue implements Executor {
- public LibDispatchMainQueue() {
- super(LibDispatchNative.nativeGetMainQueue());
- }
-
- @Override
- protected synchronized void dispose() {
- // should not dispose the main queue
- }
-
- static class Sync extends LibDispatchMainQueue {
- @Override
- public void execute(final Runnable task) {
- LibDispatchNative.nativeExecuteSync(ptr, task);
- }
- }
-
- static class ASync extends LibDispatchMainQueue {
- @Override
- public void execute(final Runnable task) {
- LibDispatchNative.nativeExecuteAsync(ptr, task);
- }
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchNative.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-final class LibDispatchNative {
- static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- System.loadLibrary("osx");
- return null;
- }
- });
- }
-
- static native boolean nativeIsDispatchSupported();
- static native long nativeGetMainQueue();
- static native long nativeCreateConcurrentQueue(int priority);
- static native long nativeCreateSerialQueue(String name);
- static native void nativeReleaseQueue(long nativeQueue);
- static native void nativeExecuteAsync(long nativeQueue, Runnable task);
- static native void nativeExecuteSync(long nativeQueue, Runnable task);
-
- private LibDispatchNative() { }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchQueue.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-class LibDispatchQueue extends LibDispatchRetainedResource {
- LibDispatchQueue(final long queuePtr) {
- super(queuePtr);
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchRetainedResource.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-class LibDispatchRetainedResource {
- protected long ptr;
-
- protected LibDispatchRetainedResource(final long ptr) {
- this.ptr = ptr;
- }
-
- protected synchronized void dispose() {
- if (ptr != 0) LibDispatchNative.nativeReleaseQueue(ptr);
- ptr = 0;
- }
-
- protected void finalize() throws Throwable {
- dispose();
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/LibDispatchSerialQueue.java Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * 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 com.apple.concurrent;
-
-import java.util.List;
-import java.util.concurrent.*;
-
-class LibDispatchSerialQueue extends AbstractExecutorService {
- static final int RUNNING = 0;
- static final int SHUTDOWN = 1;
-// static final int STOP = 2; // not supported by GCD
- static final int TERMINATED = 3;
-
- final Object lock = new Object();
- LibDispatchQueue nativeQueueWrapper;
- volatile int runState;
-
- LibDispatchSerialQueue(final long queuePtr) {
- nativeQueueWrapper = new LibDispatchQueue(queuePtr);
- }
-
- @Override
- public void execute(final Runnable task) {
- if (nativeQueueWrapper == null) return;
- LibDispatchNative.nativeExecuteAsync(nativeQueueWrapper.ptr, task);
- }
-
- @Override
- public boolean isShutdown() {
- return runState != RUNNING;
- }
-
- @Override
- public boolean isTerminated() {
- return runState == TERMINATED;
- }
-
- @Override
- public void shutdown() {
- synchronized (lock) {
- if (runState != RUNNING) return;
-
- runState = SHUTDOWN;
- execute(new Runnable() {
- public void run() {
- synchronized (lock) {
- runState = TERMINATED;
- lock.notifyAll(); // for the benefit of awaitTermination()
- }
- }
- });
- nativeQueueWrapper = null;
- }
- }
-
- @Override
- public List<Runnable> shutdownNow() {
- shutdown();
- return null;
- }
-
- @Override
- public boolean awaitTermination(final long timeout, final TimeUnit unit) throws InterruptedException {
- if (runState == TERMINATED) return true;
-
- final long millis = unit.toMillis(timeout);
- if (millis <= 0) return false;
-
- synchronized (lock) {
- if (runState == TERMINATED) return true;
- lock.wait(timeout);
- if (runState == TERMINATED) return true;
- }
-
- return false;
- }
-}
--- a/jdk/src/jdk.deploy.osx/macosx/classes/com/apple/concurrent/package.html Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-<html>
-<head>
-</head>
-<body bgcolor="white">
-Apple-specific implementations of the java.util.concurrent.* API based on libdispatch.
-</body>
-</html>
--- a/jdk/src/jdk.deploy.osx/macosx/native/libosx/CFileManager.m Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2011, 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.
- */
-
-#import "com_apple_eio_FileManager.h"
-
-#import <Cocoa/Cocoa.h>
-#import <JavaNativeFoundation/JavaNativeFoundation.h>
-
-#import "ThreadUtilities.h"
-
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _setFileTypeAndCreator
- * Signature: (Ljava/lang/String;II)V
- */
-JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileTypeAndCreator
-(JNIEnv *env, jclass clz, jstring javaFilename, jint type, jint creator)
-{
-JNF_COCOA_ENTER(env);
- NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
- NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInt:type], NSFileHFSTypeCode,
- [NSNumber numberWithInt:creator], NSFileHFSCreatorCode, nil];
- [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
-JNF_COCOA_EXIT(env);
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _setFileType
- * Signature: (Ljava/lang/String;I)V
- */
-JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileType
-(JNIEnv *env, jclass ckz, jstring javaFilename, jint type)
-{
-JNF_COCOA_ENTER(env);
- NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
- NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:type] forKey:NSFileHFSTypeCode];
- [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
-JNF_COCOA_EXIT(env);
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _setFileCreator
- * Signature: (Ljava/lang/String;I)V
- */
-JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileCreator
-(JNIEnv *env, jclass clz, jstring javaFilename, jint creator)
-{
-JNF_COCOA_ENTER(env);
- NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
- NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:creator] forKey:NSFileHFSCreatorCode];
- [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
-JNF_COCOA_EXIT(env);
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _getFileType
- * Signature: (Ljava/lang/String;)I
- */
-JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileType
-(JNIEnv *env, jclass clz, jstring javaFilename)
-{
- jint type = 0;
-JNF_COCOA_ENTER(env);
- NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
- NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
- NSNumber *val = [attributes objectForKey:NSFileHFSTypeCode];
- type = [val intValue];
-JNF_COCOA_EXIT(env);
- return type;
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _getFileCreator
- * Signature: (Ljava/lang/String;)I
- */
-JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileCreator
- (JNIEnv *env, jclass clz, jstring javaFilename)
-{
- jint creator = 0;
-JNF_COCOA_ENTER(env);
- NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
- NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
- NSNumber *val = [attributes objectForKey:NSFileHFSCreatorCode];
- creator = [val intValue];
-JNF_COCOA_EXIT(env);
- return creator;
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _findFolder
- * Signature: (SIZ)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager__1findFolder__SIZ
-(JNIEnv *env, jclass clz, jshort domain, jint folderType, jboolean createIfNeeded)
-{
- jstring filename = nil;
-JNF_COCOA_ENTER(env);
-
- FSRef foundRef;
- createIfNeeded = createIfNeeded || (folderType == kTemporaryFolderType) || (folderType == kChewableItemsFolderType);
- if (FSFindFolder((SInt16)domain, (OSType)folderType, (Boolean)createIfNeeded, &foundRef) == noErr) {
- char path[PATH_MAX];
- if (FSRefMakePath(&foundRef, (UInt8 *)path, sizeof(path)) == noErr) {
- NSString *filenameString = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:path length:strlen(path)];
- filename = JNFNormalizedJavaStringForPath(env, filenameString);
- }
- }
-
-JNF_COCOA_EXIT(env);
- return filename;
-}
-
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: _openURL
- * Signature: (Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1openURL
-(JNIEnv *env, jclass clz, jstring urlString)
-{
-JNF_COCOA_ENTER(env);
-
- NSURL *url = [NSURL URLWithString:JNFNormalizedNSStringForPath(env, urlString)];
-
- // Radar 3208005: Run this on the main thread; file:// style URLs will hang otherwise.
- [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
- [[NSWorkspace sharedWorkspace] openURL:url];
- }];
-
-JNF_COCOA_EXIT(env);
-}
-
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: getNativeResourceFromBundle
- * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativeResourceFromBundle
-(JNIEnv *env, jclass clz, jstring javaResourceName, jstring javaSubDirName, jstring javaTypeName)
-{
- jstring filename = NULL;
-JNF_COCOA_ENTER(env);
-
- NSString *resourceName = JNFNormalizedNSStringForPath(env, javaResourceName);
- NSString *subDirectory = JNFNormalizedNSStringForPath(env, javaSubDirName);
- NSString *typeName = JNFNormalizedNSStringForPath(env, javaTypeName);
-
- NSString *path = [[NSBundle mainBundle] pathForResource:resourceName
- ofType:typeName
- inDirectory:subDirectory];
-
- filename = JNFNormalizedJavaStringForPath(env, path);
-
-JNF_COCOA_EXIT(env);
- return filename;
-}
-
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: getNativePathToApplicationBundle
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativePathToApplicationBundle
-(JNIEnv *env, jclass clazz)
-{
- jstring filename = nil;
-JNF_COCOA_ENTER(env);
-
- NSBundle *mainBundle = [NSBundle mainBundle];
- filename = JNFNormalizedJavaStringForPath(env, [mainBundle bundlePath]);
-
-JNF_COCOA_EXIT(env);
- return filename;
-}
-
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: __moveToTrash
- * Signature: (Ljava/lang/String;)V
- */
-
-JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1moveToTrash
-(JNIEnv *env, jclass clz, jstring fileName)
-{
- __block BOOL returnValue = NO;
-JNF_COCOA_ENTER(env);
-
- NSString * path = JNFNormalizedNSStringForPath(env, fileName);
- NSURL *url = [NSURL fileURLWithPath:path];
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
-
- returnValue = [[NSFileManager defaultManager] trashItemAtURL:url
- resultingItemURL:nil
- error:nil];
- }];
-
-JNF_COCOA_EXIT(env);
-
- return returnValue ? JNI_TRUE: JNI_FALSE;
-}
-
-/*
- * Class: com_apple_eio_FileManager
- * Method: __revealInFinder
- * Signature: (Ljava/lang/String;)V
- */
-
-JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1revealInFinder
-(JNIEnv *env, jclass clz, jstring url)
-{
- __block jboolean returnValue = JNI_FALSE;
-JNF_COCOA_ENTER(env);
-
- NSString *path = JNFNormalizedNSStringForPath(env, url);
- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
- returnValue = [[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:@""];
- }];
-
-JNF_COCOA_EXIT(env);
-
- return returnValue;
-}
--- a/jdk/src/jdk.deploy.osx/macosx/native/libosx/Dispatch.m Fri Mar 11 21:57:43 2016 +0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,174 +0,0 @@
-/*
- * Copyright (c) 2011, 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.
- */
-
-/*
- * Must include this before JavaNativeFoundation.h to get jni.h from build
- */
-#include "jni.h"
-#include "jni_util.h"
-
-#import "com_apple_concurrent_LibDispatchNative.h"
-
-#import <dispatch/dispatch.h>
-#import <JavaNativeFoundation/JavaNativeFoundation.h>
-
-/*
- * Declare library specific JNI_Onload entry if static build
- */
-DEF_STATIC_JNI_OnLoad
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeIsDispatchSupported
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeIsDispatchSupported
-(JNIEnv *env, jclass clazz)
-{
- return JNI_TRUE;
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeGetMainQueue
- * Signature: ()J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeGetMainQueue
-(JNIEnv *env, jclass clazz)
-{
- dispatch_queue_t queue = dispatch_get_main_queue();
- return ptr_to_jlong(queue);
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeCreateConcurrentQueue
- * Signature: (I)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeCreateConcurrentQueue
-(JNIEnv *env, jclass clazz, jint priority)
-{
- dispatch_queue_t queue = dispatch_get_global_queue((long)priority, 0);
- return ptr_to_jlong(queue);
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeCreateSerialQueue
- * Signature: (Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeCreateSerialQueue
-(JNIEnv *env, jclass clazz, jstring name)
-{
- if (name == NULL) return 0L;
-
- jboolean isCopy;
- const char *queue_name = (*env)->GetStringUTFChars(env, name, &isCopy);
- dispatch_queue_t queue = dispatch_queue_create(queue_name, NULL);
- (*env)->ReleaseStringUTFChars(env, name, queue_name);
-
- return ptr_to_jlong(queue);
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeReleaseQueue
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeReleaseQueue
-(JNIEnv *env, jclass clazz, jlong nativeQueue)
-{
- if (nativeQueue == 0L) return;
- dispatch_release((dispatch_queue_t)jlong_to_ptr(nativeQueue));
-}
-
-
-static JNF_CLASS_CACHE(jc_Runnable, "java/lang/Runnable");
-static JNF_MEMBER_CACHE(jm_run, jc_Runnable, "run", "()V");
-
-static void perform_dispatch(JNIEnv *env, jlong nativeQueue, jobject runnable, void (*dispatch_fxn)(dispatch_queue_t, dispatch_block_t))
-{
-JNF_COCOA_ENTER(env);
- dispatch_queue_t queue = (dispatch_queue_t)jlong_to_ptr(nativeQueue);
- if (queue == NULL) return; // shouldn't happen
-
- // create a global-ref around the Runnable, so it can be safely passed to the dispatch thread
- JNFJObjectWrapper *wrappedRunnable = [[JNFJObjectWrapper alloc] initWithJObject:runnable withEnv:env];
-
- dispatch_fxn(queue, ^{
- // attach the dispatch thread to the JVM if necessary, and get an env
- JNFThreadContext ctx = JNFThreadDetachOnThreadDeath | JNFThreadSetSystemClassLoaderOnAttach | JNFThreadAttachAsDaemon;
- JNIEnv *blockEnv = JNFObtainEnv(&ctx);
-
- JNF_COCOA_ENTER(blockEnv);
-
- // call the user's runnable
- JNFCallObjectMethod(blockEnv, [wrappedRunnable jObject], jm_run);
-
- // explicitly clear object while we have an env (it's cheaper that way)
- [wrappedRunnable setJObject:NULL withEnv:blockEnv];
-
- JNF_COCOA_EXIT(blockEnv);
-
- // let the env go, but leave the thread attached as a daemon
- JNFReleaseEnv(blockEnv, &ctx);
- });
-
- // release this thread's interest in the Runnable, the block
- // will have retained the it's own interest above
- [wrappedRunnable release];
-
-JNF_COCOA_EXIT(env);
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeExecuteAsync
- * Signature: (JLjava/lang/Runnable;)V
- */
-JNIEXPORT void JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeExecuteAsync
-(JNIEnv *env, jclass clazz, jlong nativeQueue, jobject runnable)
-{
- // enqueues and returns
- perform_dispatch(env, nativeQueue, runnable, dispatch_async);
-}
-
-
-/*
- * Class: com_apple_concurrent_LibDispatchNative
- * Method: nativeExecuteSync
- * Signature: (JLjava/lang/Runnable;)V
- */
-JNIEXPORT void JNICALL Java_com_apple_concurrent_LibDispatchNative_nativeExecuteSync
-(JNIEnv *env, jclass clazz, jlong nativeQueue, jobject runnable)
-{
- // blocks until the Runnable completes
- perform_dispatch(env, nativeQueue, runnable, dispatch_sync);
-}
--- a/jdk/test/ProblemList.txt Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/ProblemList.txt Fri Mar 11 11:42:43 2016 -0800
@@ -334,9 +334,6 @@
# jdk_time
-# 8134979
-java/time/tck/java/time/chrono/TCKJapaneseChronology.java generic-all
-
############################################################################
# jdk_tools
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jdi/RedefineAddPrivateMethod.sh Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,79 @@
+#!/bin/sh
+
+#
+# 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 8149743
+# @summary crash when adding a breakpoint after redefining to add a private static method
+# @run shell RedefineAddPrivateMethod.sh
+
+compileOptions=-g
+
+createJavaFile()
+{
+ cat <<EOF > $1.java.1
+public class $1 {
+ static public void main(String[] args) {
+ System.out.println("@1 breakpoint");
+ System.out.println("@2 breakpoint");
+ }
+
+ // @1 uncomment private static void test() {}
+}
+EOF
+}
+
+# This is called to feed cmds to jdb.
+dojdbCmds()
+{
+ setBkpts @1
+ runToBkpt @1
+ redefineClass @1
+ setBkpts @2
+ runToBkpt @2
+ cmd exitJdb
+}
+
+
+mysetup()
+{
+ if [ -z "$TESTSRC" ] ; then
+ TESTSRC=.
+ fi
+
+ for ii in . $TESTSRC $TESTSRC/.. ; do
+ if [ -r "$ii/ShellScaffold.sh" ] ; then
+ . $ii/ShellScaffold.sh
+ break
+ fi
+ done
+}
+
+# You could replace this next line with the contents
+# of ShellScaffold.sh and this script will run just the same.
+mysetup
+
+runit
+debuggeeFailIfPresent "Internal exception:"
+pass
--- a/jdk/test/com/sun/jdi/TestScaffold.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/com/sun/jdi/TestScaffold.java Fri Mar 11 11:42:43 2016 -0800
@@ -752,6 +752,7 @@
sr.addClassExclusionFilter("com.oracle.*");
sr.addClassExclusionFilter("oracle.*");
sr.addClassExclusionFilter("jdk.internal.*");
+ sr.addClassExclusionFilter("jdk.jfr.*");
sr.addCountFilter(1);
sr.enable();
StepEvent retEvent = (StepEvent)waitForRequestedEvent(sr);
--- a/jdk/test/java/lang/instrument/NativeMethodPrefixAgent.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/java/lang/instrument/NativeMethodPrefixAgent.java Fri Mar 11 11:42:43 2016 -0800
@@ -31,7 +31,7 @@
* java.management
* java.instrument
* @run shell/timeout=240 MakeJAR2.sh NativeMethodPrefixAgent NativeMethodPrefixApp 'Can-Retransform-Classes: true' 'Can-Set-Native-Method-Prefix: true'
- * @run main/othervm -javaagent:NativeMethodPrefixAgent.jar NativeMethodPrefixApp
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:-CheckIntrinsics -javaagent:NativeMethodPrefixAgent.jar NativeMethodPrefixApp
*/
import java.lang.instrument.*;
--- a/jdk/test/java/lang/ref/FinalizeOverride.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/java/lang/ref/FinalizeOverride.java Fri Mar 11 11:42:43 2016 -0800
@@ -29,7 +29,7 @@
import java.util.concurrent.atomic.AtomicInteger;
/* @test
- * @bug 8027351
+ * @bug 8027351 8148940
* @summary Basic test of the finalize method
*/
@@ -63,6 +63,19 @@
while (finalizedCount.get() != (count+1)) {
System.gc();
System.runFinalization();
+ // Running System.gc() and System.runFinalization() in a
+ // tight loop can trigger frequent safepointing that slows
+ // down the VM and, as a result, the test. (With the
+ // HotSpot VM, the effect of frequent safepointing is
+ // especially noticeable if the test is run with the
+ // -Xcomp flag.) Sleeping for a second after every
+ // garbage collection and finalization cycle gives the VM
+ // time to make progress.
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ System.out.println("Main thread interrupted, continuing execution.");
+ }
}
if (privateFinalizeInvoked) {
--- a/jdk/test/java/net/URLPermission/URLTest.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/java/net/URLPermission/URLTest.java Fri Mar 11 11:42:43 2016 -0800
@@ -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
@@ -27,6 +27,7 @@
*
* @test
* @bug 8010464
+ * @key intermittent
* @library /lib/testlibrary/
* @build jdk.testlibrary.SimpleSSLContext
* @run main/othervm/java.security.policy=policy.1 URLTest one
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/httpclient/ShortRequestBody.java Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+import java.io.*;
+import java.net.http.*;
+import java.net.*;
+import java.util.concurrent.*;
+import java.nio.ByteBuffer;
+import java.util.function.LongConsumer;
+
+/**
+ * @test
+ * @bug 8151441
+ * @run main/othervm/timeout=10 ShortRequestBody
+ */
+
+/**
+ * Exception was not being thrown
+ */
+public class ShortRequestBody {
+
+ static Server server;
+ static String reqbody = "Hello world";
+
+ static String response = "HTTP/1.1 200 OK\r\nContent-length: 0\r\n\r\n";
+
+ static class RequestBody implements HttpRequest.BodyProcessor {
+ public long onRequestStart(HttpRequest hr, LongConsumer flowController) {
+ return reqbody.length() + 1; // wrong!
+ }
+
+ public boolean onRequestBodyChunk(ByteBuffer buf) throws IOException {
+ byte[] b = reqbody.getBytes();
+ buf.put(b);
+ return true;
+ }
+ }
+
+ static void close(Closeable c) {
+ try {
+ if (c == null)
+ return;
+ c.close();
+ } catch (IOException e) {}
+ }
+
+ public static void main(String[] args) throws Exception {
+ ServerSocket server = new ServerSocket(0);
+ int port = server.getLocalPort();
+ URI uri = new URI("http://127.0.0.1:" + port + "/");
+
+ HttpRequest request;
+ HttpResponse r;
+ Socket s = null;
+ CompletableFuture<HttpResponse> cf1;
+ try {
+ cf1 = HttpRequest.create(uri)
+ .body(new RequestBody())
+ .GET()
+ .responseAsync();
+
+ s = server.accept();
+ s.getInputStream().readAllBytes();
+ try (OutputStream os = s.getOutputStream()) {
+ os.write(response.getBytes());
+ } catch (IOException ee) {
+ }
+
+ try {
+ r = cf1.get(3, TimeUnit.SECONDS);
+ throw new RuntimeException("Failed");
+ } catch (TimeoutException e0) {
+ throw new RuntimeException("Failed timeout");
+ } catch (ExecutionException e) {
+ System.err.println("OK");
+ }
+ } finally {
+ HttpClient.getDefault().executorService().shutdownNow();
+ close(s);
+ close(server);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/httpclient/whitebox/TEST.properties Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,3 @@
+TestNG.dirs = .
+
+bootclasspath.dirs = /java/net/httpclient
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/httpclient/whitebox/java/net/http/SelectorTest.java Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,208 @@
+/*
+ * 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 8151299
+ * @summary Http client SelectorManager overwriting read and write events
+ */
+package java.net.http;
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.nio.ByteBuffer;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+import static java.lang.System.out;
+import static java.nio.charset.StandardCharsets.US_ASCII;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import org.testng.annotations.Test;
+
+/**
+ * Whitebox test of selector mechanics. Currently only a simple test
+ * setting one read and one write event is done. It checks that the
+ * write event occurs first, followed by the read event and then no
+ * further events occur despite the conditions actually still existing.
+ */
+@Test
+public class SelectorTest {
+
+ AtomicInteger counter = new AtomicInteger();
+ volatile boolean error;
+ static final CountDownLatch finishingGate = new CountDownLatch(1);
+
+ String readSomeBytes(RawChannel chan) {
+ try {
+ ByteBuffer buf = ByteBuffer.allocate(1024);
+ int t = chan.read(buf);
+ if (t <= 0) {
+ out.printf("chan read returned %d\n", t);
+ return null;
+ }
+ byte[] bb = new byte[t];
+ buf.get(bb);
+ return new String(bb, US_ASCII);
+ } catch (IOException ioe) {
+ throw new UncheckedIOException(ioe);
+ }
+ }
+
+ @Test(timeOut = 10000)
+ public void test() throws Exception {
+
+ try (ServerSocket server = new ServerSocket(0)) {
+ int port = server.getLocalPort();
+
+ out.println("Listening on port " + server.getLocalPort());
+
+ TestServer t = new TestServer(server);
+ t.start();
+ out.println("Started server thread");
+
+ final RawChannel chan = getARawChannel(port);
+
+ chan.registerEvent(new RawChannel.NonBlockingEvent() {
+ @Override
+ public int interestOps() {
+ return SelectionKey.OP_READ;
+ }
+
+ @Override
+ public void handle() {
+ readSomeBytes(chan);
+ out.printf("OP_READ\n");
+ if (counter.get() != 1) {
+ out.printf("OP_READ error counter = %d\n", counter);
+ error = true;
+ }
+ }
+ });
+
+ chan.registerEvent(new RawChannel.NonBlockingEvent() {
+ @Override
+ public int interestOps() {
+ return SelectionKey.OP_WRITE;
+ }
+
+ @Override
+ public void handle() {
+ out.printf("OP_WRITE\n");
+ if (counter.get() != 0) {
+ out.printf("OP_WRITE error counter = %d\n", counter);
+ error = true;
+ } else {
+ ByteBuffer bb = ByteBuffer.wrap(TestServer.INPUT);
+ counter.incrementAndGet();
+ try {
+ chan.write(bb);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+ }
+
+ });
+ out.println("Events registered. Waiting");
+ finishingGate.await(30, SECONDS);
+ if (error)
+ throw new RuntimeException("Error");
+ else
+ out.println("No error");
+ }
+ }
+
+ static RawChannel getARawChannel(int port) throws Exception {
+ URI uri = URI.create("http://127.0.0.1:" + port + "/");
+ out.println("client connecting to " + uri.toString());
+ HttpRequest req = HttpRequest.create(uri).GET();
+ HttpResponse r = req.response();
+ r.body(HttpResponse.ignoreBody());
+ return ((HttpResponseImpl) r).rawChannel();
+ }
+
+ static class TestServer extends Thread {
+ static final byte[] INPUT = "Hello world".getBytes(US_ASCII);
+ static final byte[] OUTPUT = "Goodbye world".getBytes(US_ASCII);
+ static final String FIRST_RESPONSE = "HTTP/1.1 200 OK\r\nContent-length: 0\r\n\r\n";
+ final ServerSocket server;
+
+ TestServer(ServerSocket server) throws IOException {
+ this.server = server;
+ }
+
+ public void run() {
+ try (Socket s = server.accept();
+ InputStream is = s.getInputStream();
+ OutputStream os = s.getOutputStream()) {
+
+ out.println("Got connection");
+ readRequest(is);
+ os.write(FIRST_RESPONSE.getBytes());
+ read(is);
+ write(os);
+ Thread.sleep(1000);
+ // send some more data, and make sure WRITE op does not get called
+ write(os);
+ out.println("TestServer exiting");
+ SelectorTest.finishingGate.countDown();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // consumes the HTTP request
+ static void readRequest(InputStream is) throws IOException {
+ out.println("starting readRequest");
+ byte[] buf = new byte[1024];
+ String s = "";
+ while (true) {
+ int n = is.read(buf);
+ if (n <= 0)
+ throw new IOException("Error");
+ s = s + new String(buf, 0, n);
+ if (s.indexOf("\r\n\r\n") != -1)
+ break;
+ }
+ out.println("returning from readRequest");
+ }
+
+ static void read(InputStream is) throws IOException {
+ out.println("starting read");
+ for (int i = 0; i < INPUT.length; i++) {
+ int c = is.read();
+ if (c == -1)
+ throw new IOException("closed");
+ if (INPUT[i] != (byte) c)
+ throw new IOException("Error. Expected:" + INPUT[i] + ", got:" + c);
+ }
+ out.println("returning from read");
+ }
+
+ static void write(OutputStream os) throws IOException {
+ out.println("doing write");
+ os.write(OUTPUT);
+ }
+ }
+}
--- a/jdk/test/java/net/ipv6tests/TcpTest.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/java/net/ipv6tests/TcpTest.java Fri Mar 11 11:42:43 2016 -0800
@@ -24,6 +24,7 @@
/*
* @test
* @bug 4868820
+ * @key intermittent
* @summary IPv6 support for Windows XP and 2003 server
*/
--- a/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Fri Mar 11 11:42:43 2016 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, 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
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4313882 4981129
+ * @bug 4313882 4981129 8143610
* @summary Unit test for datagram-socket-channel adaptors
* @library ..
* @key randomness
@@ -137,7 +137,7 @@
echoServer.getPort());
test(address, 0, false, false);
test(address, 0, false, true);
- test(address, 15000, false, false);
+ test(address, Integer.MAX_VALUE, false, false);
}
try (TestServers.UdpDiscardServer discardServer
= TestServers.UdpDiscardServer.startNewServer()) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sample/TEST.properties Fri Mar 11 11:42:43 2016 -0800
@@ -0,0 +1,1 @@
+external.lib.roots = ../../
--- a/jdk/test/sample/chatserver/ChatTest.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/sample/chatserver/ChatTest.java Fri Mar 11 11:42:43 2016 -0800
@@ -25,9 +25,9 @@
/* @test
* @summary Test chat server chatserver test
*
- * @library ../../../src/sample/share/nio/chatserver
+ * @library /src/sample/share/nio/chatserver
* @build ChatTest ChatServer Client ClientReader DataReader MessageReader NameReader
- * @run main ChatTest
+ * @run testng ChatTest
*/
import java.io.*;
@@ -38,10 +38,13 @@
import java.util.List;
import java.util.concurrent.CyclicBarrier;
+import org.testng.annotations.Test;
+
public class ChatTest {
public static int listeningPort = 0;
- public static void main(String[] args) throws Throwable {
+ @Test
+ public static void doTest() throws Throwable {
testStartStop();
testPortOpen();
testAsksForName();
--- a/jdk/test/sample/mergesort/MergeSortTest.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/sample/mergesort/MergeSortTest.java Fri Mar 11 11:42:43 2016 -0800
@@ -25,14 +25,16 @@
/* @test
* @summary Test MergeSort
*
- * @library ../../../src/sample/share/forkjoin/mergesort
+ * @library /src/sample/share/forkjoin/mergesort
* @build MergeSortTest MergeDemo MergeSort
- * @run main MergeSortTest
+ * @run testng MergeSortTest
*/
import java.util.Arrays;
import java.util.Random;
+import org.testng.annotations.Test;
+
public class MergeSortTest {
private Random random;
private MergeSort target;
@@ -42,7 +44,8 @@
this.target = target;
}
- public static void main(String[] args) {
+ @Test
+ public static void doTest() {
MergeSortTest test = new MergeSortTest(new Random(), new MergeSort(Runtime.getRuntime().availableProcessors() * 4));
test.run();
}
--- a/jdk/test/sun/security/mscapi/SignatureOffsets.java Fri Mar 11 21:57:43 2016 +0400
+++ b/jdk/test/sun/security/mscapi/SignatureOffsets.java Fri Mar 11 11:42:43 2016 -0800
@@ -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
@@ -28,7 +28,7 @@
/*
* @test
* @bug 8050374
- * @key randomness
+ * @key randomness intermittent
* @summary This test validates signature verification
* Signature.verify(byte[], int, int). The test uses RandomFactory to
* get random set of clear text data to sign. After the signature