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 2004/12/18 05:01:09 UTC
svn commit: r122701 - /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java
Author: trustin
Date: Fri Dec 17 20:01:07 2004
New Revision: 122701
URL: http://svn.apache.org/viewcvs?view=rev&rev=122701
Log:
Fixed: Inifiite loop if user flushes empty write buffer.
Modified:
incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java
Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java
Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java?view=diff&rev=122701&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java&r1=122700&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java&r2=122701
==============================================================================
--- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java (original)
+++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/TcpIoProcessor.java Fri Dec 17 20:01:07 2004
@@ -327,22 +327,14 @@
private void notifyIdleSession( TcpSession session, long currentTime )
{
SessionConfig config = session.getConfig();
- notifyIdleSession0(
- session,
- currentTime,
- config.getIdleTimeInMillis( IdleStatus.BOTH_IDLE ),
+ notifyIdleSession0( session, currentTime, config
+ .getIdleTimeInMillis( IdleStatus.BOTH_IDLE ),
IdleStatus.BOTH_IDLE, session.getLastIoTime() );
- notifyIdleSession0(
- session,
- currentTime,
- config
- .getIdleTimeInMillis( IdleStatus.READER_IDLE ),
+ notifyIdleSession0( session, currentTime, config
+ .getIdleTimeInMillis( IdleStatus.READER_IDLE ),
IdleStatus.READER_IDLE, session.getLastReadTime() );
- notifyIdleSession0(
- session,
- currentTime,
- config
- .getIdleTimeInMillis( IdleStatus.WRITER_IDLE ),
+ notifyIdleSession0( session, currentTime, config
+ .getIdleTimeInMillis( IdleStatus.WRITER_IDLE ),
IdleStatus.WRITER_IDLE, session.getLastWriteTime() );
}
@@ -393,63 +385,82 @@
synchronized( lock )
{
writeBuf.flip();
-
- int writtenBytes;
-
- try
- {
- writtenBytes = ch.write( writeBuf );
- }
- finally
+
+ // ignore empty write buffer
+ if( writeBuf.remaining() == 0 )
{
- SelectionKey key = session.getSelectionKey();
-
- if( writeBuf.hasRemaining() )
- {
- // Kernel buffer is full
- key.interestOps( key.interestOps()
- | SelectionKey.OP_WRITE );
- }
- else
- {
- key.interestOps( key.interestOps()
- & ( ~SelectionKey.OP_WRITE ) );
- }
-
- writeBuf.compact();
- writeBuf.mark();
- }
+ writeBuf.clear();
- if( writtenBytes > 0 )
- {
- session.increaseWrittenBytes( writtenBytes );
- lock.markBaseIndex();
- fireDataWritten( session, writtenBytes );
Queue markers = lock.getMarkers();
for( ;; )
{
TcpWriteBuffer.Marker marker = ( TcpWriteBuffer.Marker ) markers
- .first();
+ .pop();
if( marker == null )
break;
- int bytesLeft = marker.getBytesLeft();
- if( bytesLeft > writtenBytes )
+ fireMarkerRemoved( session, marker.getValue() );
+ }
+ }
+ else
+ {
+ int writtenBytes;
+
+ try
+ {
+ writtenBytes = ch.write( writeBuf );
+ }
+ finally
+ {
+ SelectionKey key = session.getSelectionKey();
+
+ if( writeBuf.hasRemaining() )
{
- marker.setBytesLeft( bytesLeft - writtenBytes );
- break;
+ // Kernel buffer is full
+ key.interestOps( key.interestOps()
+ | SelectionKey.OP_WRITE );
}
- else if( bytesLeft == writtenBytes )
+ else
{
- markers.pop();
- fireMarkerRemoved( session, marker.getValue() );
- break;
+ key.interestOps( key.interestOps()
+ & ( ~SelectionKey.OP_WRITE ) );
}
- else
+
+ writeBuf.compact();
+ writeBuf.mark();
+ }
+
+ if( writtenBytes > 0 )
+ {
+ session.increaseWrittenBytes( writtenBytes );
+ lock.markBaseIndex();
+ fireDataWritten( session, writtenBytes );
+ Queue markers = lock.getMarkers();
+ for( ;; )
{
- markers.pop();
- fireMarkerRemoved( session, marker.getValue() );
- writtenBytes -= bytesLeft;
+ TcpWriteBuffer.Marker marker = ( TcpWriteBuffer.Marker ) markers
+ .first();
+ if( marker == null )
+ break;
+
+ int bytesLeft = marker.getBytesLeft();
+ if( bytesLeft > writtenBytes )
+ {
+ marker.setBytesLeft( bytesLeft - writtenBytes );
+ break;
+ }
+ else if( bytesLeft == writtenBytes )
+ {
+ markers.pop();
+ fireMarkerRemoved( session, marker.getValue() );
+ break;
+ }
+ else
+ {
+ markers.pop();
+ fireMarkerRemoved( session, marker.getValue() );
+ writtenBytes -= bytesLeft;
+ }
}
}
}