]> git.lizzy.rs Git - rust.git/commitdiff
[macOS] Implement `mach_timebase_info`
authorSamrat Man Singh <samratmansingh@gmail.com>
Mon, 13 Apr 2020 15:48:34 +0000 (21:18 +0530)
committerSamrat Man Singh <samratmansingh@gmail.com>
Mon, 13 Apr 2020 15:48:34 +0000 (21:18 +0530)
Since we return nanoseceonds instead of ticks from
`mach_absolute_time`, we don't need to scale the absolute time

src/shims/foreign_items/posix/macos.rs
src/shims/time.rs
tests/run-pass/time.rs

index 9810a77ffde18066e6e66304a827f6fa8ee6d790..e7baacf7274d2cbb4595c6e8392e05be444e45e4 100644 (file)
@@ -60,6 +60,11 @@ fn emulate_foreign_item_by_name(
                 this.write_scalar(Scalar::from_u64(result), dest)?;
             }
 
+            "mach_timebase_info" => {
+                let result = this.mach_timebase_info(args[0])?;
+                this.write_scalar(Scalar::from_i32(result), dest)?;
+            },
+
             // Access to command-line arguments
             "_NSGetArgc" => {
                 this.write_scalar(this.machine.argc.expect("machine must be initialized"), dest)?;
index 0d7a4929e4e0538b7d0444b6b5f52a6b62f1de71..adcca21fb4c0d157a33d93ad69d8cbcbd0aa1708 100644 (file)
@@ -13,6 +13,7 @@ pub fn system_time_to_duration<'tcx>(time: &SystemTime) -> InterpResult<'tcx, Du
         .map_err(|_| err_unsup_format!("times before the Unix epoch are not supported").into())
 }
 
+
 impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
 pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
     fn clock_gettime(
@@ -159,4 +160,25 @@ fn mach_absolute_time(&self) -> InterpResult<'tcx, u64> {
         u64::try_from(duration.as_nanos())
             .map_err(|_| err_unsup_format!("programs running longer than 2^64 nanoseconds are not supported").into())
     }
+
+    fn mach_timebase_info(&mut self, info_op: OpTy<'tcx, Tag>) -> InterpResult<'tcx, i32> {
+        let this = self.eval_context_mut();
+
+        this.assert_target_os("macos", "mach_timebase_info");
+        this.check_no_isolation("mach_timebase_info")?;
+
+        let info = this.deref_operand(info_op)?;
+
+        // Since we return nanoseceonds instead of ticks from
+        // `mach_absolute_time`, we don't need to scale the absolute
+        // time.
+        let (numer, denom) = (1,1);
+        let imms = [
+            immty_from_int_checked(numer, this.libc_ty_layout("uint32_t")?)?,
+            immty_from_int_checked(denom, this.libc_ty_layout("uint32_t")?)?
+        ];
+
+        this.write_packed_immediates(info, &imms)?;
+        Ok(0)
+    }
 }
index aa02ac15388e56f8a320a0a1ac294cb3a88536fe..9ae64fbae42a067043d91822776b6437ab4c9e81 100644 (file)
@@ -25,13 +25,10 @@ fn main() {
     let now2 = Instant::now();
     assert!(now2 > now1);
 
-    #[cfg(not(target_os = "macos"))] // TODO: macOS does not support Instant subtraction
-    {
-        let diff = now2.duration_since(now1);
-        assert_eq!(now1 + diff, now2);
-        assert_eq!(now2 - diff, now1);
-        // Sanity-check the difference we got.
-        assert!(diff.as_micros() > 1);
-        assert!(diff.as_micros() < 1_000_000);
-    }
+    let diff = now2.duration_since(now1);
+    assert_eq!(now1 + diff, now2);
+    assert_eq!(now2 - diff, now1);
+    // Sanity-check the difference we got.
+    assert!(diff.as_micros() > 1);
+    assert!(diff.as_micros() < 1_000_000);
 }