Bladeren bron

Some small memory improvements for Ix-Async.

Bart De Smet 10 jaren geleden
bovenliggende
commit
68711390e8

+ 1 - 1
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Conversions.cs

@@ -299,7 +299,7 @@ namespace System.Linq
 
                 f();
 
-                return new CompositeDisposable(ctd, e);
+                return Disposable.Create(ctd, e);
             }
         }
 #endif

+ 1 - 1
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Creation.cs

@@ -241,7 +241,7 @@ namespace System.Linq
                 }
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, resource, e);
+                var d = Disposable.Create(cts, resource, e);
 
                 var current = default(TSource);
 

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Exceptions.cs

@@ -23,7 +23,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable { Disposable = e };
-                var d = new CompositeDisposable(cts, a);
+                var d = Disposable.Create(cts, a);
                 var done = false;
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
@@ -133,7 +133,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable();
-                var d = new CompositeDisposable(cts, se, a);
+                var d = Disposable.Create(cts, se, a);
 
                 var error = default(Exception);
 
@@ -216,7 +216,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var r = new Disposable(finallyAction);
-                var d = new CompositeDisposable(cts, e, r);
+                var d = Disposable.Create(cts, e, r);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -277,7 +277,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable();
-                var d = new CompositeDisposable(cts, se, a);
+                var d = Disposable.Create(cts, se, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>

+ 7 - 7
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Multiple.cs

@@ -23,7 +23,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable { Disposable = e };
-                var d = new CompositeDisposable(cts, a);
+                var d = Disposable.Create(cts, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) => e.MoveNext(ct).ContinueWith(t =>
@@ -81,7 +81,7 @@ namespace System.Linq
                 var current = default(TResult);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e1, e2);
+                var d = Disposable.Create(cts, e1, e2);
 
                 return Create(
                     (ct, tcs) =>
@@ -119,7 +119,7 @@ namespace System.Linq
                 var e = first.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var mapTask = default(Task<Dictionary<TSource, TSource>>);
                 var getMapTask = new Func<CancellationToken, Task<Dictionary<TSource, TSource>>>(ct =>
@@ -185,7 +185,7 @@ namespace System.Linq
                 var e = first.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var mapTask = default(Task<Dictionary<TSource, TSource>>);
                 var getMapTask = new Func<CancellationToken, Task<Dictionary<TSource, TSource>>>(ct =>
@@ -369,7 +369,7 @@ namespace System.Linq
                 var current = default(TResult);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, outerE);
+                var d = Disposable.Create(cts, outerE);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -474,7 +474,7 @@ namespace System.Linq
                 var ie = inner.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, oe, ie);
+                var d = Disposable.Create(cts, oe, ie);
 
                 var current = default(TResult);
                 var useOuter = true;
@@ -682,7 +682,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable();
-                var d = new CompositeDisposable(cts, se, a);
+                var d = Disposable.Create(cts, se, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>

+ 28 - 28
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Single.cs

@@ -22,7 +22,7 @@ namespace System.Linq
                 var current = default(TResult);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -74,7 +74,7 @@ namespace System.Linq
                 var index = 0;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -132,7 +132,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -190,7 +190,7 @@ namespace System.Linq
                 var index = 0;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -264,7 +264,7 @@ namespace System.Linq
                 });
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, new Disposable(disposeIe), e);
+                var d = Disposable.Create(cts, new Disposable(disposeIe), e);
 
                 var outer = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 var inner = default(Action<TaskCompletionSource<bool>, CancellationToken>);
@@ -359,7 +359,7 @@ namespace System.Linq
                 var index = 0;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, new Disposable(disposeIe), e);
+                var d = Disposable.Create(cts, new Disposable(disposeIe), e);
 
                 var outer = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 var inner = default(Action<TaskCompletionSource<bool>, CancellationToken>);
@@ -476,7 +476,7 @@ namespace System.Linq
                 var n = count;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -517,7 +517,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -571,7 +571,7 @@ namespace System.Linq
                 var index = 0;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -625,7 +625,7 @@ namespace System.Linq
                 var n = count;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -676,7 +676,7 @@ namespace System.Linq
                 var skipping = true;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -743,7 +743,7 @@ namespace System.Linq
                 var index = 0;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -809,7 +809,7 @@ namespace System.Linq
                 var current = default(TSource);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -896,7 +896,7 @@ namespace System.Linq
                 var stack = default(Stack<TSource>);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 return Create(
                     (ct, tcs) =>
@@ -1090,7 +1090,7 @@ namespace System.Linq
 
                     var cts = new CancellationTokenDisposable();
                     var d1 = new AssignableDisposable();
-                    var d = new CompositeDisposable(cts, e, d1);
+                    var d = Disposable.Create(cts, e, d1);
 
                     var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                     var g = default(Action<TaskCompletionSource<bool>, CancellationToken>);
@@ -1221,7 +1221,7 @@ namespace System.Linq
                             e.Dispose();
                     }
                 );
-                var d = new CompositeDisposable(cts, refCount);
+                var d = Disposable.Create(cts, refCount);
 
                 var iterateSource = default(Func<CancellationToken, Task<bool>>);
                 iterateSource = ct =>
@@ -1476,7 +1476,7 @@ namespace System.Linq
                 var index = -1;
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, sourceDisposable);
+                var d = Disposable.Create(cts, sourceDisposable);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -1593,7 +1593,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var current = default(TSource);
 
@@ -1736,7 +1736,7 @@ namespace System.Linq
                 var current = default(TSource);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, a);
+                var d = Disposable.Create(cts, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -1804,7 +1804,7 @@ namespace System.Linq
                 var current = default(TSource);
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, a);
+                var d = Disposable.Create(cts, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -1864,7 +1864,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
@@ -1933,7 +1933,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var buffers = new Queue<IList<TSource>>();
 
@@ -2079,7 +2079,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var currentKey = default(TKey);
                 var hasCurrentKey = false;
@@ -2159,7 +2159,7 @@ namespace System.Linq
 
                 var cts = new CancellationTokenDisposable();
                 var a = new AssignableDisposable();
-                var d = new CompositeDisposable(cts, a);
+                var d = Disposable.Create(cts, a);
 
                 var queue = new Queue<IAsyncEnumerable<TSource>>();
                 queue.Enqueue(source);
@@ -2252,7 +2252,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var acc = seed;
                 var current = default(TAccumulate);
@@ -2311,7 +2311,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var hasSeed = false;
                 var acc = default(TSource);
@@ -2380,7 +2380,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var q = new Queue<TSource>(count);
                 var done = false;
@@ -2451,7 +2451,7 @@ namespace System.Linq
                 var e = source.GetEnumerator();
 
                 var cts = new CancellationTokenDisposable();
-                var d = new CompositeDisposable(cts, e);
+                var d = Disposable.Create(cts, e);
 
                 var q = new Queue<TSource>();
                 var current = default(TSource);

+ 30 - 2
Ix.NET/Source/System.Interactive.Async/Disposables.cs

@@ -7,7 +7,7 @@ namespace System.Linq
 {
     class CancellationTokenDisposable : IDisposable
     {
-        private CancellationTokenSource cts = new CancellationTokenSource();
+        private readonly CancellationTokenSource cts = new CancellationTokenSource();
 
         public CancellationToken Token { get { return cts.Token; } }
 
@@ -36,7 +36,7 @@ namespace System.Linq
 
     class AssignableDisposable : IDisposable
     {
-        private object _gate = new object();
+        private readonly object _gate = new object();
         private IDisposable _disposable;
         private bool _disposed;
 
@@ -81,9 +81,37 @@ namespace System.Linq
             _dispose = dispose;
         }
 
+        public static IDisposable Create(IDisposable d1, IDisposable d2)
+        {
+            return new BinaryDisposable(d1, d2);
+        }
+
+        public static IDisposable Create(params IDisposable[] disposables)
+        {
+            return new CompositeDisposable(disposables);
+        }
+
         public void Dispose()
         {
             _dispose();
         }
     }
+
+    class BinaryDisposable : IDisposable
+    {
+        private readonly IDisposable _d1;
+        private readonly IDisposable _d2;
+
+        public BinaryDisposable(IDisposable d1, IDisposable d2)
+        {
+            _d1 = d1;
+            _d2 = d2;
+        }
+
+        public void Dispose()
+        {
+            _d1.Dispose();
+            _d2.Dispose();
+        }
+    }
 }