Author: fhanik Date: Wed Apr 25 10:19:18 2007 New Revision: 532411 URL: http://svn.apache.org/viewvc?view=rev&rev=532411 Log: Change latch behavior so that it can coexist with other IO events
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java?view=diff&rev=532411&r1=532410&r2=532411 ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioBlockingSelector.java Wed Apr 25 10:19:18 2007 @@ -66,9 +66,10 @@ if ( key == null ) throw new IOException("Key no longer registered"); KeyAttachment att = (KeyAttachment) key.attachment(); try { - if ( att.getLatch()==null || att.getLatch().getCount()==0) att.startLatch(1); - if ( att.interestOps() == 0) socket.getPoller().add(socket,SelectionKey.OP_WRITE); - att.getLatch().await(writeTimeout,TimeUnit.MILLISECONDS); + if ( att.getLatch()==null || att.getLatch().getCount()==0) att.startLatch(1,SelectionKey.OP_WRITE); + //only register for write if a write has not yet been issued + if ( (att.interestOps() & SelectionKey.OP_WRITE) == 0) socket.getPoller().add(socket,SelectionKey.OP_WRITE); + att.awaitLatch(writeTimeout,TimeUnit.MILLISECONDS,SelectionKey.OP_WRITE); }catch (InterruptedException ignore) { Thread.interrupted(); } @@ -134,9 +135,9 @@ } KeyAttachment att = (KeyAttachment) key.attachment(); try { - if ( att.getLatch()==null || att.getLatch().getCount()==0) att.startLatch(1); + if ( att.getLatch()==null || att.getLatch().getCount()==0) att.startLatch(1,SelectionKey.OP_READ); if ( att.interestOps() == 0) socket.getPoller().add(socket,SelectionKey.OP_READ); - att.getLatch().await(readTimeout,TimeUnit.MILLISECONDS); + att.awaitLatch(readTimeout,TimeUnit.MILLISECONDS, SelectionKey.OP_READ); }catch (InterruptedException ignore) { Thread.interrupted(); } 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=532411&r1=532410&r2=532411 ============================================================================== --- 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 Wed Apr 25 10:19:18 2007 @@ -1494,12 +1494,15 @@ sk.attach(attachment);//cant remember why this is here NioChannel channel = attachment.getChannel(); if (sk.isReadable() || sk.isWritable() ) { - if ( attachment.getSendfileData() != null ) { + if ( attachment.getLatch() != null ) { + unreg(sk, attachment,attachment.getLatchOps()); + attachment.getLatch().countDown(); + } else if ( attachment.getSendfileData() != null ) { processSendfile(sk,attachment,true); } else if ( attachment.getComet() ) { //check if thread is available if ( isWorkerAvailable() ) { - unreg(sk, attachment); + unreg(sk, attachment, sk.readyOps()); if (!processSocket(channel, SocketStatus.OPEN)) processSocket(channel, SocketStatus.DISCONNECT); attachment.setFairness(0); @@ -1508,13 +1511,10 @@ attachment.incFairness(); result = false; } - } else if ( attachment.getLatch() != null ) { - unreg(sk, attachment); - attachment.getLatch().countDown(); } else { //later on, improve latch behavior if ( isWorkerAvailable() ) { - unreg(sk, attachment); + unreg(sk, attachment,sk.readyOps()); boolean close = (!processSocket(channel)); if (close) { cancelledKey(sk,SocketStatus.DISCONNECT,false); @@ -1578,9 +1578,9 @@ return true; } - protected void unreg(SelectionKey sk, KeyAttachment attachment) { + protected void unreg(SelectionKey sk, KeyAttachment attachment, int readyOps) { //this is a must, so that we don't have multiple threads messing with the socket - reg(sk,attachment,0); + reg(sk,attachment,sk.interestOps()& (~readyOps)); } protected void reg(SelectionKey sk, KeyAttachment attachment, int intops) { @@ -1649,6 +1649,9 @@ fairness = 0; lastRegistered = 0; sendfileData = null; + if ( latch!=null ) try {latch.countDown();}catch (Exception ignore){} + latch = null; + latchOps = 0; } public void reset() { @@ -1676,11 +1679,24 @@ public int interestOps() { return interestOps;} public int interestOps(int ops) { this.interestOps = ops; return ops; } public CountDownLatch getLatch() { return latch; } - public void resetLatch() { if ( latch.getCount() == 0 ) latch = null; else throw new IllegalStateException("Latch must be at count 0");} - public void startLatch(int cnt) { - if ( latch == null || latch.getCount() == 0 ) this.latch = new CountDownLatch(cnt); + public void resetLatch() { + if ( latch.getCount() == 0 ) latch = null; + else throw new IllegalStateException("Latch must be at count 0"); + latchOps = 0; + } + public void startLatch(int cnt, int latchOps) { + if ( latch == null || latch.getCount() == 0 ) { + this.latch = new CountDownLatch(cnt); + this.latchOps = latchOps; + } else throw new IllegalStateException("Latch must be at count 0 or null."); } + public void awaitLatch(long timeout, TimeUnit unit, int latchOps) throws InterruptedException { + if ( latch == null ) throw new IllegalStateException("Latch cannot be null"); + this.latchOps = this.latchOps | latchOps; + latch.await(timeout,unit); + } + public int getLatchOps() { return latchOps;} public int getFairness() { return fairness; } public void setFairness(int f) { fairness = f;} public void incFairness() { fairness++; } @@ -1698,6 +1714,7 @@ protected boolean error = false; protected NioChannel channel = null; protected CountDownLatch latch = null; + protected int latchOps = 0; protected int fairness = 0; protected long lastRegistered = 0; protected SendfileData sendfileData = null; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]