You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/03/14 07:46:29 UTC

svn commit: r518040 - in /mina: branches/1.0/core/src/main/java/org/apache/mina/management/ branches/1.1/core/src/main/java/org/apache/mina/management/ trunk/core/src/main/java/org/apache/mina/management/

Author: trustin
Date: Tue Mar 13 23:46:28 2007
New Revision: 518040

URL: http://svn.apache.org/viewvc?view=rev&rev=518040
Log:
Fixed issue: StatCollector deadlocks in 1.0.2
* Fixed deadlock by using a different lock for throughput calculation


Modified:
    mina/branches/1.0/core/src/main/java/org/apache/mina/management/StatCollector.java
    mina/branches/1.1/core/src/main/java/org/apache/mina/management/StatCollector.java
    mina/trunk/core/src/main/java/org/apache/mina/management/StatCollector.java

Modified: mina/branches/1.0/core/src/main/java/org/apache/mina/management/StatCollector.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/management/StatCollector.java?view=diff&rev=518040&r1=518039&r2=518040
==============================================================================
--- mina/branches/1.0/core/src/main/java/org/apache/mina/management/StatCollector.java (original)
+++ mina/branches/1.0/core/src/main/java/org/apache/mina/management/StatCollector.java Tue Mar 13 23:46:28 2007
@@ -64,6 +64,7 @@
      */
     private static volatile int nextId = 0;
     private final int id = nextId ++;
+    private final Object calcLock = new Object();
     
     private final IoService service;
     private Worker worker;
@@ -165,6 +166,10 @@
     {
         synchronized (this) 
         {
+            if (worker == null) {
+                return;
+            }
+
             service.removeListener( serviceListener );
 
             // stop worker
@@ -187,6 +192,8 @@
                 session.removeAttribute(KEY);
             }
             polledSessions.clear();
+            
+            worker = null;
         }
     }
 
@@ -221,7 +228,7 @@
         
         // computing with time between polling and closing
         long currentTime = System.currentTimeMillis();
-        synchronized( this )
+        synchronized( calcLock )
         {
             bytesReadThroughput += (session.getReadBytes() - sessStat.lastByteRead) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
             bytesWrittenThroughput += (session.getWrittenBytes() - sessStat.lastByteWrite) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
@@ -329,7 +336,7 @@
                         / ( pollingInterval / 1000f );
                     tmpMsgWrittenThroughput += sessStat.messageWrittenThroughput;
 
-                    synchronized( StatCollector.this )
+                    synchronized( calcLock )
                     {
                         msgWrittenThroughput = tmpMsgWrittenThroughput;
                         msgReadThroughput = tmpMsgReadThroughput;

Modified: mina/branches/1.1/core/src/main/java/org/apache/mina/management/StatCollector.java
URL: http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/management/StatCollector.java?view=diff&rev=518040&r1=518039&r2=518040
==============================================================================
--- mina/branches/1.1/core/src/main/java/org/apache/mina/management/StatCollector.java (original)
+++ mina/branches/1.1/core/src/main/java/org/apache/mina/management/StatCollector.java Tue Mar 13 23:46:28 2007
@@ -63,6 +63,7 @@
      */
     private static volatile int nextId = 0;
     private final int id = nextId ++;
+    private final Object calcLock = new Object();
     
     private final IoService service;
     private Worker worker;
@@ -164,6 +165,10 @@
     {
         synchronized (this) 
         {
+            if (worker == null) {
+                return;
+            }
+
             service.removeListener( serviceListener );
 
             // stop worker
@@ -186,6 +191,8 @@
                 session.removeAttribute(KEY);
             }
             polledSessions.clear();
+            
+            worker = null;
         }
     }
 
@@ -220,7 +227,7 @@
         
         // computing with time between polling and closing
         long currentTime = System.currentTimeMillis();
-        synchronized( this )
+        synchronized( calcLock )
         {
             bytesReadThroughput += (session.getReadBytes() - sessStat.lastByteRead) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
             bytesWrittenThroughput += (session.getWrittenBytes() - sessStat.lastByteWrite) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
@@ -328,7 +335,7 @@
                         / ( pollingInterval / 1000f );
                     tmpMsgWrittenThroughput += sessStat.messageWrittenThroughput;
 
-                    synchronized( StatCollector.this )
+                    synchronized( calcLock )
                     {
                         msgWrittenThroughput = tmpMsgWrittenThroughput;
                         msgReadThroughput = tmpMsgReadThroughput;

Modified: mina/trunk/core/src/main/java/org/apache/mina/management/StatCollector.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/management/StatCollector.java?view=diff&rev=518040&r1=518039&r2=518040
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/management/StatCollector.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/management/StatCollector.java Tue Mar 13 23:46:28 2007
@@ -60,6 +60,7 @@
      */
     private static volatile int nextId = 0;
     private final int id = nextId ++;
+    private final Object calcLock = new Object();
     
     private final IoService service;
     private Worker worker;
@@ -153,6 +154,10 @@
     {
         synchronized (this) 
         {
+            if (worker == null) {
+                return;
+            }
+
             service.removeListener( serviceListener );
 
             // stop worker
@@ -175,6 +180,8 @@
                 session.removeAttribute(KEY);
             }
             polledSessions.clear();
+            
+            worker = null;
         }
     }
 
@@ -209,7 +216,7 @@
         
         // computing with time between polling and closing
         long currentTime = System.currentTimeMillis();
-        synchronized( this )
+        synchronized( calcLock )
         {
             bytesReadThroughput += (session.getReadBytes() - sessStat.lastByteRead) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
             bytesWrittenThroughput += (session.getWrittenBytes() - sessStat.lastByteWrite) /  ( ( currentTime - sessStat.lastPollingTime ) /1000f ) ;
@@ -317,7 +324,7 @@
                         / ( pollingInterval / 1000f );
                     tmpMsgWrittenThroughput += sessStat.messageWrittenThroughput;
 
-                    synchronized( StatCollector.this )
+                    synchronized( calcLock )
                     {
                         msgWrittenThroughput = tmpMsgWrittenThroughput;
                         msgReadThroughput = tmpMsgReadThroughput;