Skip to content

Commit

Permalink
Rollup merge of rust-lang#114038 - Stargateur:108277, r=ChrisDenton
Browse files Browse the repository at this point in the history
unix time module now return result

First try to fix rust-lang#108277 without break anything.

if anyone who read this know tips to be able to check compilation for different target I could use some help. So far I installed many target with rustup but `./x check --all-targets` doesn't seem to use them.

TODO:

- [x] better error
- [ ] test, how ?

``@rustbot`` label -S-waiting-on-author +S-waiting-on-review
  • Loading branch information
matthiaskrgr authored Mar 14, 2024
2 parents 8c7b82b + 408c0ea commit 1ff7079
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 51 deletions.
30 changes: 15 additions & 15 deletions library/std/src/sys/pal/unix/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -463,15 +463,15 @@ impl FileAttr {
#[cfg(target_os = "netbsd")]
impl FileAttr {
pub fn modified(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_mtime as i64, self.stat.st_mtimensec as i64))
SystemTime::new(self.stat.st_mtime as i64, self.stat.st_mtimensec as i64)
}

pub fn accessed(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_atime as i64, self.stat.st_atimensec as i64))
SystemTime::new(self.stat.st_atime as i64, self.stat.st_atimensec as i64)
}

pub fn created(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_birthtime as i64, self.stat.st_birthtimensec as i64))
SystemTime::new(self.stat.st_birthtime as i64, self.stat.st_birthtimensec as i64)
}
}

Expand Down Expand Up @@ -503,16 +503,16 @@ impl FileAttr {
#[cfg(target_pointer_width = "32")]
cfg_has_statx! {
if let Some(mtime) = self.stx_mtime() {
return Ok(SystemTime::new(mtime.tv_sec, mtime.tv_nsec as i64));
return SystemTime::new(mtime.tv_sec, mtime.tv_nsec as i64);
}
}

Ok(SystemTime::new(self.stat.st_mtime as i64, self.stat.st_mtime_nsec as i64))
SystemTime::new(self.stat.st_mtime as i64, self.stat.st_mtime_nsec as i64)
}

#[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))
SystemTime::new(self.stat.st_mtime as i64, 0)
}

#[cfg(any(target_os = "horizon", target_os = "hurd"))]
Expand All @@ -531,16 +531,16 @@ impl FileAttr {
#[cfg(target_pointer_width = "32")]
cfg_has_statx! {
if let Some(atime) = self.stx_atime() {
return Ok(SystemTime::new(atime.tv_sec, atime.tv_nsec as i64));
return SystemTime::new(atime.tv_sec, atime.tv_nsec as i64);
}
}

Ok(SystemTime::new(self.stat.st_atime as i64, self.stat.st_atime_nsec as i64))
SystemTime::new(self.stat.st_atime as i64, self.stat.st_atime_nsec as i64)
}

#[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))
SystemTime::new(self.stat.st_atime as i64, 0)
}

#[cfg(any(target_os = "horizon", target_os = "hurd"))]
Expand All @@ -557,7 +557,7 @@ impl FileAttr {
target_os = "watchos",
))]
pub fn created(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_birthtime as i64, self.stat.st_birthtime_nsec as i64))
SystemTime::new(self.stat.st_birthtime as i64, self.stat.st_birthtime_nsec as i64)
}

#[cfg(not(any(
Expand All @@ -573,7 +573,7 @@ impl FileAttr {
cfg_has_statx! {
if let Some(ext) = &self.statx_extra_fields {
return if (ext.stx_mask & libc::STATX_BTIME) != 0 {
Ok(SystemTime::new(ext.stx_btime.tv_sec, ext.stx_btime.tv_nsec as i64))
SystemTime::new(ext.stx_btime.tv_sec, ext.stx_btime.tv_nsec as i64)
} else {
Err(io::const_io_error!(
io::ErrorKind::Unsupported,
Expand All @@ -592,22 +592,22 @@ impl FileAttr {

#[cfg(target_os = "vita")]
pub fn created(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_ctime as i64, 0))
SystemTime::new(self.stat.st_ctime as i64, 0)
}
}

#[cfg(target_os = "nto")]
impl FileAttr {
pub fn modified(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_mtim.tv_sec, self.stat.st_mtim.tv_nsec))
SystemTime::new(self.stat.st_mtim.tv_sec, self.stat.st_mtim.tv_nsec)
}

pub fn accessed(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_atim.tv_sec, self.stat.st_atim.tv_nsec))
SystemTime::new(self.stat.st_atim.tv_sec, self.stat.st_atim.tv_nsec)
}

pub fn created(&self) -> io::Result<SystemTime> {
Ok(SystemTime::new(self.stat.st_ctim.tv_sec, self.stat.st_ctim.tv_nsec))
SystemTime::new(self.stat.st_ctim.tv_sec, self.stat.st_ctim.tv_nsec)
}
}

Expand Down
56 changes: 20 additions & 36 deletions library/std/src/sys/pal/unix/time.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::fmt;
use crate::time::Duration;
use crate::{fmt, io};

const NSEC_PER_SEC: u64 = 1_000_000_000;
pub const UNIX_EPOCH: SystemTime = SystemTime { t: Timespec::zero() };
Expand Down Expand Up @@ -34,8 +34,8 @@ pub(crate) struct Timespec {

impl SystemTime {
#[cfg_attr(any(target_os = "horizon", target_os = "hurd"), allow(unused))]
pub fn new(tv_sec: i64, tv_nsec: i64) -> SystemTime {
SystemTime { t: Timespec::new(tv_sec, tv_nsec) }
pub fn new(tv_sec: i64, tv_nsec: i64) -> Result<SystemTime, io::Error> {
Ok(SystemTime { t: Timespec::new(tv_sec, tv_nsec)? })
}

pub fn now() -> SystemTime {
Expand All @@ -55,12 +55,6 @@ impl SystemTime {
}
}

impl From<libc::timespec> for SystemTime {
fn from(t: libc::timespec) -> SystemTime {
SystemTime { t: Timespec::from(t) }
}
}

impl fmt::Debug for SystemTime {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SystemTime")
Expand All @@ -71,11 +65,15 @@ impl fmt::Debug for SystemTime {
}

impl Timespec {
const unsafe fn new_unchecked(tv_sec: i64, tv_nsec: i64) -> Timespec {
Timespec { tv_sec, tv_nsec: unsafe { Nanoseconds(tv_nsec as u32) } }
}

pub const fn zero() -> Timespec {
Timespec::new(0, 0)
unsafe { Self::new_unchecked(0, 0) }
}

const fn new(tv_sec: i64, tv_nsec: i64) -> Timespec {
const fn new(tv_sec: i64, tv_nsec: i64) -> Result<Timespec, io::Error> {
// On Apple OS, dates before epoch are represented differently than on other
// Unix platforms: e.g. 1/10th of a second before epoch is represented as `seconds=-1`
// and `nanoseconds=100_000_000` on other platforms, but is `seconds=0` and
Expand All @@ -100,9 +98,11 @@ impl Timespec {
} else {
(tv_sec, tv_nsec)
};
assert!(tv_nsec >= 0 && tv_nsec < NSEC_PER_SEC as i64);
// SAFETY: The assert above checks tv_nsec is within the valid range
Timespec { tv_sec, tv_nsec: unsafe { Nanoseconds(tv_nsec as u32) } }
if tv_nsec >= 0 && tv_nsec < NSEC_PER_SEC as i64 {
Ok(unsafe { Self::new_unchecked(tv_sec, tv_nsec) })
} else {
Err(io::const_io_error!(io::ErrorKind::InvalidData, "Invalid timestamp"))
}
}

pub fn now(clock: libc::clockid_t) -> Timespec {
Expand All @@ -126,13 +126,15 @@ impl Timespec {
if let Some(clock_gettime64) = __clock_gettime64.get() {
let mut t = MaybeUninit::uninit();
cvt(unsafe { clock_gettime64(clock, t.as_mut_ptr()) }).unwrap();
return Timespec::from(unsafe { t.assume_init() });
let t = unsafe { t.assume_init() };
return Timespec::new(t.tv_sec as i64, t.tv_nsec as i64).unwrap();
}
}

let mut t = MaybeUninit::uninit();
cvt(unsafe { libc::clock_gettime(clock, t.as_mut_ptr()) }).unwrap();
Timespec::from(unsafe { t.assume_init() })
let t = unsafe { t.assume_init() };
Timespec::new(t.tv_sec as i64, t.tv_nsec as i64).unwrap()
}

pub fn sub_timespec(&self, other: &Timespec) -> Result<Duration, Duration> {
Expand Down Expand Up @@ -178,7 +180,7 @@ impl Timespec {
nsec -= NSEC_PER_SEC as u32;
secs = secs.checked_add(1)?;
}
Some(Timespec::new(secs, nsec.into()))
Some(unsafe { Timespec::new_unchecked(secs, nsec.into()) })
}

pub fn checked_sub_duration(&self, other: &Duration) -> Option<Timespec> {
Expand All @@ -190,7 +192,7 @@ impl Timespec {
nsec += NSEC_PER_SEC as i32;
secs = secs.checked_sub(1)?;
}
Some(Timespec::new(secs, nsec.into()))
Some(unsafe { Timespec::new_unchecked(secs, nsec.into()) })
}

#[allow(dead_code)]
Expand Down Expand Up @@ -226,12 +228,6 @@ impl Timespec {
}
}

impl From<libc::timespec> for Timespec {
fn from(t: libc::timespec) -> Timespec {
Timespec::new(t.tv_sec as i64, t.tv_nsec as i64)
}
}

#[cfg(all(
target_os = "linux",
target_env = "gnu",
Expand Down Expand Up @@ -260,18 +256,6 @@ impl __timespec64 {
}
}

#[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())
}
}

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Instant {
t: Timespec,
Expand Down

0 comments on commit 1ff7079

Please sign in to comment.