Fix unintended returning to pool with cancelImmediately (AsyncOperation)

pull/557/head
hadashiA 2024-03-28 14:45:55 +09:00
parent b472b23773
commit fcd93feb56
2 changed files with 30 additions and 6 deletions

View File

@ -97,6 +97,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<AsyncUnit> core; UniTaskCompletionSourceCore<AsyncUnit> core;
@ -123,6 +124,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -152,7 +154,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -209,6 +212,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }
@ -320,6 +324,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<UnityEngine.Object> core; UniTaskCompletionSourceCore<UnityEngine.Object> core;
@ -346,6 +351,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -375,7 +381,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -436,6 +443,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }
@ -548,6 +556,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<UnityEngine.Object> core; UniTaskCompletionSourceCore<UnityEngine.Object> core;
@ -574,6 +583,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -603,7 +613,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -664,6 +675,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }
@ -777,6 +789,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<AssetBundle> core; UniTaskCompletionSourceCore<AssetBundle> core;
@ -803,6 +816,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -832,7 +846,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -893,6 +908,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }
@ -1021,6 +1037,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<UnityWebRequest> core; UniTaskCompletionSourceCore<UnityWebRequest> core;
@ -1047,6 +1064,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -1077,7 +1095,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -1146,6 +1165,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }

View File

@ -165,6 +165,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> progress; IProgress<float> progress;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<<#= IsVoid(t) ? "AsyncUnit" : t.returnType #>> core; UniTaskCompletionSourceCore<<#= IsVoid(t) ? "AsyncUnit" : t.returnType #>> core;
@ -191,6 +192,7 @@ namespace Cysharp.Threading.Tasks
result.asyncOperation = asyncOperation; result.asyncOperation = asyncOperation;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false; result.completed = false;
asyncOperation.completed += result.continuationAction; asyncOperation.completed += result.continuationAction;
@ -227,7 +229,8 @@ namespace Cysharp.Threading.Tasks
} }
finally finally
{ {
TryReturn(); if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
} }
} }
@ -304,6 +307,7 @@ namespace Cysharp.Threading.Tasks
progress = default; progress = default;
cancellationToken = default; cancellationToken = default;
cancellationTokenRegistration.Dispose(); cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this); return pool.TryPush(this);
} }