mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
io: add SyncIoBridge::shutdown()
(#4938)
This commit is contained in:
parent
df28ac092f
commit
733931d85f
@ -66,6 +66,21 @@ impl<T: AsyncWrite> SyncIoBridge<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: AsyncWrite + Unpin> SyncIoBridge<T> {
|
||||||
|
/// Shutdown this writer. This method provides a way to call the [`AsyncWriteExt::shutdown`]
|
||||||
|
/// function of the inner [`tokio::io::AsyncWrite`] instance.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// This method returns the same errors as [`AsyncWriteExt::shutdown`].
|
||||||
|
///
|
||||||
|
/// [`AsyncWriteExt::shutdown`]: tokio::io::AsyncWriteExt::shutdown
|
||||||
|
pub fn shutdown(&mut self) -> std::io::Result<()> {
|
||||||
|
let src = &mut self.src;
|
||||||
|
self.rt.block_on(src.shutdown())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Unpin> SyncIoBridge<T> {
|
impl<T: Unpin> SyncIoBridge<T> {
|
||||||
/// Use a [`tokio::io::AsyncRead`] synchronously as a [`std::io::Read`] or
|
/// Use a [`tokio::io::AsyncRead`] synchronously as a [`std::io::Read`] or
|
||||||
/// a [`tokio::io::AsyncWrite`] as a [`std::io::Write`].
|
/// a [`tokio::io::AsyncWrite`] as a [`std::io::Write`].
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#![cfg(not(target_os = "wasi"))] // Wasi doesn't support threads
|
#![cfg(not(target_os = "wasi"))] // Wasi doesn't support threads
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::io::{Cursor, Read, Result as IoResult};
|
use std::io::{Cursor, Read, Result as IoResult, Write};
|
||||||
use tokio::io::AsyncRead;
|
use tokio::io::{AsyncRead, AsyncReadExt};
|
||||||
use tokio_util::io::SyncIoBridge;
|
use tokio_util::io::SyncIoBridge;
|
||||||
|
|
||||||
async fn test_reader_len(
|
async fn test_reader_len(
|
||||||
@ -42,3 +42,21 @@ async fn test_async_write_to_sync() -> Result<(), Box<dyn Error>> {
|
|||||||
assert_eq!(dest.as_slice(), src);
|
assert_eq!(dest.as_slice(), src);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_shutdown() -> Result<(), Box<dyn Error>> {
|
||||||
|
let (s1, mut s2) = tokio::io::duplex(1024);
|
||||||
|
let (_rh, wh) = tokio::io::split(s1);
|
||||||
|
tokio::task::spawn_blocking(move || -> std::io::Result<_> {
|
||||||
|
let mut wh = SyncIoBridge::new(wh);
|
||||||
|
wh.write_all(b"hello")?;
|
||||||
|
wh.shutdown()?;
|
||||||
|
assert!(wh.write_all(b" world").is_err());
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.await??;
|
||||||
|
let mut buf = vec![];
|
||||||
|
s2.read_to_end(&mut buf).await?;
|
||||||
|
assert_eq!(buf, b"hello");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user