KernelStatic.cs 961 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. using Ryujinx.HLE.HOS.Kernel.Threading;
  2. using System;
  3. using System.Threading.Tasks;
  4. namespace Ryujinx.HLE.HOS.Kernel
  5. {
  6. static class KernelStatic
  7. {
  8. [ThreadStatic]
  9. private static KernelContext Context;
  10. public static void YieldUntilCompletion(Action action)
  11. {
  12. YieldUntilCompletion(Task.Factory.StartNew(action));
  13. }
  14. public static void YieldUntilCompletion(Task task)
  15. {
  16. KThread currentThread = Context.Scheduler.GetCurrentThread();
  17. Context.CriticalSection.Enter();
  18. currentThread.Reschedule(ThreadSchedState.Paused);
  19. task.ContinueWith((antecedent) =>
  20. {
  21. currentThread.Reschedule(ThreadSchedState.Running);
  22. });
  23. Context.CriticalSection.Leave();
  24. }
  25. internal static void SetKernelContext(KernelContext context)
  26. {
  27. Context = context;
  28. }
  29. }
  30. }