@@ -122,6 +122,7 @@ impl<St: Stream01> Stream03 for Compat01As03<St> {
122
122
pub struct Compat01As03Sink < S , SinkItem > {
123
123
pub ( crate ) inner : Spawn01 < S > ,
124
124
pub ( crate ) buffer : Option < SinkItem > ,
125
+ pub ( crate ) close_started : bool ,
125
126
}
126
127
127
128
impl < S , SinkItem > Unpin for Compat01As03Sink < S , SinkItem > { }
@@ -132,6 +133,7 @@ impl<S, SinkItem> Compat01As03Sink<S, SinkItem> {
132
133
Compat01As03Sink {
133
134
inner : spawn01 ( inner) ,
134
135
buffer : None ,
136
+ close_started : false
135
137
}
136
138
}
137
139
@@ -226,39 +228,49 @@ where
226
228
lw : & LocalWaker ,
227
229
) -> task03:: Poll < Result < ( ) , Self :: SinkError > > {
228
230
let item = self . buffer . take ( ) ;
231
+ let close_started = self . close_started ;
232
+
229
233
match self . in_notify ( lw, |f| match item {
230
234
Some ( i) => match f. start_send ( i) {
231
235
Ok ( AsyncSink01 :: Ready ) => {
232
236
match f. poll_complete ( ) {
233
237
Ok ( Async01 :: Ready ( _) ) => {
234
238
match <S as Sink01 >:: close ( f) {
235
- Ok ( i) => Ok ( ( i, None ) ) ,
239
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
236
240
Err ( e) => Err ( e)
237
241
}
238
242
} ,
239
- Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None ) ) ,
243
+ Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None , false ) ) ,
240
244
Err ( e) => Err ( e)
241
245
}
242
246
} ,
243
247
Ok ( AsyncSink01 :: NotReady ( t) ) => {
244
- Ok ( ( Async01 :: NotReady , Some ( t) ) )
248
+ Ok ( ( Async01 :: NotReady , Some ( t) , close_started ) )
245
249
}
246
250
Err ( e) => Err ( e) ,
247
251
} ,
248
- None => match f. poll_complete ( ) {
249
- Ok ( Async01 :: Ready ( _) ) => {
250
- match <S as Sink01 >:: close ( f) {
251
- Ok ( i) => Ok ( ( i, None ) ) ,
252
- Err ( e) => Err ( e)
253
- }
254
- } ,
255
- Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None ) ) ,
256
- Err ( e) => Err ( e)
252
+ None => if close_started {
253
+ match <S as Sink01 >:: close ( f) {
254
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
255
+ Err ( e) => Err ( e)
256
+ }
257
+ } else {
258
+ match f. poll_complete ( ) {
259
+ Ok ( Async01 :: Ready ( _) ) => {
260
+ match <S as Sink01 >:: close ( f) {
261
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
262
+ Err ( e) => Err ( e)
263
+ }
264
+ } ,
265
+ Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None , close_started) ) ,
266
+ Err ( e) => Err ( e)
267
+ }
257
268
} ,
258
269
} ) {
259
- Ok ( ( Async01 :: Ready ( _) , _) ) => task03:: Poll :: Ready ( Ok ( ( ) ) ) ,
260
- Ok ( ( Async01 :: NotReady , item) ) => {
270
+ Ok ( ( Async01 :: Ready ( _) , _, _ ) ) => task03:: Poll :: Ready ( Ok ( ( ) ) ) ,
271
+ Ok ( ( Async01 :: NotReady , item, close_started ) ) => {
261
272
self . buffer = item;
273
+ self . close_started = close_started;
262
274
task03:: Poll :: Pending
263
275
}
264
276
Err ( e) => task03:: Poll :: Ready ( Err ( e) ) ,
0 commit comments