From b472b237733d6152df6428019c6dc8ee92b48752 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 14:29:30 +0900 Subject: [PATCH 1/6] Fix unintended returning to pool with cancelImmediately (UniTask.Delay) --- .../Plugins/UniTask/Runtime/UniTask.Delay.cs | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs index 7f02a1a..2a38af6 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs @@ -208,6 +208,7 @@ namespace Cysharp.Threading.Tasks CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; YieldPromise() @@ -227,6 +228,7 @@ namespace Cysharp.Threading.Tasks } result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -253,7 +255,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -290,6 +293,7 @@ namespace Cysharp.Threading.Tasks core.Reset(); cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -309,6 +313,7 @@ namespace Cysharp.Threading.Tasks UniTaskCompletionSourceCore core; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; NextFramePromise() { @@ -328,6 +333,7 @@ namespace Cysharp.Threading.Tasks result.frameCount = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -354,7 +360,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -414,6 +421,7 @@ namespace Cysharp.Threading.Tasks UniTaskCompletionSourceCore core; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; WaitForEndOfFramePromise() { @@ -432,6 +440,7 @@ namespace Cysharp.Threading.Tasks } result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -458,7 +467,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -533,6 +543,7 @@ namespace Cysharp.Threading.Tasks int delayFrameCount; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; int currentFrameCount; UniTaskCompletionSourceCore core; @@ -556,6 +567,7 @@ namespace Cysharp.Threading.Tasks result.delayFrameCount = delayFrameCount; result.cancellationToken = cancellationToken; result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -582,7 +594,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -653,6 +666,7 @@ namespace Cysharp.Threading.Tasks delayFrameCount = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -673,6 +687,7 @@ namespace Cysharp.Threading.Tasks float elapsed; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -696,6 +711,7 @@ namespace Cysharp.Threading.Tasks result.delayTimeSpan = (float)delayTimeSpan.TotalSeconds; result.cancellationToken = cancellationToken; result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -722,7 +738,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -775,6 +792,7 @@ namespace Cysharp.Threading.Tasks elapsed = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -795,6 +813,7 @@ namespace Cysharp.Threading.Tasks int initialFrame; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -818,6 +837,7 @@ namespace Cysharp.Threading.Tasks result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds; result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -844,7 +864,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -897,6 +918,7 @@ namespace Cysharp.Threading.Tasks elapsed = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -916,6 +938,7 @@ namespace Cysharp.Threading.Tasks ValueStopwatch stopwatch; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -938,6 +961,7 @@ namespace Cysharp.Threading.Tasks result.stopwatch = ValueStopwatch.StartNew(); result.delayTimeSpanTicks = delayTimeSpan.Ticks; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -964,7 +988,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -1013,6 +1038,7 @@ namespace Cysharp.Threading.Tasks stopwatch = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } From fcd93feb5639808f20f2bce478a90523f4e1ee74 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 14:45:55 +0900 Subject: [PATCH 2/6] Fix unintended returning to pool with cancelImmediately (AsyncOperation) --- .../UniTask/Runtime/UnityAsyncExtensions.cs | 30 +++++++++++++++---- .../UniTask/Runtime/UnityAsyncExtensions.tt | 6 +++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs index b9cd1c9..5ec9da3 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs @@ -97,6 +97,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -123,6 +124,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -152,7 +154,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -209,6 +212,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -320,6 +324,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -346,6 +351,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -375,7 +381,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -436,6 +443,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -548,6 +556,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -574,6 +583,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -603,7 +613,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -664,6 +675,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -777,6 +789,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -803,6 +816,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -832,7 +846,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -893,6 +908,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -1021,6 +1037,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -1047,6 +1064,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -1077,7 +1095,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -1146,6 +1165,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt index 0516fef..ebcfa93 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt @@ -165,6 +165,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore<<#= IsVoid(t) ? "AsyncUnit" : t.returnType #>> core; @@ -191,6 +192,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -227,7 +229,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -304,6 +307,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } From a48f11d31b8dbf21641ea8234cbbf7d0d2df5d74 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 14:46:37 +0900 Subject: [PATCH 3/6] Fix unintended returning to pool with cancelImmediately (WaitUntil,etc) --- .../UniTask/Runtime/UniTask.WaitUntil.cs | 33 +++++++++++++++---- ...cExtensions.AssetBundleRequestAllAssets.cs | 6 +++- .../UnityAsyncExtensions.AsyncGPUReadback.cs | 7 ++-- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs index b28a529..eccf2c3 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs @@ -49,6 +49,7 @@ namespace Cysharp.Threading.Tasks Func predicate; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -70,6 +71,7 @@ namespace Cysharp.Threading.Tasks result.predicate = predicate; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -96,7 +98,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -147,6 +150,7 @@ namespace Cysharp.Threading.Tasks predicate = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -165,6 +169,7 @@ namespace Cysharp.Threading.Tasks Func predicate; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -212,7 +217,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -263,6 +269,7 @@ namespace Cysharp.Threading.Tasks predicate = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -280,6 +287,7 @@ namespace Cysharp.Threading.Tasks CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -287,7 +295,7 @@ namespace Cysharp.Threading.Tasks { } - public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool completeImmediately, out short token) + public static IUniTaskSource Create(CancellationToken cancellationToken, PlayerLoopTiming timing, bool cancelImmediately, out short token) { if (cancellationToken.IsCancellationRequested) { @@ -300,8 +308,9 @@ namespace Cysharp.Threading.Tasks } result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; - if (completeImmediately && cancellationToken.CanBeCanceled) + if (cancelImmediately && cancellationToken.CanBeCanceled) { result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => { @@ -326,7 +335,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -362,6 +372,7 @@ namespace Cysharp.Threading.Tasks core.Reset(); cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -385,6 +396,7 @@ namespace Cysharp.Threading.Tasks IEqualityComparer equalityComparer; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -410,6 +422,7 @@ namespace Cysharp.Threading.Tasks result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -436,7 +449,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -497,6 +511,7 @@ namespace Cysharp.Threading.Tasks equalityComparer = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } @@ -519,6 +534,7 @@ namespace Cysharp.Threading.Tasks IEqualityComparer equalityComparer; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; UniTaskCompletionSourceCore core; @@ -543,6 +559,7 @@ namespace Cysharp.Threading.Tasks result.currentValue = monitorFunction(target); result.equalityComparer = equalityComparer ?? UnityEqualityComparer.GetDefault(); result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -569,7 +586,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -630,6 +648,7 @@ namespace Cysharp.Threading.Tasks equalityComparer = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs index 5d34692..efe5292 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs @@ -101,6 +101,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -127,6 +128,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -156,7 +158,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -216,6 +219,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs index 5d73dc1..53f6ae4 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs @@ -45,7 +45,7 @@ namespace Cysharp.Threading.Tasks AsyncGPUReadbackRequest asyncOperation; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; - + bool cancelImmediately; UniTaskCompletionSourceCore core; AsyncGPUReadbackRequestAwaiterConfiguredSource() @@ -66,6 +66,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -92,7 +93,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -146,6 +148,7 @@ namespace Cysharp.Threading.Tasks asyncOperation = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } } From caccccb0b5b5cdf1b63ec1f043e2f6ad1d942f0d Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 15:00:41 +0900 Subject: [PATCH 4/6] Fix timing to returning to pool --- .../AddressablesAsyncExtensions.cs | 94 +++++++++++-------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs index 620cfad..b4427bd 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs @@ -110,6 +110,7 @@ namespace Cysharp.Threading.Tasks CancellationTokenRegistration cancellationTokenRegistration; IProgress progress; bool autoReleaseWhenCanceled; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -134,7 +135,7 @@ namespace Cysharp.Threading.Tasks result.handle = handle; result.progress = progress; result.cancellationToken = cancellationToken; - result.completed = false; + result.cancelImmediately = cancelImmediately; result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; if (cancelImmediately && cancellationToken.CanBeCanceled) @@ -169,33 +170,39 @@ namespace Cysharp.Threading.Tasks if (completed) { - TryReturn(); + return; + } + + completed = true; + if (cancellationToken.IsCancellationRequested) + { + if (autoReleaseWhenCanceled && handle.IsValid()) + { + Addressables.Release(handle); + } + core.TrySetCanceled(cancellationToken); + } + else if (handle.Status == AsyncOperationStatus.Failed) + { + core.TrySetException(handle.OperationException); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - } - else if (handle.Status == AsyncOperationStatus.Failed) - { - core.TrySetException(handle.OperationException); - } - else - { - core.TrySetResult(AsyncUnit.Default); - } + core.TrySetResult(AsyncUnit.Default); } } public void GetResult(short token) { - core.GetResult(token); + try + { + core.GetResult(token); + } + finally + { + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); + } } public UniTaskStatus GetStatus(short token) @@ -217,7 +224,6 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); return false; } @@ -304,6 +310,7 @@ namespace Cysharp.Threading.Tasks CancellationTokenRegistration cancellationTokenRegistration; IProgress progress; bool autoReleaseWhenCanceled; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -330,6 +337,7 @@ namespace Cysharp.Threading.Tasks result.completed = false; result.progress = progress; result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; + result.cancelImmediately = cancelImmediately; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -363,33 +371,38 @@ namespace Cysharp.Threading.Tasks if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + if (autoReleaseWhenCanceled && handle.IsValid()) + { + Addressables.Release(handle); + } + core.TrySetCanceled(cancellationToken); + } + else if (argHandle.Status == AsyncOperationStatus.Failed) + { + core.TrySetException(argHandle.OperationException); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - if (autoReleaseWhenCanceled && handle.IsValid()) - { - Addressables.Release(handle); - } - core.TrySetCanceled(cancellationToken); - } - else if (argHandle.Status == AsyncOperationStatus.Failed) - { - core.TrySetException(argHandle.OperationException); - } - else - { - core.TrySetResult(argHandle.Result); - } + core.TrySetResult(argHandle.Result); } } public T GetResult(short token) { - return core.GetResult(token); + try + { + return core.GetResult(token); + } + finally + { + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); + } } void IUniTaskSource.GetResult(short token) @@ -416,7 +429,6 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); return false; } From 911c37d4d82b89a94b4ffa4a25f6a7e47c7e3396 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 15:14:10 +0900 Subject: [PATCH 5/6] Tweaks --- .../Plugins/UniTask/Runtime/UniTask.Delay.cs | 14 +++ .../UniTask/Runtime/UniTask.WaitUntil.cs | 10 ++ ...cExtensions.AssetBundleRequestAllAssets.cs | 20 ++-- .../UnityAsyncExtensions.AsyncGPUReadback.cs | 2 + .../UniTask/Runtime/UnityAsyncExtensions.cs | 103 +++++++++--------- .../UniTask/Runtime/UnityAsyncExtensions.tt | 41 ++++--- 6 files changed, 105 insertions(+), 85 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs index 2a38af6..8ac8a29 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs @@ -256,7 +256,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -361,7 +363,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -468,7 +472,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -595,7 +601,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -739,7 +747,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -865,7 +875,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -989,7 +1001,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs index eccf2c3..d126199 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WaitUntil.cs @@ -99,7 +99,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -218,7 +220,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -336,7 +340,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -450,7 +456,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -587,7 +595,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs index efe5292..043e1b8 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AssetBundleRequestAllAssets.cs @@ -159,7 +159,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -227,19 +229,17 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.allAssets); - } + core.TrySetResult(asyncOperation.allAssets); } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs index 53f6ae4..a363be7 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.AsyncGPUReadback.cs @@ -94,7 +94,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs index 5ec9da3..5a5ea1c 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs @@ -155,7 +155,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -220,19 +222,16 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(AsyncUnit.Default); - } + core.TrySetResult(AsyncUnit.Default); } } } @@ -382,7 +381,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -451,19 +452,16 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.asset); - } + core.TrySetResult(asyncOperation.asset); } } } @@ -614,7 +612,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -683,19 +683,16 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.asset); - } + core.TrySetResult(asyncOperation.asset); } } } @@ -847,7 +844,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -916,19 +915,16 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else - { - core.TrySetResult(asyncOperation.assetBundle); - } + core.TrySetResult(asyncOperation.assetBundle); } } } @@ -1096,7 +1092,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -1173,23 +1171,20 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } + else if (asyncOperation.webRequest.IsError()) + { + core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } - else if (asyncOperation.webRequest.IsError()) - { - core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); - } - else - { - core.TrySetResult(asyncOperation.webRequest); - } + core.TrySetResult(asyncOperation.webRequest); } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt index ebcfa93..e2437df 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt @@ -230,7 +230,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } } @@ -315,31 +317,28 @@ namespace Cysharp.Threading.Tasks { if (completed) { - TryReturn(); + return; + } + completed = true; + if (cancellationToken.IsCancellationRequested) + { + core.TrySetCanceled(cancellationToken); + } +<# if(IsUnityWebRequest(t)) { #> + else if (asyncOperation.webRequest.IsError()) + { + core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); } else { - completed = true; - if (cancellationToken.IsCancellationRequested) - { - core.TrySetCanceled(cancellationToken); - } -<# if(IsUnityWebRequest(t)) { #> - else if (asyncOperation.webRequest.IsError()) - { - core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest)); - } - else - { - core.TrySetResult(asyncOperation.webRequest); - } -<# } else { #> - else - { - core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>); - } -<# } #> + core.TrySetResult(asyncOperation.webRequest); } +<# } else { #> + else + { + core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>); + } +<# } #> } } From 938ddd5356780409370adce47eefdf44941abd99 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 28 Mar 2024 15:15:07 +0900 Subject: [PATCH 6/6] Tweaks --- .../External/Addressables/AddressablesAsyncExtensions.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs index b4427bd..ee1a9e6 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs @@ -137,6 +137,7 @@ namespace Cysharp.Threading.Tasks result.cancellationToken = cancellationToken; result.cancelImmediately = cancelImmediately; result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; + result.completed = false; if (cancelImmediately && cancellationToken.CanBeCanceled) { @@ -201,7 +202,9 @@ namespace Cysharp.Threading.Tasks finally { if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + { TryReturn(); + } } }