summaryrefslogtreecommitdiffstats
path: root/library/std/src/sys/unix
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/unix')
-rw-r--r--library/std/src/sys/unix/alloc.rs3
-rw-r--r--library/std/src/sys/unix/args.rs2
-rw-r--r--library/std/src/sys/unix/env.rs11
-rw-r--r--library/std/src/sys/unix/fd.rs15
-rw-r--r--library/std/src/sys/unix/fs.rs96
-rw-r--r--library/std/src/sys/unix/l4re.rs5
-rw-r--r--library/std/src/sys/unix/mod.rs17
-rw-r--r--library/std/src/sys/unix/net.rs2
-rw-r--r--library/std/src/sys/unix/os.rs8
-rw-r--r--library/std/src/sys/unix/os_str.rs1
-rw-r--r--library/std/src/sys/unix/pipe.rs1
-rw-r--r--library/std/src/sys/unix/process/mod.rs2
-rw-r--r--library/std/src/sys/unix/process/process_unix.rs2
-rw-r--r--library/std/src/sys/unix/process/process_vxworks.rs2
-rw-r--r--library/std/src/sys/unix/rand.rs5
-rw-r--r--library/std/src/sys/unix/thread.rs19
-rw-r--r--library/std/src/sys/unix/time.rs38
17 files changed, 175 insertions, 54 deletions
diff --git a/library/std/src/sys/unix/alloc.rs b/library/std/src/sys/unix/alloc.rs
index 9d6567c9f..8604b5398 100644
--- a/library/std/src/sys/unix/alloc.rs
+++ b/library/std/src/sys/unix/alloc.rs
@@ -59,7 +59,8 @@ cfg_if::cfg_if! {
target_os = "redox",
target_os = "solaris",
target_os = "espidf",
- target_os = "horizon"
+ target_os = "horizon",
+ target_os = "vita",
))] {
#[inline]
unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
diff --git a/library/std/src/sys/unix/args.rs b/library/std/src/sys/unix/args.rs
index 3d79058b3..9ed4d9c1e 100644
--- a/library/std/src/sys/unix/args.rs
+++ b/library/std/src/sys/unix/args.rs
@@ -265,7 +265,7 @@ mod imp {
}
}
-#[cfg(target_os = "espidf")]
+#[cfg(any(target_os = "espidf", target_os = "vita"))]
mod imp {
use super::Args;
diff --git a/library/std/src/sys/unix/env.rs b/library/std/src/sys/unix/env.rs
index 1a9276f11..8c3ef88d8 100644
--- a/library/std/src/sys/unix/env.rs
+++ b/library/std/src/sys/unix/env.rs
@@ -141,6 +141,17 @@ pub mod os {
pub const EXE_EXTENSION: &str = "elf";
}
+#[cfg(target_os = "vita")]
+pub mod os {
+ pub const FAMILY: &str = "unix";
+ pub const OS: &str = "vita";
+ pub const DLL_PREFIX: &str = "lib";
+ pub const DLL_SUFFIX: &str = ".so";
+ pub const DLL_EXTENSION: &str = "so";
+ pub const EXE_SUFFIX: &str = ".elf";
+ pub const EXE_EXTENSION: &str = "elf";
+}
+
#[cfg(all(target_os = "emscripten", target_arch = "asmjs"))]
pub mod os {
pub const FAMILY: &str = "unix";
diff --git a/library/std/src/sys/unix/fd.rs b/library/std/src/sys/unix/fd.rs
index ce5c048f2..cb630eede 100644
--- a/library/std/src/sys/unix/fd.rs
+++ b/library/std/src/sys/unix/fd.rs
@@ -75,6 +75,7 @@ const fn max_iov() -> usize {
target_os = "nto",
target_os = "openbsd",
target_os = "horizon",
+ target_os = "vita",
target_os = "watchos",
)))]
const fn max_iov() -> usize {
@@ -93,7 +94,7 @@ impl FileDesc {
Ok(ret as usize)
}
- #[cfg(not(any(target_os = "espidf", target_os = "horizon")))]
+ #[cfg(not(any(target_os = "espidf", target_os = "horizon", target_os = "vita")))]
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
let ret = cvt(unsafe {
libc::readv(
@@ -105,14 +106,14 @@ impl FileDesc {
Ok(ret as usize)
}
- #[cfg(any(target_os = "espidf", target_os = "horizon"))]
+ #[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))]
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
io::default_read_vectored(|b| self.read(b), bufs)
}
#[inline]
pub fn is_read_vectored(&self) -> bool {
- cfg!(not(any(target_os = "espidf", target_os = "horizon")))
+ cfg!(not(any(target_os = "espidf", target_os = "horizon", target_os = "vita")))
}
pub fn read_to_end(&self, buf: &mut Vec<u8>) -> io::Result<usize> {
@@ -253,7 +254,7 @@ impl FileDesc {
Ok(ret as usize)
}
- #[cfg(not(any(target_os = "espidf", target_os = "horizon")))]
+ #[cfg(not(any(target_os = "espidf", target_os = "horizon", target_os = "vita")))]
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
let ret = cvt(unsafe {
libc::writev(
@@ -265,14 +266,14 @@ impl FileDesc {
Ok(ret as usize)
}
- #[cfg(any(target_os = "espidf", target_os = "horizon"))]
+ #[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))]
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
io::default_write_vectored(|b| self.write(b), bufs)
}
#[inline]
pub fn is_write_vectored(&self) -> bool {
- cfg!(not(any(target_os = "espidf", target_os = "horizon")))
+ cfg!(not(any(target_os = "espidf", target_os = "horizon", target_os = "vita")))
}
pub fn write_at(&self, buf: &[u8], offset: u64) -> io::Result<usize> {
@@ -481,6 +482,7 @@ impl<'a> Read for &'a FileDesc {
}
impl AsInner<OwnedFd> for FileDesc {
+ #[inline]
fn as_inner(&self) -> &OwnedFd {
&self.0
}
@@ -505,6 +507,7 @@ impl AsFd for FileDesc {
}
impl AsRawFd for FileDesc {
+ #[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
diff --git a/library/std/src/sys/unix/fs.rs b/library/std/src/sys/unix/fs.rs
index abef170dd..09e9ae272 100644
--- a/library/std/src/sys/unix/fs.rs
+++ b/library/std/src/sys/unix/fs.rs
@@ -349,6 +349,8 @@ pub struct FilePermissions {
pub struct FileTimes {
accessed: Option<SystemTime>,
modified: Option<SystemTime>,
+ #[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))]
+ created: Option<SystemTime>,
}
#[derive(Copy, Clone, Eq, Debug)]
@@ -447,7 +449,12 @@ impl FileAttr {
#[cfg(not(any(target_os = "netbsd", target_os = "nto")))]
impl FileAttr {
- #[cfg(not(any(target_os = "vxworks", target_os = "espidf", target_os = "horizon")))]
+ #[cfg(not(any(
+ target_os = "vxworks",
+ target_os = "espidf",
+ target_os = "horizon",
+ target_os = "vita"
+ )))]
pub fn modified(&self) -> io::Result<SystemTime> {
#[cfg(target_pointer_width = "32")]
cfg_has_statx! {
@@ -459,7 +466,7 @@ impl FileAttr {
Ok(SystemTime::new(self.stat.st_mtime as i64, self.stat.st_mtime_nsec as i64))
}
- #[cfg(any(target_os = "vxworks", target_os = "espidf"))]
+ #[cfg(any(target_os = "vxworks", target_os = "espidf", target_os = "vita"))]
pub fn modified(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_mtime as i64, 0))
}
@@ -469,7 +476,12 @@ impl FileAttr {
Ok(SystemTime::from(self.stat.st_mtim))
}
- #[cfg(not(any(target_os = "vxworks", target_os = "espidf", target_os = "horizon")))]
+ #[cfg(not(any(
+ target_os = "vxworks",
+ target_os = "espidf",
+ target_os = "horizon",
+ target_os = "vita"
+ )))]
pub fn accessed(&self) -> io::Result<SystemTime> {
#[cfg(target_pointer_width = "32")]
cfg_has_statx! {
@@ -481,7 +493,7 @@ impl FileAttr {
Ok(SystemTime::new(self.stat.st_atime as i64, self.stat.st_atime_nsec as i64))
}
- #[cfg(any(target_os = "vxworks", target_os = "espidf"))]
+ #[cfg(any(target_os = "vxworks", target_os = "espidf", target_os = "vita"))]
pub fn accessed(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_atime as i64, 0))
}
@@ -547,6 +559,7 @@ impl FileAttr {
}
impl AsInner<stat64> for FileAttr {
+ #[inline]
fn as_inner(&self) -> &stat64 {
&self.stat
}
@@ -580,6 +593,11 @@ impl FileTimes {
pub fn set_modified(&mut self, t: SystemTime) {
self.modified = Some(t);
}
+
+ #[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))]
+ pub fn set_created(&mut self, t: SystemTime) {
+ self.created = Some(t);
+ }
}
impl FileType {
@@ -865,6 +883,7 @@ impl DirEntry {
target_os = "vxworks",
target_os = "espidf",
target_os = "horizon",
+ target_os = "vita",
target_os = "nto",
))]
pub fn ino(&self) -> u64 {
@@ -1193,37 +1212,51 @@ impl File {
None => Ok(libc::timespec { tv_sec: 0, tv_nsec: libc::UTIME_OMIT as _ }),
}
};
- #[cfg(not(any(target_os = "redox", target_os = "espidf", target_os = "horizon")))]
- let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
cfg_if::cfg_if! {
if #[cfg(any(target_os = "redox", target_os = "espidf", target_os = "horizon"))] {
// Redox doesn't appear to support `UTIME_OMIT`.
// ESP-IDF and HorizonOS do not support `futimens` at all and the behavior for those OS is therefore
// the same as for Redox.
- drop(times);
+ let _ = times;
Err(io::const_io_error!(
io::ErrorKind::Unsupported,
"setting file times not supported",
))
- } else if #[cfg(any(target_os = "android", target_os = "macos"))] {
- // futimens requires macOS 10.13, and Android API level 19
+ } else if #[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))] {
+ let mut buf = [mem::MaybeUninit::<libc::timespec>::uninit(); 3];
+ let mut num_times = 0;
+ let mut attrlist: libc::attrlist = unsafe { mem::zeroed() };
+ attrlist.bitmapcount = libc::ATTR_BIT_MAP_COUNT;
+ if times.created.is_some() {
+ buf[num_times].write(to_timespec(times.created)?);
+ num_times += 1;
+ attrlist.commonattr |= libc::ATTR_CMN_CRTIME;
+ }
+ if times.modified.is_some() {
+ buf[num_times].write(to_timespec(times.modified)?);
+ num_times += 1;
+ attrlist.commonattr |= libc::ATTR_CMN_MODTIME;
+ }
+ if times.accessed.is_some() {
+ buf[num_times].write(to_timespec(times.accessed)?);
+ num_times += 1;
+ attrlist.commonattr |= libc::ATTR_CMN_ACCTIME;
+ }
+ cvt(unsafe { libc::fsetattrlist(
+ self.as_raw_fd(),
+ (&attrlist as *const libc::attrlist).cast::<libc::c_void>().cast_mut(),
+ buf.as_ptr().cast::<libc::c_void>().cast_mut(),
+ num_times * mem::size_of::<libc::timespec>(),
+ 0
+ ) })?;
+ Ok(())
+ } else if #[cfg(target_os = "android")] {
+ let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
+ // futimens requires Android API level 19
cvt(unsafe {
weak!(fn futimens(c_int, *const libc::timespec) -> c_int);
match futimens.get() {
Some(futimens) => futimens(self.as_raw_fd(), times.as_ptr()),
- #[cfg(target_os = "macos")]
- None => {
- fn ts_to_tv(ts: &libc::timespec) -> libc::timeval {
- libc::timeval {
- tv_sec: ts.tv_sec,
- tv_usec: (ts.tv_nsec / 1000) as _
- }
- }
- let timevals = [ts_to_tv(&times[0]), ts_to_tv(&times[1])];
- libc::futimes(self.as_raw_fd(), timevals.as_ptr())
- }
- // futimes requires even newer Android.
- #[cfg(target_os = "android")]
None => return Err(io::const_io_error!(
io::ErrorKind::Unsupported,
"setting file times requires Android API level >= 19",
@@ -1232,6 +1265,22 @@ impl File {
})?;
Ok(())
} else {
+ #[cfg(all(target_os = "linux", target_env = "gnu", target_pointer_width = "32", not(target_arch = "riscv32")))]
+ {
+ use crate::sys::{time::__timespec64, weak::weak};
+
+ // Added in glibc 2.34
+ weak!(fn __futimens64(libc::c_int, *const __timespec64) -> libc::c_int);
+
+ if let Some(futimens64) = __futimens64.get() {
+ let to_timespec = |time: Option<SystemTime>| time.map(|time| time.t.to_timespec64())
+ .unwrap_or(__timespec64::new(0, libc::UTIME_OMIT as _));
+ let times = [to_timespec(times.accessed), to_timespec(times.modified)];
+ cvt(unsafe { futimens64(self.as_raw_fd(), times.as_ptr()) })?;
+ return Ok(());
+ }
+ }
+ let times = [to_timespec(times.accessed)?, to_timespec(times.modified)?];
cvt(unsafe { libc::futimens(self.as_raw_fd(), times.as_ptr()) })?;
Ok(())
}
@@ -1254,12 +1303,14 @@ impl DirBuilder {
}
impl AsInner<FileDesc> for File {
+ #[inline]
fn as_inner(&self) -> &FileDesc {
&self.0
}
}
impl AsInnerMut<FileDesc> for File {
+ #[inline]
fn as_inner_mut(&mut self) -> &mut FileDesc {
&mut self.0
}
@@ -1284,6 +1335,7 @@ impl AsFd for File {
}
impl AsRawFd for File {
+ #[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
diff --git a/library/std/src/sys/unix/l4re.rs b/library/std/src/sys/unix/l4re.rs
index 996758893..ee016887e 100644
--- a/library/std/src/sys/unix/l4re.rs
+++ b/library/std/src/sys/unix/l4re.rs
@@ -129,6 +129,7 @@ pub mod net {
}
impl AsInner<FileDesc> for Socket {
+ #[inline]
fn as_inner(&self) -> &FileDesc {
&self.0
}
@@ -153,6 +154,7 @@ pub mod net {
}
impl AsRawFd for Socket {
+ #[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
@@ -183,6 +185,7 @@ pub mod net {
unimpl!();
}
+ #[inline]
pub fn socket(&self) -> &Socket {
&self.inner
}
@@ -305,6 +308,7 @@ pub mod net {
unimpl!();
}
+ #[inline]
pub fn socket(&self) -> &Socket {
&self.inner
}
@@ -371,6 +375,7 @@ pub mod net {
unimpl!();
}
+ #[inline]
pub fn socket(&self) -> &Socket {
&self.inner
}
diff --git a/library/std/src/sys/unix/mod.rs b/library/std/src/sys/unix/mod.rs
index 68c9520cc..bb9e65e68 100644
--- a/library/std/src/sys/unix/mod.rs
+++ b/library/std/src/sys/unix/mod.rs
@@ -92,6 +92,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
target_os = "redox",
target_os = "l4re",
target_os = "horizon",
+ target_os = "vita",
)))]
'poll: {
use crate::sys::os::errno;
@@ -140,6 +141,7 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
target_os = "vxworks",
target_os = "l4re",
target_os = "horizon",
+ target_os = "vita",
)))]
{
use crate::sys::os::errno;
@@ -162,7 +164,12 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
}
unsafe fn reset_sigpipe(#[allow(unused_variables)] sigpipe: u8) {
- #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "horizon")))]
+ #[cfg(not(any(
+ target_os = "emscripten",
+ target_os = "fuchsia",
+ target_os = "horizon",
+ target_os = "vita"
+ )))]
{
// We don't want to add this as a public type to std, nor do we
// want to `include!` a file from the compiler (which would break
@@ -199,7 +206,8 @@ pub unsafe fn init(argc: isize, argv: *const *const u8, sigpipe: u8) {
target_os = "espidf",
target_os = "emscripten",
target_os = "fuchsia",
- target_os = "horizon"
+ target_os = "horizon",
+ target_os = "vita"
)))]
static UNIX_SIGPIPE_ATTR_SPECIFIED: crate::sync::atomic::AtomicBool =
crate::sync::atomic::AtomicBool::new(false);
@@ -208,7 +216,8 @@ static UNIX_SIGPIPE_ATTR_SPECIFIED: crate::sync::atomic::AtomicBool =
target_os = "espidf",
target_os = "emscripten",
target_os = "fuchsia",
- target_os = "horizon"
+ target_os = "horizon",
+ target_os = "vita",
)))]
pub(crate) fn unix_sigpipe_attr_specified() -> bool {
UNIX_SIGPIPE_ATTR_SPECIFIED.load(crate::sync::atomic::Ordering::Relaxed)
@@ -402,7 +411,7 @@ cfg_if::cfg_if! {
}
}
-#[cfg(any(target_os = "espidf", target_os = "horizon"))]
+#[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))]
mod unsupported {
use crate::io;
diff --git a/library/std/src/sys/unix/net.rs b/library/std/src/sys/unix/net.rs
index 573bfa658..39edb136c 100644
--- a/library/std/src/sys/unix/net.rs
+++ b/library/std/src/sys/unix/net.rs
@@ -490,6 +490,7 @@ impl Socket {
}
impl AsInner<FileDesc> for Socket {
+ #[inline]
fn as_inner(&self) -> &FileDesc {
&self.0
}
@@ -514,6 +515,7 @@ impl AsFd for Socket {
}
impl AsRawFd for Socket {
+ #[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
diff --git a/library/std/src/sys/unix/os.rs b/library/std/src/sys/unix/os.rs
index a345af76f..8edfd3313 100644
--- a/library/std/src/sys/unix/os.rs
+++ b/library/std/src/sys/unix/os.rs
@@ -460,7 +460,7 @@ pub fn current_exe() -> io::Result<PathBuf> {
path.canonicalize()
}
-#[cfg(any(target_os = "espidf", target_os = "horizon"))]
+#[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))]
pub fn current_exe() -> io::Result<PathBuf> {
super::unsupported::unsupported()
}
@@ -614,7 +614,8 @@ pub fn home_dir() -> Option<PathBuf> {
target_os = "redox",
target_os = "vxworks",
target_os = "espidf",
- target_os = "horizon"
+ target_os = "horizon",
+ target_os = "vita",
))]
unsafe fn fallback() -> Option<OsString> {
None
@@ -627,7 +628,8 @@ pub fn home_dir() -> Option<PathBuf> {
target_os = "redox",
target_os = "vxworks",
target_os = "espidf",
- target_os = "horizon"
+ target_os = "horizon",
+ target_os = "vita",
)))]
unsafe fn fallback() -> Option<OsString> {
let amt = match libc::sysconf(libc::_SC_GETPW_R_SIZE_MAX) {
diff --git a/library/std/src/sys/unix/os_str.rs b/library/std/src/sys/unix/os_str.rs
index 017e2af29..488217f39 100644
--- a/library/std/src/sys/unix/os_str.rs
+++ b/library/std/src/sys/unix/os_str.rs
@@ -89,6 +89,7 @@ impl IntoInner<Vec<u8>> for Buf {
}
impl AsInner<[u8]> for Buf {
+ #[inline]
fn as_inner(&self) -> &[u8] {
&self.inner
}
diff --git a/library/std/src/sys/unix/pipe.rs b/library/std/src/sys/unix/pipe.rs
index dc17c9fac..938a46bfd 100644
--- a/library/std/src/sys/unix/pipe.rs
+++ b/library/std/src/sys/unix/pipe.rs
@@ -135,6 +135,7 @@ pub fn read2(p1: AnonPipe, v1: &mut Vec<u8>, p2: AnonPipe, v2: &mut Vec<u8>) ->
}
impl AsRawFd for AnonPipe {
+ #[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
diff --git a/library/std/src/sys/unix/process/mod.rs b/library/std/src/sys/unix/process/mod.rs
index 3701510f3..0cf163d9f 100644
--- a/library/std/src/sys/unix/process/mod.rs
+++ b/library/std/src/sys/unix/process/mod.rs
@@ -14,7 +14,7 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "vxworks")] {
#[path = "process_vxworks.rs"]
mod process_inner;
- } else if #[cfg(any(target_os = "espidf", target_os = "horizon"))] {
+ } else if #[cfg(any(target_os = "espidf", target_os = "horizon", target_os = "vita"))] {
#[path = "process_unsupported.rs"]
mod process_inner;
} else {
diff --git a/library/std/src/sys/unix/process/process_unix.rs b/library/std/src/sys/unix/process/process_unix.rs
index ceaff5966..612d43fe2 100644
--- a/library/std/src/sys/unix/process/process_unix.rs
+++ b/library/std/src/sys/unix/process/process_unix.rs
@@ -735,7 +735,7 @@ impl ExitStatus {
// true on all actual versions of Unix, is widely assumed, and is specified in SuS
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html. If it is not
// true for a platform pretending to be Unix, the tests (our doctests, and also
- // procsss_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
+ // process_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
match NonZero_c_int::try_from(self.0) {
/* was nonzero */ Ok(failure) => Err(ExitStatusError(failure)),
/* was zero, couldn't convert */ Err(_) => Ok(()),
diff --git a/library/std/src/sys/unix/process/process_vxworks.rs b/library/std/src/sys/unix/process/process_vxworks.rs
index 569a4b149..c40e7ada0 100644
--- a/library/std/src/sys/unix/process/process_vxworks.rs
+++ b/library/std/src/sys/unix/process/process_vxworks.rs
@@ -199,7 +199,7 @@ impl ExitStatus {
// true on all actual versions of Unix, is widely assumed, and is specified in SuS
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html. If it is not
// true for a platform pretending to be Unix, the tests (our doctests, and also
- // procsss_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
+ // process_unix/tests.rs) will spot it. `ExitStatusError::code` assumes this too.
match NonZero_c_int::try_from(self.0) {
Ok(failure) => Err(ExitStatusError(failure)),
Err(_) => Ok(()),
diff --git a/library/std/src/sys/unix/rand.rs b/library/std/src/sys/unix/rand.rs
index 0f347ffab..d8b63546b 100644
--- a/library/std/src/sys/unix/rand.rs
+++ b/library/std/src/sys/unix/rand.rs
@@ -21,7 +21,8 @@ pub fn hashmap_random_keys() -> (u64, u64) {
not(target_os = "fuchsia"),
not(target_os = "redox"),
not(target_os = "vxworks"),
- not(target_os = "emscripten")
+ not(target_os = "emscripten"),
+ not(target_os = "vita"),
))]
mod imp {
use crate::fs::File;
@@ -175,7 +176,7 @@ mod imp {
}
}
-#[cfg(any(target_os = "openbsd", target_os = "emscripten"))]
+#[cfg(any(target_os = "openbsd", target_os = "emscripten", target_os = "vita"))]
mod imp {
use crate::sys::os::errno;
diff --git a/library/std/src/sys/unix/thread.rs b/library/std/src/sys/unix/thread.rs
index 15070b1f6..7307d9b2c 100644
--- a/library/std/src/sys/unix/thread.rs
+++ b/library/std/src/sys/unix/thread.rs
@@ -326,6 +326,25 @@ pub fn available_parallelism() -> io::Result<NonZeroUsize> {
} else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd"))] {
use crate::ptr;
+ #[cfg(target_os = "freebsd")]
+ {
+ let mut set: libc::cpuset_t = unsafe { mem::zeroed() };
+ unsafe {
+ if libc::cpuset_getaffinity(
+ libc::CPU_LEVEL_WHICH,
+ libc::CPU_WHICH_PID,
+ -1,
+ mem::size_of::<libc::cpuset_t>(),
+ &mut set,
+ ) == 0 {
+ let count = libc::CPU_COUNT(&set) as usize;
+ if count > 0 {
+ return Ok(NonZeroUsize::new_unchecked(count));
+ }
+ }
+ }
+ }
+
let mut cpus: libc::c_uint = 0;
let mut cpus_size = crate::mem::size_of_val(&cpus);
diff --git a/library/std/src/sys/unix/time.rs b/library/std/src/sys/unix/time.rs
index 6f5358340..a9fbc7ab1 100644
--- a/library/std/src/sys/unix/time.rs
+++ b/library/std/src/sys/unix/time.rs
@@ -113,11 +113,7 @@ impl Timespec {
}
pub fn checked_add_duration(&self, other: &Duration) -> Option<Timespec> {
- let mut secs = other
- .as_secs()
- .try_into() // <- target type would be `i64`
- .ok()
- .and_then(|secs| self.tv_sec.checked_add(secs))?;
+ let mut secs = self.tv_sec.checked_add_unsigned(other.as_secs())?;
// Nano calculations can't overflow because nanos are <1B which fit
// in a u32.
@@ -126,15 +122,11 @@ impl Timespec {
nsec -= NSEC_PER_SEC as u32;
secs = secs.checked_add(1)?;
}
- Some(Timespec::new(secs, nsec as i64))
+ Some(Timespec::new(secs, nsec.into()))
}
pub fn checked_sub_duration(&self, other: &Duration) -> Option<Timespec> {
- let mut secs = other
- .as_secs()
- .try_into() // <- target type would be `i64`
- .ok()
- .and_then(|secs| self.tv_sec.checked_sub(secs))?;
+ let mut secs = self.tv_sec.checked_sub_unsigned(other.as_secs())?;
// Similar to above, nanos can't overflow.
let mut nsec = self.tv_nsec.0 as i32 - other.subsec_nanos() as i32;
@@ -142,7 +134,7 @@ impl Timespec {
nsec += NSEC_PER_SEC as i32;
secs = secs.checked_sub(1)?;
}
- Some(Timespec::new(secs, nsec as i64))
+ Some(Timespec::new(secs, nsec.into()))
}
#[allow(dead_code)]
@@ -166,6 +158,16 @@ impl Timespec {
}
self.to_timespec()
}
+
+ #[cfg(all(
+ target_os = "linux",
+ target_env = "gnu",
+ target_pointer_width = "32",
+ not(target_arch = "riscv32")
+ ))]
+ pub fn to_timespec64(&self) -> __timespec64 {
+ __timespec64::new(self.tv_sec, self.tv_nsec.0 as _)
+ }
}
impl From<libc::timespec> for Timespec {
@@ -196,6 +198,18 @@ pub(in crate::sys::unix) struct __timespec64 {
target_pointer_width = "32",
not(target_arch = "riscv32")
))]
+impl __timespec64 {
+ pub(in crate::sys::unix) fn new(tv_sec: i64, tv_nsec: i32) -> Self {
+ Self { tv_sec, tv_nsec, _padding: 0 }
+ }
+}
+
+#[cfg(all(
+ target_os = "linux",
+ target_env = "gnu",
+ target_pointer_width = "32",
+ not(target_arch = "riscv32")
+))]
impl From<__timespec64> for Timespec {
fn from(t: __timespec64) -> Timespec {
Timespec::new(t.tv_sec, t.tv_nsec.into())