|  | @@ -1,9 +1,9 @@
 | 
	
		
			
				|  |  |  using System;
 | 
	
		
			
				|  |  | +using System.Globalization;
 | 
	
		
			
				|  |  |  using System.Text;
 | 
	
		
			
				|  |  |  using System.Threading;
 | 
	
		
			
				|  |  |  using Renci.SshNet.Channels;
 | 
	
		
			
				|  |  |  using Renci.SshNet.Common;
 | 
	
		
			
				|  |  | -using System.Globalization;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -13,15 +13,10 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |      public abstract class SubsystemSession : IDisposable
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          private readonly Session _session;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private readonly string _subsystemName;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private ChannelSession _channel;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private Exception _exception;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private EventWaitHandle _errorOccuredWaitHandle = new ManualResetEvent(false);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private EventWaitHandle _channelClosedWaitHandle = new ManualResetEvent(false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -99,7 +94,6 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |          public void Disconnect()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._channel.SendEof();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              this._channel.Close();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -132,12 +126,10 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              this._exception = error;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            this._errorOccuredWaitHandle.Set();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (this.ErrorOccurred != null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                this.ErrorOccurred(this, new ExceptionEventArgs(error));
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            var errorOccuredWaitHandle = _errorOccuredWaitHandle;
 | 
	
		
			
				|  |  | +            if (errorOccuredWaitHandle != null)
 | 
	
		
			
				|  |  | +                errorOccuredWaitHandle.Set();
 | 
	
		
			
				|  |  | +            SignalErrorOccurred(error);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private void Channel_DataReceived(object sender, ChannelDataEventArgs e)
 | 
	
	
		
			
				|  | @@ -147,7 +139,9 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private void Channel_Closed(object sender, ChannelEventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            this._channelClosedWaitHandle.Set();
 | 
	
		
			
				|  |  | +            var channelClosedWaitHandle = _channelClosedWaitHandle;
 | 
	
		
			
				|  |  | +            if (channelClosedWaitHandle != null)
 | 
	
		
			
				|  |  | +                channelClosedWaitHandle.Set();
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          internal void WaitOnHandle(WaitHandle waitHandle, TimeSpan operationTimeout)
 | 
	
	
		
			
				|  | @@ -172,11 +166,7 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private void Session_Disconnected(object sender, EventArgs e)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            if (this.Disconnected != null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                this.Disconnected(this, new EventArgs());
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            SignalDisconnected();
 | 
	
		
			
				|  |  |              this.RaiseError(new SshException("Connection was lost"));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -185,6 +175,24 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |              this.RaiseError(e.Exception);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        private void SignalErrorOccurred(Exception error)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var errorOccurred = ErrorOccurred;
 | 
	
		
			
				|  |  | +            if (errorOccurred != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                errorOccurred(this, new ExceptionEventArgs(error));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void SignalDisconnected()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var disconnected = Disconnected;
 | 
	
		
			
				|  |  | +            if (disconnected != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                disconnected(this, new EventArgs());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          #region IDisposable Members
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private bool _isDisposed;
 | 
	
	
		
			
				|  | @@ -195,7 +203,6 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |          public void Dispose()
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              Dispose(true);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              GC.SuppressFinalize(this);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -211,6 +218,7 @@ namespace Renci.SshNet.Sftp
 | 
	
		
			
				|  |  |                  if (this._channel != null)
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      this._channel.DataReceived -= Channel_DataReceived;
 | 
	
		
			
				|  |  | +                    this._channel.Closed -= Channel_Closed;
 | 
	
		
			
				|  |  |                      this._channel.Dispose();
 | 
	
		
			
				|  |  |                      this._channel = null;
 | 
	
		
			
				|  |  |                  }
 |