You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2019/04/19 15:59:21 UTC
[tomcat] branch master updated: More code cleanups
This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push:
new f988436 More code cleanups
f988436 is described below
commit f9884366b9ed9273c8faf74502c1ef2d64c19b47
Author: remm <re...@apache.org>
AuthorDate: Fri Apr 19 17:59:12 2019 +0200
More code cleanups
No real change. Add an attribute to eventually replace a system property
(the system property still sets the default value). Remove unused block
parameter. Fix a lot of legacy code formatting.
---
.../tomcat/util/net/NioBlockingSelector.java | 188 +++++++++++++--------
java/org/apache/tomcat/util/net/NioEndpoint.java | 2 +-
.../apache/tomcat/util/net/NioSelectorPool.java | 171 ++++++++++---------
.../apache/tomcat/util/net/SecureNioChannel.java | 2 +-
webapps/docs/config/http.xml | 10 ++
5 files changed, 223 insertions(+), 150 deletions(-)
diff --git a/java/org/apache/tomcat/util/net/NioBlockingSelector.java b/java/org/apache/tomcat/util/net/NioBlockingSelector.java
index 252bf0e..d723c7a 100644
--- a/java/org/apache/tomcat/util/net/NioBlockingSelector.java
+++ b/java/org/apache/tomcat/util/net/NioBlockingSelector.java
@@ -49,9 +49,6 @@ public class NioBlockingSelector {
protected Selector sharedSelector;
protected BlockPoller poller;
- public NioBlockingSelector() {
-
- }
public void open(String name, Selector selector) {
sharedSelector = selector;
@@ -63,7 +60,7 @@ public class NioBlockingSelector {
}
public void close() {
- if (poller!=null) {
+ if (poller != null) {
poller.disable();
poller.interrupt();
poller = null;
@@ -71,13 +68,14 @@ public class NioBlockingSelector {
}
/**
- * Performs a blocking write using the bytebuffer for data to be written
+ * Performs a blocking write using the byte buffer for data to be written
* If the <code>selector</code> parameter is null, then it will perform a busy write that could
* take up a lot of CPU cycles.
+ *
* @param buf ByteBuffer - the buffer containing the data, we will write as long as <code>(buf.hasRemaining()==true)</code>
* @param socket SocketChannel - the socket to write data to
* @param writeTimeout long - the timeout for this write operation in milliseconds, -1 means no timeout
- * @return int - returns the number of bytes written
+ * @return the number of bytes written
* @throws EOFException if write returns -1
* @throws SocketTimeoutException if the write times out
* @throws IOException if an IO Exception occurs in the underlying socket logic
@@ -98,11 +96,12 @@ public class NioBlockingSelector {
int keycount = 1; //assume we can write
long time = System.currentTimeMillis(); //start the timeout timer
try {
- while ( (!timedout) && buf.hasRemaining()) {
+ while (!timedout && buf.hasRemaining()) {
if (keycount > 0) { //only write if we were registered for a write
int cnt = socket.write(buf); //write the data
- if (cnt == -1)
+ if (cnt == -1) {
throw new EOFException();
+ }
written += cnt;
if (cnt > 0) {
time = System.currentTimeMillis(); //reset our timeout timer
@@ -110,29 +109,33 @@ public class NioBlockingSelector {
}
}
try {
- if ( att.getWriteLatch()==null || att.getWriteLatch().getCount()==0) att.startWriteLatch(1);
- poller.add(att,SelectionKey.OP_WRITE,reference);
- att.awaitWriteLatch(AbstractEndpoint.toTimeout(writeTimeout),TimeUnit.MILLISECONDS);
+ if (att.getWriteLatch() == null || att.getWriteLatch().getCount() == 0) {
+ att.startWriteLatch(1);
+ }
+ poller.add(att, SelectionKey.OP_WRITE, reference);
+ att.awaitWriteLatch(AbstractEndpoint.toTimeout(writeTimeout), TimeUnit.MILLISECONDS);
} catch (InterruptedException ignore) {
// Ignore
}
- if ( att.getWriteLatch()!=null && att.getWriteLatch().getCount()> 0) {
+ if (att.getWriteLatch() != null && att.getWriteLatch().getCount() > 0) {
//we got interrupted, but we haven't received notification from the poller.
keycount = 0;
- }else {
+ } else {
//latch countdown has happened
keycount = 1;
att.resetWriteLatch();
}
- if (writeTimeout > 0 && (keycount == 0))
+ if (writeTimeout > 0 && (keycount == 0)) {
timedout = (System.currentTimeMillis() - time) >= writeTimeout;
- } //while
- if (timedout)
+ }
+ }
+ if (timedout) {
throw new SocketTimeoutException();
+ }
} finally {
- poller.remove(att,SelectionKey.OP_WRITE);
- if (timedout && reference.key!=null) {
+ poller.remove(att, SelectionKey.OP_WRITE);
+ if (timedout && reference.key != null) {
poller.cancelKey(reference.key);
}
reference.key = null;
@@ -145,10 +148,11 @@ public class NioBlockingSelector {
* Performs a blocking read using the bytebuffer for data to be read
* 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 readTimeout long - the timeout for this read operation in milliseconds, -1 means no timeout
- * @return int - returns the number of bytes read
+ * @return 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
@@ -168,7 +172,7 @@ public class NioBlockingSelector {
int keycount = 1; //assume we can read
long time = System.currentTimeMillis(); //start the timeout timer
try {
- while(!timedout) {
+ while (!timedout) {
if (keycount > 0) { //only read if we were registered for a read
read = socket.read(buf);
if (read != 0) {
@@ -176,7 +180,9 @@ public class NioBlockingSelector {
}
}
try {
- if ( att.getReadLatch()==null || att.getReadLatch().getCount()==0) att.startReadLatch(1);
+ if (att.getReadLatch()==null || att.getReadLatch().getCount()==0) {
+ att.startReadLatch(1);
+ }
poller.add(att,SelectionKey.OP_READ, reference);
att.awaitReadLatch(AbstractEndpoint.toTimeout(readTimeout), TimeUnit.MILLISECONDS);
} catch (InterruptedException ignore) {
@@ -190,14 +196,16 @@ public class NioBlockingSelector {
keycount = 1;
att.resetReadLatch();
}
- if (readTimeout >= 0 && (keycount == 0))
+ if (readTimeout >= 0 && (keycount == 0)) {
timedout = (System.currentTimeMillis() - time) >= readTimeout;
- } //while
- if (timedout)
+ }
+ }
+ if (timedout) {
throw new SocketTimeoutException();
+ }
} finally {
poller.remove(att,SelectionKey.OP_READ);
- if (timedout && reference.key!=null) {
+ if (timedout && reference.key != null) {
poller.cancelKey(reference.key);
}
reference.key = null;
@@ -211,7 +219,10 @@ public class NioBlockingSelector {
protected volatile boolean run = true;
protected Selector selector = null;
protected final SynchronizedQueue<Runnable> events = new SynchronizedQueue<>();
- public void disable() { run = false; selector.wakeup();}
+ public void disable() {
+ run = false;
+ selector.wakeup();
+ }
protected final AtomicInteger wakeupCounter = new AtomicInteger(0);
public void cancelKey(final SelectionKey key) {
@@ -225,31 +236,41 @@ public class NioBlockingSelector {
}
public void cancel(SelectionKey sk, NioSocketWrapper key, int ops){
- if (sk!=null) {
+ if (sk != null) {
sk.cancel();
sk.attach(null);
- if (SelectionKey.OP_WRITE==(ops&SelectionKey.OP_WRITE)) countDown(key.getWriteLatch());
- if (SelectionKey.OP_READ==(ops&SelectionKey.OP_READ))countDown(key.getReadLatch());
+ if (SelectionKey.OP_WRITE == (ops & SelectionKey.OP_WRITE)) {
+ countDown(key.getWriteLatch());
+ }
+ if (SelectionKey.OP_READ == (ops & SelectionKey.OP_READ)) {
+ countDown(key.getReadLatch());
+ }
}
}
public void add(final NioSocketWrapper key, final int ops, final KeyReference ref) {
- if ( key == null ) return;
+ if (key == null) {
+ return;
+ }
NioChannel nch = key.getSocket();
final SocketChannel ch = nch.getIOChannel();
- if ( ch == null ) return;
-
+ if (ch == null) {
+ return;
+ }
Runnable r = new RunnableAdd(ch, key, ops, ref);
events.offer(r);
wakeup();
}
public void remove(final NioSocketWrapper key, final int ops) {
- if ( key == null ) return;
+ if (key == null) {
+ return;
+ }
NioChannel nch = key.getSocket();
final SocketChannel ch = nch.getIOChannel();
- if ( ch == null ) return;
-
+ if (ch == null) {
+ return;
+ }
Runnable r = new RunnableRemove(ch, key, ops);
events.offer(r);
wakeup();
@@ -257,7 +278,6 @@ public class NioBlockingSelector {
public boolean events() {
Runnable r = null;
-
/* We only poll and run the runnable events when we start this
* method. Further events added to the queue later will be delayed
* to the next execution of this method.
@@ -275,7 +295,6 @@ public class NioBlockingSelector {
for (int i = 0; i < size && (r = events.poll()) != null; i++) {
r.run();
}
-
return (size > 0);
}
@@ -287,22 +306,30 @@ public class NioBlockingSelector {
int keyCount = 0;
try {
int i = wakeupCounter.get();
- if (i>0)
+ if (i > 0) {
keyCount = selector.selectNow();
- else {
+ } else {
wakeupCounter.set(-1);
keyCount = selector.select(1000);
}
wakeupCounter.set(0);
- if (!run) break;
- }catch ( NullPointerException x ) {
- //sun bug 5076772 on windows JDK 1.5
- if (selector==null) throw x;
- if ( log.isDebugEnabled() ) log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5",x);
+ if (!run) {
+ break;
+ }
+ } catch (NullPointerException x) {
+ // sun bug 5076772 on windows JDK 1.5
+ if (selector == null) {
+ throw x;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5", x);
+ }
continue;
- } catch ( CancelledKeyException x ) {
- //sun bug 5076772 on windows JDK 1.5
- if ( log.isDebugEnabled() ) log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5",x);
+ } catch (CancelledKeyException x) {
+ // sun bug 5076772 on windows JDK 1.5
+ if (log.isDebugEnabled()) {
+ log.debug("Possibly encountered sun bug 5076772 on windows JDK 1.5", x);
+ }
continue;
} catch (Throwable x) {
ExceptionUtils.handleThrowable(x);
@@ -310,29 +337,31 @@ public class NioBlockingSelector {
continue;
}
- Iterator<SelectionKey> iterator = keyCount > 0 ? selector.selectedKeys().iterator() : null;
+ Iterator<SelectionKey> iterator = keyCount > 0
+ ? selector.selectedKeys().iterator()
+ : null;
// Walk through the collection of ready keys and dispatch
// any active event.
while (run && iterator != null && iterator.hasNext()) {
SelectionKey sk = iterator.next();
- NioSocketWrapper attachment = (NioSocketWrapper)sk.attachment();
+ NioSocketWrapper socketWrapper = (NioSocketWrapper) sk.attachment();
try {
iterator.remove();
sk.interestOps(sk.interestOps() & (~sk.readyOps()));
- if ( sk.isReadable() ) {
- countDown(attachment.getReadLatch());
+ if (sk.isReadable()) {
+ countDown(socketWrapper.getReadLatch());
}
if (sk.isWritable()) {
- countDown(attachment.getWriteLatch());
+ countDown(socketWrapper.getWriteLatch());
}
- }catch (CancelledKeyException ckx) {
+ } catch (CancelledKeyException ckx) {
sk.cancel();
- countDown(attachment.getReadLatch());
- countDown(attachment.getWriteLatch());
+ countDown(socketWrapper.getReadLatch());
+ countDown(socketWrapper.getWriteLatch());
}
- }//while
- }catch ( Throwable t ) {
+ }
+ } catch (Throwable t) {
log.error(sm.getString("nioBlockingSelector.processingError"), t);
}
}
@@ -345,19 +374,23 @@ public class NioBlockingSelector {
try {
// Cancels all remaining keys
selector.selectNow();
- }catch( Exception ignore ) {
- if (log.isDebugEnabled())log.debug("",ignore);
+ } catch (Exception ignore) {
+ if (log.isDebugEnabled())
+ log.debug("", ignore);
}
}
try {
selector.close();
- }catch( Exception ignore ) {
- if (log.isDebugEnabled())log.debug("",ignore);
+ } catch (Exception ignore) {
+ if (log.isDebugEnabled())
+ log.debug("", ignore);
}
}
public void countDown(CountDownLatch latch) {
- if ( latch == null ) return;
+ if (latch == null) {
+ return;
+ }
latch.countDown();
}
@@ -414,24 +447,32 @@ public class NioBlockingSelector {
SelectionKey sk = ch.keyFor(selector);
try {
if (sk == null) {
- if (SelectionKey.OP_WRITE==(ops&SelectionKey.OP_WRITE)) countDown(key.getWriteLatch());
- if (SelectionKey.OP_READ==(ops&SelectionKey.OP_READ))countDown(key.getReadLatch());
+ if (SelectionKey.OP_WRITE == (ops & SelectionKey.OP_WRITE)) {
+ countDown(key.getWriteLatch());
+ }
+ if (SelectionKey.OP_READ == (ops & SelectionKey.OP_READ)) {
+ countDown(key.getReadLatch());
+ }
} else {
if (sk.isValid()) {
sk.interestOps(sk.interestOps() & (~ops));
- if (SelectionKey.OP_WRITE==(ops&SelectionKey.OP_WRITE)) countDown(key.getWriteLatch());
- if (SelectionKey.OP_READ==(ops&SelectionKey.OP_READ))countDown(key.getReadLatch());
- if (sk.interestOps()==0) {
+ if (SelectionKey.OP_WRITE == (ops & SelectionKey.OP_WRITE)) {
+ countDown(key.getWriteLatch());
+ }
+ if (SelectionKey.OP_READ == (ops & SelectionKey.OP_READ)) {
+ countDown(key.getReadLatch());
+ }
+ if (sk.interestOps() == 0) {
sk.cancel();
sk.attach(null);
}
- }else {
+ } else {
sk.cancel();
sk.attach(null);
}
}
- }catch (CancelledKeyException cx) {
- if (sk!=null) {
+ } catch (CancelledKeyException cx) {
+ if (sk != null) {
sk.cancel();
sk.attach(null);
}
@@ -462,9 +503,12 @@ public class NioBlockingSelector {
@Override
protected void finalize() {
- if (key!=null && key.isValid()) {
+ if (key != null && key.isValid()) {
log.warn(sm.getString("nioBlockingSelector.possibleLeak"));
- try {key.cancel();}catch (Exception ignore){}
+ try {
+ key.cancel();
+ } catch (Exception ignore) {
+ }
}
}
}
diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java
index bfa53bb..eb9b87a 100644
--- a/java/org/apache/tomcat/util/net/NioEndpoint.java
+++ b/java/org/apache/tomcat/util/net/NioEndpoint.java
@@ -1319,7 +1319,7 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
// Ignore
}
try {
- pool.write(from, getSocket(), selector, writeTimeout, block);
+ pool.write(from, getSocket(), selector, writeTimeout);
if (block) {
// Make sure we are flushed
do {
diff --git a/java/org/apache/tomcat/util/net/NioSelectorPool.java b/java/org/apache/tomcat/util/net/NioSelectorPool.java
index 0bcdf8d..e6b3a17 100644
--- a/java/org/apache/tomcat/util/net/NioSelectorPool.java
+++ b/java/org/apache/tomcat/util/net/NioSelectorPool.java
@@ -31,56 +31,58 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class NioSelectorPool {
- protected static final boolean SHARED =
- Boolean.parseBoolean(System.getProperty("org.apache.tomcat.util.net.NioSelectorShared", "true"));
-
protected NioBlockingSelector blockingSelector;
- protected volatile Selector SHARED_SELECTOR;
+ protected volatile Selector sharedSelector;
+ protected boolean shared = Boolean.parseBoolean(System.getProperty("org.apache.tomcat.util.net.NioSelectorShared", "true"));
protected int maxSelectors = 200;
protected long sharedSelectorTimeout = 30000;
protected int maxSpareSelectors = -1;
protected boolean enabled = true;
+
protected AtomicInteger active = new AtomicInteger(0);
protected AtomicInteger spare = new AtomicInteger(0);
- protected ConcurrentLinkedQueue<Selector> selectors =
- new ConcurrentLinkedQueue<>();
+ protected ConcurrentLinkedQueue<Selector> selectors = new ConcurrentLinkedQueue<>();
protected Selector getSharedSelector() throws IOException {
- if (SHARED && SHARED_SELECTOR == null) {
- synchronized ( NioSelectorPool.class ) {
- if ( SHARED_SELECTOR == null ) {
- SHARED_SELECTOR = Selector.open();
+ if (shared && sharedSelector == null) {
+ synchronized (NioSelectorPool.class) {
+ if (sharedSelector == null) {
+ sharedSelector = Selector.open();
}
}
}
- return SHARED_SELECTOR;
+ return sharedSelector;
}
public Selector get() throws IOException{
- if ( SHARED ) {
+ if (shared) {
return getSharedSelector();
}
- if ( (!enabled) || active.incrementAndGet() >= maxSelectors ) {
- if ( enabled ) active.decrementAndGet();
+ if ((!enabled) || active.incrementAndGet() >= maxSelectors) {
+ if (enabled) {
+ active.decrementAndGet();
+ }
return null;
}
Selector s = null;
try {
- s = selectors.size()>0?selectors.poll():null;
+ s = selectors.size() > 0 ? selectors.poll() : null;
if (s == null) {
s = Selector.open();
+ } else {
+ spare.decrementAndGet();
}
- else spare.decrementAndGet();
-
- }catch (NoSuchElementException x ) {
+ } catch (NoSuchElementException x) {
try {
s = Selector.open();
} catch (IOException iox) {
}
} finally {
- if ( s == null ) active.decrementAndGet();//we were unable to find a selector
+ if (s == null) {
+ active.decrementAndGet();// we were unable to find a selector
+ }
}
return s;
}
@@ -88,34 +90,42 @@ public class NioSelectorPool {
public void put(Selector s) throws IOException {
- if ( SHARED ) return;
- if ( enabled ) active.decrementAndGet();
- if ( enabled && (maxSpareSelectors==-1 || spare.get() < Math.min(maxSpareSelectors,maxSelectors)) ) {
+ if (shared) {
+ return;
+ }
+ if (enabled) {
+ active.decrementAndGet();
+ }
+ if (enabled && (maxSpareSelectors == -1
+ || spare.get() < Math.min(maxSpareSelectors, maxSelectors))) {
spare.incrementAndGet();
selectors.offer(s);
+ } else {
+ s.close();
}
- else s.close();
}
public void close() throws IOException {
enabled = false;
Selector s;
- while ( (s = selectors.poll()) != null ) s.close();
+ while ((s = selectors.poll()) != null) {
+ s.close();
+ }
spare.set(0);
active.set(0);
- if (blockingSelector!=null) {
+ if (blockingSelector != null) {
blockingSelector.close();
}
- if ( SHARED && getSharedSelector()!=null ) {
+ if (shared && getSharedSelector() != null) {
getSharedSelector().close();
- SHARED_SELECTOR = null;
+ sharedSelector = null;
}
}
public void open(String name) throws IOException {
enabled = true;
getSharedSelector();
- if (SHARED) {
+ if (shared) {
blockingSelector = new NioBlockingSelector();
blockingSelector.open(name, getSharedSelector());
}
@@ -138,10 +148,10 @@ public class NioSelectorPool {
* @throws SocketTimeoutException if the write times out
* @throws IOException if an IO Exception occurs in the underlying socket logic
*/
- public int write(ByteBuffer buf, NioChannel socket, Selector selector,
- long writeTimeout, boolean block) throws IOException {
- if ( SHARED && block ) {
- return blockingSelector.write(buf,socket,writeTimeout);
+ public int write(ByteBuffer buf, NioChannel socket, Selector selector, long writeTimeout)
+ throws IOException {
+ if (shared) {
+ return blockingSelector.write(buf, socket, writeTimeout);
}
SelectionKey key = null;
int written = 0;
@@ -149,34 +159,42 @@ public class NioSelectorPool {
int keycount = 1; //assume we can write
long time = System.currentTimeMillis(); //start the timeout timer
try {
- while ( (!timedout) && buf.hasRemaining() ) {
+ while ((!timedout) && buf.hasRemaining()) {
int cnt = 0;
if ( keycount > 0 ) { //only write if we were registered for a write
cnt = socket.write(buf); //write the data
- if (cnt == -1) throw new EOFException();
+ 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 ) {
+ if (selector != null) {
//register OP_WRITE to the selector
- if (key==null) key = socket.getIOChannel().register(selector, SelectionKey.OP_WRITE);
- else key.interestOps(SelectionKey.OP_WRITE);
- if (writeTimeout==0) {
+ if (key == null) {
+ key = socket.getIOChannel().register(selector, SelectionKey.OP_WRITE);
+ } else {
+ key.interestOps(SelectionKey.OP_WRITE);
+ }
+ if (writeTimeout == 0) {
timedout = buf.hasRemaining();
- } else if (writeTimeout<0) {
+ } else if (writeTimeout < 0) {
keycount = selector.select();
} else {
keycount = selector.select(writeTimeout);
}
}
- if (writeTimeout > 0 && (selector == null || keycount == 0) ) timedout = (System.currentTimeMillis()-time)>=writeTimeout;
- }//while
- if ( timedout ) throw new SocketTimeoutException();
+ if (writeTimeout > 0 && (selector == null || keycount == 0)) {
+ timedout = (System.currentTimeMillis() - time) >= writeTimeout;
+ }
+ }
+ if (timedout) {
+ throw new SocketTimeoutException();
+ }
} finally {
if (key != null) {
key.cancel();
@@ -199,27 +217,10 @@ public class NioSelectorPool {
* @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) throws IOException {
- 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 blockingSelector.read(buf,socket,readTimeout);
+ public int read(ByteBuffer buf, NioChannel socket, Selector selector, long readTimeout)
+ throws IOException {
+ if (shared) {
+ return blockingSelector.read(buf, socket, readTimeout);
}
SelectionKey key = null;
int read = 0;
@@ -227,9 +228,9 @@ public class NioSelectorPool {
int keycount = 1; //assume we can write
long time = System.currentTimeMillis(); //start the timeout timer
try {
- while ( (!timedout) ) {
+ while (!timedout) {
int cnt = 0;
- if ( keycount > 0 ) { //only read if we were registered for a read
+ if (keycount > 0) { //only read if we were registered for a read
cnt = socket.read(buf);
if (cnt == -1) {
if (read == 0) {
@@ -239,27 +240,37 @@ public class NioSelectorPool {
}
read += cnt;
if (cnt > 0) continue; //read some more
- if (cnt==0 && (read>0 || (!block) ) ) break; //we are done reading
+ if (cnt == 0 && read > 0) {
+ break; //we are done reading
+ }
}
- if ( selector != null ) {//perform a blocking read
+ if (selector != null) {//perform a blocking read
//register OP_WRITE to the selector
- if (key==null) key = socket.getIOChannel().register(selector, SelectionKey.OP_READ);
+ if (key == null) {
+ key = socket.getIOChannel().register(selector, SelectionKey.OP_READ);
+ }
else key.interestOps(SelectionKey.OP_READ);
- if (readTimeout==0) {
- timedout = (read==0);
- } else if (readTimeout<0) {
+ if (readTimeout == 0) {
+ timedout = (read == 0);
+ } else if (readTimeout < 0) {
keycount = selector.select();
} else {
keycount = selector.select(readTimeout);
}
}
- if (readTimeout > 0 && (selector == null || keycount == 0) ) timedout = (System.currentTimeMillis()-time)>=readTimeout;
- }//while
- if ( timedout ) throw new SocketTimeoutException();
+ if (readTimeout > 0 && (selector == null || keycount == 0) ) {
+ timedout = (System.currentTimeMillis() - time) >= readTimeout;
+ }
+ }
+ if (timedout) {
+ throw new SocketTimeoutException();
+ }
} finally {
if (key != null) {
key.cancel();
- if (selector != null) selector.selectNow();//removes the key from this selector
+ if (selector != null) {
+ selector.selectNow();//removes the key from this selector
+ }
}
}
return read;
@@ -304,4 +315,12 @@ public class NioSelectorPool {
public AtomicInteger getSpare() {
return spare;
}
+
+ public boolean isShared() {
+ return shared;
+ }
+
+ public void setShared(boolean shared) {
+ this.shared = shared;
+ }
}
\ No newline at end of file
diff --git a/java/org/apache/tomcat/util/net/SecureNioChannel.java b/java/org/apache/tomcat/util/net/SecureNioChannel.java
index 37bcc1f..093fd8e 100644
--- a/java/org/apache/tomcat/util/net/SecureNioChannel.java
+++ b/java/org/apache/tomcat/util/net/SecureNioChannel.java
@@ -127,7 +127,7 @@ public class SecureNioChannel extends NioChannel {
if (!block) {
flush(netOutBuffer);
} else {
- pool.write(netOutBuffer, this, s, timeout, block);
+ pool.write(netOutBuffer, this, s, timeout);
}
return !netOutBuffer.hasRemaining();
}
diff --git a/webapps/docs/config/http.xml b/webapps/docs/config/http.xml
index 039335d..0470ca7 100644
--- a/webapps/docs/config/http.xml
+++ b/webapps/docs/config/http.xml
@@ -875,6 +875,16 @@
value is set to false. Default value is <code>-1</code> (unlimited).</p>
</attribute>
+ <attribute name="selectorPool.shared" required="false">
+ <p>(bool)Set this value to <code>false</code> if you wish to
+ use a selector for each thread. When you set it to <code>false</code>, you can
+ control the size of the pool of selectors by using the
+ <strong>selectorPool.maxSelectors</strong> attribute.
+ Default is <code>true</code> or the value of the
+ <code>org.apache.tomcat.util.net.NioSelectorShared</code> system
+ property if present.</p>
+ </attribute>
+
<attribute name="useInheritedChannel" required="false">
<p>(bool)Defines if this connector should inherit an inetd/systemd network socket.
Only one connector can inherit a network socket. This can option can be
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org