Fix omissions in Addressable.Release and IsValid checks

pull/536/head
hadashiA 2024-01-25 17:47:06 +09:00
parent 36ac0863ad
commit ee12dd9ae7
1 changed files with 25 additions and 11 deletions

View File

@ -109,7 +109,7 @@ namespace Cysharp.Threading.Tasks
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size); TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size);
} }
readonly Action<AsyncOperationHandle> continuationAction; readonly Action<AsyncOperationHandle> completedCallback;
AsyncOperationHandle handle; AsyncOperationHandle handle;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
@ -120,7 +120,7 @@ namespace Cysharp.Threading.Tasks
AsyncOperationHandleConfiguredSource() AsyncOperationHandleConfiguredSource()
{ {
continuationAction = Continuation; completedCallback = HandleCompleted;
} }
public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token)
@ -145,6 +145,10 @@ namespace Cysharp.Threading.Tasks
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
{ {
var promise = (AsyncOperationHandleConfiguredSource)state; var promise = (AsyncOperationHandleConfiguredSource)state;
if (promise.handle.IsValid())
{
Addressables.Release(promise.handle);
}
promise.core.TrySetCanceled(promise.cancellationToken); promise.core.TrySetCanceled(promise.cancellationToken);
}, result); }, result);
} }
@ -153,15 +157,18 @@ namespace Cysharp.Threading.Tasks
PlayerLoopHelper.AddAction(timing, result); PlayerLoopHelper.AddAction(timing, result);
handle.Completed += result.continuationAction; handle.Completed += result.completedCallback;
token = result.core.Version; token = result.core.Version;
return result; return result;
} }
void Continuation(AsyncOperationHandle _) void HandleCompleted(AsyncOperationHandle _)
{ {
handle.Completed -= continuationAction; if (handle.IsValid())
{
handle.Completed -= completedCallback;
}
if (completed) if (completed)
{ {
@ -172,7 +179,7 @@ namespace Cysharp.Threading.Tasks
completed = true; completed = true;
if (cancellationToken.IsCancellationRequested) if (cancellationToken.IsCancellationRequested)
{ {
If (handle.IsValid()) if (handle.IsValid())
{ {
Addressables.Release(handle); Addressables.Release(handle);
} }
@ -299,7 +306,7 @@ namespace Cysharp.Threading.Tasks
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource<T>), () => pool.Size); TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource<T>), () => pool.Size);
} }
readonly Action<AsyncOperationHandle<T>> continuationAction; readonly Action<AsyncOperationHandle<T>> completedCallback;
AsyncOperationHandle<T> handle; AsyncOperationHandle<T> handle;
CancellationToken cancellationToken; CancellationToken cancellationToken;
CancellationTokenRegistration cancellationTokenRegistration; CancellationTokenRegistration cancellationTokenRegistration;
@ -310,7 +317,7 @@ namespace Cysharp.Threading.Tasks
AsyncOperationHandleConfiguredSource() AsyncOperationHandleConfiguredSource()
{ {
continuationAction = Continuation; completedCallback = HandleCompleted;
} }
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token) public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, bool cancelImmediately, out short token)
@ -335,6 +342,10 @@ namespace Cysharp.Threading.Tasks
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state => result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(state =>
{ {
var promise = (AsyncOperationHandleConfiguredSource<T>)state; var promise = (AsyncOperationHandleConfiguredSource<T>)state;
if (promise.handle.IsValid())
{
Addressables.Release(promise.handle);
}
promise.core.TrySetCanceled(promise.cancellationToken); promise.core.TrySetCanceled(promise.cancellationToken);
}, result); }, result);
} }
@ -343,15 +354,18 @@ namespace Cysharp.Threading.Tasks
PlayerLoopHelper.AddAction(timing, result); PlayerLoopHelper.AddAction(timing, result);
handle.Completed += result.continuationAction; handle.Completed += result.completedCallback;
token = result.core.Version; token = result.core.Version;
return result; return result;
} }
void Continuation(AsyncOperationHandle<T> argHandle) void HandleCompleted(AsyncOperationHandle<T> argHandle)
{ {
handle.Completed -= continuationAction; if (handle.IsValid())
{
handle.Completed -= completedCallback;
}
if (completed) if (completed)
{ {