You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2006/08/28 11:29:14 UTC

svn commit: r437621 - in /jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio: IOSession.java impl/AsyncHttpDataReceiver.java impl/AsyncHttpDataTransmitter.java impl/DefaultIOSession.java

Author: olegk
Date: Mon Aug 28 02:29:14 2006
New Revision: 437621

URL: http://svn.apache.org/viewvc?rev=437621&view=rev
Log:
Improved handling of read events

Modified:
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataReceiver.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataTransmitter.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java?rev=437621&r1=437620&r2=437621&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/IOSession.java Mon Aug 28 02:29:14 2006
@@ -38,6 +38,10 @@
     int getEventMask();
     
     void setEventMask(int ops);
+    
+    void setEvent(int op);
+
+    void clearEvent(int op);
 
     void close();
     

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataReceiver.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataReceiver.java?rev=437621&r1=437620&r2=437621&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataReceiver.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataReceiver.java Mon Aug 28 02:29:14 2006
@@ -25,14 +25,18 @@
         this.session = session;
         this.mutex = new Object();
         initBuffer(buffersize);
-        // Start receiving input events immediately
-        this.session.setEventMask(EventMask.READ);
     }
     
     public void consumeInput() throws IOException {
         synchronized (this.mutex) {
-            this.session.channel().read(getBuffer());
-            this.mutex.notifyAll();            
+            int noRead = this.session.channel().read(getBuffer());
+            if (noRead == -1) {
+                this.closed = true;
+            }
+            if (noRead != 0) {
+                this.session.clearEvent(EventMask.READ);
+                this.mutex.notifyAll();            
+            }
         }
     }
     
@@ -44,6 +48,7 @@
             ByteBuffer buffer = getBuffer();
             try {
                 while (buffer.position() == 0 && !this.closed) {
+                    this.session.setEvent(EventMask.READ);
                     this.mutex.wait();
                 }
                 
@@ -77,6 +82,9 @@
                 this.mutex.wait(timeout);
             } catch (InterruptedException ex) {
                 throw new IOException("Interrupted while waiting for more data");
+            }
+            if (this.closed) {
+                return false;
             }
             return buffer.position() > 0;
         }

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataTransmitter.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataTransmitter.java?rev=437621&r1=437620&r2=437621&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataTransmitter.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/AsyncHttpDataTransmitter.java Mon Aug 28 02:29:14 2006
@@ -32,7 +32,7 @@
             ByteBuffer buffer = getBuffer();
             this.session.channel().write(buffer);
             if (!buffer.hasRemaining()) {
-                this.session.setEventMask(EventMask.READ);
+                this.session.clearEvent(EventMask.WRITE);
                 this.mutex.notifyAll();            
             }
         }
@@ -42,7 +42,7 @@
         if (this.closed) {
             return;
         }
-        this.session.setEventMask(EventMask.READ_WRITE);
+        this.session.setEvent(EventMask.WRITE);
         synchronized (this.mutex) {
             ByteBuffer buffer = getBuffer();
             try {

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java?rev=437621&r1=437620&r2=437621&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/nio/impl/DefaultIOSession.java Mon Aug 28 02:29:14 2006
@@ -66,8 +66,26 @@
     }
     
     public void setEventMask(int ops) {
-        this.key.interestOps(ops);
-        this.key.selector().wakeup();
+        synchronized (this.key) {
+            this.key.interestOps(ops);
+            this.key.selector().wakeup();
+        }
+    }
+    
+    public void setEvent(int op) {
+        synchronized (this.key) {
+            int ops = this.key.interestOps();
+            this.key.interestOps(ops | op);
+            this.key.selector().wakeup();
+        }
+    }
+    
+    public void clearEvent(int op) {
+        synchronized (this.key) {
+            int ops = this.key.interestOps();
+            this.key.interestOps(ops & ~op);
+            this.key.selector().wakeup();
+        }
     }
     
     public int getSocketTimeout() {