mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-29 00:00:11 +02:00
fs: change panic to error in File::start_seek (#4897)
This commit is contained in:
+20
-19
@@ -565,29 +565,30 @@ impl AsyncSeek for File {
|
|||||||
let me = self.get_mut();
|
let me = self.get_mut();
|
||||||
let inner = me.inner.get_mut();
|
let inner = me.inner.get_mut();
|
||||||
|
|
||||||
loop {
|
match inner.state {
|
||||||
match inner.state {
|
Busy(_) => Err(io::Error::new(
|
||||||
Busy(_) => panic!("must wait for poll_complete before calling start_seek"),
|
io::ErrorKind::Other,
|
||||||
Idle(ref mut buf_cell) => {
|
"other file operation is pending, call poll_complete before start_seek",
|
||||||
let mut buf = buf_cell.take().unwrap();
|
)),
|
||||||
|
Idle(ref mut buf_cell) => {
|
||||||
|
let mut buf = buf_cell.take().unwrap();
|
||||||
|
|
||||||
// Factor in any unread data from the buf
|
// Factor in any unread data from the buf
|
||||||
if !buf.is_empty() {
|
if !buf.is_empty() {
|
||||||
let n = buf.discard_read();
|
let n = buf.discard_read();
|
||||||
|
|
||||||
if let SeekFrom::Current(ref mut offset) = pos {
|
if let SeekFrom::Current(ref mut offset) = pos {
|
||||||
*offset += n;
|
*offset += n;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let std = me.std.clone();
|
|
||||||
|
|
||||||
inner.state = Busy(spawn_blocking(move || {
|
|
||||||
let res = (&*std).seek(pos);
|
|
||||||
(Operation::Seek(res), buf)
|
|
||||||
}));
|
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let std = me.std.clone();
|
||||||
|
|
||||||
|
inner.state = Busy(spawn_blocking(move || {
|
||||||
|
let res = (&*std).seek(pos);
|
||||||
|
(Operation::Seek(res), buf)
|
||||||
|
}));
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -955,3 +955,24 @@ fn partial_read_set_len_ok() {
|
|||||||
assert_eq!(n, FOO.len());
|
assert_eq!(n, FOO.len());
|
||||||
assert_eq!(&buf[..n], FOO);
|
assert_eq!(&buf[..n], FOO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn busy_file_seek_error() {
|
||||||
|
let mut file = MockFile::default();
|
||||||
|
let mut seq = Sequence::new();
|
||||||
|
file.expect_inner_write()
|
||||||
|
.once()
|
||||||
|
.in_sequence(&mut seq)
|
||||||
|
.returning(|_| Err(io::ErrorKind::Other.into()));
|
||||||
|
|
||||||
|
let mut file = crate::io::BufReader::new(File::from_std(file));
|
||||||
|
{
|
||||||
|
let mut t = task::spawn(file.write(HELLO));
|
||||||
|
assert_ready_ok!(t.poll());
|
||||||
|
}
|
||||||
|
|
||||||
|
pool::run_one();
|
||||||
|
|
||||||
|
let mut t = task::spawn(file.seek(SeekFrom::Start(0)));
|
||||||
|
assert_ready_err!(t.poll());
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user