Fix timing to returning to pool

pull/557/head
hadashiA 2024-03-28 15:00:41 +09:00
parent a48f11d31b
commit caccccb0b5
1 changed files with 53 additions and 41 deletions

View File

@ -110,6 +110,7 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
IProgress<float> progress; IProgress<float> progress;
bool autoReleaseWhenCanceled; bool autoReleaseWhenCanceled;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<AsyncUnit> core; UniTaskCompletionSourceCore<AsyncUnit> core;
@ -134,7 +135,7 @@ namespace Cysharp.Threading.Tasks
result.handle = handle; result.handle = handle;
result.progress = progress; result.progress = progress;
result.cancellationToken = cancellationToken; result.cancellationToken = cancellationToken;
result.completed = false; result.cancelImmediately = cancelImmediately;
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
if (cancelImmediately && cancellationToken.CanBeCanceled) if (cancelImmediately && cancellationToken.CanBeCanceled)
@ -169,10 +170,9 @@ namespace Cysharp.Threading.Tasks
if (completed) if (completed)
{ {
TryReturn(); return;
} }
else
{
completed = true; completed = true;
if (cancellationToken.IsCancellationRequested) if (cancellationToken.IsCancellationRequested)
{ {
@ -191,12 +191,19 @@ namespace Cysharp.Threading.Tasks
core.TrySetResult(AsyncUnit.Default); core.TrySetResult(AsyncUnit.Default);
} }
} }
}
public void GetResult(short token) public void GetResult(short token)
{
try
{ {
core.GetResult(token); core.GetResult(token);
} }
finally
{
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
}
}
public UniTaskStatus GetStatus(short token) public UniTaskStatus GetStatus(short token)
{ {
@ -217,7 +224,6 @@ namespace Cysharp.Threading.Tasks
{ {
if (completed) if (completed)
{ {
TryReturn();
return false; return false;
} }
@ -304,6 +310,7 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
IProgress<float> progress; IProgress<float> progress;
bool autoReleaseWhenCanceled; bool autoReleaseWhenCanceled;
bool cancelImmediately;
bool completed; bool completed;
UniTaskCompletionSourceCore<T> core; UniTaskCompletionSourceCore<T> core;
@ -330,6 +337,7 @@ namespace Cysharp.Threading.Tasks
result.completed = false; result.completed = false;
result.progress = progress; result.progress = progress;
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled; result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
result.cancelImmediately = cancelImmediately;
if (cancelImmediately && cancellationToken.CanBeCanceled) if (cancelImmediately && cancellationToken.CanBeCanceled)
{ {
@ -363,10 +371,8 @@ namespace Cysharp.Threading.Tasks
if (completed) if (completed)
{ {
TryReturn(); return;
} }
else
{
completed = true; completed = true;
if (cancellationToken.IsCancellationRequested) if (cancellationToken.IsCancellationRequested)
{ {
@ -385,12 +391,19 @@ namespace Cysharp.Threading.Tasks
core.TrySetResult(argHandle.Result); core.TrySetResult(argHandle.Result);
} }
} }
}
public T GetResult(short token) public T GetResult(short token)
{
try
{ {
return core.GetResult(token); return core.GetResult(token);
} }
finally
{
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
TryReturn();
}
}
void IUniTaskSource.GetResult(short token) void IUniTaskSource.GetResult(short token)
{ {
@ -416,7 +429,6 @@ namespace Cysharp.Threading.Tasks
{ {
if (completed) if (completed)
{ {
TryReturn();
return false; return false;
} }