Author: markt
Date: Fri Jan 16 10:53:21 2015
New Revision: 1652384
URL: http://svn.apache.org/r1652384
Log:
Streamlining
- reduce scope of sync (in really only needs to surrond non-blocking
read and readInterest)
- make fillReadBuffer responsible for releasing readPending semaphore
in blocking case (it already did it for non-blcoking)
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1652384&r1=1652383&r2=1652384&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Fri Jan 16
10:53:21 2015
@@ -1014,38 +1014,34 @@ public class Nio2Endpoint extends Abstra
}
}
- synchronized (readCompletionHandler) {
- socketBufferHandler.configureReadBufferForRead();
+ socketBufferHandler.configureReadBufferForRead();
- int remaining =
socketBufferHandler.getReadBuffer().remaining();
+ int remaining = socketBufferHandler.getReadBuffer().remaining();
- // Is there enough data in the read buffer to satisfy this
request?
- if (remaining >= len) {
- socketBufferHandler.getReadBuffer().get(b, off, len);
- if (log.isDebugEnabled()) {
- log.debug("Socket: [" + this + "], Read from buffer:
[" + len + "]");
- }
- readPending.release();
- return len;
+ // Is there enough data in the read buffer to satisfy this request?
+ if (remaining >= len) {
+ socketBufferHandler.getReadBuffer().get(b, off, len);
+ if (log.isDebugEnabled()) {
+ log.debug("Socket: [" + this + "], Read from buffer: [" +
len + "]");
}
+ readPending.release();
+ return len;
+ }
- // Copy what data there is in the read buffer to the byte array
- if (remaining > 0) {
- socketBufferHandler.getReadBuffer().get(b, off, remaining);
- // This may be sufficient to complete the request and we
- // don't want to trigger another read since if there is no
- // more data to read and this request takes a while to
- // process the read will timeout triggering an error.
- readPending.release();
- return remaining;
- }
+ // Copy what data there is in the read buffer to the byte array
+ if (remaining > 0) {
+ socketBufferHandler.getReadBuffer().get(b, off, remaining);
+ // This may be sufficient to complete the request and we
+ // don't want to trigger another read since if there is no
+ // more data to read and this request takes a while to
+ // process the read will timeout triggering an error.
+ readPending.release();
+ return remaining;
+ }
+ synchronized (readCompletionHandler) {
// Fill the read buffer as best we can.
int nRead = fillReadBuffer(block);
- if (block) {
- // Just did a blocking read so release the semaphore
- readPending.release();
- }
// Fill as much of the remaining byte array as possible with
the
// data that was just read
@@ -1091,6 +1087,9 @@ public class Nio2Endpoint extends Abstra
/* Callers of this method must:
* - have acquired the readPending semaphore
* - have acquired a lock on readCompletionHandler
+ *
+ * This method will release (or arrange for the release of) the
+ * readPending semaphore once the read has completed.
*/
private int fillReadBuffer(boolean block) throws IOException {
socketBufferHandler.configureReadBufferForWrite();
@@ -1099,6 +1098,7 @@ public class Nio2Endpoint extends Abstra
try {
nRead =
getSocket().read(socketBufferHandler.getReadBuffer()).get(
getTimeout(), TimeUnit.MILLISECONDS).intValue();
+ readPending.release();
} catch (ExecutionException e) {
if (e.getCause() instanceof IOException) {
throw (IOException) e.getCause();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]