Skip to content

Commit f15a87b

Browse files
committed
Fix suspending of buffered yield when NIOAsyncWriter is finished
1 parent fc1d1cd commit f15a87b

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

Sources/NIOCore/AsyncSequences/NIOAsyncWriter.swift

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,38 @@ extension NIOAsyncWriter {
11731173
delegate: delegate
11741174
)
11751175

1176-
case .initial, .finished, .writerFinished:
1176+
case .writerFinished(
1177+
let isWritable,
1178+
let inDelegateOutcall,
1179+
var suspendedYields,
1180+
let cancelledYields,
1181+
let bufferedYieldIDs,
1182+
let delegate,
1183+
let error
1184+
):
1185+
// We have a suspended yield at this point that hasn't been cancelled yet.
1186+
// It was buffered before we became finished, so we still have to deliver it.
1187+
// We need to store the yield now.
1188+
1189+
self._state = .modifying
1190+
1191+
let suspendedYield = SuspendedYield(
1192+
yieldID: yieldID,
1193+
continuation: continuation
1194+
)
1195+
suspendedYields.append(suspendedYield)
1196+
1197+
self._state = .writerFinished(
1198+
isWritable: isWritable,
1199+
inDelegateOutcall: inDelegateOutcall,
1200+
suspendedYields: suspendedYields,
1201+
cancelledYields: cancelledYields,
1202+
bufferedYieldIDs: bufferedYieldIDs,
1203+
delegate: delegate,
1204+
error: error
1205+
)
1206+
1207+
case .initial, .finished:
11771208
preconditionFailure("This should have already been handled by `yield()`")
11781209

11791210
case .modifying:
@@ -1501,7 +1532,7 @@ extension NIOAsyncWriter {
15011532

15021533
self._state = .writerFinished(
15031534
isWritable: isWritable,
1504-
inDelegateOutcall: inDelegateOutcall,
1535+
inDelegateOutcall: false,
15051536
suspendedYields: .init(),
15061537
cancelledYields: cancelledYields,
15071538
bufferedYieldIDs: bufferedYieldIDs,

0 commit comments

Comments
 (0)