diff options
| author | bors <bors@rust-lang.org> | 2014-12-09 19:12:02 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-12-09 19:12:02 +0000 |
| commit | b25e100173effba685d076cee16f8af150078617 (patch) | |
| tree | 6c045a3ce5fe575f6e4e4663d4e748780e7416cd /src/libstd | |
| parent | ef4982f0f8643af9e7deede95ad5e4e8df854d66 (diff) | |
| parent | 1a61fe4280b476bb2131f76414c32676b91e163c (diff) | |
| download | rust-b25e100173effba685d076cee16f8af150078617.tar.gz rust-b25e100173effba685d076cee16f8af150078617.zip | |
auto merge of #19665 : alexcrichton/rust/rollup, r=alexcrichton
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/dynamic_lib.rs | 3 | ||||
| -rw-r--r-- | src/libstd/os.rs | 72 | ||||
| -rw-r--r-- | src/libstd/rand/mod.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sync/poison.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/common/thread_local.rs | 18 | ||||
| -rw-r--r-- | src/libstd/sys/windows/fs.rs | 2 |
6 files changed, 57 insertions, 42 deletions
diff --git a/src/libstd/dynamic_lib.rs b/src/libstd/dynamic_lib.rs index 5609fbf16cd..96b075ab569 100644 --- a/src/libstd/dynamic_lib.rs +++ b/src/libstd/dynamic_lib.rs @@ -21,9 +21,11 @@ use iter::IteratorExt; use mem; use ops::*; use option::*; +use option::Option::{None, Some}; use os; use path::{Path,GenericPath}; use result::*; +use result::Result::{Err, Ok}; use slice::{AsSlice,SlicePrelude}; use str; use string::String; @@ -216,6 +218,7 @@ pub mod dl { use kinds::Copy; use ptr; use result::*; + use result::Result::{Err, Ok}; use string::String; pub unsafe fn open_external<T: ToCStr>(filename: T) -> *mut u8 { diff --git a/src/libstd/os.rs b/src/libstd/os.rs index f298ec74f6a..6c91010f4cb 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -160,7 +160,7 @@ pub fn getcwd() -> IoResult<Path> { } #[cfg(windows)] -pub mod windows { +pub mod windoze { use libc::types::os::arch::extra::DWORD; use libc; use option::Option; @@ -386,7 +386,7 @@ pub fn getenv_as_bytes(n: &str) -> Option<Vec<u8>> { pub fn getenv(n: &str) -> Option<String> { unsafe { with_env_lock(|| { - use os::windows::{fill_utf16_buf_and_decode}; + use os::windoze::{fill_utf16_buf_and_decode}; let mut n: Vec<u16> = n.utf16_units().collect(); n.push(0); fill_utf16_buf_and_decode(|buf, sz| { @@ -715,7 +715,7 @@ pub fn self_exe_name() -> Option<Path> { #[cfg(windows)] fn load_self() -> Option<Vec<u8>> { 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()) @@ -1215,7 +1215,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. @@ -1413,7 +1417,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()); @@ -1423,23 +1427,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); } @@ -1467,7 +1471,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, @@ -1991,55 +1995,47 @@ mod tests { #[test] fn memory_map_file() { - use result::Result::{Ok, Err}; + use libc; use os::*; - use libc::*; - use io::fs; - - #[cfg(unix)] - fn lseek_(fd: c_int, size: uint) { - unsafe { - assert!(lseek(fd, size as off_t, SEEK_SET) == size as off_t); - } + use io::fs::{File, unlink}; + use io::SeekStyle::SeekSet; + use io::FileMode::Open; + use io::FileAccess::ReadWrite; + + #[cfg(not(windows))] + fn get_fd(file: &File) -> libc::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) -> libc::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/rand/mod.rs b/src/libstd/rand/mod.rs index a359fcf7a9f..5b5fa2952e6 100644 --- a/src/libstd/rand/mod.rs +++ b/src/libstd/rand/mod.rs @@ -80,7 +80,7 @@ //! circle, both centered at the origin. Since the area of a unit circle is π, //! we have: //! -//! ```notrust +//! ```text //! (area of unit circle) / (area of square) = π / 4 //! ``` //! diff --git a/src/libstd/sync/poison.rs b/src/libstd/sync/poison.rs index eb46fd77147..ee151556620 100644 --- a/src/libstd/sync/poison.rs +++ b/src/libstd/sync/poison.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use option::None; +use option::Option::None; use rustrt::task::Task; use rustrt::local::Local; diff --git a/src/libstd/sys/common/thread_local.rs b/src/libstd/sys/common/thread_local.rs index 370d74cc5e1..3eb0e3f46cb 100644 --- a/src/libstd/sys/common/thread_local.rs +++ b/src/libstd/sys/common/thread_local.rs @@ -185,7 +185,23 @@ impl StaticKey { } unsafe fn lazy_init(&self) -> uint { - let key = imp::create(self.dtor); + // POSIX allows the key created here to be 0, but the compare_and_swap + // below relies on using 0 as a sentinel value to check who won the + // race to set the shared TLS key. As far as I know, there is no + // guaranteed value that cannot be returned as a posix_key_create key, + // so there is no value we can initialize the inner key with to + // prove that it has not yet been set. As such, we'll continue using a + // value of 0, but with some gyrations to make sure we have a non-0 + // value returned from the creation routine. + // FIXME: this is clearly a hack, and should be cleaned up. + let key1 = imp::create(self.dtor); + let key = if key1 != 0 { + key1 + } else { + let key2 = imp::create(self.dtor); + imp::destroy(key1); + key2 + }; assert!(key != 0); match self.inner.key.compare_and_swap(0, key as uint, atomic::SeqCst) { // The CAS succeeded, so we've created the actual key diff --git a/src/libstd/sys/windows/fs.rs b/src/libstd/sys/windows/fs.rs index 16779a80185..05be8de0b56 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; |
