Author: gnodet
Date: Mon Jul 27 14:00:38 2009
New Revision: 798139

URL: http://svn.apache.org/viewvc?rev=798139&view=rev
Log:
SSHD-28: Deadlock between execute thread and NioProcessor thread

Added:
    
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java
Modified:
    
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
    
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
    
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java

Modified: 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
URL: 
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java?rev=798139&r1=798138&r2=798139&view=diff
==============================================================================
--- 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
 (original)
+++ 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/ChannelOutputStream.java
 Mon Jul 27 14:00:38 2009
@@ -89,6 +89,9 @@
             remoteWindow.waitAndConsume(bufferLength);
             log.debug("Send {} on channel {}", cmd, channel.getId());
             channel.getSession().writePacket(buffer);
+        } catch (WindowClosedException e) {
+          closed = true;
+          throw e;
         } catch (SshException e) {
             throw e;
         } catch (Exception e) {

Modified: 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
URL: 
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java?rev=798139&r1=798138&r2=798139&view=diff
==============================================================================
--- 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
 (original)
+++ 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/Window.java
 Mon Jul 27 14:00:38 2009
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 
+import org.apache.sshd.common.SshException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,6 +45,7 @@
     private int maxSize;
     private int packetSize;
     private boolean waiting;
+    private boolean closed;
 
     public Window(AbstractChannel channel, Object lock, boolean client, 
boolean local) {
         this.channel = channel;
@@ -114,9 +116,9 @@
         }
     }
 
-    public void waitAndConsume(int len) throws InterruptedException {
+    public void waitAndConsume(int len) throws InterruptedException, 
WindowClosedException {
         synchronized (lock) {
-            while (size < len) {
+            while (size < len && !closed) {
                 log.debug("Waiting for {} bytes on {}", len, name);
                 waiting = true;
                 lock.wait();
@@ -125,6 +127,9 @@
                 log.debug("Space available for {}", name);
                 waiting = false;
             }
+            if (closed) {
+                throw new WindowClosedException();
+            }
             size -= len;
             if (log.isTraceEnabled()) {
                 log.trace("Consume " + name + " by " + len + " down to " + 
size);
@@ -132,4 +137,12 @@
         }
     }
 
+    public void notifyClosed() {
+        synchronized (lock) {
+            closed = true;
+            if (waiting) {
+                lock.notifyAll();
+            }
+        }
+    }
 }

Added: 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java
URL: 
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java?rev=798139&view=auto
==============================================================================
--- 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java
 (added)
+++ 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/common/channel/WindowClosedException.java
 Mon Jul 27 14:00:38 2009
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sshd.common.channel;
+
+import org.apache.sshd.common.SshException;
+
+/**
+ * Indicates a {...@link Window} has been closed.
+ * 
+ * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
+ */
+public class WindowClosedException extends SshException {
+    public WindowClosedException() {
+        super("Already closed");
+    }
+}

Modified: 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
URL: 
http://svn.apache.org/viewvc/mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java?rev=798139&r1=798138&r2=798139&view=diff
==============================================================================
--- 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
 (original)
+++ 
mina/sshd/trunk/sshd-core/src/main/java/org/apache/sshd/server/channel/ChannelSession.java
 Mon Jul 27 14:00:38 2009
@@ -233,6 +233,7 @@
                     shell.destroy();
                     shell = null;
                 }
+                remoteWindow.notifyClosed();
                 IoUtils.closeQuietly(in, out, err, shellIn, shellOut, 
shellErr);
             }
         });


Reply via email to