Browse Source

Merge pull request #368 from Reactive-Extensions/WeGotWeakTable

Removing conditional use of ConditionalWeakTable
Bart J.F. De Smet 8 years ago
parent
commit
84a6a2404d

+ 0 - 10
Rx.NET/Source/src/System.Reactive/Concurrency/CatchScheduler.cs

@@ -3,10 +3,7 @@
 // See the LICENSE file in the project root for more information. 
 
 using System.Reactive.Disposables;
-
-#if !NO_WEAKTABLE
 using System.Runtime.CompilerServices;
-#endif
 
 namespace System.Reactive.Concurrency
 {
@@ -39,7 +36,6 @@ namespace System.Reactive.Concurrency
             };
         }
 
-#if !NO_WEAKTABLE
         public CatchScheduler(IScheduler scheduler, Func<TException, bool> handler, ConditionalWeakTable<IScheduler, IScheduler> cache)
             : base(scheduler, cache)
         {
@@ -50,12 +46,6 @@ namespace System.Reactive.Concurrency
         {
             return new CatchScheduler<TException>(scheduler, _handler, cache);
         }
-#else
-        protected override SchedulerWrapper Clone(IScheduler scheduler)
-        {
-            return new CatchScheduler<TException>(scheduler, _handler);
-        }
-#endif
 
         protected override bool TryGetService(IServiceProvider provider, Type serviceType, out object service)
         {

+ 0 - 10
Rx.NET/Source/src/System.Reactive/Concurrency/DisableOptimizationsScheduler.cs

@@ -3,10 +3,7 @@
 // See the LICENSE file in the project root for more information. 
 
 using System.Linq;
-
-#if !NO_WEAKTABLE
 using System.Runtime.CompilerServices;
-#endif
 
 namespace System.Reactive.Concurrency
 {
@@ -26,7 +23,6 @@ namespace System.Reactive.Concurrency
             _optimizationInterfaces = optimizationInterfaces;
         }
 
-#if !NO_WEAKTABLE
         public DisableOptimizationsScheduler(IScheduler scheduler, Type[] optimizationInterfaces, ConditionalWeakTable<IScheduler, IScheduler> cache)
             : base(scheduler, cache)
         {
@@ -37,12 +33,6 @@ namespace System.Reactive.Concurrency
         {
             return new DisableOptimizationsScheduler(scheduler, _optimizationInterfaces, cache);
         }
-#else
-        protected override SchedulerWrapper Clone(IScheduler scheduler)
-        {
-            return new DisableOptimizationsScheduler(scheduler, _optimizationInterfaces);
-        }
-#endif
 
         protected override bool TryGetService(IServiceProvider provider, Type serviceType, out object service)
         {

+ 7 - 49
Rx.NET/Source/src/System.Reactive/Concurrency/SchedulerWrapper.cs

@@ -2,23 +2,25 @@
 // The .NET Foundation licenses this file to you under the Apache 2.0 License.
 // See the LICENSE file in the project root for more information. 
 
-#if !NO_WEAKTABLE
 using System.Runtime.CompilerServices;
-#endif
 
 namespace System.Reactive.Concurrency
 {
     internal abstract class SchedulerWrapper : IScheduler, IServiceProvider
     {
         protected readonly IScheduler _scheduler;
+        private readonly ConditionalWeakTable<IScheduler, IScheduler> _cache;
 
         public SchedulerWrapper(IScheduler scheduler)
         {
             _scheduler = scheduler;
-
-#if !NO_WEAKTABLE
             _cache = new ConditionalWeakTable<IScheduler, IScheduler>();
-#endif
+        }
+
+        public SchedulerWrapper(IScheduler scheduler, ConditionalWeakTable<IScheduler, IScheduler> cache)
+        {
+            _scheduler = scheduler;
+            _cache = cache;
         }
 
         public DateTimeOffset Now
@@ -55,56 +57,12 @@ namespace System.Reactive.Concurrency
             return (self, state) => action(GetRecursiveWrapper(self), state);
         }
 
-#if !NO_WEAKTABLE
-        private readonly ConditionalWeakTable<IScheduler, IScheduler> _cache;
-
-        public SchedulerWrapper(IScheduler scheduler, ConditionalWeakTable<IScheduler, IScheduler> cache)
-        {
-            _scheduler = scheduler;
-            _cache = cache;
-        }
-
         protected IScheduler GetRecursiveWrapper(IScheduler scheduler)
         {
             return _cache.GetValue(scheduler, s => Clone(s, _cache));
         }
 
         protected abstract SchedulerWrapper Clone(IScheduler scheduler, ConditionalWeakTable<IScheduler, IScheduler> cache);
-#else
-            private readonly object _gate = new object();
-            private IScheduler _recursiveOriginal;
-            private IScheduler _recursiveWrapper;
-
-            protected IScheduler GetRecursiveWrapper(IScheduler scheduler)
-            {
-                var recursiveWrapper = default(IScheduler);
-
-                lock (_gate)
-                {
-                    //
-                    // Chances are the recursive scheduler will remain the same. In practice, this
-                    // single-shot caching scheme works out quite well. Notice we propagate our
-                    // mini-cache to recursive raw scheduler wrappers too.
-                    //
-                    if (!object.ReferenceEquals(scheduler, _recursiveOriginal))
-                    {
-                        _recursiveOriginal = scheduler;
-
-                        var wrapper = Clone(scheduler);
-                        wrapper._recursiveOriginal = scheduler;
-                        wrapper._recursiveWrapper = wrapper;
-
-                        _recursiveWrapper = wrapper;
-                    }
-
-                    recursiveWrapper = _recursiveWrapper;
-                }
-
-                return recursiveWrapper;
-            }
-
-            protected abstract SchedulerWrapper Clone(IScheduler scheduler);
-#endif
 
         public object GetService(Type serviceType)
         {