changeset 10859:785d21100834

Merge
author coffeys
date Thu, 25 Jun 2015 03:48:35 -0700
parents e0a04f91f4bd 7589c562c8c6
children 62bb6086fc79 a39b635e4dab
files
diffstat 11 files changed, 301 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/make/lib/CoreLibraries.gmk	Tue Jun 23 04:07:36 2015 -0700
+++ b/make/lib/CoreLibraries.gmk	Thu Jun 25 03:48:35 2015 -0700
@@ -207,7 +207,7 @@
     LDFLAGS_SUFFIX_windows := -export:winFileHandleOpen -export:handleLseek \
         jvm.lib $(BUILD_LIBFDLIBM) $(WIN_VERIFY_LIB) \
         shell32.lib delayimp.lib -DELAYLOAD:shell32.dll \
-        advapi32.lib, \
+        advapi32.lib version.lib, \
     VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \
     RC_FLAGS := $(RC_FLAGS) \
         -D "JDK_FNAME=java.dll" \
--- a/src/share/classes/com/sun/jndi/ldap/LdapURL.java	Tue Jun 23 04:07:36 2015 -0700
+++ b/src/share/classes/com/sun/jndi/ldap/LdapURL.java	Thu Jun 25 03:48:35 2015 -0700
@@ -26,9 +26,6 @@
 package com.sun.jndi.ldap;
 
 import javax.naming.*;
-import javax.naming.directory.*;
-import javax.naming.spi.*;
-import java.net.URL;
 import java.net.MalformedURLException;
 import java.io.UnsupportedEncodingException;
 import java.util.StringTokenizer;
@@ -211,43 +208,52 @@
 
         // query begins with a '?' or is null
 
-        if (query == null) {
+        if (query == null || query.length() < 2) {
             return;
         }
 
-        int qmark2 = query.indexOf('?', 1);
+        int currentIndex = 1;
+        int nextQmark;
+        int endIndex;
 
-        if (qmark2 < 0) {
-            attributes = query.substring(1);
+        // attributes:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            attributes = query.substring(currentIndex, endIndex);
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
             return;
-        } else if (qmark2 != 1) {
-            attributes = query.substring(1, qmark2);
         }
 
-        int qmark3 = query.indexOf('?', qmark2 + 1);
-
-        if (qmark3 < 0) {
-            scope = query.substring(qmark2 + 1);
+        // scope:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            scope = query.substring(currentIndex, endIndex);
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
             return;
-        } else if (qmark3 != qmark2 + 1) {
-            scope = query.substring(qmark2 + 1, qmark3);
         }
 
-        int qmark4 = query.indexOf('?', qmark3 + 1);
+        // filter:
+        nextQmark = query.indexOf('?', currentIndex);
+        endIndex = nextQmark == -1 ? query.length() : nextQmark;
+        if (endIndex - currentIndex > 0) {
+            filter = query.substring(currentIndex, endIndex);
+            filter = UrlUtil.decode(filter, "UTF8");
+        }
+        currentIndex = endIndex + 1;
+        if (currentIndex >= query.length()) {
+            return;
+        }
 
-        if (qmark4 < 0) {
-            filter = query.substring(qmark3 + 1);
-        } else {
-            if (qmark4 != qmark3 + 1) {
-                filter = query.substring(qmark3 + 1, qmark4);
-            }
-            extensions = query.substring(qmark4 + 1);
-            if (extensions.length() > 0) {
-                extensions = UrlUtil.decode(extensions, "UTF8");
-            }
-        }
-        if (filter != null && filter.length() > 0) {
-            filter = UrlUtil.decode(filter, "UTF8");
+        // extensions:
+        if (query.length() - currentIndex > 0) {
+            extensions = query.substring(currentIndex);
+            extensions = UrlUtil.decode(extensions, "UTF8");
         }
     }
 
--- a/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Tue Jun 23 04:07:36 2015 -0700
+++ b/src/solaris/classes/sun/awt/X11/XWindowPeer.java	Thu Jun 25 03:48:35 2015 -0700
@@ -679,28 +679,33 @@
         GraphicsConfiguration newGC = null;
         Rectangle screenBounds;
 
-        for (int i = 0; i < gds.length; i++) {
-            screenBounds = gds[i].getDefaultConfiguration().getBounds();
-            if (newBounds.intersects(screenBounds)) {
-                horizAmt = Math.min(newBounds.x + newBounds.width,
-                                    screenBounds.x + screenBounds.width) -
-                           Math.max(newBounds.x, screenBounds.x);
-                vertAmt = Math.min(newBounds.y + newBounds.height,
-                                   screenBounds.y + screenBounds.height)-
-                          Math.max(newBounds.y, screenBounds.y);
-                intAmt = horizAmt * vertAmt;
-                if (intAmt == area) {
-                    // Completely on this screen - done!
-                    newScreenNum = i;
-                    newGC = gds[i].getDefaultConfiguration();
-                    break;
-                }
-                if (intAmt > largestAmt) {
-                    largestAmt = intAmt;
-                    newScreenNum = i;
-                    newGC = gds[i].getDefaultConfiguration();
+        XToolkit.awtUnlock();
+        try {
+            for (int i = 0; i < gds.length; i++) {
+                screenBounds = gds[i].getDefaultConfiguration().getBounds();
+                if (newBounds.intersects(screenBounds)) {
+                    horizAmt = Math.min(newBounds.x + newBounds.width,
+                                        screenBounds.x + screenBounds.width) -
+                               Math.max(newBounds.x, screenBounds.x);
+                    vertAmt = Math.min(newBounds.y + newBounds.height,
+                                       screenBounds.y + screenBounds.height)-
+                              Math.max(newBounds.y, screenBounds.y);
+                    intAmt = horizAmt * vertAmt;
+                    if (intAmt == area) {
+                        // Completely on this screen - done!
+                        newScreenNum = i;
+                        newGC = gds[i].getDefaultConfiguration();
+                        break;
+                    }
+                    if (intAmt > largestAmt) {
+                        largestAmt = intAmt;
+                        newScreenNum = i;
+                        newGC = gds[i].getDefaultConfiguration();
+                    }
                 }
             }
+        } finally {
+            XToolkit.awtLock();
         }
         if (newScreenNum != curScreenNum) {
             if (log.isLoggable(PlatformLogger.Level.FINEST)) {
--- a/src/solaris/classes/sun/awt/X11GraphicsDevice.java	Tue Jun 23 04:07:36 2015 -0700
+++ b/src/solaris/classes/sun/awt/X11GraphicsDevice.java	Thu Jun 25 03:48:35 2015 -0700
@@ -286,7 +286,6 @@
      * Returns true only if:
      *   - the Xrandr extension is present
      *   - the necessary Xrandr functions were loaded successfully
-     *   - XINERAMA is not enabled
      */
     private static synchronized boolean isXrandrExtensionSupported() {
         if (xrandrExtSupported == null) {
@@ -318,7 +317,9 @@
 
     @Override
     public boolean isDisplayChangeSupported() {
-        return (isFullScreenSupported() && (getFullScreenWindow() != null));
+        return (isFullScreenSupported()
+                && !((X11GraphicsEnvironment) GraphicsEnvironment
+                        .getLocalGraphicsEnvironment()).runningXinerama());
     }
 
     private static void enterFullScreenExclusive(Window w) {
@@ -348,7 +349,9 @@
         if (fsSupported && old != null) {
             // enter windowed mode (and restore original display mode)
             exitFullScreenExclusive(old);
-            setDisplayMode(origDisplayMode);
+            if (isDisplayChangeSupported()) {
+                setDisplayMode(origDisplayMode);
+            }
         }
 
         super.setFullScreenWindow(w);
@@ -431,7 +434,9 @@
                     Window old = getFullScreenWindow();
                     if (old != null) {
                         exitFullScreenExclusive(old);
-                        setDisplayMode(origDisplayMode);
+                        if (isDisplayChangeSupported()) {
+                            setDisplayMode(origDisplayMode);
+                        }
                     }
                 };
                 Thread t = new Thread(rootTG, r,"Display-Change-Shutdown-Thread-"+screen);
--- a/src/windows/native/java/lang/java_props_md.c	Tue Jun 23 04:07:36 2015 -0700
+++ b/src/windows/native/java/lang/java_props_md.c	Thu Jun 25 03:48:35 2015 -0700
@@ -348,8 +348,8 @@
 GetJavaProperties(JNIEnv* env)
 {
     static java_props_t sprops = {0};
-
-    OSVERSIONINFOEX ver;
+    int majorVersion;
+    int minorVersion;
 
     if (sprops.line_separator) {
         return &sprops;
@@ -380,21 +380,67 @@
     /* OS properties */
     {
         char buf[100];
-        SYSTEM_INFO si;
-        PGNSI pGNSI;
+        boolean is_workstation;
+        boolean is_64bit;
+        DWORD platformId;
+        {
+            OSVERSIONINFOEX ver;
+            ver.dwOSVersionInfoSize = sizeof(ver);
+            GetVersionEx((OSVERSIONINFO *) &ver);
+            majorVersion = ver.dwMajorVersion;
+            minorVersion = ver.dwMinorVersion;
+            is_workstation = (ver.wProductType == VER_NT_WORKSTATION);
+            platformId = ver.dwPlatformId;
+            sprops.patch_level = _strdup(ver.szCSDVersion);
+        }
 
-        ver.dwOSVersionInfoSize = sizeof(ver);
-        GetVersionEx((OSVERSIONINFO *) &ver);
+        {
+            SYSTEM_INFO si;
+            ZeroMemory(&si, sizeof(SYSTEM_INFO));
+            GetNativeSystemInfo(&si);
 
-        ZeroMemory(&si, sizeof(SYSTEM_INFO));
-        // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
-        pGNSI = (PGNSI) GetProcAddress(
-                GetModuleHandle(TEXT("kernel32.dll")),
-                "GetNativeSystemInfo");
-        if(NULL != pGNSI)
-            pGNSI(&si);
-        else
-            GetSystemInfo(&si);
+            is_64bit = (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64);
+        }
+        do {
+            // Read the major and minor version number from kernel32.dll
+            VS_FIXEDFILEINFO *file_info;
+            WCHAR kernel32_path[MAX_PATH];
+            DWORD version_size;
+            LPTSTR version_info;
+            UINT len, ret;
+
+            // Get the full path to \Windows\System32\kernel32.dll and use that for
+            // determining what version of Windows we're running on.
+            len = MAX_PATH - (UINT)strlen("\\kernel32.dll") - 1;
+            ret = GetSystemDirectoryW(kernel32_path, len);
+            if (ret == 0 || ret > len) {
+                break;
+            }
+            wcsncat(kernel32_path, L"\\kernel32.dll", MAX_PATH - ret);
+
+            version_size = GetFileVersionInfoSizeW(kernel32_path, NULL);
+            if (version_size == 0) {
+                break;
+            }
+
+            version_info = (LPTSTR)malloc(version_size);
+            if (version_info == NULL) {
+                break;
+            }
+
+            if (!GetFileVersionInfoW(kernel32_path, 0, version_size, version_info)) {
+                free(version_info);
+                break;
+            }
+
+            if (!VerQueryValueW(version_info, L"\\", (LPVOID*)&file_info, &len)) {
+                free(version_info);
+                break;
+            }
+            majorVersion = HIWORD(file_info->dwProductVersionMS);
+            minorVersion = LOWORD(file_info->dwProductVersionMS);
+            free(version_info);
+        } while (0);
 
         /*
          * From msdn page on OSVERSIONINFOEX, current as of this
@@ -420,17 +466,15 @@
          * 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 10                   10              0  (VER_NT_WORKSTATION)
          *
          * This mapping will presumably be augmented as new Windows
          * versions are released.
          */
-        switch (ver.dwPlatformId) {
-        case VER_PLATFORM_WIN32s:
-            sprops.os_name = "Windows 3.1";
-            break;
+        switch (platformId) {
         case VER_PLATFORM_WIN32_WINDOWS:
-           if (ver.dwMajorVersion == 4) {
-                switch (ver.dwMinorVersion) {
+           if (majorVersion == 4) {
+                switch (minorVersion) {
                 case  0: sprops.os_name = "Windows 95";           break;
                 case 10: sprops.os_name = "Windows 98";           break;
                 case 90: sprops.os_name = "Windows Me";           break;
@@ -441,10 +485,10 @@
             }
             break;
         case VER_PLATFORM_WIN32_NT:
-            if (ver.dwMajorVersion <= 4) {
+            if (majorVersion <= 4) {
                 sprops.os_name = "Windows NT";
-            } else if (ver.dwMajorVersion == 5) {
-                switch (ver.dwMinorVersion) {
+            } else if (majorVersion == 5) {
+                switch (minorVersion) {
                 case  0: sprops.os_name = "Windows 2000";         break;
                 case  1: sprops.os_name = "Windows XP";           break;
                 case  2:
@@ -459,8 +503,7 @@
                     * If it is, the operating system is Windows XP 64 bit;
                     * otherwise, it is Windows Server 2003."
                     */
-                    if(ver.wProductType == VER_NT_WORKSTATION &&
-                       si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
+                    if (is_workstation && is_64bit) {
                         sprops.os_name = "Windows XP"; /* 64 bit */
                     } else {
                         sprops.os_name = "Windows 2003";
@@ -468,12 +511,12 @@
                     break;
                 default: sprops.os_name = "Windows NT (unknown)"; break;
                 }
-            } else if (ver.dwMajorVersion == 6) {
+            } else if (majorVersion == 6) {
                 /*
                  * See table in MSDN OSVERSIONINFOEX documentation.
                  */
-                if (ver.wProductType == VER_NT_WORKSTATION) {
-                    switch (ver.dwMinorVersion) {
+                if (is_workstation) {
+                    switch (minorVersion) {
                     case  0: sprops.os_name = "Windows Vista";        break;
                     case  1: sprops.os_name = "Windows 7";            break;
                     case  2: sprops.os_name = "Windows 8";            break;
@@ -481,7 +524,7 @@
                     default: sprops.os_name = "Windows NT (unknown)";
                     }
                 } else {
-                    switch (ver.dwMinorVersion) {
+                    switch (minorVersion) {
                     case  0: sprops.os_name = "Windows Server 2008";    break;
                     case  1: sprops.os_name = "Windows Server 2008 R2"; break;
                     case  2: sprops.os_name = "Windows Server 2012";    break;
@@ -489,6 +532,17 @@
                     default: sprops.os_name = "Windows NT (unknown)";
                     }
                 }
+            } else if (majorVersion == 10) {
+                if (is_workstation) {
+                    switch (minorVersion) {
+                    case  0: sprops.os_name = "Windows 10";           break;
+                    default: sprops.os_name = "Windows NT (unknown)";
+                    }
+                } else {
+                    switch (minorVersion) {
+                    default: sprops.os_name = "Windows NT (unknown)";
+                    }
+                }
             } else {
                 sprops.os_name = "Windows NT (unknown)";
             }
@@ -497,7 +551,7 @@
             sprops.os_name = "Windows (unknown)";
             break;
         }
-        sprintf(buf, "%d.%d", ver.dwMajorVersion, ver.dwMinorVersion);
+        sprintf(buf, "%d.%d", majorVersion, minorVersion);
         sprops.os_version = _strdup(buf);
 #if _M_IA64
         sprops.os_arch = "ia64";
@@ -508,9 +562,6 @@
 #else
         sprops.os_arch = "unknown";
 #endif
-
-        sprops.patch_level = _strdup(ver.szCSDVersion);
-
         sprops.desktop = "windows";
     }
 
@@ -621,7 +672,7 @@
                            &display_encoding);
 
             sprops.sun_jnu_encoding = getEncodingInternal(systemDefaultLCID);
-            if (LANGIDFROMLCID(userDefaultLCID) == 0x0c04 && ver.dwMajorVersion == 6) {
+            if (LANGIDFROMLCID(userDefaultLCID) == 0x0c04 && majorVersion == 6) {
                 // MS claims "Vista has built-in support for HKSCS-2004.
                 // All of the HKSCS-2004 characters have Unicode 4.1.
                 // PUA code point assignments". But what it really means
--- a/src/windows/resource/java.manifest	Tue Jun 23 04:07:36 2015 -0700
+++ b/src/windows/resource/java.manifest	Thu Jun 25 03:48:35 2015 -0700
@@ -52,6 +52,8 @@
         <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
         <!-- Windows 8.1 -->
         <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+        <!-- Windows 10 -->
+        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
       </application>
     </compatibility>
 
--- a/test/TEST.groups	Tue Jun 23 04:07:36 2015 -0700
+++ b/test/TEST.groups	Thu Jun 25 03:48:35 2015 -0700
@@ -489,6 +489,7 @@
   java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java \
   java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java \
   java/lang/System/MacEncoding/TestFileEncoding.java \
+  java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java \
   java/nio/channels/AsynchronousSocketChannel/Leaky.java \
   java/security/PermissionCollection/Concurrent.java \
   java/security/Principal/Implies.java \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/com/sun/jndi/ldap/LdapURLOptionalFields.java	Thu Jun 25 03:48:35 2015 -0700
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, Red Hat, Inc.
+ * 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 8074761
+ * @summary RFC-2255 allows attribute, scope and filter to be empty.
+ */
+
+import com.sun.jndi.ldap.LdapURL;
+
+public class LdapURLOptionalFields {
+
+    private static final String[] TEST_URLS = {
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com?",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com??",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com???",
+        "ldap://localhost:10389/ou=RefPeople,dc=example,dc=com????"
+    };
+
+    public static void main(String[] args) throws Exception {
+        for (int i = 0; i < TEST_URLS.length; i++) {
+            String url = TEST_URLS[i];
+            checkEmptyAttributes(url);
+        }
+    }
+
+    private static void checkEmptyAttributes(String urlString) throws Exception {
+        LdapURL url = new LdapURL(urlString);
+        if (url.getAttributes() != null) {
+            throw new Exception("Expected null attributes for url: '" + urlString + "'");
+        }
+        if (url.getScope() != null) {
+            throw new Exception("Expected null scope for url: '" + urlString + "'");
+        }
+        if (url.getFilter() != null) {
+            throw new Exception("Expected null filter for url: '" + urlString + "'");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/FullScreen/MultimonFullscreenTest/MultimonDeadlockTest.java	Thu Jun 25 03:48:35 2015 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+  @test
+  @bug 8129116
+  @summary Deadlock with multimonitor fullscreen windows.
+  @run main/timeout=20 MultimonDeadlockTest
+ */
+import java.awt.*;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.lang.reflect.InvocationTargetException;
+
+public class MultimonDeadlockTest {
+
+    public static void main(String argv[]) {
+        final GraphicsDevice[] devices = GraphicsEnvironment
+                .getLocalGraphicsEnvironment()
+                .getScreenDevices();
+        if (devices.length < 2) {
+            System.out.println("It's a multiscreen test... skipping!");
+            return;
+        }
+
+        Frame frames[] = new Frame[devices.length];
+        try {
+            EventQueue.invokeAndWait(() -> {
+                for (int i = 0; i < devices.length; i++) {
+                    frames[i] = new Frame();
+                    frames[i].setSize(100, 100);
+                    frames[i].setBackground(Color.BLUE);
+                    devices[i].setFullScreenWindow(frames[i]);
+                }
+            });
+            Thread.sleep(5000);
+        } catch (InterruptedException | InvocationTargetException ex) {
+        } finally {
+            for (int i = 0; i < devices.length; i++) {
+                devices[i].setFullScreenWindow(null);
+                frames[i].dispose();
+            }
+        }
+
+    }
+}
--- a/test/java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java	Tue Jun 23 04:07:36 2015 -0700
+++ b/test/java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java	Thu Jun 25 03:48:35 2015 -0700
@@ -79,23 +79,18 @@
         CountDownLatch end = new CountDownLatch(CORES);
         final Map<Thread, Throwable> threadUncaughtExceptions
                 = Collections.synchronizedMap(new HashMap<Thread, Throwable>(CORES));
-        Thread.UncaughtExceptionHandler exHandler = (t, e) -> {
-            threadUncaughtExceptions.put(t, e);
-        };
         for (int i = 0; i < CORES; ++i) {
             TestMethods.Kind kind = KINDS[i % KINDS.length];
             Thread t = new Thread(() -> {
                 try {
                     begin.await();
                     adapters.add(getTestMethod().getTestCaseMH(data, kind));
-                } catch (InterruptedException | BrokenBarrierException
-                        | IllegalAccessException | NoSuchMethodException ex) {
-                    throw new Error("Unexpected exception", ex);
+                } catch (Throwable ex) {
+                    threadUncaughtExceptions.put(Thread.currentThread(), ex);
                 } finally {
                     end.countDown();
                 }
             });
-            t.setUncaughtExceptionHandler(exHandler);
             t.start();
         }
         try {
--- a/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Tue Jun 23 04:07:36 2015 -0700
+++ b/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Thu Jun 25 03:48:35 2015 -0700
@@ -104,6 +104,8 @@
             default:
                 throw new RuntimeException("Wrong parameter: " + args[0]);
         }
+
+        System.out.println("Test passed");
     }
 
     /*
@@ -128,7 +130,6 @@
                 }
             }
 
-            server.stop();
             while (server.isRunning()) {
                 sleep();
             }
@@ -224,11 +225,19 @@
                 } catch (SSLHandshakeException e) {
                     System.out.println("Server: run: " + e);
                     sslError = true;
+                    stopped = true;
                 } catch (IOException e) {
                     if (!stopped) {
-                        System.out.println("Server: run: " + e);
+                        System.out.println("Server: run: unexpected exception: "
+                                + e);
                         e.printStackTrace();
                         otherError = true;
+                        stopped = true;
+                    } else {
+                        System.out.println("Server: run: " + e);
+                        System.out.println("The exception above occurred "
+                                    + "because socket was closed, "
+                                    + "please ignore it");
                     }
                 }
             }
@@ -261,6 +270,7 @@
             stopped = true;
             if (!ssocket.isClosed()) {
                 try {
+                    System.out.println("Server: close socket");
                     ssocket.close();
                 } catch (IOException e) {
                     System.out.println("Server: close: " + e);