1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System;
- using System.Threading;
- using System.Threading.Tasks.Sources;
- using LitMotion.Collections;
- namespace LitMotion
- {
- internal sealed class ValueTaskMotionConfiguredSource : MotionConfiguredSourceBase, IValueTaskSource, ILinkedPoolNode<ValueTaskMotionConfiguredSource>
- {
- static LinkedPool<ValueTaskMotionConfiguredSource> pool;
- ValueTaskMotionConfiguredSource nextNode;
- public ref ValueTaskMotionConfiguredSource NextNode => ref nextNode;
- ManualResetValueTaskSourceCore<object> core;
- static ValueTaskMotionConfiguredSource FromCanceled(out short token)
- {
- if (canceledSource == null)
- {
- canceledSource = new();
- }
- canceledSource.core.Reset();
- canceledSource.core.SetException(new OperationCanceledException());
- token = canceledSource.Version;
- return canceledSource;
- }
- static ValueTaskMotionConfiguredSource canceledSource;
- ValueTaskMotionConfiguredSource() : base() { }
- public static IValueTaskSource Create(MotionHandle motionHandle, CancelBehaviour cancelBehaviour, CancellationToken cancellationToken, out short token)
- {
- if (cancellationToken.IsCancellationRequested)
- {
- OnCanceledTokenReceived(motionHandle, cancelBehaviour);
- return FromCanceled(out token);
- }
- if (!pool.TryPop(out var result))
- {
- result = new ValueTaskMotionConfiguredSource();
- }
- result.Initialize(motionHandle, cancelBehaviour, cancellationToken);
- token = result.core.Version;
- return result;
- }
- public short Version => core.Version;
- public void GetResult(short token)
- {
- try
- {
- core.GetResult(token);
- }
- finally
- {
- TryReturn();
- }
- }
- public ValueTaskSourceStatus GetStatus(short token)
- {
- return core.GetStatus(token);
- }
- public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
- {
- core.OnCompleted(continuation, state, token, flags);
- }
- bool TryReturn()
- {
- core.Reset();
- DisposeRegistration();
- RestoreOriginalCallback();
- ResetFields();
- return pool.TryPush(this);
- }
- protected override void SetTaskCanceled(CancellationToken cancellationToken)
- {
- core.SetException(new OperationCanceledException());
- }
- protected override void SetTaskCompleted()
- {
- core.SetResult(null);
- }
- }
- }
|