aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs')
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs
new file mode 100644
index 00000000..2ea92b11
--- /dev/null
+++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AsyncContext/AsyncExecution.cs
@@ -0,0 +1,56 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.HLE.HOS.Kernel.Threading;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext
+{
+ class AsyncExecution
+ {
+ private readonly CancellationTokenSource _tokenSource;
+ private readonly CancellationToken _token;
+
+ public KEvent SystemEvent { get; }
+ public bool IsInitialized { get; private set; }
+ public bool IsRunning { get; private set; }
+
+ public AsyncExecution(KEvent asyncEvent)
+ {
+ SystemEvent = asyncEvent;
+
+ _tokenSource = new CancellationTokenSource();
+ _token = _tokenSource.Token;
+ }
+
+ public void Initialize(int timeout, Func<CancellationToken, Task> taskAsync)
+ {
+ Task.Run(async () =>
+ {
+ IsRunning = true;
+
+ _tokenSource.CancelAfter(timeout);
+
+ try
+ {
+ await taskAsync(_token);
+ }
+ catch (Exception ex)
+ {
+ Logger.Warning?.Print(LogClass.ServiceAcc, $"Exception: {ex.Message}");
+ }
+
+ SystemEvent.ReadableEvent.Signal();
+
+ IsRunning = false;
+ }, _token);
+
+ IsInitialized = true;
+ }
+
+ public void Cancel()
+ {
+ _tokenSource.Cancel();
+ }
+ }
+} \ No newline at end of file