Author: trustin Date: Thu Dec 23 23:03:45 2004 New Revision: 123279 URL: http://svn.apache.org/viewcvs?view=rev&rev=123279 Log: * Removed datagram package which is too outdated * Removed ReadBuffer and WriteBuffer and replaced them with simple ByteBuffers * Replaced IoSession.getWriteBuffer()... buf.flush() to IoSession.write() methods. (Now we need some write buffer pooling mechanism here) * Removed markerReleased() event handler. dataWritten method now passes marker instead. * Added ProtocolEncoderOutput which provides a kind of output stream to ProtocolEncoder. (This change is related with new IoSession.write() methods)
Performance is better and API is simpler and UDP friendly. Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoderOutput.java Removed: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/ReadBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/WriteBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptorSession.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramReadBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSessionConfig.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramWriteBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketReadBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketWriteBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java (original) +++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/echoserver/EchoProtocolHandler.java Thu Dec 23 23:03:45 2004 @@ -18,11 +18,11 @@ */ package org.apache.mina.examples.echoserver; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; -import org.apache.mina.io.WriteBuffer; /** * TODO Document me. @@ -57,51 +57,24 @@ cause.printStackTrace( System.out ); } - public void dataRead( IoSession IoSession ) - { - ReadBuffer rb = IoSession.getReadBuffer(); - WriteBuffer wb = IoSession.getWriteBuffer(); - - synchronized( rb ) - { - synchronized( wb ) - { - int nBytes = wb.putAsPossible( rb ); - if( nBytes > 0 ) - { - System.out.println( Thread.currentThread().getName() + ' ' - + IoSession.getRemoteAddress() - + ": READ (" + nBytes + "B)" ); - rb.signal(); - wb.flush(); - } - } - } - } - - public void dataWritten( IoSession IoSession ) + public void dataRead( IoSession session, ByteBuffer rb ) { - ReadBuffer rb = IoSession.getReadBuffer(); - WriteBuffer wb = IoSession.getWriteBuffer(); - synchronized( rb ) { - synchronized( wb ) - { - int nBytes = wb.putAsPossible( rb ); - if( nBytes > 0 ) - { - System.out.println( Thread.currentThread().getName() + ' ' - + IoSession.getRemoteAddress() - + ": WRITTEN (" + nBytes + "B)" ); - rb.signal(); - wb.flush(); - } - } + ByteBuffer wb = ByteBuffer.allocate(rb.remaining()); + wb.put(rb); + wb.flip(); + System.out.println( Thread.currentThread().getName() + ' ' + + session.getRemoteAddress() + + ": READ (" + wb.remaining() + "B)" ); + session.write(wb, null); } } - public void markerReleased( IoSession IoSession, Object marker ) + public void dataWritten( IoSession IoSession, Object marker ) { + System.out.println( Thread.currentThread().getName() + ' ' + + IoSession.getRemoteAddress() + + ": WRITTEN" ); } } Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java (original) +++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/netcat/NetCatProtocolHandler.java Thu Dec 23 23:03:45 2004 @@ -18,10 +18,11 @@ */ package org.apache.mina.examples.netcat; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; import org.apache.mina.io.IoHandlerAdapter; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; /** * TODO Document me. @@ -46,17 +47,14 @@ session.close(); } - public void dataRead( IoSession session ) + public void dataRead( IoSession session, ByteBuffer buf ) { - ReadBuffer buf = session.getReadBuffer(); - synchronized( buf ) { while( buf.hasRemaining() ) { System.out.print( ( char ) buf.get() ); } - buf.signal(); } System.out.flush(); } Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java (original) +++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineDecoder.java Thu Dec 23 23:03:45 2004 @@ -18,7 +18,8 @@ */ package org.apache.mina.examples.reverser; -import org.apache.mina.io.ReadBuffer; +import java.nio.ByteBuffer; + import org.apache.mina.protocol.ProtocolDecoder; import org.apache.mina.protocol.ProtocolSession; import org.apache.mina.protocol.ProtocolViolationException; @@ -34,7 +35,7 @@ private StringBuffer decodeBuf = new StringBuffer(); - public Object decode( ProtocolSession session, ReadBuffer in ) + public Object decode( ProtocolSession session, ByteBuffer in ) throws ProtocolViolationException { do @@ -62,4 +63,4 @@ return null; } -} \ No newline at end of file +} Modified: incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java (original) +++ incubator/directory/network/trunk/mina/src/examples/org/apache/mina/examples/reverser/TextLineEncoder.java Thu Dec 23 23:03:45 2004 @@ -18,8 +18,10 @@ */ package org.apache.mina.examples.reverser; -import org.apache.mina.io.WriteBuffer; +import java.nio.ByteBuffer; + import org.apache.mina.protocol.ProtocolEncoder; +import org.apache.mina.protocol.ProtocolEncoderOutput; import org.apache.mina.protocol.ProtocolSession; import org.apache.mina.protocol.ProtocolViolationException; @@ -32,39 +34,27 @@ public class TextLineEncoder implements ProtocolEncoder { - private String encodeData; - - private int encodePos; - - public boolean encode( ProtocolSession session, Object message, - WriteBuffer out ) throws ProtocolViolationException + public void encode( ProtocolSession session, Object message, + ProtocolEncoderOutput out ) + throws ProtocolViolationException { - if( message != encodeData ) + String val = message.toString(); + if( val.length() > 256 ) { - String val = message.toString(); - if( val.length() > 256 ) - { - throw new ProtocolViolationException( - "Cannot encode too long string." ); - } - encodeData = val + "\r\n"; - encodePos = 0; + throw new ProtocolViolationException( + "Cannot encode too long string." ); } - for( ; encodePos < encodeData.length(); encodePos++ ) + val += "\r\n"; + + ByteBuffer buf = ByteBuffer.allocate( val.length() ); + for( int i = 0; i < val.length(); i++ ) { - if( out.hasRemaining() ) - { - out.put( ( byte ) encodeData.charAt( encodePos ) ); - } - else - { - return false; - } + buf.put( ( byte ) val.charAt( i ) ); } - encodeData = null; - return true; + buf.flip(); + out.write( buf ); } } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandler.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,8 @@ */ package org.apache.mina.io; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; /** @@ -36,9 +38,7 @@ void exceptionCaught( IoSession session, Throwable cause ); - void dataRead( IoSession session ); - - void dataWritten( IoSession session ); + void dataRead( IoSession session, ByteBuffer buf ); - void markerReleased( IoSession session, Object marker ); + void dataWritten( IoSession session, Object marker ); } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerAdapter.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,8 @@ */ package org.apache.mina.io; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; /** @@ -45,15 +47,11 @@ { } - public void dataRead( IoSession session ) - { - } - - public void dataWritten( IoSession session ) + public void dataRead( IoSession session, ByteBuffer buf ) { } - public void markerReleased( IoSession session, Object marker ) + public void dataWritten( IoSession session, Object marker ) { } } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilter.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,8 @@ */ package org.apache.mina.io; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; /** @@ -42,10 +44,7 @@ void exceptionCaught( IoHandler nextHandler, IoSession session, Throwable cause ); - void dataRead( IoHandler nextHandler, IoSession session ); - - void dataWritten( IoHandler nextHandler, IoSession session ); + void dataRead( IoHandler nextHandler, IoSession session, ByteBuffer buf ); - void markerReleased( IoHandler nextHandler, IoSession session, - Object marker ); + void dataWritten( IoHandler nextHandler, IoSession session, Object marker ); } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoHandlerFilterAdapter.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,8 @@ */ package org.apache.mina.io; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; /** @@ -58,20 +60,15 @@ nextHandler.exceptionCaught( session, cause ); } - public void dataRead( IoHandler nextHandler, IoSession session ) + public void dataRead( IoHandler nextHandler, IoSession session, + ByteBuffer buf ) { - nextHandler.dataRead( session ); + nextHandler.dataRead( session, buf ); } - public void dataWritten( IoHandler nextHandler, IoSession session ) + public void dataWritten( IoHandler nextHandler, IoSession session, + Object marker ) { - nextHandler.dataWritten( session ); + nextHandler.dataWritten( session, marker ); } - - public void markerReleased( IoHandler nextHandler, IoSession session, - Object marker ) - { - nextHandler.markerReleased( session, marker ); - } - } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/IoSession.java Thu Dec 23 23:03:45 2004 @@ -19,6 +19,7 @@ package org.apache.mina.io; import java.net.SocketAddress; +import java.nio.ByteBuffer; import org.apache.mina.common.IdleStatus; import org.apache.mina.common.SessionConfig; @@ -34,14 +35,16 @@ IoHandler getHandler(); void close(); + + void write(byte[] buf, Object marker); - Object getAttachment(); + void write(ByteBuffer buf, Object marker); - void setAttachment( Object attachment ); + void write(byte[] buf, int offset, int length, Object marker); - ReadBuffer getReadBuffer(); + Object getAttachment(); - WriteBuffer getWriteBuffer(); + void setAttachment( Object attachment ); boolean isConnected(); Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/ReadBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/ReadBuffer.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/WriteBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/WriteBuffer.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptor.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptorSession.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramAcceptorSession.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramReadBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramReadBuffer.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSessionConfig.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramSessionConfig.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramWriteBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/datagram/DatagramWriteBuffer.java?view=auto&rev=123278 ============================================================================== Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/BlacklistFilter.java Thu Dec 23 23:03:45 2004 @@ -21,13 +21,13 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.nio.ByteBuffer; import java.util.HashSet; import java.util.Set; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoHandlerFilterAdapter; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; /** * TODO Document me. @@ -49,19 +49,16 @@ blacklist.remove( address ); } - public void dataRead( IoHandler nextHandler, IoSession session ) + public void dataRead( IoHandler nextHandler, IoSession session, ByteBuffer buf ) { if( isBlocked( session ) ) { // just ignore all - ReadBuffer buf = session.getReadBuffer(); - buf.skipAll(); - buf.signal(); } else { // or forward - super.dataRead( nextHandler, session ); + super.dataRead( nextHandler, session, buf ); } } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/filter/IoThreadPoolFilter.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,7 @@ */ package org.apache.mina.io.filter; +import java.nio.ByteBuffer; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; @@ -28,7 +29,6 @@ import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoHandlerFilter; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; import org.apache.mina.util.BlockingSet; import org.apache.mina.util.Queue; import org.apache.mina.util.Stack; @@ -165,20 +165,14 @@ fireEvent( nextHandler, session, EventType.EXCEPTION, cause ); } - public void dataRead( IoHandler nextHandler, IoSession session ) + public void dataRead( IoHandler nextHandler, IoSession session, ByteBuffer buf ) { - fireEvent( nextHandler, session, EventType.READ, null ); + fireEvent( nextHandler, session, EventType.READ, buf ); } - public void dataWritten( IoHandler nextHandler, IoSession session ) + public void dataWritten( IoHandler nextHandler, IoSession session, Object marker ) { - fireEvent( nextHandler, session, EventType.WRITTEN, null ); - } - - public void markerReleased( IoHandler nextHandler, IoSession session, - Object marker ) - { - fireEvent( nextHandler, session, EventType.MARKER, marker ); + fireEvent( nextHandler, session, EventType.WRITTEN, marker ); } private void fireEvent( IoHandler nextHandler, IoSession session, @@ -257,8 +251,6 @@ private static final EventType IDLE = new EventType(); - private static final EventType MARKER = new EventType(); - private static final EventType EXCEPTION = new EventType(); private EventType() @@ -372,7 +364,7 @@ { if( type == EventType.READ ) { - ReadBuffer buf = session.getReadBuffer(); + ByteBuffer buf = (ByteBuffer) data; boolean fire; synchronized( buf ) { @@ -381,16 +373,12 @@ if( fire ) { - nextHandler.dataRead( session ); + nextHandler.dataRead( session, buf ); } } else if( type == EventType.WRITTEN ) { - nextHandler.dataWritten( session ); - } - else if( type == EventType.MARKER ) - { - nextHandler.markerReleased( session, data ); + nextHandler.dataWritten( session, data ); } else if( type == EventType.EXCEPTION ) { Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketIoProcessor.java Thu Dec 23 23:03:45 2004 @@ -253,8 +253,7 @@ private void read( SocketSession session ) { - SocketReadBuffer lock = ( SocketReadBuffer ) session.getReadBuffer(); - ByteBuffer readBuf = lock.buf(); + ByteBuffer buf = session.getReadBuffer(); SocketChannel ch = session.getChannel(); try @@ -262,21 +261,20 @@ int readBytes = 0; int ret; - synchronized( lock ) + synchronized( buf ) { - readBuf.compact(); + buf.compact(); try { - while( ( ret = ch.read( readBuf ) ) > 0 ) + while( ( ret = ch.read( buf ) ) > 0 ) { readBytes += ret; } } finally { - readBuf.flip(); - readBuf.mark(); + buf.flip(); } session.increaseReadBytes( readBytes ); @@ -285,14 +283,15 @@ { if( readBytes > 0 ) { - lock.markBaseIndex(); - session.getFilterManager().fireDataRead( session ); + session.getFilterManager().fireDataRead( session, buf ); } else { - SelectionKey key = session.getSelectionKey(); - key.interestOps( key.interestOps() - & ( ~SelectionKey.OP_READ ) ); + // FIXME will spin in multi-threaded env. + +// SelectionKey key = session.getSelectionKey(); +// key.interestOps( key.interestOps() +// & ( ~SelectionKey.OP_READ ) ); } } else @@ -393,114 +392,64 @@ if( session.isClosed() ) continue; - flush( session ); + try + { + flush( session ); + } + catch( IOException e ) + { + session.getFilterManager().fireExceptionCaught( session, e ); + } } } - private void flush( SocketSession session ) + private void flush( SocketSession session ) throws IOException { - SocketWriteBuffer lock = ( SocketWriteBuffer ) session - .getWriteBuffer(); - ByteBuffer writeBuf = lock.buf(); SocketChannel ch = session.getChannel(); - try - { - synchronized( lock ) + Queue writeBufferQueue = session.getWriteBufferQueue(); + Queue writeMarkerQueue = session.getWriteMarkerQueue(); + + ByteBuffer buf; + Object marker; + for ( ;; ) { + synchronized (writeBufferQueue) { + buf = (ByteBuffer) writeBufferQueue.first(); + marker = writeMarkerQueue.first(); + } + + if (buf == null) + break; + + if (buf.remaining() == 0) { + synchronized (writeBufferQueue) { + writeBufferQueue.pop(); + writeMarkerQueue.pop(); + } + + session.getFilterManager().fireDataWritten(session, marker); + continue; + } + + try { - writeBuf.flip(); - - // ignore empty write buffer - if( writeBuf.remaining() == 0 ) + ch.write( buf ); + } + finally + { + SelectionKey key = session.getSelectionKey(); + if( buf.hasRemaining() ) { - writeBuf.clear(); - - Queue markers = lock.getMarkers(); - for( ;; ) - { - SocketWriteBuffer.Marker marker = ( SocketWriteBuffer.Marker ) markers - .pop(); - if( marker == null ) - break; - - session.getFilterManager() - .fireMarkerReleased( session, - marker.getValue() ); - } + // Kernel buffer is full + key.interestOps( key.interestOps() + | SelectionKey.OP_WRITE ); } else { - int writtenBytes; - - try - { - writtenBytes = ch.write( writeBuf ); - } - finally - { - 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(); - } - - if( writtenBytes > 0 ) - { - session.increaseWrittenBytes( writtenBytes ); - lock.markBaseIndex(); - session.getFilterManager().fireDataWritten( session ); - Queue markers = lock.getMarkers(); - for( ;; ) - { - SocketWriteBuffer.Marker marker = ( SocketWriteBuffer.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(); - session - .getFilterManager() - .fireMarkerReleased( session, - marker.getValue() ); - break; - } - else - { - markers.pop(); - session - .getFilterManager() - .fireMarkerReleased( session, - marker.getValue() ); - writtenBytes -= bytesLeft; - } - } - } + key.interestOps( key.interestOps() + & ( ~SelectionKey.OP_WRITE ) ); } } - } - catch( IOException e ) - { - session.getFilterManager().fireExceptionCaught( session, e ); } } Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketReadBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketReadBuffer.java?view=auto&rev=123278 ============================================================================== Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketSession.java Thu Dec 23 23:03:45 2004 @@ -27,10 +27,9 @@ import org.apache.mina.common.SessionConfig; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; -import org.apache.mina.io.WriteBuffer; import org.apache.mina.util.ByteBufferPool; import org.apache.mina.util.IoHandlerFilterManager; +import org.apache.mina.util.Queue; /** * TODO Insert type comment. @@ -46,9 +45,11 @@ private final SocketSessionConfig config; - private final SocketReadBuffer readBuf; + private final ByteBuffer readBuf; - private final SocketWriteBuffer writeBuf; + private final Queue writeBufferQueue; + + private final Queue writeMarkerQueue; private final IoHandler handler; @@ -78,14 +79,14 @@ * Creates a new instance. */ SocketSession( IoHandlerFilterManager filterManager, SocketChannel ch, - IoHandler defaultHandler ) + IoHandler defaultHandler ) { this.filterManager = filterManager; this.ch = ch; this.config = new SocketSessionConfig( ch ); - this.readBuf = new SocketReadBuffer( this, ( ByteBuffer ) ByteBufferPool - .open().limit( 0 ) ); - this.writeBuf = new SocketWriteBuffer( this, ByteBufferPool.open() ); + this.readBuf = ( ByteBuffer ) ByteBufferPool.open().limit( 0 ); + this.writeBufferQueue = new Queue(); + this.writeMarkerQueue = new Queue(); this.handler = defaultHandler; this.remoteAddress = ch.socket().getRemoteSocketAddress(); this.localAddress = ch.socket().getLocalSocketAddress(); @@ -113,8 +114,7 @@ void dispose() { - ByteBufferPool.close( readBuf.buf() ); - ByteBufferPool.close( writeBuf.buf() ); + ByteBufferPool.close( readBuf ); } public IoHandler getHandler() @@ -137,18 +137,39 @@ this.attachment = attachment; } - public ReadBuffer getReadBuffer() + ByteBuffer getReadBuffer() { return readBuf; } - public WriteBuffer getWriteBuffer() + Queue getWriteBufferQueue() + { + return writeBufferQueue; + } + + Queue getWriteMarkerQueue() { - return writeBuf; + return writeMarkerQueue; } - void flush() + public void write( byte[] buf, int offset, int length, Object marker ) { + write( ByteBuffer.wrap( buf, offset, length ), marker ); + } + + public void write( byte[] buf, Object marker ) + { + write( ByteBuffer.wrap( buf ), marker ); + } + + public void write( ByteBuffer buf, Object marker ) + { + synchronized( writeBufferQueue ) + { + writeBufferQueue.push( buf ); + writeMarkerQueue.push( marker ); + } + SocketIoProcessor.getInstance().flushSession( this ); } Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketWriteBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/io/socket/SocketWriteBuffer.java?view=auto&rev=123278 ============================================================================== Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/IoAdapter.java Thu Dec 23 23:03:45 2004 @@ -19,13 +19,12 @@ package org.apache.mina.protocol; import java.net.SocketAddress; +import java.nio.ByteBuffer; import org.apache.mina.common.IdleStatus; import org.apache.mina.common.SessionConfig; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoSession; -import org.apache.mina.io.ReadBuffer; -import org.apache.mina.io.WriteBuffer; import org.apache.mina.util.ProtocolHandlerFilterManager; import org.apache.mina.util.Queue; @@ -106,43 +105,22 @@ .getAttachment(), cause ); } - public void dataRead( IoSession session ) + public void dataRead( IoSession session, ByteBuffer in ) { ProtocolSession psession = ( ProtocolSession ) session .getAttachment(); - ReadBuffer in = session.getReadBuffer(); - int sizeBefore; - int sizeAfter; Object result; - try { - do + synchronized( in ) { - result = null; - - synchronized( in ) - { - sizeBefore = in.remaining(); - result = decoder.decode( psession, in ); - sizeAfter = in.remaining(); - } - - if( sizeBefore != sizeAfter ) - { - in.signal(); - } + result = decoder.decode( psession, in ); + } - if( result != null ) - { - filterManager.fireMessageReceived( psession, result ); - } - else - { - break; - } + if( result != null ) + { + filterManager.fireMessageReceived( psession, result ); } - while( sizeAfter > 0 ); } catch( Throwable t ) { @@ -150,12 +128,7 @@ } } - public void dataWritten( IoSession session ) - { - write( session ); - } - - public void markerReleased( IoSession session, Object marker ) + public void dataWritten( IoSession session, Object marker ) { filterManager.fireMessageSent( ( ProtocolSession ) session .getAttachment(), marker ); @@ -172,26 +145,18 @@ return; } - WriteBuffer out = session.getWriteBuffer(); - try { while( !writeQueue.isEmpty() ) { - synchronized( out ) + synchronized( writeQueue ) { - Object message = writeQueue.first(); + Object message = writeQueue.pop(); if( message == null ) break; - if( encoder.encode( psession, message, out ) ) - { - out.putMarker( writeQueue.pop() ); - out.flush(); - } - else - { - break; - } + + psession.encOut.setMessage( message ); + encoder.encode( psession, message, psession.encOut ); } } } @@ -210,6 +175,8 @@ private final Queue writeQueue = new Queue(); + private final ProtocolEncoderOutputImpl encOut; + private Object attachment; private ProtocolSessionImpl( IoSession session, @@ -217,6 +184,7 @@ { this.session = session; this.adapter = adapter; + this.encOut = new ProtocolEncoderOutputImpl( session ); } public ProtocolHandler getHandler() @@ -251,7 +219,7 @@ public boolean write( Object message ) { - synchronized( session.getWriteBuffer() ) + synchronized( writeQueue ) { writeQueue.push( message ); } @@ -303,6 +271,40 @@ public boolean isIdle( IdleStatus status ) { return session.isIdle( status ); + } + } + + private static class ProtocolEncoderOutputImpl implements + ProtocolEncoderOutput + { + + private final IoSession session; + + private Object message; + + private ProtocolEncoderOutputImpl( IoSession session ) + { + this.session = session; + } + + public void setMessage( Object message ) + { + this.message = message; + } + + public void write( ByteBuffer buf ) + { + session.write( buf, message ); + } + + public void write( byte[] buf ) + { + session.write( buf, message ); + } + + public void write( byte[] buf, int offset, int length ) + { + session.write( buf, offset, length, message ); } } } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolDecoder.java Thu Dec 23 23:03:45 2004 @@ -18,7 +18,8 @@ */ package org.apache.mina.protocol; -import org.apache.mina.io.ReadBuffer; +import java.nio.ByteBuffer; + /** * TODO Insert type comment. @@ -28,6 +29,6 @@ */ public interface ProtocolDecoder { - Object decode( ProtocolSession session, ReadBuffer in ) + Object decode( ProtocolSession session, ByteBuffer in ) throws ProtocolViolationException; } Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoder.java Thu Dec 23 23:03:45 2004 @@ -18,7 +18,6 @@ */ package org.apache.mina.protocol; -import org.apache.mina.io.WriteBuffer; /** * TODO Insert type comment. @@ -28,6 +27,6 @@ */ public interface ProtocolEncoder { - boolean encode( ProtocolSession session, Object message, WriteBuffer out ) - throws ProtocolViolationException; + void encode( ProtocolSession session, Object message, + ProtocolEncoderOutput out ) throws ProtocolViolationException; } Added: incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoderOutput.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoderOutput.java?view=auto&rev=123279 ============================================================================== --- (empty file) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/protocol/ProtocolEncoderOutput.java Thu Dec 23 23:03:45 2004 @@ -0,0 +1,34 @@ +/* + * @(#) $Id: ProtocolEncoder.java 122629 2004-12-17 08:14:08Z trustin $ + * + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.mina.protocol; + +import java.nio.ByteBuffer; + +/** + * TODO Document me. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$ + */ +public interface ProtocolEncoderOutput +{ + void write(ByteBuffer buf); + void write(byte[] buf); + void write(byte[] buf, int offset, int length); +} Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractReadBuffer.java?view=auto&rev=123278 ============================================================================== Deleted: /incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/AbstractWriteBuffer.java?view=auto&rev=123278 ============================================================================== Modified: incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java Url: http://svn.apache.org/viewcvs/incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java?view=diff&rev=123279&p1=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java&r1=123278&p2=incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java&r2=123279 ============================================================================== --- incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java (original) +++ incubator/directory/network/trunk/mina/src/java/org/apache/mina/util/IoHandlerFilterManager.java Thu Dec 23 23:03:45 2004 @@ -18,6 +18,8 @@ */ package org.apache.mina.util; +import java.nio.ByteBuffer; + import org.apache.mina.common.IdleStatus; import org.apache.mina.io.IoHandler; import org.apache.mina.io.IoHandlerFilter; @@ -56,20 +58,16 @@ session.getHandler().exceptionCaught( session, cause ); } - public void dataRead( IoHandler nextHandler, IoSession session ) - { - session.getHandler().dataRead( session ); - } - - public void dataWritten( IoHandler nextHandler, IoSession session ) + public void dataRead( IoHandler nextHandler, IoSession session, + ByteBuffer buf ) { - session.getHandler().dataWritten( session ); + session.getHandler().dataRead( session, buf ); } - public void markerReleased( IoHandler nextHandler, IoSession session, - Object marker ) + public void dataWritten( IoHandler nextHandler, IoSession session, + Object marker ) { - session.getHandler().markerReleased( session, marker ); + session.getHandler().dataWritten( session, marker ); } public void init() @@ -232,25 +230,12 @@ } } - public void fireDataRead( IoSession session ) - { - Entry head = this.head; - try - { - head.filter.dataRead( head.nextHandler, session ); - } - catch( Throwable e ) - { - fireExceptionCaught( session, e ); - } - } - - public void fireDataWritten( IoSession session ) + public void fireDataRead( IoSession session, ByteBuffer buf ) { Entry head = this.head; try { - head.filter.dataWritten( head.nextHandler, session ); + head.filter.dataRead( head.nextHandler, session, buf ); } catch( Throwable e ) { @@ -258,12 +243,12 @@ } } - public void fireMarkerReleased( IoSession session, Object marker ) + public void fireDataWritten( IoSession session, Object marker ) { Entry head = this.head; try { - head.filter.markerReleased( head.nextHandler, session, marker ); + head.filter.dataWritten( head.nextHandler, session, marker ); } catch( Throwable e ) { @@ -364,13 +349,13 @@ } } - public void dataRead( IoSession session ) + public void dataRead( IoSession session, ByteBuffer buf ) { try { Entry.this.nextEntry.filter .dataRead( Entry.this.nextEntry.nextHandler, - session ); + session, buf ); } catch( Throwable e ) { @@ -378,29 +363,14 @@ } } - public void dataWritten( IoSession session ) + public void dataWritten( IoSession session, Object marker ) { try { Entry.this.nextEntry.filter .dataWritten( Entry.this.nextEntry.nextHandler, - session ); - } - catch( Throwable e ) - { - exceptionCaught( session, e ); - } - } - - public void markerReleased( IoSession session, Object marker ) - { - try - { - Entry.this.nextEntry.filter - .markerReleased( - Entry.this.nextEntry.nextHandler, - session, marker ); + session, marker ); } catch( Throwable e ) {
