diff --git a/src/libstd/os.rs b/src/libstd/os.rs index ba9bcc05546..25842450068 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -159,7 +159,7 @@ pub fn getcwd() -> IoResult { } #[cfg(windows)] -pub mod windows { +pub mod windoze { use libc::types::os::arch::extra::DWORD; use libc; use option::Option; @@ -385,7 +385,7 @@ pub fn getenv_as_bytes(n: &str) -> Option> { pub fn getenv(n: &str) -> Option { unsafe { with_env_lock(|| { - use os::windows::{fill_utf16_buf_and_decode}; + use os::windoze::{fill_utf16_buf_and_decode}; let mut n: Vec = n.utf16_units().collect(); n.push(0); fill_utf16_buf_and_decode(|buf, sz| { @@ -712,7 +712,7 @@ pub fn self_exe_name() -> Option { #[cfg(windows)] fn load_self() -> Option> { unsafe { - use os::windows::fill_utf16_buf_and_decode; + use os::windoze::fill_utf16_buf_and_decode; fill_utf16_buf_and_decode(|buf, sz| { libc::GetModuleFileNameW(0u as libc::DWORD, buf, sz) }).map(|s| s.into_string().into_bytes()) @@ -1207,7 +1207,11 @@ pub enum MapOption { /// Create a map for a specific address range. Corresponds to `MAP_FIXED` on /// POSIX. MapAddr(*const u8), + /// Create a memory mapping for a file with a given HANDLE. + #[cfg(windows)] + MapFd(libc::HANDLE), /// Create a memory mapping for a file with a given fd. + #[cfg(not(windows))] MapFd(c_int), /// When using `MapFd`, the start of the map is `uint` bytes from the start /// of the file. @@ -1401,7 +1405,7 @@ impl MemoryMap { let mut readable = false; let mut writable = false; let mut executable = false; - let mut fd: c_int = -1; + let mut handle: HANDLE = libc::INVALID_HANDLE_VALUE; let mut offset: uint = 0; let len = round_up(min_len, page_size()); @@ -1411,23 +1415,23 @@ impl MemoryMap { MapWritable => { writable = true; }, MapExecutable => { executable = true; } MapAddr(addr_) => { lpAddress = addr_ as LPVOID; }, - MapFd(fd_) => { fd = fd_; }, + MapFd(handle_) => { handle = handle_; }, MapOffset(offset_) => { offset = offset_; }, MapNonStandardFlags(..) => {} } } let flProtect = match (executable, readable, writable) { - (false, false, false) if fd == -1 => libc::PAGE_NOACCESS, + (false, false, false) if handle == libc::INVALID_HANDLE_VALUE => libc::PAGE_NOACCESS, (false, true, false) => libc::PAGE_READONLY, (false, true, true) => libc::PAGE_READWRITE, - (true, false, false) if fd == -1 => libc::PAGE_EXECUTE, + (true, false, false) if handle == libc::INVALID_HANDLE_VALUE => libc::PAGE_EXECUTE, (true, true, false) => libc::PAGE_EXECUTE_READ, (true, true, true) => libc::PAGE_EXECUTE_READWRITE, _ => return Err(ErrUnsupProt) }; - if fd == -1 { + if handle == libc::INVALID_HANDLE_VALUE { if offset != 0 { return Err(ErrUnsupOffset); } @@ -1455,7 +1459,7 @@ impl MemoryMap { // we should never get here. }; unsafe { - let hFile = libc::get_osfhandle(fd) as HANDLE; + let hFile = handle; let mapping = libc::CreateFileMappingW(hFile, ptr::null_mut(), flProtect, @@ -1979,55 +1983,47 @@ mod tests { #[test] fn memory_map_file() { - use result::Result::{Ok, Err}; use os::*; - use libc::*; - use io::fs; + use io::fs::{File, unlink}; + use io::SeekStyle::SeekSet; + use io::FileMode::Open; + use io::FileAccess::ReadWrite; + use libc::HANDLE; - #[cfg(unix)] - fn lseek_(fd: c_int, size: uint) { - unsafe { - assert!(lseek(fd, size as off_t, SEEK_SET) == size as off_t); - } + #[cfg(not(windows))] + fn get_fd(file: &File) -> c_int { + use os::unix::AsRawFd; + file.as_raw_fd() } + #[cfg(windows)] - fn lseek_(fd: c_int, size: uint) { - unsafe { - assert!(lseek(fd, size as c_long, SEEK_SET) == size as c_long); - } + fn get_fd(file: &File) -> HANDLE { + use os::windows::AsRawHandle; + file.as_raw_handle() } let mut path = tmpdir(); path.push("mmap_file.tmp"); let size = MemoryMap::granularity() * 2; + let mut file = File::open_mode(&path, Open, ReadWrite).unwrap(); + file.seek(size as i64, SeekSet); + file.write_u8(0); - let fd = unsafe { - let fd = path.with_c_str(|path| { - open(path, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR) - }); - lseek_(fd, size); - "x".with_c_str(|x| assert!(write(fd, x as *const c_void, 1) == 1)); - fd - }; - let chunk = match MemoryMap::new(size / 2, &[ + let chunk = MemoryMap::new(size / 2, &[ MapReadable, MapWritable, - MapFd(fd), + MapFd(get_fd(&file)), MapOffset(size / 2) - ]) { - Ok(chunk) => chunk, - Err(msg) => panic!("{}", msg) - }; + ]).unwrap(); assert!(chunk.len > 0); unsafe { *chunk.data = 0xbe; assert!(*chunk.data == 0xbe); - close(fd); } drop(chunk); - fs::unlink(&path).unwrap(); + unlink(&path).unwrap(); } #[test] diff --git a/src/libstd/sys/windows/fs.rs b/src/libstd/sys/windows/fs.rs index 9402c63dcf5..731fdc0871f 100644 --- a/src/libstd/sys/windows/fs.rs +++ b/src/libstd/sys/windows/fs.rs @@ -15,7 +15,7 @@ use libc::{mod, c_int}; use c_str::CString; use mem; -use os::windows::fill_utf16_buf_and_decode; +use os::windoze::fill_utf16_buf_and_decode; use path; use ptr; use str;