adc         2004/04/24 14:34:35

  Modified:    modules/network/src/java/org/apache/geronimo/network/protocol
                        SocketProtocol.java
  Log:
  We are always interested in read events.
  
  It seems better to wait for a write ready event before attempting to write to 
the
  socket channel.
  
  Revision  Changes    Path
  1.9       +35 -31    
incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/SocketProtocol.java
  
  Index: SocketProtocol.java
  ===================================================================
  RCS file: 
/home/cvs/incubator-geronimo/modules/network/src/java/org/apache/geronimo/network/protocol/SocketProtocol.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SocketProtocol.java       24 Apr 2004 17:56:32 -0000      1.8
  +++ SocketProtocol.java       24 Apr 2004 21:34:34 -0000      1.9
  @@ -64,13 +64,14 @@
       ByteBuffer[] sendBuffer;
       ByteBuffer headerBuffer;
       ByteBuffer bodyBuffer;
  -    
  +
       Object serviceReadMutex;
       Object serviceWriteMutex;
  -    
  -    static int nextConnectionId=0;
  +
  +    static int nextConnectionId = 0;
  +
       synchronized static int getNextConnectionId() {
  -     return nextConnectionId++;      
  +        return nextConnectionId++;
       }
   
       public Protocol getUpProtocol() {
  @@ -150,18 +151,18 @@
       }
   
       public Protocol cloneProtocol() throws CloneNotSupportedException {
  -     SocketProtocol p = (SocketProtocol)super.clone();
  -     p.log = 
LogFactory.getLog(SocketProtocol.class.getName()+":"+getNextConnectionId());
  +        SocketProtocol p = (SocketProtocol) super.clone();
  +        p.log = LogFactory.getLog(SocketProtocol.class.getName() + ":" + 
getNextConnectionId());
           return p;
       }
   
       public void setup() throws ProtocolException {
  -     log = 
LogFactory.getLog(SocketProtocol.class.getName()+":"+getNextConnectionId());
  -     sendMutex = new Mutex();
  -     headerBuffer = ByteBuffer.allocate(4);
  -     serviceReadMutex = new Object();
  -     serviceWriteMutex = new Object();
  -     
  +        log = LogFactory.getLog(SocketProtocol.class.getName() + ":" + 
getNextConnectionId());
  +        sendMutex = new Mutex();
  +        headerBuffer = ByteBuffer.allocate(4);
  +        serviceReadMutex = new Object();
  +        serviceWriteMutex = new Object();
  +
           if (address == null && acceptedSocketChannel == null) throw new 
IllegalStateException("No address set");
   
           log.trace("Starting");
  @@ -240,10 +241,9 @@
               sendBuffer[0].putInt(size);
               sendBuffer[0].flip();
   
  -            // This is non blocking call anyways, push out
  -            // the buffer now if we can.
  -            serviceWrite();
  -            
  +            log.trace("OP_READ, OP_WRITE " + selectionKey);
  +            selectorManager.setInterestOps(selectionKey, 
SelectionKey.OP_READ | SelectionKey.OP_WRITE, 0);
  +
           } catch (InterruptedException e) {
               log.debug("Communications error, closing connection: ", e);
               close();
  @@ -255,16 +255,16 @@
           try {
               if (selection.isReadable()) {
                   synchronized (serviceReadMutex) {
  -                     serviceRead();
  +                    serviceRead();
                   }
               }
               if (selection.isWritable()) {
                   synchronized (serviceWriteMutex) {
  -                     serviceWrite();
  +                    serviceWrite();
                   }
  -            } 
  +            }
           } catch (CancelledKeyException e) {
  -             log.trace("Key Cancelled:", e);
  +            log.trace("Key Cancelled:", e);
               // who knows, by the time we get here,
               // the key could have been canceled.
           }
  @@ -273,11 +273,11 @@
       private void serviceWrite() {
           log.trace("serviceWrite() triggered.");
           try {
  -             if( sendBuffer == null ) {
  +            if (sendBuffer == null) {
                   log.trace("Write had allready been serviced.");
                   return;
  -             }
  -             
  +            }
  +
               long count = socketChannel.write(sendBuffer);
               log.trace("Wrote " + count);
   
  @@ -285,8 +285,8 @@
                   if (sendBuffer[i].hasRemaining()) {
                       // not all was delivered in this call setup selector
                       // so we setup to finish sending async.
  -                    log.trace("OP_WRITE " + selectionKey);
  -                    selectorManager.setInterestOps(selectionKey, 
SelectionKey.OP_WRITE, 0);
  +                    log.trace("OP_READ, OP_WRITE " + selectionKey);
  +                    selectorManager.setInterestOps(selectionKey, 
SelectionKey.OP_READ | SelectionKey.OP_WRITE, 0);
   
                       return;
                   }
  @@ -297,8 +297,12 @@
   
               log.trace("RELEASING " + sendMutex);
               sendMutex.release();
  -            log.trace("RELEASED " + sendMutex);            
  +            log.trace("RELEASED " + sendMutex);
  +
   
  +            // We are done writing.
  +            log.trace("OP_READ " + selectionKey);
  +            selectorManager.setInterestOps(selectionKey, 
SelectionKey.OP_READ, 0);
           } catch (IOException e) {
               log.debug("Communications error, closing connection: ", e);
               close();
  @@ -331,7 +335,7 @@
   
                       if (headerBuffer.hasRemaining()) {
                           log.trace("HEADER reamining " + 
headerBuffer.remaining());
  -                     break; // not done reading the header.
  +                        break; // not done reading the header.
                       }
   
                       headerBuffer.flip();
  @@ -351,8 +355,8 @@
                       bodyBuffer.clear();
                       bodyBuffer.limit(size);
                   }
  -                
  -                log.trace("BODY... HEADER remaining: " + 
headerBuffer.remaining()+", "+headerBuffer.hasRemaining());
  +
  +                log.trace("BODY... HEADER remaining: " + 
headerBuffer.remaining() + ", " + headerBuffer.hasRemaining());
                   // Are we reading the body??
                   if (bodyBuffer.hasRemaining()) {
                       if (tracing)
  @@ -381,7 +385,7 @@
               log.trace("OP_READ " + selectionKey);
               selectorManager.setInterestOps(selectionKey, 
SelectionKey.OP_READ, 0);
               if (tracing) log.trace("No more data available to be read.");
  -            
  +
           } catch (CancelledKeyException e) {
               log.trace("Key Cancelled: ", e);
               // who knows, by the time we get here,
  
  
  

Reply via email to