-
Notifications
You must be signed in to change notification settings - Fork 60
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #113 from AnnulusGames/feature-cancel-behaviour
Add: CancelBehaviour to ToUniTask, ToValueTask, ToAwaitable
- Loading branch information
Showing
11 changed files
with
462 additions
and
350 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
namespace LitMotion | ||
{ | ||
/// <summary> | ||
/// Specifies the behavior when await is canceled. | ||
/// </summary> | ||
public enum CancelBehaviour | ||
{ | ||
CancelAndCancelAwait, | ||
CompleteAndCancelAwait, | ||
CancelAwait, | ||
Cancel, | ||
Complete | ||
} | ||
} |
2 changes: 2 additions & 0 deletions
2
src/LitMotion/Assets/LitMotion/Runtime/CancelBehaviour.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
94 changes: 94 additions & 0 deletions
94
src/LitMotion/Assets/LitMotion/Runtime/External/UniTask/UniTaskMotionConfiguredSource.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
#if LITMOTION_SUPPORT_UNITASK | ||
using System; | ||
using System.Threading; | ||
using Cysharp.Threading.Tasks; | ||
|
||
namespace LitMotion | ||
{ | ||
internal sealed class UniTaskMotionConfiguredSource : MotionConfiguredSourceBase ,IUniTaskSource, ITaskPoolNode<UniTaskMotionConfiguredSource> | ||
{ | ||
static UniTaskMotionConfiguredSource() | ||
{ | ||
TaskPool.RegisterSizeGetter(typeof(UniTaskMotionConfiguredSource), () => pool.Size); | ||
} | ||
|
||
UniTaskMotionConfiguredSource() : base() { } | ||
|
||
static TaskPool<UniTaskMotionConfiguredSource> pool; | ||
UniTaskMotionConfiguredSource nextNode; | ||
public ref UniTaskMotionConfiguredSource NextNode => ref nextNode; | ||
|
||
UniTaskCompletionSourceCore<AsyncUnit> core; | ||
|
||
public static IUniTaskSource Create(MotionHandle motionHandle, CancelBehaviour cancelBehaviour, CancellationToken cancellationToken, out short token) | ||
{ | ||
if (cancellationToken.IsCancellationRequested) | ||
{ | ||
OnCanceledTokenReceived(motionHandle, cancelBehaviour); | ||
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); | ||
} | ||
|
||
if (!pool.TryPop(out var result)) | ||
{ | ||
result = new UniTaskMotionConfiguredSource(); | ||
} | ||
|
||
result.Initialize(motionHandle, cancelBehaviour, cancellationToken); | ||
|
||
TaskTracker.TrackActiveTask(result, 3); | ||
|
||
token = result.core.Version; | ||
return result; | ||
} | ||
|
||
protected override void SetTaskCanceled(CancellationToken cancellationToken) | ||
{ | ||
core.TrySetCanceled(cancellationToken); | ||
} | ||
|
||
protected override void SetTaskCompleted() | ||
{ | ||
core.TrySetResult(AsyncUnit.Default); | ||
} | ||
|
||
public void GetResult(short token) | ||
{ | ||
try | ||
{ | ||
core.GetResult(token); | ||
} | ||
finally | ||
{ | ||
TryReturn(); | ||
} | ||
} | ||
|
||
public UniTaskStatus GetStatus(short token) | ||
{ | ||
return core.GetStatus(token); | ||
} | ||
|
||
public UniTaskStatus UnsafeGetStatus() | ||
{ | ||
return core.UnsafeGetStatus(); | ||
} | ||
|
||
public void OnCompleted(Action<object> continuation, object state, short token) | ||
{ | ||
core.OnCompleted(continuation, state, token); | ||
} | ||
|
||
bool TryReturn() | ||
{ | ||
TaskTracker.RemoveTracking(this); | ||
core.Reset(); | ||
|
||
DisposeRegistration(); | ||
RestoreOriginalCallback(); | ||
ResetFields(); | ||
|
||
return pool.TryPush(this); | ||
} | ||
} | ||
} | ||
#endif |
2 changes: 2 additions & 0 deletions
2
...LitMotion/Assets/LitMotion/Runtime/External/UniTask/UniTaskMotionConfiguredSource.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.