7174887: Deadlock in jndi ldap connection cleanup
authorrobm
Mon, 02 Jul 2012 19:32:35 +0100
changeset 13157 2141a68fb2a7
parent 13156 e88d9099b6f0
child 13158 f628cbfcbfa0
7174887: Deadlock in jndi ldap connection cleanup Reviewed-by: xuelei
jdk/src/share/classes/com/sun/jndi/ldap/Connection.java
jdk/src/share/classes/com/sun/jndi/ldap/LdapClient.java
--- a/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java	Fri Jun 29 16:16:13 2012 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java	Mon Jul 02 19:32:35 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -680,9 +680,11 @@
                         ldr = ldr.next;
                     }
                 }
-                parent.processConnectionClosure();
             }
         }
+        if (nparent) {
+            parent.processConnectionClosure();
+        }
     }
 
 
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Fri Jun 29 16:16:13 2012 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapClient.java	Mon Jul 02 19:32:35 2012 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -488,14 +488,16 @@
      */
     void processConnectionClosure() {
         // Notify listeners
-        if (unsolicited.size() > 0) {
-            String msg;
-            if (conn != null) {
-                msg = conn.host + ":" + conn.port + " connection closed";
-            } else {
-                msg = "Connection closed";
+        synchronized (unsolicited) {
+            if (unsolicited.size() > 0) {
+                String msg;
+                if (conn != null) {
+                    msg = conn.host + ":" + conn.port + " connection closed";
+                } else {
+                    msg = "Connection closed";
+                }
+                notifyUnsolicited(new CommunicationException(msg));
             }
-            notifyUnsolicited(new CommunicationException(msg));
         }
 
         // Remove from pool