[jboss-remoting-commits] JBoss Remoting SVN: r4677 - remoting3/trunk/api/src/main/java/org/jboss/remoting/spi.

jboss-remoting-commits at lists.jboss.org jboss-remoting-commits at lists.jboss.org
Thu Nov 13 23:07:41 EST 2008


Author: david.lloyd at jboss.com
Date: 2008-11-13 23:07:41 -0500 (Thu, 13 Nov 2008)
New Revision: 4677

Modified:
   remoting3/trunk/api/src/main/java/org/jboss/remoting/spi/AbstractAutoCloseable.java
Log:
Fix a memory leak issue; fix a race condition

Modified: remoting3/trunk/api/src/main/java/org/jboss/remoting/spi/AbstractAutoCloseable.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/remoting/spi/AbstractAutoCloseable.java	2008-11-13 22:36:44 UTC (rev 4676)
+++ remoting3/trunk/api/src/main/java/org/jboss/remoting/spi/AbstractAutoCloseable.java	2008-11-14 04:07:41 UTC (rev 4677)
@@ -23,12 +23,16 @@
 package org.jboss.remoting.spi;
 
 import java.io.IOException;
+import java.io.Closeable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.lang.ref.WeakReference;
 import org.jboss.remoting.RemotingException;
 import org.jboss.remoting.CloseHandler;
+import org.jboss.remoting.HandleableCloseable;
 import org.jboss.xnio.log.Logger;
 import org.jboss.xnio.IoUtils;
+import org.jboss.xnio.WeakCloseable;
 
 /**
  * A closeable implementation that supports reference counting.  Since the initial reference count is zero, implementors
@@ -98,24 +102,20 @@
      * @throws RemotingException if the resource is closed
      */
     public Handle<T> getHandle() throws IOException {
-        return new HandleImpl();
+        final HandleImpl handle = new HandleImpl();
+        final Key key = addCloseHandler(new HandleCloseHandler<T>(handle));
+        handle.addCloseHandler(new KeyCloseHandler<Handle<T>>(key));
+        return handle;
     }
 
     private final class HandleImpl extends AbstractHandleableCloseable<Handle<T>> implements Handle<T> {
-        private final Key key;
 
         private HandleImpl() throws IOException {
             super(AbstractAutoCloseable.this.executor);
-            key = AbstractAutoCloseable.this.addCloseHandler(new CloseHandler<T>() {
-                public void handleClose(final T closed) {
-                    IoUtils.safeClose(HandleImpl.this);
-                }
-            });
             inc();
         }
 
         protected void closeAction() throws IOException {
-            key.remove();
             dec();
         }
 
@@ -125,11 +125,36 @@
         }
 
         public String toString() {
-            return "handle <" + Integer.toString(hashCode(), 16) + "> to " + String.valueOf(AbstractAutoCloseable.this);
+            return "handle <" + Integer.toHexString(hashCode()) + "> to " + String.valueOf(AbstractAutoCloseable.this);
         }
     }
 
+    private static class HandleCloseHandler<T> implements CloseHandler<T> {
+
+        private final Closeable handle;
+
+        public HandleCloseHandler(final Handle<T> handle) {
+            this.handle = new WeakCloseable(new WeakReference<Closeable>(handle));
+        }
+
+        public void handleClose(final T closed) {
+            IoUtils.safeClose(handle);
+        }
+    }
+
+    private static class KeyCloseHandler<T> implements CloseHandler<T> {
+        private final Key key;
+
+        public KeyCloseHandler(final Key key) {
+            this.key = key;
+        }
+
+        public void handleClose(final T closed) {
+            key.remove();
+        }
+    }
+
     public String toString() {
-        return "generic resource <" + Integer.toString(hashCode(), 16) + ">";
+        return "generic resource <" + Integer.toHexString(hashCode()) + ">";
     }
 }




More information about the jboss-remoting-commits mailing list