|
@@ -26,73 +26,6 @@ namespace System.Linq
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class CompositeDisposable : IDisposable
|
|
|
- {
|
|
|
- private static IDisposable[] s_empty = new IDisposable[0];
|
|
|
- private IDisposable[] _dispose;
|
|
|
-
|
|
|
- public CompositeDisposable(params IDisposable[] dispose)
|
|
|
- {
|
|
|
- _dispose = dispose;
|
|
|
- }
|
|
|
-
|
|
|
- public void Dispose()
|
|
|
- {
|
|
|
- var dispose = Interlocked.Exchange(ref _dispose, s_empty);
|
|
|
-
|
|
|
- foreach (var d in dispose)
|
|
|
- {
|
|
|
- d.Dispose();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- class AssignableDisposable : IDisposable
|
|
|
- {
|
|
|
- private readonly object _gate = new object();
|
|
|
- private IDisposable _disposable;
|
|
|
- private bool _disposed;
|
|
|
-
|
|
|
- public IDisposable Disposable
|
|
|
- {
|
|
|
- set
|
|
|
- {
|
|
|
- lock (_gate)
|
|
|
- {
|
|
|
- DisposeInner();
|
|
|
-
|
|
|
- _disposable = value;
|
|
|
-
|
|
|
- if (_disposed)
|
|
|
- {
|
|
|
- DisposeInner();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void Dispose()
|
|
|
- {
|
|
|
- lock (_gate)
|
|
|
- {
|
|
|
- if (!_disposed)
|
|
|
- {
|
|
|
- _disposed = true;
|
|
|
- DisposeInner();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void DisposeInner()
|
|
|
- {
|
|
|
- if (_disposable != null)
|
|
|
- {
|
|
|
- _disposable.Dispose();
|
|
|
- _disposable = null;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
class Disposable : IDisposable
|
|
|
{
|
|
|
private static Action s_nop = () => { };
|
|
@@ -108,11 +41,6 @@ namespace System.Linq
|
|
|
return new BinaryDisposable(d1, d2);
|
|
|
}
|
|
|
|
|
|
- public static IDisposable Create(params IDisposable[] disposables)
|
|
|
- {
|
|
|
- return new CompositeDisposable(disposables);
|
|
|
- }
|
|
|
-
|
|
|
public void Dispose()
|
|
|
{
|
|
|
var dispose = Interlocked.Exchange(ref _dispose, s_nop);
|