@@ -9,7 +9,6 @@ use futures_01::{
9
9
use futures_core:: { task as task03, Future as Future03 , Stream as Stream03 } ;
10
10
use std:: pin:: Pin ;
11
11
use futures_sink:: Sink as Sink03 ;
12
- use std:: pin:: { Pin , Unpin } ;
13
12
use std:: task:: LocalWaker ;
14
13
15
14
/// Converts a futures 0.1 Future, Stream, AsyncRead, or AsyncWrite
@@ -127,6 +126,7 @@ impl<St: Stream01> Stream03 for Compat01As03<St> {
127
126
pub struct Compat01As03Sink < S , SinkItem > {
128
127
pub ( crate ) inner : Spawn01 < S > ,
129
128
pub ( crate ) buffer : Option < SinkItem > ,
129
+ pub ( crate ) close_started : bool ,
130
130
}
131
131
132
132
impl < S , SinkItem > Unpin for Compat01As03Sink < S , SinkItem > { }
@@ -137,6 +137,7 @@ impl<S, SinkItem> Compat01As03Sink<S, SinkItem> {
137
137
Compat01As03Sink {
138
138
inner : spawn01 ( inner) ,
139
139
buffer : None ,
140
+ close_started : false
140
141
}
141
142
}
142
143
@@ -231,39 +232,49 @@ where
231
232
lw : & LocalWaker ,
232
233
) -> task03:: Poll < Result < ( ) , Self :: SinkError > > {
233
234
let item = self . buffer . take ( ) ;
235
+ let close_started = self . close_started ;
236
+
234
237
match self . in_notify ( lw, |f| match item {
235
238
Some ( i) => match f. start_send ( i) {
236
239
Ok ( AsyncSink01 :: Ready ) => {
237
240
match f. poll_complete ( ) {
238
241
Ok ( Async01 :: Ready ( _) ) => {
239
242
match <S as Sink01 >:: close ( f) {
240
- Ok ( i) => Ok ( ( i, None ) ) ,
243
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
241
244
Err ( e) => Err ( e)
242
245
}
243
246
} ,
244
- Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None ) ) ,
247
+ Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None , false ) ) ,
245
248
Err ( e) => Err ( e)
246
249
}
247
250
} ,
248
251
Ok ( AsyncSink01 :: NotReady ( t) ) => {
249
- Ok ( ( Async01 :: NotReady , Some ( t) ) )
252
+ Ok ( ( Async01 :: NotReady , Some ( t) , close_started ) )
250
253
}
251
254
Err ( e) => Err ( e) ,
252
255
} ,
253
- None => match f. poll_complete ( ) {
254
- Ok ( Async01 :: Ready ( _) ) => {
255
- match <S as Sink01 >:: close ( f) {
256
- Ok ( i) => Ok ( ( i, None ) ) ,
257
- Err ( e) => Err ( e)
258
- }
259
- } ,
260
- Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None ) ) ,
261
- Err ( e) => Err ( e)
256
+ None => if close_started {
257
+ match <S as Sink01 >:: close ( f) {
258
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
259
+ Err ( e) => Err ( e)
260
+ }
261
+ } else {
262
+ match f. poll_complete ( ) {
263
+ Ok ( Async01 :: Ready ( _) ) => {
264
+ match <S as Sink01 >:: close ( f) {
265
+ Ok ( i) => Ok ( ( i, None , true ) ) ,
266
+ Err ( e) => Err ( e)
267
+ }
268
+ } ,
269
+ Ok ( Async01 :: NotReady ) => Ok ( ( Async01 :: NotReady , None , close_started) ) ,
270
+ Err ( e) => Err ( e)
271
+ }
262
272
} ,
263
273
} ) {
264
- Ok ( ( Async01 :: Ready ( _) , _) ) => task03:: Poll :: Ready ( Ok ( ( ) ) ) ,
265
- Ok ( ( Async01 :: NotReady , item) ) => {
274
+ Ok ( ( Async01 :: Ready ( _) , _, _ ) ) => task03:: Poll :: Ready ( Ok ( ( ) ) ) ,
275
+ Ok ( ( Async01 :: NotReady , item, close_started ) ) => {
266
276
self . buffer = item;
277
+ self . close_started = close_started;
267
278
task03:: Poll :: Pending
268
279
}
269
280
Err ( e) => task03:: Poll :: Ready ( Err ( e) ) ,
0 commit comments