Skip to content

Commit 6311856

Browse files
committed
std: slight refactor on UvFilestream seek behavior, pre-seek-refactor
1 parent 94b84a8 commit 6311856

File tree

3 files changed

+34
-38
lines changed

3 files changed

+34
-38
lines changed

src/libstd/rt/io/file.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,9 @@ impl Seek for FileStream {
170170
}
171171

172172
fn seek(&mut self, pos: i64, style: SeekStyle) {
173-
use libc::{SEEK_SET, SEEK_CUR, SEEK_END};
174-
let whence = match style {
175-
SeekSet => SEEK_SET,
176-
SeekCur => SEEK_CUR,
177-
SeekEnd => SEEK_END
178-
} as i64;
179-
match self.fd.seek(pos, whence) {
173+
match self.fd.seek(pos, style) {
180174
Ok(_) => {
181-
// successful seek resets EOF indocator
175+
// successful seek resets EOF indicator
182176
self.last_nread = -1;
183177
()
184178
},

src/libstd/rt/rtio.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use super::io::net::ip::{IpAddr, SocketAddr};
1717
use rt::uv::uvio;
1818
use path::Path;
1919
use super::io::support::PathLike;
20+
use super::io::{SeekStyle};
2021

2122
// XXX: ~object doesn't work currently so these are some placeholder
2223
// types to use instead
@@ -118,7 +119,7 @@ pub trait RtioFileStream {
118119
fn write(&mut self, buf: &[u8]) -> Result<(), IoError>;
119120
fn pread(&mut self, buf: &mut [u8], offset: u64) -> Result<int, IoError>;
120121
fn pwrite(&mut self, buf: &[u8], offset: u64) -> Result<(), IoError>;
121-
fn seek(&mut self, pos: i64, whence: i64) -> Result<(), IoError>;
122+
fn seek(&mut self, pos: i64, whence: SeekStyle) -> Result<u64, IoError>;
122123
fn tell(&self) -> Result<u64, IoError>;
123124
fn flush(&mut self) -> Result<(), IoError>;
124125
}

src/libstd/rt/uv/uvio.rs

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use str;
2121
use result::*;
2222
use rt::io::IoError;
2323
use rt::io::net::ip::{SocketAddr, IpAddr};
24-
use rt::io::{standard_error, OtherIoError};
24+
use rt::io::{standard_error, OtherIoError, SeekStyle, SeekSet, SeekCur, SeekEnd};
2525
use rt::local::Local;
2626
use rt::rtio::*;
2727
use rt::sched::{Scheduler, SchedHandle};
@@ -31,7 +31,7 @@ use rt::uv::idle::IdleWatcher;
3131
use rt::uv::net::{UvIpv4SocketAddr, UvIpv6SocketAddr};
3232
use unstable::sync::Exclusive;
3333
use super::super::io::support::PathLike;
34-
use libc::{lseek, c_long, SEEK_CUR};
34+
use libc::{lseek, c_long};
3535

3636
#[cfg(test)] use container::Container;
3737
#[cfg(test)] use unstable::run_in_bare_thread;
@@ -1122,6 +1122,22 @@ impl UvFileStream {
11221122
};
11231123
result_cell.take()
11241124
}
1125+
fn seek_common(&mut self, pos: i64, whence: c_int) ->
1126+
Result<u64, IoError>{
1127+
#[fixed_stack_segment]; #[inline(never)];
1128+
unsafe {
1129+
match lseek((*self.fd), pos as c_long, whence) {
1130+
-1 => {
1131+
Err(IoError {
1132+
kind: OtherIoError,
1133+
desc: "Failed to lseek.",
1134+
detail: None
1135+
})
1136+
},
1137+
n => Ok(n as u64)
1138+
}
1139+
}
1140+
}
11251141
}
11261142

11271143
impl Drop for UvFileStream {
@@ -1155,35 +1171,20 @@ impl RtioFileStream for UvFileStream {
11551171
fn pwrite(&mut self, buf: &[u8], offset: u64) -> Result<(), IoError> {
11561172
self.base_write(buf, offset as i64)
11571173
}
1158-
fn seek(&mut self, pos: i64, whence: i64) -> Result<(), IoError> {
1159-
#[fixed_stack_segment]; #[inline(never)];
1160-
unsafe {
1161-
match lseek((*self.fd), pos as c_long, whence as c_int) {
1162-
-1 => {
1163-
Err(IoError {
1164-
kind: OtherIoError,
1165-
desc: "Failed to lseek.",
1166-
detail: None
1167-
})
1168-
},
1169-
_ => Ok(())
1170-
}
1171-
}
1174+
fn seek(&mut self, pos: i64, whence: SeekStyle) -> Result<u64, IoError> {
1175+
use libc::{SEEK_SET, SEEK_CUR, SEEK_END};
1176+
let whence = match whence {
1177+
SeekSet => SEEK_SET,
1178+
SeekCur => SEEK_CUR,
1179+
SeekEnd => SEEK_END
1180+
};
1181+
self.seek_common(pos, whence)
11721182
}
11731183
fn tell(&self) -> Result<u64, IoError> {
1174-
#[fixed_stack_segment]; #[inline(never)];
1175-
unsafe {
1176-
match lseek((*self.fd), 0, SEEK_CUR) {
1177-
-1 => {
1178-
Err(IoError {
1179-
kind: OtherIoError,
1180-
desc: "Failed to lseek, needed to tell().",
1181-
detail: None
1182-
})
1183-
},
1184-
n=> Ok(n as u64)
1185-
}
1186-
}
1184+
use libc::SEEK_CUR;
1185+
// this is temporary
1186+
let self_ = unsafe { cast::transmute::<&UvFileStream, &mut UvFileStream>(self) };
1187+
self_.seek_common(0, SEEK_CUR)
11871188
}
11881189
fn flush(&mut self) -> Result<(), IoError> {
11891190
Ok(())

0 commit comments

Comments
 (0)