From b58ff91864890a1c7008b4884bcbcc7759257fff Mon Sep 17 00:00:00 2001 From: Thibault Wittemberg Date: Mon, 11 Apr 2022 11:44:30 +0200 Subject: [PATCH] asyncChannel: fixes potential crashes when no more awaiting This commit fixes crashes where the state is "awaiting" with no more awaiting clients. The state is now set to .idle to reflect the reality. --- Sources/AsyncAlgorithms/AsyncChannel.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Sources/AsyncAlgorithms/AsyncChannel.swift b/Sources/AsyncAlgorithms/AsyncChannel.swift index c256fd09..f6d132f4 100644 --- a/Sources/AsyncAlgorithms/AsyncChannel.swift +++ b/Sources/AsyncAlgorithms/AsyncChannel.swift @@ -89,7 +89,11 @@ public final class AsyncChannel: AsyncSequence, Sendable { switch self { case .awaiting(var awaiting): let continuation = awaiting.remove(Awaiting(placeholder: generation))?.continuation - self = .awaiting(awaiting) + if awaiting.isEmpty { + self = .idle + } else { + self = .awaiting(awaiting) + } return continuation case .idle: self = .awaiting([Awaiting(cancelled: generation)]) @@ -145,7 +149,11 @@ public final class AsyncChannel: AsyncSequence, Sendable { nexts.remove(Awaiting(placeholder: generation)) cancelled = true } - state.emission = .awaiting(nexts) + if nexts.isEmpty { + state.emission = .idle + } else { + state.emission = .awaiting(nexts) + } return nil } }?.resume()