Fix unintended returning to pool with cancelImmediately (AsyncOperation)

This commit is contained in:
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;
CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
UniTaskCompletionSourceCore<AsyncUnit> 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<float> progress;
CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
UniTaskCompletionSourceCore<UnityEngine.Object> 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<float> progress;
CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
UniTaskCompletionSourceCore<UnityEngine.Object> 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<float> progress;
CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
UniTaskCompletionSourceCore<AssetBundle> 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<float> progress;
CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
UniTaskCompletionSourceCore<UnityWebRequest> 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);
}

View File

@@ -165,6 +165,7 @@ namespace Cysharp.Threading.Tasks
IProgress<float> 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);
}