diff options
author | Greg Wilkins | 2009-04-30 03:24:06 +0000 |
---|---|---|
committer | Greg Wilkins | 2009-04-30 03:24:06 +0000 |
commit | 14c38b8346bd70bb5c8306ce354699042ca19693 (patch) | |
tree | 2de5f9ed2b7f5cc035928a8199742f21a42d4896 | |
parent | 456a00161b47b8a3a13fc253c3a94ccacd69ea3b (diff) | |
download | org.eclipse.jetty.project-14c38b8346bd70bb5c8306ce354699042ca19693.tar.gz org.eclipse.jetty.project-14c38b8346bd70bb5c8306ce354699042ca19693.tar.xz org.eclipse.jetty.project-14c38b8346bd70bb5c8306ce354699042ca19693.zip |
JETTY-937
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@200 7e9141cc-0065-0410-87d8-b60c137991c4
-rw-r--r-- | VERSION.txt | 1 | ||||
-rw-r--r-- | jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectorManager.java | 62 |
2 files changed, 44 insertions, 19 deletions
diff --git a/VERSION.txt b/VERSION.txt index cfe43c83e3..2ab0ba3444 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1,4 +1,5 @@ jetty-7.0.0.M2-SNAPSHOT + + JETTY-937 Work around Sun JVM bugs + JETTY-941 Linux chkconfig hint + JETTY-959 CGI servlet doesn't kill the CGI in case the client disconnects + JETTY-980 Fixed ResourceHandler ? handling, and bad URI creation in listings diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectorManager.java b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectorManager.java index b3f200fb63..a146089258 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectorManager.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/nio/SelectorManager.java @@ -47,6 +47,8 @@ public abstract class SelectorManager extends AbstractLifeCycle private transient SelectSet[] _selectSet; private int _selectSets=1; private volatile int _set; + private boolean _jvmBug0; + private boolean _jvmBug1; /* ------------------------------------------------------------ */ @@ -420,34 +422,33 @@ public abstract class SelectorManager extends AbstractLifeCycle _idleTimeout.setNow(now); _timeout.setNow(now); - // Look for JVM bug http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6403933 + // Look for JVM bugs + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6403933 if (selected==0 && (now-before)<wait/2) { _jvmBug++; - if (_jvmBug>4) + if (_jvmBug>16) { - // Probably JVM BUG! - for (SelectionKey key: selector.keys()) - { - if (key.interestOps()==0 && key.isValid()) - key.cancel(); - } - selector.selectNow(); - } - else if (_jvmBug>8) - { - // BLOODY SUN!!! Try refreshing the entire selector. synchronized (this) { - System.err.println("SUN BUG WORKAROUND!!!!"); - final Selector new_selector = Selector.open(); + if (_jvmBug1) + Log.debug("seeing JVM BUG(s) - recreating selector"); + else + { + _jvmBug1=true; + Log.info("seeing JVM BUG(s) - recreating selector"); + } - for (SelectionKey key : _selector.keys()) + // BLOODY SUN BUG !!! Try refreshing the entire selector. + final Selector new_selector = Selector.open(); + Iterator iterator = _selector.keys().iterator(); + while (iterator.hasNext()) { - final SocketChannel channel = (SocketChannel)key.channel(); - final Object attachment = key.attachment(); + SelectionKey k = (SelectionKey)iterator.next(); + final SelectableChannel channel = k.channel(); + final Object attachment = k.attachment(); - key.cancel(); + k.cancel(); if (attachment==null) addChange(channel); else @@ -455,8 +456,31 @@ public abstract class SelectorManager extends AbstractLifeCycle } _selector.close(); _selector=new_selector; + return; + } + } + else if (_jvmBug>8) + { + // Cancel keys with 0 interested ops + if (_jvmBug0) + Log.debug("seeing JVM BUG(s) - cancelling interestOps==0"); + else + { + _jvmBug0=true; + Log.info("seeing JVM BUG(s) - cancelling interestOps==0"); + } + Iterator iter = selector.keys().iterator(); + while(iter.hasNext()) + { + SelectionKey k = (SelectionKey) iter.next(); + if (k.isValid()&&k.interestOps()==0) + { + k.cancel(); + } } + return; } + } else _jvmBug=0; |