diff options
author | Jens Geyer <jensg@apache.org> | 2013-06-25 22:21:29 +0200 |
---|---|---|
committer | Jens Geyer <jensg@apache.org> | 2013-06-25 22:21:29 +0200 |
commit | 102bca47f754d9c9ed6ce341c7f8f106bd2719d7 (patch) | |
tree | c886def659d4c122b58681c6f41299d89e97f1f0 /lib/csharp | |
parent | 809544747834a3a28e7cc9c6b93300306e4d605e (diff) | |
download | thrift-102bca47f754d9c9ed6ce341c7f8f106bd2719d7.tar.gz |
THRIFT-2032 C# client leaks sockets/handles
Patch: Jens Geyer
Diffstat (limited to 'lib/csharp')
-rw-r--r-- | lib/csharp/src/Protocol/TProtocol.cs | 25 | ||||
-rw-r--r-- | lib/csharp/src/Transport/TServerSocket.cs | 78 |
2 files changed, 63 insertions, 40 deletions
diff --git a/lib/csharp/src/Protocol/TProtocol.cs b/lib/csharp/src/Protocol/TProtocol.cs index ea3762c27..70920d47b 100644 --- a/lib/csharp/src/Protocol/TProtocol.cs +++ b/lib/csharp/src/Protocol/TProtocol.cs @@ -27,7 +27,7 @@ using Thrift.Transport; namespace Thrift.Protocol { - public abstract class TProtocol + public abstract class TProtocol : IDisposable { protected TTransport trans; @@ -41,6 +41,29 @@ namespace Thrift.Protocol get { return trans; } } + #region " IDisposable Support " + private bool _IsDisposed; + + // IDisposable + public void Dispose() + { + Dispose(true); + } + + protected virtual void Dispose(bool disposing) + { + if (!_IsDisposed) + { + if (disposing) + { + if (trans is IDisposable) + (trans as IDisposable).Dispose(); + } + } + _IsDisposed = true; + } + #endregion + public abstract void WriteMessageBegin(TMessage message); public abstract void WriteMessageEnd(); public abstract void WriteStructBegin(TStruct struc); diff --git a/lib/csharp/src/Transport/TServerSocket.cs b/lib/csharp/src/Transport/TServerSocket.cs index 1ad3bd891..eefa4f976 100644 --- a/lib/csharp/src/Transport/TServerSocket.cs +++ b/lib/csharp/src/Transport/TServerSocket.cs @@ -116,48 +116,48 @@ namespace Thrift.Transport } } - protected override TTransport AcceptImpl() - { - if (server == null) - { - throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No underlying server socket."); - } - try - { - TcpClient result = server.AcceptTcpClient(); - TSocket result2 = new TSocket(result); - try - { - result2 = new TSocket(result); - result2.Timeout = clientTimeout; - if (useBufferedSockets) - { - TBufferedTransport result3 = new TBufferedTransport(result2); - return result3; - } - else - { - return result2; - } - } - catch (System.Exception) + protected override TTransport AcceptImpl() { - // If a TSocket was successfully created, then let - // it do proper cleanup of the TcpClient object. - if (result2 != null) - result2.Dispose(); - else // Otherwise, clean it up ourselves. - ((IDisposable)result).Dispose(); - throw; + if (server == null) + { + throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No underlying server socket."); + } + try + { + TSocket result2 = null; + TcpClient result = server.AcceptTcpClient(); + try + { + result2 = new TSocket(result); + result2.Timeout = clientTimeout; + if (useBufferedSockets) + { + TBufferedTransport result3 = new TBufferedTransport(result2); + return result3; + } + else + { + return result2; + } + } + catch (System.Exception) + { + // If a TSocket was successfully created, then let + // it do proper cleanup of the TcpClient object. + if (result2 != null) + result2.Dispose(); + else // Otherwise, clean it up ourselves. + ((IDisposable)result).Dispose(); + throw; + } + } + catch (Exception ex) + { + throw new TTransportException(ex.ToString()); + } } - } - catch (Exception ex) - { - throw new TTransportException(ex.ToString()); - } - } - public override void Close() + public override void Close() { if (server != null) { |