Commit 06ea5b9 1 parent 4aa0974 commit 06ea5b9 Copy full SHA for 06ea5b9
File tree 3 files changed +17
-4
lines changed
core/arrow-autoclose/src/commonMain/kotlin/arrow
fx/arrow-fx-coroutines/src
commonMain/kotlin/arrow/fx/coroutines
commonTest/kotlin/arrow/fx/coroutines
3 files changed +17
-4
lines changed Original file line number Diff line number Diff line change @@ -2,7 +2,6 @@ package arrow
2
2
3
3
import arrow.atomic.Atomic
4
4
import arrow.atomic.update
5
- import arrow.atomic.value
6
5
import kotlin.coroutines.cancellation.CancellationException
7
6
8
7
/* *
@@ -97,7 +96,7 @@ internal class DefaultAutoCloseScope : AutoCloseScope {
97
96
}
98
97
99
98
fun close (error : Throwable ? ): Nothing? {
100
- return finalizers.value .asReversed().fold(error) { acc, finalizer ->
99
+ return finalizers.getAndSet(emptyList()) .asReversed().fold(error) { acc, finalizer ->
101
100
acc.add(runCatching { finalizer(error) }.exceptionOrNull())
102
101
}?.let { throw it }
103
102
}
Original file line number Diff line number Diff line change @@ -3,7 +3,6 @@ package arrow.fx.coroutines
3
3
import arrow.AutoCloseScope
4
4
import arrow.atomic.Atomic
5
5
import arrow.atomic.update
6
- import arrow.atomic.value
7
6
import arrow.core.nonFatalOrThrow
8
7
import arrow.core.prependTo
9
8
import kotlinx.coroutines.CoroutineDispatcher
@@ -471,7 +470,7 @@ internal class ResourceScopeImpl : ResourceScope {
471
470
472
471
suspend fun cancelAll (exitCase : ExitCase ) {
473
472
withContext(NonCancellable ) {
474
- finalizers.value .fold(exitCase.errorOrNull) { acc, finalizer ->
473
+ finalizers.getAndSet(emptyList()) .fold(exitCase.errorOrNull) { acc, finalizer ->
475
474
acc.add(runCatching { finalizer(exitCase) }.exceptionOrNull())
476
475
}
477
476
}?.let { throw it }
Original file line number Diff line number Diff line change @@ -699,6 +699,21 @@ class ResourceTest {
699
699
}
700
700
}
701
701
702
+ @OptIn(DelicateCoroutinesApi ::class )
703
+ @Test
704
+ fun allocatedRunsReleasersOnlyOnce () = runTest {
705
+ val released = CompletableDeferred <ExitCase >()
706
+ val (_, release) =
707
+ resource {
708
+ onRelease { exitCase ->
709
+ require(released.complete(exitCase))
710
+ }
711
+ }.allocate()
712
+ release(ExitCase .Completed )
713
+ release(ExitCase .Completed )
714
+ released.shouldHaveCompleted() shouldBe ExitCase .Completed
715
+ }
716
+
702
717
private class Res : AutoCloseable {
703
718
private val isActive = AtomicBoolean (true )
704
719
You can’t perform that action at this time.
0 commit comments