Skip to content

Commit b724a2a

Browse files
authored
Merge pull request #557 from Cysharp/hadashiA/fix-cancel-immediate
Fix unintended returning to pool with cancelImmediately
2 parents 01c8fad + 938ddd5 commit b724a2a

File tree

7 files changed

+257
-146
lines changed

7 files changed

+257
-146
lines changed

src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/AddressablesAsyncExtensions.cs

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ static AsyncOperationHandleConfiguredSource()
110110
CancellationTokenRegistration cancellationTokenRegistration;
111111
IProgress<float> progress;
112112
bool autoReleaseWhenCanceled;
113+
bool cancelImmediately;
113114
bool completed;
114115

115116
UniTaskCompletionSourceCore<AsyncUnit> core;
@@ -134,8 +135,9 @@ public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTimin
134135
result.handle = handle;
135136
result.progress = progress;
136137
result.cancellationToken = cancellationToken;
137-
result.completed = false;
138+
result.cancelImmediately = cancelImmediately;
138139
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
140+
result.completed = false;
139141

140142
if (cancelImmediately && cancellationToken.CanBeCanceled)
141143
{
@@ -169,33 +171,41 @@ void HandleCompleted(AsyncOperationHandle _)
169171

170172
if (completed)
171173
{
172-
TryReturn();
174+
return;
173175
}
174-
else
176+
177+
completed = true;
178+
if (cancellationToken.IsCancellationRequested)
175179
{
176-
completed = true;
177-
if (cancellationToken.IsCancellationRequested)
178-
{
179-
if (autoReleaseWhenCanceled && handle.IsValid())
180-
{
181-
Addressables.Release(handle);
182-
}
183-
core.TrySetCanceled(cancellationToken);
184-
}
185-
else if (handle.Status == AsyncOperationStatus.Failed)
186-
{
187-
core.TrySetException(handle.OperationException);
188-
}
189-
else
180+
if (autoReleaseWhenCanceled && handle.IsValid())
190181
{
191-
core.TrySetResult(AsyncUnit.Default);
182+
Addressables.Release(handle);
192183
}
184+
core.TrySetCanceled(cancellationToken);
185+
}
186+
else if (handle.Status == AsyncOperationStatus.Failed)
187+
{
188+
core.TrySetException(handle.OperationException);
189+
}
190+
else
191+
{
192+
core.TrySetResult(AsyncUnit.Default);
193193
}
194194
}
195195

196196
public void GetResult(short token)
197197
{
198-
core.GetResult(token);
198+
try
199+
{
200+
core.GetResult(token);
201+
}
202+
finally
203+
{
204+
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
205+
{
206+
TryReturn();
207+
}
208+
}
199209
}
200210

201211
public UniTaskStatus GetStatus(short token)
@@ -217,7 +227,6 @@ public bool MoveNext()
217227
{
218228
if (completed)
219229
{
220-
TryReturn();
221230
return false;
222231
}
223232

@@ -304,6 +313,7 @@ static AsyncOperationHandleConfiguredSource()
304313
CancellationTokenRegistration cancellationTokenRegistration;
305314
IProgress<float> progress;
306315
bool autoReleaseWhenCanceled;
316+
bool cancelImmediately;
307317
bool completed;
308318

309319
UniTaskCompletionSourceCore<T> core;
@@ -330,6 +340,7 @@ public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoo
330340
result.completed = false;
331341
result.progress = progress;
332342
result.autoReleaseWhenCanceled = autoReleaseWhenCanceled;
343+
result.cancelImmediately = cancelImmediately;
333344

334345
if (cancelImmediately && cancellationToken.CanBeCanceled)
335346
{
@@ -363,33 +374,38 @@ void HandleCompleted(AsyncOperationHandle<T> argHandle)
363374

364375
if (completed)
365376
{
366-
TryReturn();
377+
return;
367378
}
368-
else
379+
completed = true;
380+
if (cancellationToken.IsCancellationRequested)
369381
{
370-
completed = true;
371-
if (cancellationToken.IsCancellationRequested)
372-
{
373-
if (autoReleaseWhenCanceled && handle.IsValid())
374-
{
375-
Addressables.Release(handle);
376-
}
377-
core.TrySetCanceled(cancellationToken);
378-
}
379-
else if (argHandle.Status == AsyncOperationStatus.Failed)
380-
{
381-
core.TrySetException(argHandle.OperationException);
382-
}
383-
else
382+
if (autoReleaseWhenCanceled && handle.IsValid())
384383
{
385-
core.TrySetResult(argHandle.Result);
384+
Addressables.Release(handle);
386385
}
386+
core.TrySetCanceled(cancellationToken);
387+
}
388+
else if (argHandle.Status == AsyncOperationStatus.Failed)
389+
{
390+
core.TrySetException(argHandle.OperationException);
391+
}
392+
else
393+
{
394+
core.TrySetResult(argHandle.Result);
387395
}
388396
}
389397

390398
public T GetResult(short token)
391399
{
392-
return core.GetResult(token);
400+
try
401+
{
402+
return core.GetResult(token);
403+
}
404+
finally
405+
{
406+
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
407+
TryReturn();
408+
}
393409
}
394410

395411
void IUniTaskSource.GetResult(short token)
@@ -416,7 +432,6 @@ public bool MoveNext()
416432
{
417433
if (completed)
418434
{
419-
TryReturn();
420435
return false;
421436
}
422437

0 commit comments

Comments
 (0)