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/02/07 02:57:17 UTC
svn commit: r151659 - in
incubator/directory/network/mina/trunk/src/java/org/apache/mina:
io/datagram/DatagramAcceptor.java io/datagram/DatagramConnector.java
io/socket/SocketIoProcessor.java io/socket/SocketSession.java
protocol/io/IoAdapter.java util/IoHandlerFilterManager.java
Author: trustin
Date: Sun Feb 6 17:57:15 2005
New Revision: 151659
URL: http://svn.apache.org/viewcvs?view=rev&rev=151659
Log:
Fixed: ByteBuffer leakage detection code causes I/O threads to die.
Fixed: SocketSession.readBuf is sometimes released more than once.
Modified:
incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
incubator/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
incubator/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Sun Feb 6 17:57:15 2005
@@ -338,7 +338,16 @@
writeMarkerQueue.pop();
}
- ByteBuffer.release( buf );
+ try
+ {
+ ByteBuffer.release( buf );
+ }
+ catch( IllegalStateException e )
+ {
+ session.getFilterManager().fireExceptionCaught( session,
+ e );
+ }
+
session.getFilterManager().fireDataWritten( session, marker );
continue;
}
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/datagram/DatagramConnector.java Sun Feb 6 17:57:15 2005
@@ -46,13 +46,13 @@
* @version $Rev$, $Date$
*/
public class DatagramConnector extends DatagramProcessor implements
- IoConnector
+ IoConnector
{
private static volatile int nextId = 0;
private final IoHandlerFilterManager filterManager = new IoHandlerFilterManager();
- private final int id = nextId++;
+ private final int id = nextId ++ ;
private final Selector selector;
@@ -84,7 +84,7 @@
if( handler == null )
throw new NullPointerException( "handler" );
- if( ! ( address instanceof InetSocketAddress ) )
+ if( !( address instanceof InetSocketAddress ) )
throw new IllegalArgumentException( "Unexpected address type: "
+ address.getClass() );
@@ -200,7 +200,7 @@
catch( IOException e )
{
exceptionMonitor.exceptionCaught( DatagramConnector.this,
- e );
+ e );
try
{
@@ -319,7 +319,17 @@
writeBufferQueue.pop();
writeMarkerQueue.pop();
}
- ByteBuffer.release( buf );
+
+ try
+ {
+ ByteBuffer.release( buf );
+ }
+ catch( IllegalStateException e )
+ {
+ session.getFilterManager().fireExceptionCaught( session,
+ e );
+ }
+
session.getFilterManager().fireDataWritten( session, marker );
continue;
}
@@ -334,9 +344,8 @@
}
else
{
- key
- .interestOps( key.interestOps()
- & ( ~SelectionKey.OP_WRITE ) );
+ key.interestOps( key.interestOps()
+ & ( ~SelectionKey.OP_WRITE ) );
// pop and fire event
synchronized( writeBufferQueue )
@@ -366,13 +375,10 @@
break;
DatagramSession session = new DatagramSession( this,
- filterManager,
- req.channel,
- req.handler );
+ filterManager, req.channel, req.handler );
SelectionKey key = req.channel.register( selector,
- SelectionKey.OP_READ,
- session );
+ SelectionKey.OP_READ, session );
session.setSelectionKey( key );
@@ -427,12 +433,12 @@
public void removeAllFilters()
{
- filterManager.removeAllFilters();
+ filterManager.removeAllFilters();
}
public List getAllFilters()
{
- return filterManager.filters();
+ return filterManager.filters();
}
private static class RegistrationRequest
@@ -443,7 +449,8 @@
private DatagramSession session;
- private RegistrationRequest( DatagramChannel channel, IoHandler handler )
+ private RegistrationRequest( DatagramChannel channel,
+ IoHandler handler )
{
this.channel = channel;
this.handler = handler;
@@ -464,4 +471,4 @@
this.exceptionMonitor = monitor;
}
-}
\ No newline at end of file
+}
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Sun Feb 6 17:57:15 2005
@@ -418,7 +418,16 @@
writeBufferQueue.pop();
writeMarkerQueue.pop();
}
- ByteBuffer.release( buf );
+ try
+ {
+ ByteBuffer.release( buf );
+ }
+ catch( IllegalStateException e )
+ {
+ session.getFilterManager().fireExceptionCaught( session,
+ e );
+ }
+
session.getFilterManager().fireDataWritten( session, marker );
continue;
}
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/io/socket/SocketSession.java Sun Feb 6 17:57:15 2005
@@ -79,6 +79,8 @@
private boolean idleForRead;
private boolean idleForWrite;
+
+ private boolean disposed;
/**
* Creates a new instance.
@@ -119,6 +121,11 @@
void dispose()
{
+ if (disposed)
+ {
+ return;
+ }
+ disposed = true;
ByteBuffer.release( readBuf );
}
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/protocol/io/IoAdapter.java Sun Feb 6 17:57:15 2005
@@ -196,7 +196,14 @@
}
finally
{
- ByteBuffer.release( in );
+ try
+ {
+ ByteBuffer.release( in );
+ }
+ catch( IllegalStateException e )
+ {
+ filterManager.fireExceptionCaught( psession, e );
+ }
}
}
Modified: incubator/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java
URL: http://svn.apache.org/viewcvs/incubator/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java?view=diff&r1=151658&r2=151659
==============================================================================
--- incubator/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java (original)
+++ incubator/directory/network/mina/trunk/src/java/org/apache/mina/util/IoHandlerFilterManager.java Sun Feb 6 17:57:15 2005
@@ -55,8 +55,8 @@
session.getHandler().sessionIdle( session, status );
}
- public void exceptionCaught( IoHandler nextHandler, IoSession session,
- Throwable cause )
+ public void exceptionCaught( IoHandler nextHandler,
+ IoSession session, Throwable cause )
{
session.getHandler().exceptionCaught( session, cause );
}
@@ -86,7 +86,7 @@
};
private Entry head = new Entry( null, null, Integer.MIN_VALUE,
- FINAL_FILTER );
+ FINAL_FILTER );
private final Entry tail = head;
@@ -117,9 +117,9 @@
else if( e.priority == priority )
{
throw new IllegalArgumentException(
- "Other filter is registered with priority "
- + priority
- + " already." );
+ "Other filter is registered with priority "
+ + priority
+ + " already." );
}
prevEntry = e;
e = e.nextEntry;
@@ -128,11 +128,11 @@
public synchronized void removeFilter( IoHandlerFilter filter )
{
- if( filter == tail )
- {
- throw new IllegalArgumentException(
- "Cannot remove the internal filter.");
- }
+ if( filter == tail )
+ {
+ throw new IllegalArgumentException(
+ "Cannot remove the internal filter." );
+ }
Entry e = head;
Entry prevEntry = null;
@@ -161,11 +161,12 @@
e = e.nextEntry;
}
}
-
- public synchronized void removeAllFilters() {
- tail.prevEntry = null;
- tail.nextEntry = null;
- head = tail;
+
+ public synchronized void removeAllFilters()
+ {
+ tail.prevEntry = null;
+ tail.nextEntry = null;
+ head = tail;
}
public void fireSessionOpened( IoSession session )
@@ -256,9 +257,18 @@
newBuf = e.filter.filterWrite( session, buf );
if( buf != newBuf )
{
- // Original buffer is replaced with new filtered buffer;
- // let's release the old one.
- ByteBuffer.release(buf);
+ // Original buffer is replaced with new filtered buffer;
+ // let's release the old one.
+ try
+ {
+ ByteBuffer.release( buf );
+ }
+ catch( IllegalStateException ex )
+ {
+ fireExceptionCaught( session, ex );
+ // abort the write operation.
+ return;
+ }
}
buf = newBuf;
e = e.prevEntry;
@@ -324,14 +334,13 @@
{
try
{
- Entry.this.nextEntry.filter
- .sessionOpened(
- Entry.this.nextEntry.nextHandler,
- session );
+ Entry.this.nextEntry.filter.sessionOpened(
+ Entry.this.nextEntry.nextHandler, session );
}
catch( Throwable e )
{
- IoHandlerFilterManager.this.fireExceptionCaught( session, e );
+ IoHandlerFilterManager.this.fireExceptionCaught(
+ session, e );
}
}
@@ -339,14 +348,13 @@
{
try
{
- Entry.this.nextEntry.filter
- .sessionClosed(
- Entry.this.nextEntry.nextHandler,
- session );
+ Entry.this.nextEntry.filter.sessionClosed(
+ Entry.this.nextEntry.nextHandler, session );
}
catch( Throwable e )
{
- IoHandlerFilterManager.this.fireExceptionCaught( session, e );
+ IoHandlerFilterManager.this.fireExceptionCaught(
+ session, e );
}
}
@@ -354,25 +362,25 @@
{
try
{
- Entry.this.nextEntry.filter
- .sessionIdle(
- Entry.this.nextEntry.nextHandler,
- session, status );
+ Entry.this.nextEntry.filter.sessionIdle(
+ Entry.this.nextEntry.nextHandler, session,
+ status );
}
catch( Throwable e )
{
- IoHandlerFilterManager.this.fireExceptionCaught( session, e );
+ IoHandlerFilterManager.this.fireExceptionCaught(
+ session, e );
}
}
- public void exceptionCaught( IoSession session, Throwable cause )
+ public void exceptionCaught( IoSession session,
+ Throwable cause )
{
try
{
- Entry.this.nextEntry.filter
- .exceptionCaught(
- Entry.this.nextEntry.nextHandler,
- session, cause );
+ Entry.this.nextEntry.filter.exceptionCaught(
+ Entry.this.nextEntry.nextHandler, session,
+ cause );
}
catch( Throwable e )
{
@@ -384,13 +392,14 @@
{
try
{
- Entry.this.nextEntry.filter
- .dataRead( Entry.this.nextEntry.nextHandler,
- session, buf );
+ Entry.this.nextEntry.filter.dataRead(
+ Entry.this.nextEntry.nextHandler, session,
+ buf );
}
catch( Throwable e )
{
- IoHandlerFilterManager.this.fireExceptionCaught( session, e );
+ IoHandlerFilterManager.this.fireExceptionCaught(
+ session, e );
}
}
@@ -398,14 +407,14 @@
{
try
{
- Entry.this.nextEntry.filter
- .dataWritten(
- Entry.this.nextEntry.nextHandler,
- session, marker );
+ Entry.this.nextEntry.filter.dataWritten(
+ Entry.this.nextEntry.nextHandler, session,
+ marker );
}
catch( Throwable e )
{
- IoHandlerFilterManager.this.fireExceptionCaught( session, e );
+ IoHandlerFilterManager.this.fireExceptionCaught(
+ session, e );
}
}
};
@@ -416,4 +425,4 @@
{
void execute( ByteBuffer buf, Object marker );
}
-}
\ No newline at end of file
+}