You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/12/06 09:37:19 UTC

svn commit: r354362 - in /directory/network/trunk/src/java/org/apache/mina/common: CloseFuture.java ConnectFuture.java IoFuture.java WriteFuture.java support/BaseIoSession.java

Author: trustin
Date: Tue Dec  6 00:37:11 2005
New Revision: 354362

URL: http://svn.apache.org/viewcvs?rev=354362&view=rev
Log:
* Changed IoFuture so it can use a lock object other than 'this'.
* BaseIoSession.closeFuture now uses IoSession as a lock so it is fully thread-safe.

Modified:
    directory/network/trunk/src/java/org/apache/mina/common/CloseFuture.java
    directory/network/trunk/src/java/org/apache/mina/common/ConnectFuture.java
    directory/network/trunk/src/java/org/apache/mina/common/IoFuture.java
    directory/network/trunk/src/java/org/apache/mina/common/WriteFuture.java
    directory/network/trunk/src/java/org/apache/mina/common/support/BaseIoSession.java

Modified: directory/network/trunk/src/java/org/apache/mina/common/CloseFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/CloseFuture.java?rev=354362&r1=354361&r2=354362&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/CloseFuture.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/CloseFuture.java Tue Dec  6 00:37:11 2005
@@ -37,6 +37,21 @@
 public class CloseFuture extends IoFuture
 {
     /**
+     * Creates a new instance.
+     */
+    public CloseFuture()
+    {
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public CloseFuture( Object lock )
+    {
+        super( lock );
+    }
+    
+    /**
      * Returns <tt>true</tt> if the close request is finished and the session is closed.
      */
     public boolean isClosed()

Modified: directory/network/trunk/src/java/org/apache/mina/common/ConnectFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/ConnectFuture.java?rev=354362&r1=354361&r2=354362&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/ConnectFuture.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/ConnectFuture.java Tue Dec  6 00:37:11 2005
@@ -48,6 +48,18 @@
         failedFuture.setException( exception );
         return failedFuture;
     }
+    
+    public ConnectFuture()
+    {
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public ConnectFuture( Object lock )
+    {
+        super( lock );
+    }
 
     /**
      * Returns {@link IoSession} which is the result of connect operation.

Modified: directory/network/trunk/src/java/org/apache/mina/common/IoFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/IoFuture.java?rev=354362&r1=354361&r2=354362&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/IoFuture.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/IoFuture.java Tue Dec  6 00:37:11 2005
@@ -27,6 +27,7 @@
  */
 public class IoFuture
 {
+    private final Object lock;
     private Object result;
     private Callback callback;
     private boolean ready;
@@ -52,21 +53,37 @@
      */
     protected IoFuture()
     {
+        this.lock = this;
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    protected IoFuture( Object lock )
+    {
+        if( lock == null )
+        {
+            throw new NullPointerException( "lock" );
+        }
+        this.lock = lock;
     }
     
     /**
      * Wait for the asynchronous operation to end.
      */
-    public synchronized void join()
+    public void join()
     {
-        while( !ready )
+        synchronized( lock )
         {
-            try
-            {
-                wait();
-            }
-            catch( InterruptedException e )
+            while( !ready )
             {
+                try
+                {
+                    lock.wait();
+                }
+                catch( InterruptedException e )
+                {
+                }
             }
         }
     }
@@ -76,38 +93,42 @@
      * 
      * @return <tt>true</tt> if the operation is finished.
      */
-    public synchronized boolean join( long timeoutInMillis )
+    public boolean join( long timeoutInMillis )
     {
         long startTime = ( timeoutInMillis <= 0 ) ? 0 : System
                 .currentTimeMillis();
         long waitTime = timeoutInMillis;
-        if( ready )
-        {
-            return ready;
-        }
-        else if( waitTime <= 0 )
+        
+        synchronized( lock )
         {
-            return ready;
-        }
-
-        for( ;; )
-        {
-            try
+            if( ready )
             {
-                wait( waitTime );
+                return ready;
             }
-            catch( InterruptedException e )
+            else if( waitTime <= 0 )
             {
+                return ready;
             }
 
-            if( ready )
-                return true;
-            else
+            for( ;; )
             {
-                waitTime = timeoutInMillis - ( System.currentTimeMillis() - startTime );
-                if( waitTime <= 0 )
+                try
+                {
+                    lock.wait( waitTime );
+                }
+                catch( InterruptedException e )
+                {
+                }
+
+                if( ready )
+                    return true;
+                else
                 {
-                    return ready;
+                    waitTime = timeoutInMillis - ( System.currentTimeMillis() - startTime );
+                    if( waitTime <= 0 )
+                    {
+                        return ready;
+                    }
                 }
             }
         }
@@ -116,40 +137,52 @@
     /**
      * Returns if the asynchronous operation is finished.
      */
-    public synchronized boolean isReady()
+    public boolean isReady()
     {
-        return ready;
+        synchronized( lock )
+        {
+            return ready;
+        }
     }
 
     /**
      * Sets the result of the asynchronous operation, and mark it as finished.
      */
-    protected synchronized void setValue( Object newValue )
+    protected void setValue( Object newValue )
     {
-        result = newValue;
-        ready = true;
-        notifyAll();
-
-        if( callback != null )
+        synchronized( lock )
         {
-            invokeCallback();
+            result = newValue;
+            ready = true;
+            lock.notifyAll();
+    
+            if( callback != null )
+            {
+                invokeCallback();
+            }
         }
     }
 
     /**
      * Returns the result of the asynchronous operation.
      */
-    protected synchronized Object getValue()
+    protected Object getValue()
     {
-        return result;
+        synchronized( lock )
+        {
+            return result;
+        }
     }
     
     /**
      * Returns a {@link Callback} which is associated with this future.
      */
-    public synchronized Callback getCallback()
+    public Callback getCallback()
     {
-        return callback;
+        synchronized( lock )
+        {
+            return callback;
+        }
     }
     
     /**
@@ -157,17 +190,20 @@
      * becomes available.  If tth result has already become obtained,
      * the specified callback is notified immediately
      */
-    public synchronized void setCallback( Callback callback ) 
+    public void setCallback( Callback callback ) 
     {
         if( callback == null )
         {
             throw new NullPointerException( "callback" );
         }
 
-        this.callback = callback;
-        if( ready )
+        synchronized( lock )
         {
-            invokeCallback();
+            this.callback = callback;
+            if( ready )
+            {
+                invokeCallback();
+            }
         }
     }
 

Modified: directory/network/trunk/src/java/org/apache/mina/common/WriteFuture.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/WriteFuture.java?rev=354362&r1=354361&r2=354362&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/WriteFuture.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/WriteFuture.java Tue Dec  6 00:37:11 2005
@@ -64,6 +64,21 @@
     }
     
     /**
+     * Creates a new instance.
+     */
+    public WriteFuture()
+    {
+    }
+    
+    /**
+     * Creates a new instance which uses the specified object as a lock.
+     */
+    public WriteFuture( Object lock )
+    {
+        super( lock );
+    }
+    
+    /**
      * Returns <tt>true</tt> if the write operation is finished successfully.
      */
     public boolean isWritten()

Modified: directory/network/trunk/src/java/org/apache/mina/common/support/BaseIoSession.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/common/support/BaseIoSession.java?rev=354362&r1=354361&r2=354362&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/common/support/BaseIoSession.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/common/support/BaseIoSession.java Tue Dec  6 00:37:11 2005
@@ -45,7 +45,7 @@
     /** 
      * A future that will be set 'closed' when the connection is closed.
      */
-    private final CloseFuture closeFuture = new CloseFuture();
+    private final CloseFuture closeFuture = new CloseFuture( this );
     private boolean closing;
 
     // Configuration variables
@@ -120,7 +120,7 @@
     public synchronized WriteFuture write( Object message )
     {
         WriteFuture future = new WriteFuture();
-        if( isClosing() )
+        if( isClosing() || !isConnected() )
         {
             future.setWritten( false );
         }