Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds support for threading lock in .NET 9 and C# 13 #277

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/R3.Avalonia/AvaloniaDispatcherFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ public sealed class AvaloniaDispatcherFrameProvider : FrameProvider, IDisposable
bool disposed;
long frameCount;
FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif
readonly DispatcherTimer timer;
EventHandler timerTick;

Expand Down
4 changes: 4 additions & 0 deletions src/R3.Avalonia/AvaloniaRenderingFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ public class AvaloniaRenderingFrameProvider : FrameProvider, IDisposable
bool disposed;
long frameCount;
FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif

Action<TimeSpan> messageLoop;

Expand Down
5 changes: 5 additions & 0 deletions src/R3.Avalonia/ObserveOnExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ sealed class _ObserveOnDispatcher : Observer<T>
readonly Observer<T> 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<Notification<T>> list;
bool running;

Expand Down
4 changes: 2 additions & 2 deletions src/R3.Avalonia/R3.Avalonia.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;net9.0;netstandard2.0;netstandard2.1</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>

Expand Down
4 changes: 2 additions & 2 deletions src/R3.Blazor/R3.Blazor.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
<OutputType>Library</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>
<RootNamespace>R3</RootNamespace>
Expand Down
4 changes: 2 additions & 2 deletions src/R3.BlazorWebAssembly/R3.BlazorWebAssembly.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
<OutputType>Library</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>
<RootNamespace>R3</RootNamespace>
Expand Down
4 changes: 4 additions & 0 deletions src/R3.Godot/addons/R3.Godot/GodotFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ public class GodotFrameProvider : FrameProvider
public static readonly GodotFrameProvider PhysicsProcess = new GodotFrameProvider(PlayerLoopTiming.PhysicsProcess);

FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif

PlayerLoopTiming PlayerLoopTiming { get; }

Expand Down
4 changes: 4 additions & 0 deletions src/R3.Godot/addons/R3.Godot/GodotTimeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions src/R3.LogicLooper/LogicLooperFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
4 changes: 4 additions & 0 deletions src/R3.LogicLooper/LogicLooperTimerProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/R3.LogicLooper/R3.LogicLooper.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>

Expand Down
4 changes: 4 additions & 0 deletions src/R3.Maui/MauiTickerFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<IFrameRunnerWorkItem> runners;
Expand Down
6 changes: 5 additions & 1 deletion src/R3.Maui/ObserveOnExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ sealed class _ObserveOnDispatcher : Observer<T>
readonly Action postCallback;
readonly Observer<T> 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<Notification<T>> list;
bool running;

Expand Down
4 changes: 2 additions & 2 deletions src/R3.Maui/R3.Maui.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>

Expand Down
4 changes: 4 additions & 0 deletions src/R3.MonoGame/MonoGameFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<IFrameRunnerWorkItem> list;
long frameCount;
bool disposed;
Expand Down
9 changes: 8 additions & 1 deletion src/R3.MonoGame/MonoGameTimeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ public class MonoGameTimeProvider : TimeProvider, IDisposable
public GameTime GameTime { get; private set; } = new();

FreeListCore<FrameTimer> 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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -254,4 +262,3 @@ public ValueTask DisposeAsync()
return default;
}
}

4 changes: 2 additions & 2 deletions src/R3.MonoGame/R3.MonoGame.csproj
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<TargetFrameworks>net6.0;net8.0;net9.0</TargetFrameworks>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>

<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>1701;1702;1591;1573</NoWarn>
Expand Down
2 changes: 1 addition & 1 deletion src/R3.Stride/R3.Stride.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net8.0</TargetFrameworks>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
<Nullable>enable</Nullable>
<PackageReadmeFile>README.md</PackageReadmeFile>

Expand Down
4 changes: 4 additions & 0 deletions src/R3.Stride/StrideFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ namespace R3;
public sealed class StrideFrameProvider : FrameProvider
{
FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif

internal StrongBox<double> Delta = default!; // set from Node before running process.

Expand Down
4 changes: 4 additions & 0 deletions src/R3.Stride/StrideTimeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
5 changes: 5 additions & 0 deletions src/R3.WPF/ObserveOnExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ sealed class _ObserveOnDispatcher : Observer<T>
readonly Observer<T> 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<Notification<T>> list;
bool running;

Expand Down
4 changes: 2 additions & 2 deletions src/R3.WPF/R3.WPF.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0-windows;net7.0-windows;net8.0-windows;net472;</TargetFrameworks>
<TargetFrameworks>net6.0-windows;net7.0-windows;net8.0-windows;net9.0-windows;net472;</TargetFrameworks>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<EnableWindowsTargeting>true</EnableWindowsTargeting>

Expand Down
6 changes: 5 additions & 1 deletion src/R3.WPF/WpfRenderingFrameProvider.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using R3.Collections;

namespace R3;
Expand All @@ -8,7 +8,11 @@ public sealed class WpfRenderingFrameProvider : FrameProvider, IDisposable
bool disposed;
long frameCount;
FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif

EventHandler messageLoop;

Expand Down
6 changes: 3 additions & 3 deletions src/R3.WinForms/R3.WinForms.csproj
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net6.0-windows;net8.0-windows;net472</TargetFrameworks>
<TargetFrameworks>net6.0-windows;net8.0-windows;net9.0-windows;net472</TargetFrameworks>
<UseWindowsForms>true</UseWindowsForms>
<LangVersion>12</LangVersion>
<LangVersion>13</LangVersion>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
Expand All @@ -16,7 +16,7 @@
<ItemGroup>
<None Include="../../Icon.png" Pack="true" PackagePath="/" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\R3\R3.csproj" />
</ItemGroup>
Expand Down
4 changes: 4 additions & 0 deletions src/R3.WinForms/WinFormsFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ public sealed class WinFormsFrameProvider :
private bool disposed;
private long frameCount;
private FreeListCore<IFrameRunnerWorkItem> 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;

Expand Down
4 changes: 4 additions & 0 deletions src/R3.WinUI3/WinUI3RenderingFrameProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ public sealed class WinUI3RenderingFrameProvider : FrameProvider, IDisposable
bool disposed;
long frameCount;
FreeListCore<IFrameRunnerWorkItem> list;
#if NET9_0_OR_GREATER
readonly System.Threading.Lock gate = new();
#else
readonly object gate = new object();
#endif

EventHandler<object> messageLoop;

Expand Down
16 changes: 16 additions & 0 deletions src/R3/AwaitOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,11 @@ internal abstract class AwaitOperationSwitchObserver<T> : Observer<T>
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;

Expand Down Expand Up @@ -292,7 +296,11 @@ internal abstract class AwaitOperationParallelObserver<T> : Observer<T>
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;
Expand Down Expand Up @@ -459,7 +467,11 @@ async void RunQueueWorker() // don't(can't) wait so use async void
internal abstract class AwaitOperationParallelConcurrentLimitObserver<T>(bool configureAwait, bool cancelOnCompleted, int maxConcurrent) : Observer<T>
{
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

Expand Down Expand Up @@ -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<TTaskValue>)> channel;
bool completed;
int runningCount;
Expand Down
Loading
Loading