diff --git a/src/R3.Avalonia/AvaloniaDispatcherFrameProvider.cs b/src/R3.Avalonia/AvaloniaDispatcherFrameProvider.cs index c5224f59..20cca766 100644 --- a/src/R3.Avalonia/AvaloniaDispatcherFrameProvider.cs +++ b/src/R3.Avalonia/AvaloniaDispatcherFrameProvider.cs @@ -13,7 +13,11 @@ public sealed class AvaloniaDispatcherFrameProvider : FrameProvider, IDisposable bool disposed; long frameCount; FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly DispatcherTimer timer; EventHandler timerTick; diff --git a/src/R3.Avalonia/AvaloniaRenderingFrameProvider.cs b/src/R3.Avalonia/AvaloniaRenderingFrameProvider.cs index 198ea1e7..6309ebfd 100644 --- a/src/R3.Avalonia/AvaloniaRenderingFrameProvider.cs +++ b/src/R3.Avalonia/AvaloniaRenderingFrameProvider.cs @@ -10,7 +10,11 @@ public class AvaloniaRenderingFrameProvider : FrameProvider, IDisposable bool disposed; long frameCount; FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif Action messageLoop; diff --git a/src/R3.Avalonia/ObserveOnExtensions.cs b/src/R3.Avalonia/ObserveOnExtensions.cs index b90cb5fa..9e023e6b 100644 --- a/src/R3.Avalonia/ObserveOnExtensions.cs +++ b/src/R3.Avalonia/ObserveOnExtensions.cs @@ -40,7 +40,12 @@ sealed class _ObserveOnDispatcher : Observer readonly Observer observer; readonly Dispatcher dispatcher; readonly DispatcherPriority? dispatcherPriority; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif + SwapListCore> list; bool running; diff --git a/src/R3.Avalonia/R3.Avalonia.csproj b/src/R3.Avalonia/R3.Avalonia.csproj index 1c4e3b03..f9bc85f6 100644 --- a/src/R3.Avalonia/R3.Avalonia.csproj +++ b/src/R3.Avalonia/R3.Avalonia.csproj @@ -1,10 +1,10 @@  - netstandard2.0;netstandard2.1;net6.0;net8.0 + net6.0;net8.0;net9.0;netstandard2.0;netstandard2.1 enable enable - 12 + 13 true 1701;1702;1591;1573 diff --git a/src/R3.Blazor/R3.Blazor.csproj b/src/R3.Blazor/R3.Blazor.csproj index 7f7f8ffa..ab04a308 100644 --- a/src/R3.Blazor/R3.Blazor.csproj +++ b/src/R3.Blazor/R3.Blazor.csproj @@ -1,11 +1,11 @@  - net6.0;net8.0 + net6.0;net8.0;net9.0 Library enable enable - 12 + 13 true 1701;1702;1591;1573 R3 diff --git a/src/R3.BlazorWebAssembly/R3.BlazorWebAssembly.csproj b/src/R3.BlazorWebAssembly/R3.BlazorWebAssembly.csproj index f43a749a..466414f7 100644 --- a/src/R3.BlazorWebAssembly/R3.BlazorWebAssembly.csproj +++ b/src/R3.BlazorWebAssembly/R3.BlazorWebAssembly.csproj @@ -1,11 +1,11 @@  - net6.0;net8.0 + net6.0;net8.0;net9.0 Library enable enable - 12 + 13 true 1701;1702;1591;1573 R3 diff --git a/src/R3.Godot/addons/R3.Godot/GodotFrameProvider.cs b/src/R3.Godot/addons/R3.Godot/GodotFrameProvider.cs index 15e3e7a0..98b3ac48 100644 --- a/src/R3.Godot/addons/R3.Godot/GodotFrameProvider.cs +++ b/src/R3.Godot/addons/R3.Godot/GodotFrameProvider.cs @@ -19,7 +19,11 @@ public class GodotFrameProvider : FrameProvider public static readonly GodotFrameProvider PhysicsProcess = new GodotFrameProvider(PlayerLoopTiming.PhysicsProcess); FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif PlayerLoopTiming PlayerLoopTiming { get; } diff --git a/src/R3.Godot/addons/R3.Godot/GodotTimeProvider.cs b/src/R3.Godot/addons/R3.Godot/GodotTimeProvider.cs index 3ef44a81..aa6c9c73 100644 --- a/src/R3.Godot/addons/R3.Godot/GodotTimeProvider.cs +++ b/src/R3.Godot/addons/R3.Godot/GodotTimeProvider.cs @@ -44,7 +44,11 @@ enum RunningState readonly TimerCallback callback; readonly object? state; readonly GodotFrameProvider frameProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif TimeSpan dueTime; TimeSpan period; diff --git a/src/R3.LogicLooper/LogicLooperFrameProvider.cs b/src/R3.LogicLooper/LogicLooperFrameProvider.cs index 3d36704d..cbb7b6e6 100644 --- a/src/R3.LogicLooper/LogicLooperFrameProvider.cs +++ b/src/R3.LogicLooper/LogicLooperFrameProvider.cs @@ -13,7 +13,11 @@ public sealed class LogicLooperFrameProvider : FrameProvider, IDisposable Task loop; internal long timestamp; internal TimeSpan deltaTime; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public LogicLooperFrameProvider(ILogicLooper looper) { diff --git a/src/R3.LogicLooper/LogicLooperTimerProvider.cs b/src/R3.LogicLooper/LogicLooperTimerProvider.cs index 1c5f8b00..85fa8d7d 100644 --- a/src/R3.LogicLooper/LogicLooperTimerProvider.cs +++ b/src/R3.LogicLooper/LogicLooperTimerProvider.cs @@ -28,7 +28,11 @@ enum RunningState readonly TimerCallback callback; readonly object? state; readonly LogicLooperFrameProvider frameProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif TimeSpan dueTime; TimeSpan period; diff --git a/src/R3.LogicLooper/R3.LogicLooper.csproj b/src/R3.LogicLooper/R3.LogicLooper.csproj index d2f72d25..cff258aa 100644 --- a/src/R3.LogicLooper/R3.LogicLooper.csproj +++ b/src/R3.LogicLooper/R3.LogicLooper.csproj @@ -1,10 +1,10 @@  - netstandard2.0;netstandard2.1;net6.0;net8.0 + netstandard2.0;netstandard2.1;net6.0;net8.0;net9.0 enable enable - 12 + 13 true 1701;1702;1591;1573 diff --git a/src/R3.Maui/MauiTickerFrameProvider.cs b/src/R3.Maui/MauiTickerFrameProvider.cs index 3aa1e6f6..8dded2e7 100644 --- a/src/R3.Maui/MauiTickerFrameProvider.cs +++ b/src/R3.Maui/MauiTickerFrameProvider.cs @@ -6,7 +6,11 @@ namespace R3; public class MauiTickerFrameProvider : FrameProvider, IDisposable { readonly ITicker ticker; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new(); +#endif readonly Action timerTick; FreeListCore runners; diff --git a/src/R3.Maui/ObserveOnExtensions.cs b/src/R3.Maui/ObserveOnExtensions.cs index 03c0735a..8af79f24 100644 --- a/src/R3.Maui/ObserveOnExtensions.cs +++ b/src/R3.Maui/ObserveOnExtensions.cs @@ -43,7 +43,11 @@ sealed class _ObserveOnDispatcher : Observer readonly Action postCallback; readonly Observer observer; readonly IDispatcher dispatcher; - readonly object gate = new(); +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else + readonly object gate = new(); +#endif SwapListCore> list; bool running; diff --git a/src/R3.Maui/R3.Maui.csproj b/src/R3.Maui/R3.Maui.csproj index 99ca8a62..0cc23f9a 100644 --- a/src/R3.Maui/R3.Maui.csproj +++ b/src/R3.Maui/R3.Maui.csproj @@ -1,10 +1,10 @@  - netstandard2.0;netstandard2.1;net6.0;net8.0 + netstandard2.0;netstandard2.1;net6.0;net8.0;net9.0 enable enable - 12 + 13 true 1701;1702;1591;1573 diff --git a/src/R3.MonoGame/MonoGameFrameProvider.cs b/src/R3.MonoGame/MonoGameFrameProvider.cs index b2789c1c..114dbd04 100644 --- a/src/R3.MonoGame/MonoGameFrameProvider.cs +++ b/src/R3.MonoGame/MonoGameFrameProvider.cs @@ -7,7 +7,11 @@ public class MonoGameFrameProvider : FrameProvider { public static readonly MonoGameFrameProvider Update = new(); +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new(); +#endif FreeListCore list; long frameCount; bool disposed; diff --git a/src/R3.MonoGame/MonoGameTimeProvider.cs b/src/R3.MonoGame/MonoGameTimeProvider.cs index 9202d1d7..759234c5 100644 --- a/src/R3.MonoGame/MonoGameTimeProvider.cs +++ b/src/R3.MonoGame/MonoGameTimeProvider.cs @@ -13,7 +13,11 @@ public class MonoGameTimeProvider : TimeProvider, IDisposable public GameTime GameTime { get; private set; } = new(); FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new(); +#endif // frame loop is delayed until first register bool running; @@ -110,7 +114,11 @@ enum RunningState readonly MonoGameTimeProvider timeProvider; readonly TimerCallback callback; readonly object? state; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new(); +#endif TimeSpan dueTime; TimeSpan period; @@ -254,4 +262,3 @@ public ValueTask DisposeAsync() return default; } } - diff --git a/src/R3.MonoGame/R3.MonoGame.csproj b/src/R3.MonoGame/R3.MonoGame.csproj index 0fb427ca..ac8554c8 100644 --- a/src/R3.MonoGame/R3.MonoGame.csproj +++ b/src/R3.MonoGame/R3.MonoGame.csproj @@ -1,9 +1,9 @@  - net6.0;net8.0 + net6.0;net8.0;net9.0 enable - 12 + 13 true 1701;1702;1591;1573 diff --git a/src/R3.Stride/R3.Stride.csproj b/src/R3.Stride/R3.Stride.csproj index 436acc4d..38a5705f 100644 --- a/src/R3.Stride/R3.Stride.csproj +++ b/src/R3.Stride/R3.Stride.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net9.0 enable README.md diff --git a/src/R3.Stride/StrideFrameProvider.cs b/src/R3.Stride/StrideFrameProvider.cs index e06c7678..5a5354ea 100644 --- a/src/R3.Stride/StrideFrameProvider.cs +++ b/src/R3.Stride/StrideFrameProvider.cs @@ -8,7 +8,11 @@ namespace R3; public sealed class StrideFrameProvider : FrameProvider { FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif internal StrongBox Delta = default!; // set from Node before running process. diff --git a/src/R3.Stride/StrideTimeProvider.cs b/src/R3.Stride/StrideTimeProvider.cs index 6c32ed3c..1c439b79 100644 --- a/src/R3.Stride/StrideTimeProvider.cs +++ b/src/R3.Stride/StrideTimeProvider.cs @@ -39,7 +39,11 @@ enum RunningState TimeSpan period; bool isDisposed; readonly StrideFrameProvider frameProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif RunningState runningState; double elapsed; diff --git a/src/R3.WPF/ObserveOnExtensions.cs b/src/R3.WPF/ObserveOnExtensions.cs index 358e6704..5eb67d76 100644 --- a/src/R3.WPF/ObserveOnExtensions.cs +++ b/src/R3.WPF/ObserveOnExtensions.cs @@ -40,7 +40,12 @@ sealed class _ObserveOnDispatcher : Observer readonly Observer observer; readonly Dispatcher dispatcher; readonly DispatcherPriority dispatcherPriority; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif + SwapListCore> list; bool running; diff --git a/src/R3.WPF/R3.WPF.csproj b/src/R3.WPF/R3.WPF.csproj index 43d4331c..91cdf0a0 100644 --- a/src/R3.WPF/R3.WPF.csproj +++ b/src/R3.WPF/R3.WPF.csproj @@ -1,10 +1,10 @@  - net6.0-windows;net7.0-windows;net8.0-windows;net472; + net6.0-windows;net7.0-windows;net8.0-windows;net9.0-windows;net472; enable true - 12 + 13 enable true diff --git a/src/R3.WPF/WpfRenderingFrameProvider.cs b/src/R3.WPF/WpfRenderingFrameProvider.cs index 30f1088f..c0e69288 100644 --- a/src/R3.WPF/WpfRenderingFrameProvider.cs +++ b/src/R3.WPF/WpfRenderingFrameProvider.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using R3.Collections; namespace R3; @@ -8,7 +8,11 @@ public sealed class WpfRenderingFrameProvider : FrameProvider, IDisposable bool disposed; long frameCount; FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif EventHandler messageLoop; diff --git a/src/R3.WinForms/R3.WinForms.csproj b/src/R3.WinForms/R3.WinForms.csproj index 8ad03cc3..40751c5c 100644 --- a/src/R3.WinForms/R3.WinForms.csproj +++ b/src/R3.WinForms/R3.WinForms.csproj @@ -1,9 +1,9 @@  - net6.0-windows;net8.0-windows;net472 + net6.0-windows;net8.0-windows;net9.0-windows;net472 true - 12 + 13 disable enable true @@ -16,7 +16,7 @@ - + diff --git a/src/R3.WinForms/WinFormsFrameProvider.cs b/src/R3.WinForms/WinFormsFrameProvider.cs index abec5b70..b59cc0e5 100644 --- a/src/R3.WinForms/WinFormsFrameProvider.cs +++ b/src/R3.WinForms/WinFormsFrameProvider.cs @@ -14,7 +14,11 @@ public sealed class WinFormsFrameProvider : private bool disposed; private long frameCount; private FreeListCore list; +#if NET9_0_OR_GREATER + private readonly System.Threading.Lock gate = new(); +#else private readonly object gate = new object(); +#endif private readonly MessageHook filter; private readonly MessageFilter? predicate; diff --git a/src/R3.WinUI3/WinUI3RenderingFrameProvider.cs b/src/R3.WinUI3/WinUI3RenderingFrameProvider.cs index 249ac595..619c75b1 100644 --- a/src/R3.WinUI3/WinUI3RenderingFrameProvider.cs +++ b/src/R3.WinUI3/WinUI3RenderingFrameProvider.cs @@ -9,7 +9,11 @@ public sealed class WinUI3RenderingFrameProvider : FrameProvider, IDisposable bool disposed; long frameCount; FreeListCore list; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif EventHandler messageLoop; diff --git a/src/R3/AwaitOperation.cs b/src/R3/AwaitOperation.cs index d9235a68..2e335592 100644 --- a/src/R3/AwaitOperation.cs +++ b/src/R3/AwaitOperation.cs @@ -188,7 +188,11 @@ internal abstract class AwaitOperationSwitchObserver : Observer CancellationTokenSource cancellationTokenSource; readonly bool configureAwait; // continueOnCapturedContext readonly bool cancelOnCompleted; +#if NET9_0_OR_GREATER + protected readonly System.Threading.Lock gate = new(); +#else protected readonly object gate = new object(); +#endif bool running; bool completed; @@ -292,7 +296,11 @@ internal abstract class AwaitOperationParallelObserver : Observer readonly CancellationTokenSource cancellationTokenSource; readonly bool configureAwait; // continueOnCapturedContext readonly bool cancelOnCompleted; +#if NET9_0_OR_GREATER + protected readonly System.Threading.Lock gate = new(); // need to use gate. +#else protected readonly object gate = new object(); // need to use gate. +#endif protected sealed override bool AutoDisposeOnCompleted => false; // disable auto-dispose int runningCount = 0; @@ -459,7 +467,11 @@ async void RunQueueWorker() // don't(can't) wait so use async void internal abstract class AwaitOperationParallelConcurrentLimitObserver(bool configureAwait, bool cancelOnCompleted, int maxConcurrent) : Observer { readonly CancellationTokenSource cancellationTokenSource = new(); +#if NET9_0_OR_GREATER + protected readonly System.Threading.Lock gate = new(); // need to use gate. +#else protected readonly object gate = new object(); // need to use gate. +#endif protected sealed override bool AutoDisposeOnCompleted => false; // disable auto-dispose @@ -555,7 +567,11 @@ internal abstract class AwaitOperationSequentialParallelConcurrentLimitObserver< readonly bool configureAwait; // continueOnCapturedContext readonly bool cancelOnCompleted; readonly int maxConcurrent; + #if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly Channel<(T, ValueTask)> channel; bool completed; int runningCount; diff --git a/src/R3/CompositeDisposable.cs b/src/R3/CompositeDisposable.cs index 5ae64cf7..99823134 100644 --- a/src/R3/CompositeDisposable.cs +++ b/src/R3/CompositeDisposable.cs @@ -7,7 +7,11 @@ namespace R3; public sealed class CompositeDisposable : ICollection, IDisposable { List list; // when removed, set null +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool isDisposed; int count; diff --git a/src/R3/Factories/Concat.cs b/src/R3/Factories/Concat.cs index 07a5dbfe..1b7a1816 100644 --- a/src/R3/Factories/Concat.cs +++ b/src/R3/Factories/Concat.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace R3; @@ -37,7 +37,11 @@ sealed class _Concat : IDisposable public SerialDisposableCore disposable; int id = 0; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Concat(Observer observer, IEnumerable> sources) { diff --git a/src/R3/Factories/Merge.cs b/src/R3/Factories/Merge.cs index 7b306817..bb86eed9 100644 --- a/src/R3/Factories/Merge.cs +++ b/src/R3/Factories/Merge.cs @@ -46,7 +46,11 @@ sealed class _Merge(Observer observer) : IDisposable { public Observer observer = observer; public SingleAssignmentDisposableCore disposable; +#if NET9_0_OR_GREATER + public readonly System.Threading.Lock gate = new(); +#else public readonly object gate = new object(); +#endif int sourceCount = -1; // not set yet. int completeCount; diff --git a/src/R3/FrameProvider.cs b/src/R3/FrameProvider.cs index 210069be..46c9978a 100644 --- a/src/R3/FrameProvider.cs +++ b/src/R3/FrameProvider.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public abstract class FrameProvider { @@ -15,7 +15,11 @@ public interface IFrameRunnerWorkItem public sealed class FakeFrameProvider : FrameProvider { long frameCount; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif FreeListCore list; public FakeFrameProvider() diff --git a/src/R3/Operators/Chunk.cs b/src/R3/Operators/Chunk.cs index e037a4f5..50c84383 100644 --- a/src/R3/Operators/Chunk.cs +++ b/src/R3/Operators/Chunk.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace R3; @@ -247,7 +247,11 @@ sealed class _Chunk : Observer readonly int count; readonly TimeSpan timeSpan; readonly TimeProvider timeProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif ITimer? timer; T[] buffer; int index; diff --git a/src/R3/Operators/ChunkFrame.cs b/src/R3/Operators/ChunkFrame.cs index 462b10cb..4ef2997f 100644 --- a/src/R3/Operators/ChunkFrame.cs +++ b/src/R3/Operators/ChunkFrame.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -119,7 +119,11 @@ sealed class _Chunk : Observer, IFrameRunnerWorkItem readonly Observer observer; readonly int periodFrame; readonly int count; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly FrameProvider frameProvider; bool running; T[] buffer; diff --git a/src/R3/Operators/CombineLatest.cs b/src/R3/Operators/CombineLatest.cs index baa8cb76..dfc13f82 100644 --- a/src/R3/Operators/CombineLatest.cs +++ b/src/R3/Operators/CombineLatest.cs @@ -244,8 +244,11 @@ sealed class _CombineLatest : IDisposable readonly Func resultSelector; readonly CombineLatestObserver observer1; readonly CombineLatestObserver observer2; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -376,8 +379,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer1; readonly CombineLatestObserver observer2; readonly CombineLatestObserver observer3; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -516,8 +522,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer2; readonly CombineLatestObserver observer3; readonly CombineLatestObserver observer4; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -664,8 +673,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer3; readonly CombineLatestObserver observer4; readonly CombineLatestObserver observer5; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -820,8 +832,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer4; readonly CombineLatestObserver observer5; readonly CombineLatestObserver observer6; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -984,8 +999,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer5; readonly CombineLatestObserver observer6; readonly CombineLatestObserver observer7; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -1156,8 +1174,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer6; readonly CombineLatestObserver observer7; readonly CombineLatestObserver observer8; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -1336,8 +1357,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer7; readonly CombineLatestObserver observer8; readonly CombineLatestObserver observer9; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -1524,8 +1548,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer8; readonly CombineLatestObserver observer9; readonly CombineLatestObserver observer10; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -1720,8 +1747,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer9; readonly CombineLatestObserver observer10; readonly CombineLatestObserver observer11; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -1924,8 +1954,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer10; readonly CombineLatestObserver observer11; readonly CombineLatestObserver observer12; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -2136,8 +2169,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer11; readonly CombineLatestObserver observer12; readonly CombineLatestObserver observer13; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -2356,8 +2392,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer12; readonly CombineLatestObserver observer13; readonly CombineLatestObserver observer14; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; @@ -2584,8 +2623,11 @@ sealed class _CombineLatest : IDisposable readonly CombineLatestObserver observer13; readonly CombineLatestObserver observer14; readonly CombineLatestObserver observer15; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; diff --git a/src/R3/Operators/CombineLatest.tt b/src/R3/Operators/CombineLatest.tt index fc6bee20..efde7f9b 100644 --- a/src/R3/Operators/CombineLatest.tt +++ b/src/R3/Operators/CombineLatest.tt @@ -1,4 +1,4 @@ -<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> @@ -56,8 +56,12 @@ internal sealed class CombineLatest<<#= generateT(i) #>, TResult>( readonly Func<<#= generateT(i) #>, TResult> resultSelector; <# for (var j = 1; j <= i; j++ ) { #> readonly CombineLatestObserver> observer<#= j #>; -<# } #> +<# } #> +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool hasValueAll; int completedCount; diff --git a/src/R3/Operators/Debounce.cs b/src/R3/Operators/Debounce.cs index 70007ab5..a75ceac0 100644 --- a/src/R3/Operators/Debounce.cs +++ b/src/R3/Operators/Debounce.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -32,7 +32,11 @@ sealed class _Debounce : Observer readonly Observer observer; readonly TimeSpan timeSpan; readonly ITimer timer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? latestValue; bool hasvalue; int timerId; @@ -109,7 +113,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _Debounce(Observer observer, Func throttleDurationSelector, bool configureAwait) : Observer { +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? latestValue; bool hasValue; bool isRunning; diff --git a/src/R3/Operators/DebounceFrame.cs b/src/R3/Operators/DebounceFrame.cs index 4bfb56d9..137c82cb 100644 --- a/src/R3/Operators/DebounceFrame.cs +++ b/src/R3/Operators/DebounceFrame.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -25,7 +25,11 @@ sealed class _DebounceFrame : Observer, IFrameRunnerWorkItem { readonly Observer observer; readonly int frameCount; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly FrameProvider frameProvider; T? latestValue; bool hasvalue; diff --git a/src/R3/Operators/Multicast.cs b/src/R3/Operators/Multicast.cs index fd49d0a5..b119c497 100644 --- a/src/R3/Operators/Multicast.cs +++ b/src/R3/Operators/Multicast.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -77,7 +77,11 @@ public static Observable Share(this Observable source) internal sealed class Multicast(Observable source, ISubject subject) : ConnectableObservable { + #if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif Connection? connection; public override IDisposable Connect() diff --git a/src/R3/Operators/ObserveOn.cs b/src/R3/Operators/ObserveOn.cs index 1ff9b1ba..7b334dd0 100644 --- a/src/R3/Operators/ObserveOn.cs +++ b/src/R3/Operators/ObserveOn.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; namespace R3; @@ -54,7 +54,11 @@ sealed class _ObserveOn : Observer readonly Observer observer; readonly SynchronizationContext synchronizationContext; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif SwapListCore> list; bool running; @@ -413,7 +417,11 @@ internal sealed class _ObserveOn : Observer, IFrameRunnerWorkItem { readonly Observer observer; readonly FrameProvider frameProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif SwapListCore> list; bool running; diff --git a/src/R3/Operators/RefCount.cs b/src/R3/Operators/RefCount.cs index f022a984..c17b4825 100644 --- a/src/R3/Operators/RefCount.cs +++ b/src/R3/Operators/RefCount.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -10,7 +10,11 @@ public static Observable RefCount(this ConnectableObservable source) internal sealed class RefCount(ConnectableObservable source) : Observable { + #if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif int refCount = 0; IDisposable? connection; diff --git a/src/R3/Operators/SelectMany.cs b/src/R3/Operators/SelectMany.cs index 658a1ad6..1b3ab73f 100644 --- a/src/R3/Operators/SelectMany.cs +++ b/src/R3/Operators/SelectMany.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -40,7 +40,11 @@ sealed class _SelectMany(Observer observer, Func> collectionSelector = collectionSelector; readonly Func resultSelector = resultSelector; readonly CompositeDisposable compositeDisposable = new(); +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool isStopped; protected override bool AutoDisposeOnCompleted => false; @@ -161,7 +165,11 @@ sealed class _SelectMany(Observer observer, Func> collectionSelector = collectionSelector; readonly Func resultSelector = resultSelector; readonly CompositeDisposable compositeDisposable = new(); +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool isStopped; int index = 0; diff --git a/src/R3/Operators/Switch.cs b/src/R3/Operators/Switch.cs index 5945bd24..64f21964 100644 --- a/src/R3/Operators/Switch.cs +++ b/src/R3/Operators/Switch.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -18,7 +18,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _Switch(Observer observer) : Observer> { public Observer observer = observer; +#if NET9_0_OR_GREATER + public readonly System.Threading.Lock gate = new(); +#else public readonly object gate = new object(); +#endif SerialDisposableCore subscription; public ulong id; diff --git a/src/R3/Operators/Take.cs b/src/R3/Operators/Take.cs index 468ece45..48313f25 100644 --- a/src/R3/Operators/Take.cs +++ b/src/R3/Operators/Take.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -88,7 +88,11 @@ sealed class _TakeTime : Observer, IDisposable readonly Observer observer; readonly ITimer timer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _TakeTime(Observer observer, TimeSpan duration, TimeProvider timeProvider) { @@ -145,7 +149,11 @@ sealed class _TakeFrame : Observer, IDisposable, IFrameRunnerWorkItem { readonly Observer observer; long remaining; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _TakeFrame(Observer observer, int frameCount, FrameProvider frameProvider) { diff --git a/src/R3/Operators/TakeLast.cs b/src/R3/Operators/TakeLast.cs index 0f5c5f57..84b6d7b1 100644 --- a/src/R3/Operators/TakeLast.cs +++ b/src/R3/Operators/TakeLast.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -106,7 +106,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _TakeLastTime : Observer, IDisposable { readonly Observer observer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly Queue<(long timestamp, T value)> queue = new(); readonly TimeSpan duration; readonly TimeProvider timeProvider; @@ -188,7 +192,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _TakeLastFrame : Observer, IDisposable { readonly Observer observer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly Queue<(long frameCount, T value)> queue = new(); readonly int frameCount; readonly FrameProvider frameProvider; diff --git a/src/R3/Operators/ThrottleFirst.cs b/src/R3/Operators/ThrottleFirst.cs index 36d237b4..aac912e9 100644 --- a/src/R3/Operators/ThrottleFirst.cs +++ b/src/R3/Operators/ThrottleFirst.cs @@ -1,4 +1,4 @@ -namespace R3; +namespace R3; public static partial class ObservableExtensions { @@ -37,7 +37,11 @@ sealed class _ThrottleFirst : Observer readonly Observer observer; readonly ITimer timer; readonly TimeSpan timeSpan; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif bool closing; public _ThrottleFirst(Observer observer, TimeSpan timeSpan, TimeProvider timeProvider) @@ -95,7 +99,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleFirst(Observer observer, Func sampler, bool configureAwait) : Observer { +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly CancellationTokenSource cancellationTokenSource = new(); bool closing; @@ -163,7 +171,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleFirst : Observer { readonly Observer observer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly IDisposable samplerSubscription; bool closing; diff --git a/src/R3/Operators/ThrottleFirstFrame.cs b/src/R3/Operators/ThrottleFirstFrame.cs index 5cd92b35..c01f083c 100644 --- a/src/R3/Operators/ThrottleFirstFrame.cs +++ b/src/R3/Operators/ThrottleFirstFrame.cs @@ -26,7 +26,11 @@ sealed class _ThrottleFirstFrame : Observer, IFrameRunnerWorkItem readonly Observer observer; readonly int frameCount; readonly FrameProvider frameProvider; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif int currentFrame; bool closing; diff --git a/src/R3/Operators/ThrottleFirstLast.cs b/src/R3/Operators/ThrottleFirstLast.cs index c2d5c44b..33834791 100644 --- a/src/R3/Operators/ThrottleFirstLast.cs +++ b/src/R3/Operators/ThrottleFirstLast.cs @@ -37,7 +37,11 @@ sealed class _ThrottleFirstLast : Observer readonly Observer observer; readonly TimeSpan interval; readonly ITimer timer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? lastValue; bool hasValue; bool timerIsRunning; @@ -109,7 +113,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleFirstLast(Observer observer, Func sampler, bool configureAwait) : Observer { +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly CancellationTokenSource cancellationTokenSource = new(); T? lastValue; bool hasValue; @@ -190,7 +198,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleFirstLast : Observer { readonly Observer observer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly IDisposable samplerSubscription; T? lastValue; bool hasValue; diff --git a/src/R3/Operators/ThrottleFirstLastFrame.cs b/src/R3/Operators/ThrottleFirstLastFrame.cs index a1edaca3..e9659b4e 100644 --- a/src/R3/Operators/ThrottleFirstLastFrame.cs +++ b/src/R3/Operators/ThrottleFirstLastFrame.cs @@ -25,7 +25,11 @@ sealed class _ThrottleFirstLastFrame : Observer, IFrameRunnerWorkItem readonly Observer observer; readonly FrameProvider frameProvider; readonly int frameCount; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? lastValue; bool hasValue; int currentFrame; diff --git a/src/R3/Operators/ThrottleLast.cs b/src/R3/Operators/ThrottleLast.cs index 5c84e00f..b1d33b8d 100644 --- a/src/R3/Operators/ThrottleLast.cs +++ b/src/R3/Operators/ThrottleLast.cs @@ -37,7 +37,11 @@ sealed class _ThrottleLast : Observer readonly Observer observer; readonly TimeSpan interval; readonly ITimer timer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? lastValue; bool hasValue; @@ -102,7 +106,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleLast(Observer observer, Func sampler, bool configureAwait) : Observer { +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly CancellationTokenSource cancellationTokenSource = new(); T? lastValue; bool isRunning; @@ -173,7 +181,11 @@ protected override IDisposable SubscribeCore(Observer observer) sealed class _ThrottleLast : Observer { readonly Observer observer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif readonly IDisposable samplerSubscription; T? lastValue; bool hasValue; diff --git a/src/R3/Operators/ThrottleLastFrame.cs b/src/R3/Operators/ThrottleLastFrame.cs index 7ec9b658..3c26e841 100644 --- a/src/R3/Operators/ThrottleLastFrame.cs +++ b/src/R3/Operators/ThrottleLastFrame.cs @@ -27,7 +27,11 @@ sealed class _ThrottleLastFrame : Observer, IFrameRunnerWorkItem readonly Observer observer; readonly FrameProvider frameProvider; readonly int frameCount; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif T? lastValue; int currentFrame; bool running; diff --git a/src/R3/Operators/Timeout.cs b/src/R3/Operators/Timeout.cs index cdbcc518..714d6268 100644 --- a/src/R3/Operators/Timeout.cs +++ b/src/R3/Operators/Timeout.cs @@ -27,7 +27,11 @@ sealed class _Timeout : Observer readonly Observer observer; readonly TimeSpan timeSpan; readonly ITimer timer; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif int timerId; public _Timeout(Observer observer, TimeSpan timeSpan, TimeProvider timeProvider) diff --git a/src/R3/Operators/TimeoutFrame.cs b/src/R3/Operators/TimeoutFrame.cs index 1c8166d8..da7b809d 100644 --- a/src/R3/Operators/TimeoutFrame.cs +++ b/src/R3/Operators/TimeoutFrame.cs @@ -24,7 +24,11 @@ sealed class _TimeoutFrame : Observer, IFrameRunnerWorkItem { readonly Observer observer; readonly int frameCount; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif int currentFrame; public _TimeoutFrame(Observer observer, int frameCount, FrameProvider frameProvider) diff --git a/src/R3/Operators/Zip.cs b/src/R3/Operators/Zip.cs index c03f50d7..24d6f276 100644 --- a/src/R3/Operators/Zip.cs +++ b/src/R3/Operators/Zip.cs @@ -239,8 +239,11 @@ sealed class _Zip : IDisposable readonly Func resultSelector; readonly ZipObserver observer1; readonly ZipObserver observer2; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -368,8 +371,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer1; readonly ZipObserver observer2; readonly ZipObserver observer3; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -505,8 +511,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer2; readonly ZipObserver observer3; readonly ZipObserver observer4; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -650,8 +659,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer3; readonly ZipObserver observer4; readonly ZipObserver observer5; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -803,8 +815,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer4; readonly ZipObserver observer5; readonly ZipObserver observer6; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -964,8 +979,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer5; readonly ZipObserver observer6; readonly ZipObserver observer7; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -1133,8 +1151,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer6; readonly ZipObserver observer7; readonly ZipObserver observer8; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -1310,8 +1331,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer7; readonly ZipObserver observer8; readonly ZipObserver observer9; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -1495,8 +1519,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer8; readonly ZipObserver observer9; readonly ZipObserver observer10; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -1688,8 +1715,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer9; readonly ZipObserver observer10; readonly ZipObserver observer11; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -1889,8 +1919,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer10; readonly ZipObserver observer11; readonly ZipObserver observer12; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -2098,8 +2131,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer11; readonly ZipObserver observer12; readonly ZipObserver observer13; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -2315,8 +2351,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer12; readonly ZipObserver observer13; readonly ZipObserver observer14; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, @@ -2540,8 +2579,11 @@ sealed class _Zip : IDisposable readonly ZipObserver observer13; readonly ZipObserver observer14; readonly ZipObserver observer15; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, diff --git a/src/R3/Operators/Zip.tt b/src/R3/Operators/Zip.tt index 9e2287eb..936b9511 100644 --- a/src/R3/Operators/Zip.tt +++ b/src/R3/Operators/Zip.tt @@ -53,8 +53,12 @@ internal sealed class Zip<<#= generateT(i) #>, TResult>( readonly Func<<#= generateT(i) #>, TResult> resultSelector; <# for (var j = 1; j <= i; j++ ) { #> readonly ZipObserver> observer<#= j #>; -<# } #> +<# } #> +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _Zip( Observer observer, diff --git a/src/R3/Operators/ZipLatest.cs b/src/R3/Operators/ZipLatest.cs index ba762aea..243224bf 100644 --- a/src/R3/Operators/ZipLatest.cs +++ b/src/R3/Operators/ZipLatest.cs @@ -239,8 +239,11 @@ sealed class _ZipLatest : IDisposable readonly Func resultSelector; readonly ZipLatestObserver observer1; readonly ZipLatestObserver observer2; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -277,7 +280,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted) { observer.OnCompleted(); @@ -371,8 +374,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer1; readonly ZipLatestObserver observer2; readonly ZipLatestObserver observer3; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -413,7 +419,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted) { observer.OnCompleted(); @@ -511,8 +517,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer2; readonly ZipLatestObserver observer3; readonly ZipLatestObserver observer4; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -557,7 +566,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted) { observer.OnCompleted(); @@ -659,8 +668,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer3; readonly ZipLatestObserver observer4; readonly ZipLatestObserver observer5; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -709,7 +721,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted) { observer.OnCompleted(); @@ -815,8 +827,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer4; readonly ZipLatestObserver observer5; readonly ZipLatestObserver observer6; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -869,7 +884,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted) { observer.OnCompleted(); @@ -979,8 +994,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer5; readonly ZipLatestObserver observer6; readonly ZipLatestObserver observer7; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1037,7 +1055,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted) { observer.OnCompleted(); @@ -1151,8 +1169,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer6; readonly ZipLatestObserver observer7; readonly ZipLatestObserver observer8; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1213,7 +1234,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted) { observer.OnCompleted(); @@ -1331,8 +1352,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer7; readonly ZipLatestObserver observer8; readonly ZipLatestObserver observer9; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1397,7 +1421,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted) { observer.OnCompleted(); @@ -1519,8 +1543,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer8; readonly ZipLatestObserver observer9; readonly ZipLatestObserver observer10; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1589,7 +1616,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted) { observer.OnCompleted(); @@ -1715,8 +1742,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer9; readonly ZipLatestObserver observer10; readonly ZipLatestObserver observer11; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1789,7 +1819,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue(), observer11.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted || observer11.IsCompleted) { observer.OnCompleted(); @@ -1919,8 +1949,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer10; readonly ZipLatestObserver observer11; readonly ZipLatestObserver observer12; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -1997,7 +2030,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue(), observer11.GetValue(), observer12.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted || observer11.IsCompleted || observer12.IsCompleted) { observer.OnCompleted(); @@ -2131,8 +2164,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer11; readonly ZipLatestObserver observer12; readonly ZipLatestObserver observer13; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -2213,7 +2249,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue(), observer11.GetValue(), observer12.GetValue(), observer13.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted || observer11.IsCompleted || observer12.IsCompleted || observer13.IsCompleted) { observer.OnCompleted(); @@ -2351,8 +2387,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer12; readonly ZipLatestObserver observer13; readonly ZipLatestObserver observer14; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -2437,7 +2476,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue(), observer11.GetValue(), observer12.GetValue(), observer13.GetValue(), observer14.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted || observer11.IsCompleted || observer12.IsCompleted || observer13.IsCompleted || observer14.IsCompleted) { observer.OnCompleted(); @@ -2579,8 +2618,11 @@ sealed class _ZipLatest : IDisposable readonly ZipLatestObserver observer13; readonly ZipLatestObserver observer14; readonly ZipLatestObserver observer15; - +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -2669,7 +2711,7 @@ public void TryPublishOnNext() { var result = resultSelector(observer1.GetValue(), observer2.GetValue(), observer3.GetValue(), observer4.GetValue(), observer5.GetValue(), observer6.GetValue(), observer7.GetValue(), observer8.GetValue(), observer9.GetValue(), observer10.GetValue(), observer11.GetValue(), observer12.GetValue(), observer13.GetValue(), observer14.GetValue(), observer15.GetValue()); observer.OnNext(result); - + if (observer1.IsCompleted || observer2.IsCompleted || observer3.IsCompleted || observer4.IsCompleted || observer5.IsCompleted || observer6.IsCompleted || observer7.IsCompleted || observer8.IsCompleted || observer9.IsCompleted || observer10.IsCompleted || observer11.IsCompleted || observer12.IsCompleted || observer13.IsCompleted || observer14.IsCompleted || observer15.IsCompleted) { observer.OnCompleted(); diff --git a/src/R3/Operators/ZipLatest.tt b/src/R3/Operators/ZipLatest.tt index 023ceb70..ee98a6e0 100644 --- a/src/R3/Operators/ZipLatest.tt +++ b/src/R3/Operators/ZipLatest.tt @@ -53,8 +53,12 @@ internal sealed class ZipLatest<<#= generateT(i) #>, TResult>( readonly Func<<#= generateT(i) #>, TResult> resultSelector; <# for (var j = 1; j <= i; j++ ) { #> readonly ZipLatestObserver> observer<#= j #>; -<# } #> +<# } #> +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif public _ZipLatest( Observer observer, @@ -95,7 +99,7 @@ internal sealed class ZipLatest<<#= generateT(i) #>, TResult>( { var result = resultSelector(<#= generateValue(i) #>); observer.OnNext(result); - + if (<#= generateIsCompletedOr(i) #>) { observer.OnCompleted(); diff --git a/src/R3/R3.csproj b/src/R3/R3.csproj index 96442227..5af6bca8 100644 --- a/src/R3/R3.csproj +++ b/src/R3/R3.csproj @@ -1,10 +1,10 @@  - netstandard2.0;netstandard2.1;net6.0;net8.0 + net6.0;net8.0;net9.0;netstandard2.0;netstandard2.1 enable enable - 12 + 13 true true diff --git a/src/R3/TimerFrameProvider.cs b/src/R3/TimerFrameProvider.cs index 0eb8fc68..0d07a26f 100644 --- a/src/R3/TimerFrameProvider.cs +++ b/src/R3/TimerFrameProvider.cs @@ -4,7 +4,11 @@ public sealed class TimerFrameProvider : FrameProvider, IDisposable { static readonly TimerCallback timerCallback = Run; +#if NET9_0_OR_GREATER + readonly System.Threading.Lock gate = new(); +#else readonly object gate = new object(); +#endif long frameCount; bool disposed; FreeListCore list; diff --git a/tests/R3.Tests/R3.Tests.csproj b/tests/R3.Tests/R3.Tests.csproj index e01fa103..bcee80e1 100644 --- a/tests/R3.Tests/R3.Tests.csproj +++ b/tests/R3.Tests/R3.Tests.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net9.0 enable enable false