Author: fhanik
Date: Sun Apr 8 10:03:21 2007
New Revision: 526577
URL: http://svn.apache.org/viewvc?view=rev&rev=526577
Log:
Start preparing for non blocking writes, the underlying code has to have the
ability if there is ever gonna be a need
fix NPE
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioSelectorPool.java
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?view=diff&rev=526577&r1=526576&r2=526577
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Sun
Apr 8 10:03:21 2007
@@ -2063,8 +2063,9 @@
try {
key =
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
int handshake = -1;
+
try {
- handshake = socket.handshake(key.isReadable(),
key.isWritable());
+ if (key!=null) handshake =
socket.handshake(key.isReadable(), key.isWritable());
}catch ( IOException x ) {
handshake = -1;
if ( log.isDebugEnabled() ) log.debug("Error during SSL
handshake",x);
@@ -2091,8 +2092,11 @@
}
}
} else if (handshake == -1 ) {
- KeyAttachment ka = (KeyAttachment)key.attachment();
-
socket.getPoller().cancelledKey(key,SocketStatus.DISCONNECT,false);
+ KeyAttachment ka = null;
+ if (key!=null) {
+ ka = (KeyAttachment) key.attachment();
+ socket.getPoller().cancelledKey(key,
SocketStatus.DISCONNECT, false);
+ }
try {socket.close(true);}catch (IOException ignore){}
nioChannels.offer(socket);
if ( ka!=null ) keyCache.offer(ka);
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioSelectorPool.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioSelectorPool.java?view=diff&rev=526577&r1=526576&r2=526577
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioSelectorPool.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioSelectorPool.java
Sun Apr 8 10:03:21 2007
@@ -126,7 +126,11 @@
* @throws IOException if an IO Exception occurs in the underlying socket
logic
*/
public int write(ByteBuffer buf, NioChannel socket, Selector selector,
long writeTimeout) throws IOException {
- if ( SHARED ) {
+ return write(buf,socket,selector,writeTimeout,true);
+ }
+
+ public int write(ByteBuffer buf, NioChannel socket, Selector selector,
long writeTimeout, boolean block) throws IOException {
+ if ( SHARED && block) {
return NioBlockingSelector.write(buf,socket,writeTimeout);
}
SelectionKey key = null;
@@ -140,14 +144,16 @@
}
try {
while ( (!timedout) && buf.hasRemaining() ) {
+ int cnt = 0;
if ( keycount > 0 ) { //only write if we were registered for a
write
- int cnt = socket.write(buf); //write the data
+ cnt = socket.write(buf); //write the data
if (cnt == -1) throw new EOFException();
written += cnt;
if (cnt > 0) {
time = System.currentTimeMillis(); //reset our timeout
timer
continue; //we successfully wrote, try again without a
selector
}
+ if (cnt==0 && (!block)) break; //don't block
}
if ( selector != null ) {
//register OP_WRITE to the selector
@@ -181,7 +187,25 @@
* @throws IOException if an IO Exception occurs in the underlying socket
logic
*/
public int read(ByteBuffer buf, NioChannel socket, Selector selector, long
readTimeout) throws IOException {
- if ( SHARED ) {
+ return read(buf,socket,selector,readTimeout,true);
+ }
+ /**
+ * Performs a read using the bytebuffer for data to be read and a selector
to register for events should
+ * you have the block=true.
+ * If the <code>selector</code> parameter is null, then it will perform a
busy read that could
+ * take up a lot of CPU cycles.
+ * @param buf ByteBuffer - the buffer containing the data, we will read as
until we have read at least one byte or we timed out
+ * @param socket SocketChannel - the socket to write data to
+ * @param selector Selector - the selector to use for blocking, if null
then a busy read will be initiated
+ * @param readTimeout long - the timeout for this read operation in
milliseconds, -1 means no timeout
+ * @param block - true if you want to block until data becomes available
or timeout time has been reached
+ * @return int - returns the number of bytes read
+ * @throws EOFException if read returns -1
+ * @throws SocketTimeoutException if the read times out
+ * @throws IOException if an IO Exception occurs in the underlying socket
logic
+ */
+ public int read(ByteBuffer buf, NioChannel socket, Selector selector, long
readTimeout, boolean block) throws IOException {
+ if ( SHARED && block) {
return NioBlockingSelector.read(buf,socket,readTimeout);
}
SelectionKey key = null;
@@ -190,14 +214,16 @@
int keycount = 1; //assume we can write
long time = System.currentTimeMillis(); //start the timeout timer
try {
- while ( (!timedout) && read == 0 ) {
+ while ( (!timedout) ) {
+ int cnt = 0;
if ( keycount > 0 ) { //only read if we were registered for a
read
- int cnt = socket.read(buf);
+ cnt = socket.read(buf);
if (cnt == -1) throw new EOFException();
read += cnt;
- if (cnt > 0) break;
- }
- if ( selector != null ) {
+ if (cnt > 0) continue; //read some more
+ if (cnt==0 && (read>0 || (!block) ) ) break; //we are done
reading
+ }
+ if ( selector != null ) {//perform a blocking read
//register OP_WRITE to the selector
if (key==null) key =
socket.getIOChannel().register(selector, SelectionKey.OP_READ);
else key.interestOps(SelectionKey.OP_READ);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]