diff options
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/common/wtf8.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/ext/raw.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/fd.rs | 31 | ||||
| -rw-r--r-- | src/libstd/sys/unix/fs.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/unix/net.rs | 8 | ||||
| -rw-r--r-- | src/libstd/sys/unix/pipe.rs | 19 | ||||
| -rw-r--r-- | src/libstd/sys/unix/thread.rs | 21 |
7 files changed, 47 insertions, 38 deletions
diff --git a/src/libstd/sys/common/wtf8.rs b/src/libstd/sys/common/wtf8.rs index d705b8986d0..b6be85a4dfa 100644 --- a/src/libstd/sys/common/wtf8.rs +++ b/src/libstd/sys/common/wtf8.rs @@ -715,7 +715,7 @@ impl<'a> Iterator for Wtf8CodePoints<'a> { #[inline] fn size_hint(&self) -> (usize, Option<usize>) { - let (len, _) = self.bytes.size_hint(); + let len = self.bytes.len(); (len.saturating_add(3) / 4, Some(len)) } } diff --git a/src/libstd/sys/unix/ext/raw.rs b/src/libstd/sys/unix/ext/raw.rs index 96535e88604..7972990e67d 100644 --- a/src/libstd/sys/unix/ext/raw.rs +++ b/src/libstd/sys/unix/ext/raw.rs @@ -23,7 +23,7 @@ #[stable(feature = "raw_ext", since = "1.1.0")] pub type pid_t = i32; #[doc(inline)] -#[unstable(feature = "pthread_t", issue = "29791")] +#[stable(feature = "pthread_t", since = "1.8.0")] pub use sys::platform::raw::pthread_t; #[doc(inline)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs index 94c48be02ff..b99f4a2eacd 100644 --- a/src/libstd/sys/unix/fd.rs +++ b/src/libstd/sys/unix/fd.rs @@ -62,32 +62,31 @@ impl FileDesc { } #[cfg(not(any(target_env = "newlib", target_os = "solaris", target_os = "emscripten")))] - pub fn set_cloexec(&self) { + pub fn set_cloexec(&self) -> io::Result<()> { unsafe { - let ret = libc::ioctl(self.fd, libc::FIOCLEX); - debug_assert_eq!(ret, 0); + cvt(libc::ioctl(self.fd, libc::FIOCLEX))?; + Ok(()) } } #[cfg(any(target_env = "newlib", target_os = "solaris", target_os = "emscripten"))] - pub fn set_cloexec(&self) { + pub fn set_cloexec(&self) -> io::Result<()> { unsafe { - let previous = libc::fcntl(self.fd, libc::F_GETFD); - let ret = libc::fcntl(self.fd, libc::F_SETFD, previous | libc::FD_CLOEXEC); - debug_assert_eq!(ret, 0); + let previous = cvt(libc::fcntl(self.fd, libc::F_GETFD))?; + cvt(libc::fcntl(self.fd, libc::F_SETFD, previous | libc::FD_CLOEXEC))?; + Ok(()) } } - pub fn set_nonblocking(&self, nonblocking: bool) { + pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { unsafe { - let previous = libc::fcntl(self.fd, libc::F_GETFL); - debug_assert!(previous != -1); + let previous = cvt(libc::fcntl(self.fd, libc::F_GETFL))?; let new = if nonblocking { previous | libc::O_NONBLOCK } else { previous & !libc::O_NONBLOCK }; - let ret = libc::fcntl(self.fd, libc::F_SETFL, new); - debug_assert!(ret != -1); + cvt(libc::fcntl(self.fd, libc::F_SETFL, new))?; + Ok(()) } } @@ -114,8 +113,8 @@ impl FileDesc { let make_filedesc = |fd| { let fd = FileDesc::new(fd); - fd.set_cloexec(); - fd + fd.set_cloexec()?; + Ok(fd) }; static TRY_CLOEXEC: AtomicBool = AtomicBool::new(!cfg!(target_os = "android")); @@ -127,7 +126,7 @@ impl FileDesc { // though it reported doing so on F_DUPFD_CLOEXEC. Ok(fd) => { return Ok(if cfg!(target_os = "linux") { - make_filedesc(fd) + make_filedesc(fd)? } else { FileDesc::new(fd) }) @@ -138,7 +137,7 @@ impl FileDesc { Err(e) => return Err(e), } } - cvt(unsafe { libc::fcntl(fd, libc::F_DUPFD, 0) }).map(make_filedesc) + cvt(unsafe { libc::fcntl(fd, libc::F_DUPFD, 0) }).and_then(make_filedesc) } } diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 7f23ae53fcd..0524851df91 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -418,7 +418,7 @@ impl File { // The CLOEXEC flag, however, is supported on versions of OSX/BSD/etc // that we support, so we only do this on Linux currently. if cfg!(target_os = "linux") { - fd.set_cloexec(); + fd.set_cloexec()?; } Ok(File(fd)) diff --git a/src/libstd/sys/unix/net.rs b/src/libstd/sys/unix/net.rs index 830957a7e59..a784741c88c 100644 --- a/src/libstd/sys/unix/net.rs +++ b/src/libstd/sys/unix/net.rs @@ -77,7 +77,7 @@ impl Socket { let fd = cvt(libc::socket(fam, ty, 0))?; let fd = FileDesc::new(fd); - fd.set_cloexec(); + fd.set_cloexec()?; Ok(Socket(fd)) } } @@ -99,9 +99,9 @@ impl Socket { cvt(libc::socketpair(fam, ty, 0, fds.as_mut_ptr()))?; let a = FileDesc::new(fds[0]); - a.set_cloexec(); let b = FileDesc::new(fds[1]); - b.set_cloexec(); + a.set_cloexec()?; + b.set_cloexec()?; Ok((Socket(a), Socket(b))) } } @@ -132,7 +132,7 @@ impl Socket { libc::accept(self.0.raw(), storage, len) })?; let fd = FileDesc::new(fd); - fd.set_cloexec(); + fd.set_cloexec()?; Ok(Socket(fd)) } diff --git a/src/libstd/sys/unix/pipe.rs b/src/libstd/sys/unix/pipe.rs index beca2d46753..2dde9c0e615 100644 --- a/src/libstd/sys/unix/pipe.rs +++ b/src/libstd/sys/unix/pipe.rs @@ -44,17 +44,18 @@ pub fn anon_pipe() -> io::Result<(AnonPipe, AnonPipe)> { } } if unsafe { libc::pipe(fds.as_mut_ptr()) == 0 } { - Ok((AnonPipe::from_fd(fds[0]), AnonPipe::from_fd(fds[1]))) + let fd0 = FileDesc::new(fds[0]); + let fd1 = FileDesc::new(fds[1]); + Ok((AnonPipe::from_fd(fd0)?, AnonPipe::from_fd(fd1)?)) } else { Err(io::Error::last_os_error()) } } impl AnonPipe { - pub fn from_fd(fd: libc::c_int) -> AnonPipe { - let fd = FileDesc::new(fd); - fd.set_cloexec(); - AnonPipe(fd) + pub fn from_fd(fd: FileDesc) -> io::Result<AnonPipe> { + fd.set_cloexec()?; + Ok(AnonPipe(fd)) } pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> { @@ -81,8 +82,8 @@ pub fn read2(p1: AnonPipe, // in the `select` loop below, and we wouldn't want one to block the other! let p1 = p1.into_fd(); let p2 = p2.into_fd(); - p1.set_nonblocking(true); - p2.set_nonblocking(true); + p1.set_nonblocking(true)?; + p2.set_nonblocking(true)?; let max = cmp::max(p1.raw(), p2.raw()); loop { @@ -114,11 +115,11 @@ pub fn read2(p1: AnonPipe, } }; if read(&p1, v1)? { - p2.set_nonblocking(false); + p2.set_nonblocking(false)?; return p2.read_to_end(v2).map(|_| ()); } if read(&p2, v2)? { - p1.set_nonblocking(false); + p1.set_nonblocking(false)?; return p1.read_to_end(v1).map(|_| ()); } } diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs index cb34d1a5fbc..371319a93d2 100644 --- a/src/libstd/sys/unix/thread.rs +++ b/src/libstd/sys/unix/thread.rs @@ -125,16 +125,25 @@ impl Thread { } pub fn sleep(dur: Duration) { - let mut ts = libc::timespec { - tv_sec: dur.as_secs() as libc::time_t, - tv_nsec: dur.subsec_nanos() as libc::c_long, - }; + let mut secs = dur.as_secs(); + let mut nsecs = dur.subsec_nanos() as libc::c_long; // If we're awoken with a signal then the return value will be -1 and // nanosleep will fill in `ts` with the remaining time. unsafe { - while libc::nanosleep(&ts, &mut ts) == -1 { - assert_eq!(os::errno(), libc::EINTR); + while secs > 0 || nsecs > 0 { + let mut ts = libc::timespec { + tv_sec: cmp::min(libc::time_t::max_value() as u64, secs) as libc::time_t, + tv_nsec: nsecs, + }; + secs -= ts.tv_sec as u64; + if libc::nanosleep(&ts, &mut ts) == -1 { + assert_eq!(os::errno(), libc::EINTR); + secs += ts.tv_sec as u64; + nsecs = ts.tv_nsec; + } else { + nsecs = 0; + } } } } |
