UniTaskMotionConfiguredSource.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #if LITMOTION_SUPPORT_UNITASK
  2. using System;
  3. using System.Threading;
  4. using Cysharp.Threading.Tasks;
  5. namespace LitMotion
  6. {
  7. internal sealed class UniTaskMotionConfiguredSource : MotionConfiguredSourceBase ,IUniTaskSource, ITaskPoolNode<UniTaskMotionConfiguredSource>
  8. {
  9. static UniTaskMotionConfiguredSource()
  10. {
  11. TaskPool.RegisterSizeGetter(typeof(UniTaskMotionConfiguredSource), () => pool.Size);
  12. }
  13. UniTaskMotionConfiguredSource() : base() { }
  14. static TaskPool<UniTaskMotionConfiguredSource> pool;
  15. UniTaskMotionConfiguredSource nextNode;
  16. public ref UniTaskMotionConfiguredSource NextNode => ref nextNode;
  17. UniTaskCompletionSourceCore<AsyncUnit> core;
  18. public static IUniTaskSource Create(MotionHandle motionHandle, CancelBehaviour cancelBehaviour, CancellationToken cancellationToken, out short token)
  19. {
  20. if (cancellationToken.IsCancellationRequested)
  21. {
  22. OnCanceledTokenReceived(motionHandle, cancelBehaviour);
  23. return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
  24. }
  25. if (!pool.TryPop(out var result))
  26. {
  27. result = new UniTaskMotionConfiguredSource();
  28. }
  29. result.Initialize(motionHandle, cancelBehaviour, cancellationToken);
  30. TaskTracker.TrackActiveTask(result, 3);
  31. token = result.core.Version;
  32. return result;
  33. }
  34. protected override void SetTaskCanceled(CancellationToken cancellationToken)
  35. {
  36. core.TrySetCanceled(cancellationToken);
  37. }
  38. protected override void SetTaskCompleted()
  39. {
  40. core.TrySetResult(AsyncUnit.Default);
  41. }
  42. public void GetResult(short token)
  43. {
  44. try
  45. {
  46. core.GetResult(token);
  47. }
  48. finally
  49. {
  50. TryReturn();
  51. }
  52. }
  53. public UniTaskStatus GetStatus(short token)
  54. {
  55. return core.GetStatus(token);
  56. }
  57. public UniTaskStatus UnsafeGetStatus()
  58. {
  59. return core.UnsafeGetStatus();
  60. }
  61. public void OnCompleted(Action<object> continuation, object state, short token)
  62. {
  63. core.OnCompleted(continuation, state, token);
  64. }
  65. bool TryReturn()
  66. {
  67. TaskTracker.RemoveTracking(this);
  68. core.Reset();
  69. DisposeRegistration();
  70. RestoreOriginalCallback();
  71. ResetFields();
  72. return pool.TryPush(this);
  73. }
  74. }
  75. }
  76. #endif