Skip to content

Commit c9e7578

Browse files
authored
sync: remove 'static bound on impl Sink for PollSender (#6397)
In PR #5665, the `'static` bound has been removed on values sent into `PollSender`. One of this bound was remaining on the `PollSender` implementation of `Sink`. This patch removes it and adds some tests on the `Sink` interface for `PollSender`.
1 parent 3141ed6 commit c9e7578

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

tokio-util/src/sync/mpsc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ impl<T> Clone for PollSender<T> {
303303
}
304304
}
305305

306-
impl<T: Send + 'static> Sink<T> for PollSender<T> {
306+
impl<T: Send> Sink<T> for PollSender<T> {
307307
type Error = PollSendError<T>;
308308

309309
fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {

tokio-util/tests/mpsc.rs

+88-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use futures::future::poll_fn;
2+
use futures::sink::SinkExt;
23
use tokio::sync::mpsc::channel;
34
use tokio_test::task::spawn;
4-
use tokio_test::{assert_pending, assert_ready, assert_ready_err, assert_ready_ok};
5+
use tokio_test::{
6+
assert_ok, assert_pending, assert_ready, assert_ready_eq, assert_ready_err, assert_ready_ok,
7+
};
58
use tokio_util::sync::PollSender;
69

710
#[tokio::test]
@@ -260,3 +263,87 @@ fn start_send_panics_when_acquiring() {
260263
assert_pending!(reserve.poll());
261264
send.send_item(2).unwrap();
262265
}
266+
267+
#[test]
268+
fn sink_send_then_flush() {
269+
let (send, mut recv) = channel(1);
270+
let mut send = PollSender::new(send);
271+
272+
let mut recv_task = spawn(recv.recv());
273+
assert_pending!(recv_task.poll());
274+
275+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
276+
assert_ready_ok!(ready.poll());
277+
assert_ok!(send.start_send_unpin(()));
278+
279+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
280+
assert_pending!(ready.poll());
281+
282+
let mut flush = spawn(poll_fn(|cx| send.poll_flush_unpin(cx)));
283+
assert_ready_ok!(flush.poll());
284+
285+
// Flushing does not mean that the sender becomes ready.
286+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
287+
assert_pending!(ready.poll());
288+
289+
assert_ready_eq!(recv_task.poll(), Some(()));
290+
assert!(ready.is_woken());
291+
assert_ready_ok!(ready.poll());
292+
}
293+
294+
#[test]
295+
fn sink_send_then_close() {
296+
let (send, mut recv) = channel(1);
297+
let mut send = PollSender::new(send);
298+
299+
let mut recv_task = spawn(recv.recv());
300+
assert_pending!(recv_task.poll());
301+
302+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
303+
assert_ready_ok!(ready.poll());
304+
assert_ok!(send.start_send_unpin(1));
305+
306+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
307+
assert_pending!(ready.poll());
308+
309+
assert!(recv_task.is_woken());
310+
assert_ready_eq!(recv_task.poll(), Some(1));
311+
312+
assert!(ready.is_woken());
313+
assert_ready_ok!(ready.poll());
314+
315+
drop(recv_task);
316+
let mut recv_task = spawn(recv.recv());
317+
assert_pending!(recv_task.poll());
318+
assert_ok!(send.start_send_unpin(2));
319+
320+
let mut close = spawn(poll_fn(|cx| send.poll_close_unpin(cx)));
321+
assert_ready_ok!(close.poll());
322+
323+
assert!(recv_task.is_woken());
324+
assert_ready_eq!(recv_task.poll(), Some(2));
325+
326+
drop(recv_task);
327+
let mut recv_task = spawn(recv.recv());
328+
assert_ready_eq!(recv_task.poll(), None);
329+
}
330+
331+
#[test]
332+
fn sink_send_ref() {
333+
let data = "data".to_owned();
334+
let (send, mut recv) = channel(1);
335+
let mut send = PollSender::new(send);
336+
337+
let mut recv_task = spawn(recv.recv());
338+
assert_pending!(recv_task.poll());
339+
340+
let mut ready = spawn(poll_fn(|cx| send.poll_ready_unpin(cx)));
341+
assert_ready_ok!(ready.poll());
342+
343+
assert_ok!(send.start_send_unpin(data.as_str()));
344+
345+
let mut flush = spawn(poll_fn(|cx| send.poll_flush_unpin(cx)));
346+
assert_ready_ok!(flush.poll());
347+
348+
assert_ready_eq!(recv_task.poll(), Some("data"));
349+
}

0 commit comments

Comments
 (0)