Author: trustin
Date: Fri Jul 6 04:55:57 2007
New Revision: 553852
URL: http://svn.apache.org/viewvc?view=rev&rev=553852
Log:
Made sure notifyAll is not invoked when nobody's waiting
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java?view=diff&rev=553852&r1=553851&r2=553852
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/common/support/DefaultIoFuture.java
Fri Jul 6 04:55:57 2007
@@ -41,6 +41,7 @@
private List<IoFutureListener> otherListeners;
private Object result;
private boolean ready;
+ private int waiters;
/**
* Creates a new instance.
@@ -71,7 +72,12 @@
{
while( !ready )
{
- lock.wait();
+ waiters ++;
+ try {
+ lock.wait();
+ } finally {
+ waiters --;
+ }
}
}
return this;
@@ -86,7 +92,12 @@
{
if( !ready )
{
- lock.wait(timeoutMillis);
+ waiters ++;
+ try {
+ lock.wait(timeoutMillis);
+ } finally {
+ waiters --;
+ }
}
return ready;
}
@@ -98,12 +109,15 @@
{
while( !ready )
{
+ waiters ++;
try
{
lock.wait();
}
catch( InterruptedException e )
{
+ } finally {
+ waiters --;
}
}
}
@@ -132,26 +146,31 @@
return ready;
}
- for( ;; )
- {
- try
+ waiters ++;
+ try {
+ for( ;; )
{
- lock.wait( waitTime );
- }
- catch( InterruptedException e )
- {
- }
-
- if( ready ) {
- return true;
- } else
- {
- waitTime = timeoutMillis - ( System.currentTimeMillis() -
startTime );
- if( waitTime <= 0 )
+ try
+ {
+ lock.wait( waitTime );
+ }
+ catch( InterruptedException e )
{
- return ready;
+ }
+
+ if( ready ) {
+ return true;
+ } else
+ {
+ waitTime = timeoutMillis - (
System.currentTimeMillis() - startTime );
+ if( waitTime <= 0 )
+ {
+ return ready;
+ }
}
}
+ } finally {
+ waiters --;
}
}
}
@@ -179,7 +198,9 @@
result = newValue;
ready = true;
- lock.notifyAll();
+ if (waiters > 0) {
+ lock.notifyAll();
+ }
}
notifyListeners();