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,33 +170,39 @@ namespace Cysharp.Threading.Tasks
if (completed) 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 else
{ {
completed = true; core.TrySetResult(AsyncUnit.Default);
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);
}
} }
} }
public void GetResult(short token) public void GetResult(short token)
{ {
core.GetResult(token); try
{
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,33 +371,38 @@ namespace Cysharp.Threading.Tasks
if (completed) 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 else
{ {
completed = true; core.TrySetResult(argHandle.Result);
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);
}
} }
} }
public T GetResult(short token) 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) void IUniTaskSource.GetResult(short token)
@ -416,7 +429,6 @@ namespace Cysharp.Threading.Tasks
{ {
if (completed) if (completed)
{ {
TryReturn();
return false; return false;
} }