changeset 11429:e2117e30fb39

Merge
author robm
date Fri, 12 Feb 2016 19:11:40 +0000
parents cbde29a3b05d (current diff) 78def9711bfe (diff)
children 05272fc62173
files
diffstat 5 files changed, 68 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java	Fri Feb 05 09:34:06 2016 -0800
+++ b/src/share/classes/org/jcp/xml/dsig/internal/dom/DOMURIDereferencer.java	Fri Feb 12 19:11:40 2016 +0000
@@ -21,7 +21,7 @@
  * under the License.
  */
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * $Id: DOMURIDereferencer.java 1231033 2012-01-13 12:12:12Z coheigea $
@@ -111,7 +111,8 @@
         try {
             ResourceResolver apacheResolver =
                 ResourceResolver.getInstance(uriAttr, baseURI, secVal);
-            XMLSignatureInput in = apacheResolver.resolve(uriAttr, baseURI);
+            XMLSignatureInput in = apacheResolver.resolve(uriAttr,
+                                                          baseURI, secVal);
             if (in.isOctetStream()) {
                 return new ApacheOctetStreamData(in);
             } else {
--- a/src/share/classes/sun/rmi/transport/DGCAckHandler.java	Fri Feb 05 09:34:06 2016 -0800
+++ b/src/share/classes/sun/rmi/transport/DGCAckHandler.java	Fri Feb 12 19:11:40 2016 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2012, 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
@@ -118,6 +118,9 @@
         if (objList != null && task == null) {
             task = scheduler.schedule(new Runnable() {
                 public void run() {
+                    if (id != null) {
+                        idTable.remove(id);
+                    }
                     release();
                 }
             }, dgcAckTimeout, TimeUnit.MILLISECONDS);
--- a/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Fri Feb 05 09:34:06 2016 -0800
+++ b/src/solaris/classes/sun/awt/X11/XBaseWindow.java	Fri Feb 12 19:11:40 2016 +0000
@@ -669,7 +669,7 @@
         XToolkit.awtLock();
         try {
             XAtom xa = XAtom.get(XAtom.XA_WM_CLASS);
-            xa.setProperty8(getWindow(), cl[0] + '\0' + cl[1]);
+            xa.setProperty8(getWindow(), cl[0] + '\0' + cl[1] + '\0');
         } finally {
             XToolkit.awtUnlock();
         }
--- a/test/java/lang/management/ThreadMXBean/Locks.java	Fri Feb 05 09:34:06 2016 -0800
+++ b/test/java/lang/management/ThreadMXBean/Locks.java	Fri Feb 12 19:11:40 2016 +0000
@@ -170,6 +170,9 @@
     private static CheckerThread checker;
     static class WaitingThread extends Thread {
         private final Phaser p;
+
+        volatile boolean waiting = false;
+
         public WaitingThread(Phaser p) {
             super("WaitingThread");
             this.p = p;
@@ -180,7 +183,9 @@
                 log("WaitingThread about to wait on objC");
                 try {
                     // Signal checker thread, about to wait on objC.
+                    waiting = false;
                     p.arriveAndAwaitAdvance(); // Phase 1 (waiting)
+                    waiting = true;
                     objC.wait();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
@@ -199,7 +204,9 @@
             synchronized(objC) {
                 try {
                     // signal checker thread, about to wait on objC
+                    waiting = false;
                     p.arriveAndAwaitAdvance(); // Phase 3 (waiting)
+                    waiting = true;
                     objC.wait();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
@@ -208,25 +215,35 @@
             }
             log("WaitingThread about to exit waiting on objC 2");
         }
-    }
-    static class CheckerThread extends Thread {
-        private final Phaser p;
-        public CheckerThread(Phaser p) {
-            super("CheckerThread");
-            this.p = p;
+
+        public void waitForWaiting() {
+            p.arriveAndAwaitAdvance();
+            while (!waiting) {
+                goSleep(10);
+            }
+            waitForState(State.WAITING);
+        }
+
+        public void waitForBlocked() {
+            p.arriveAndAwaitAdvance();
+            waitForState(State.BLOCKED);
         }
 
         private void waitForState(Thread.State state) {
-            p.arriveAndAwaitAdvance();
             while (!waiter.isInterrupted() && waiter.getState() != state) {
-                goSleep(10);
+                Thread.yield();
             }
         }
+    }
+    static class CheckerThread extends Thread {
+        public CheckerThread() {
+            super("CheckerThread");
+        }
 
         public void run() {
             synchronized (ready) {
                 // wait until WaitingThread about to wait for objC
-                waitForState(Thread.State.WAITING); // Phase 1 (waiting)
+                waiter.waitForWaiting(); // Phase 1 (waiting)
                 checkBlockedObject(waiter, objC, null, Thread.State.WAITING);
 
                 synchronized (objC) {
@@ -235,13 +252,13 @@
 
                 // wait for waiter thread to about to enter
                 // synchronized object ready.
-                waitForState(Thread.State.BLOCKED); // Phase 2 (waiting)
+                waiter.waitForBlocked(); // Phase 2 (waiting)
                 checkBlockedObject(waiter, ready, this, Thread.State.BLOCKED);
             }
 
             // wait for signal from waiting thread that it is about
             // wait for objC.
-            waitForState(Thread.State.WAITING); // Phase 3 (waiting)
+            waiter.waitForWaiting(); // Phase 3 (waiting)
             synchronized(objC) {
                 checkBlockedObject(waiter, objC, Thread.currentThread(), Thread.State.WAITING);
                 objC.notify();
@@ -289,7 +306,7 @@
         waiter = new WaitingThread(p);
         waiter.start();
 
-        checker = new CheckerThread(p);
+        checker = new CheckerThread();
         checker.start();
 
         try {
--- a/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure.java	Fri Feb 05 09:34:06 2016 -0800
+++ b/test/java/rmi/dgc/dgcAckFailure/DGCAckFailure.java	Fri Feb 12 19:11:40 2016 +0000
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4017232
+ * @bug 4017232 8046339
  * @summary If, after returning a reference to a remote object in the current
  * VM (which gets implicitly converted to a remote stub), the client fails to
  * both send a DGC dirty call and to send a "DGC acknowledgment", the RMI
@@ -36,10 +36,14 @@
 
 import java.io.*;
 import java.net.*;
+import java.lang.reflect.Field;
 import java.lang.ref.*;
 
 import java.rmi.*;
 import java.rmi.server.*;
+import java.util.Map;
+
+import sun.rmi.transport.DGCAckHandler;
 
 interface ReturnRemote extends Remote {
     Object returnRemote() throws RemoteException;
@@ -48,6 +52,7 @@
 public class DGCAckFailure implements ReturnRemote {
 
     private static final long TIMEOUT = 20000;
+    private static final long ACK_TIMEOUT = TIMEOUT / 2;
 
     public Object returnRemote() {
         return new Wrapper(this);
@@ -55,7 +60,8 @@
 
     public static void main(String[] args) throws Exception {
 
-        System.setProperty("sun.rmi.dgc.ackTimeout", "10000");
+        System.setProperty("sun.rmi.dgc.ackTimeout",
+                Long.toString(ACK_TIMEOUT));
 
         /*
          * Set a socket factory that has a hook for shutting down all client
@@ -93,12 +99,31 @@
                     break;
                 }
             }
-            if (ref == weakRef) {
-                System.err.println("TEST PASSED");
-            } else {
+            if (ref != weakRef) {
                 throw new RuntimeException("TEST FAILED: " +
                     "timed out, remote object not garbage collected");
             }
+
+            // 8046339
+            // All DGCAckHandlers must be properly released after timeout
+            Thread.sleep(ACK_TIMEOUT + 100);
+            try {
+                Field field =
+                        DGCAckHandler.class.getDeclaredField("idTable");
+                field.setAccessible(true);
+                Object obj = field.get(null);
+                Map<?,?> idTable = (Map<?,?>)obj;
+
+                if (!idTable.isEmpty()) {
+                    throw new RuntimeException("TEST FAILED: " +
+                            "DGCAckHandler.idTable isn't empty");
+                }
+            } catch (ReflectiveOperationException roe) {
+                throw new RuntimeException(roe);
+            }
+
+            System.err.println("TEST PASSED");
+
         } finally {
             try {
                 UnicastRemoteObject.unexportObject((Remote) weakRef.get(),