mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-08 00:00:13 +02:00
fs: fuse std iterator in ReadDir (#5555)
Implementation of Tokio's ReadDir assumes that ReadDir from std is fused, but that's not the case on Windows. This change wraps the std iterator in std::iter::Fuse to make its usage correct.
This commit is contained in:
@@ -33,7 +33,7 @@ const CHUNK_SIZE: usize = 32;
|
|||||||
pub async fn read_dir(path: impl AsRef<Path>) -> io::Result<ReadDir> {
|
pub async fn read_dir(path: impl AsRef<Path>) -> io::Result<ReadDir> {
|
||||||
let path = path.as_ref().to_owned();
|
let path = path.as_ref().to_owned();
|
||||||
asyncify(|| -> io::Result<ReadDir> {
|
asyncify(|| -> io::Result<ReadDir> {
|
||||||
let mut std = std::fs::read_dir(path)?;
|
let mut std = std::fs::read_dir(path)?.fuse();
|
||||||
let mut buf = VecDeque::with_capacity(CHUNK_SIZE);
|
let mut buf = VecDeque::with_capacity(CHUNK_SIZE);
|
||||||
ReadDir::next_chunk(&mut buf, &mut std);
|
ReadDir::next_chunk(&mut buf, &mut std);
|
||||||
|
|
||||||
@@ -64,10 +64,12 @@ pub async fn read_dir(path: impl AsRef<Path>) -> io::Result<ReadDir> {
|
|||||||
#[must_use = "streams do nothing unless polled"]
|
#[must_use = "streams do nothing unless polled"]
|
||||||
pub struct ReadDir(State);
|
pub struct ReadDir(State);
|
||||||
|
|
||||||
|
type StdReadDir = std::iter::Fuse<std::fs::ReadDir>;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum State {
|
enum State {
|
||||||
Idle(Option<(VecDeque<io::Result<DirEntry>>, std::fs::ReadDir)>),
|
Idle(Option<(VecDeque<io::Result<DirEntry>>, StdReadDir)>),
|
||||||
Pending(JoinHandle<(VecDeque<io::Result<DirEntry>>, std::fs::ReadDir)>),
|
Pending(JoinHandle<(VecDeque<io::Result<DirEntry>>, StdReadDir)>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ReadDir {
|
impl ReadDir {
|
||||||
@@ -133,7 +135,7 @@ impl ReadDir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_chunk(buf: &mut VecDeque<io::Result<DirEntry>>, std: &mut std::fs::ReadDir) {
|
fn next_chunk(buf: &mut VecDeque<io::Result<DirEntry>>, std: &mut StdReadDir) {
|
||||||
for ret in std.by_ref().take(CHUNK_SIZE) {
|
for ret in std.by_ref().take(CHUNK_SIZE) {
|
||||||
let success = ret.is_ok();
|
let success = ret.is_ok();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user