|
2 | 2 | Module: time
|
3 | 3 | */
|
4 | 4 |
|
5 |
| -// FIXME: Document what these functions do |
6 |
| - |
7 | 5 | #[abi = "cdecl"]
|
8 | 6 | native mod rustrt {
|
9 | 7 | fn get_time(&sec: u32, &usec: u32);
|
10 |
| - fn nano_time(&ns: u64); |
| 8 | + fn precise_time_ns(&ns: u64); |
11 | 9 | }
|
12 | 10 |
|
13 |
| -/* Type: timeval */ |
| 11 | +/* |
| 12 | +Type: timeval |
| 13 | +
|
| 14 | +A record specifying a time value in seconds and microseconds. |
| 15 | +*/ |
14 | 16 | type timeval = {sec: u32, usec: u32};
|
15 | 17 |
|
16 |
| -/* Function: get_time */ |
| 18 | +/* |
| 19 | +Function: get_time |
| 20 | +
|
| 21 | +Returns the current time as a `timeval` containing the seconds and |
| 22 | +microseconds since 1970-01-01T00:00:00Z. |
| 23 | +*/ |
17 | 24 | fn get_time() -> timeval {
|
18 | 25 | let sec = 0u32;
|
19 | 26 | let usec = 0u32;
|
20 | 27 | rustrt::get_time(sec, usec);
|
21 | 28 | ret {sec: sec, usec: usec};
|
22 | 29 | }
|
23 | 30 |
|
24 |
| -/* Function: precise_time_ns */ |
25 |
| -fn precise_time_ns() -> u64 { let ns = 0u64; rustrt::nano_time(ns); ret ns; } |
| 31 | +/* |
| 32 | +Function: precise_time_ns |
| 33 | +
|
| 34 | +Returns the current value of a high-resolution performance counter |
| 35 | +in nanoseconds since an unspecified epoch. |
| 36 | +*/ |
| 37 | +fn precise_time_ns() -> u64 { let ns = 0u64; rustrt::precise_time_ns(ns); ns } |
| 38 | + |
| 39 | +/* |
| 40 | +Function: precise_time_s |
26 | 41 |
|
27 |
| -/* Function: precise_time_s */ |
| 42 | +Returns the current value of a high-resolution performance counter |
| 43 | +in seconds since an unspecified epoch. |
| 44 | +*/ |
28 | 45 | fn precise_time_s() -> float {
|
29 | 46 | ret (precise_time_ns() as float) / 1000000000.;
|
30 | 47 | }
|
| 48 | + |
| 49 | +#[cfg(test)] |
| 50 | +mod tests { |
| 51 | + import task; |
| 52 | + |
| 53 | + #[test] |
| 54 | + fn test_get_time() { |
| 55 | + const some_recent_date: u32 = 1325376000u32; // 2012-01-01T00:00:00Z |
| 56 | + const some_future_date: u32 = 1577836800u32; // 2020-01-01T00:00:00Z |
| 57 | + |
| 58 | + let tv1 = get_time(); |
| 59 | + log(debug, "tv1=" + uint::str(tv1.sec as uint) + " sec + " |
| 60 | + + uint::str(tv1.usec as uint) + " usec"); |
| 61 | + |
| 62 | + assert tv1.sec > some_recent_date; |
| 63 | + assert tv1.usec < 1000000u32; |
| 64 | + |
| 65 | + let tv2 = get_time(); |
| 66 | + log(debug, "tv2=" + uint::str(tv2.sec as uint) + " sec + " |
| 67 | + + uint::str(tv2.usec as uint) + " usec"); |
| 68 | + |
| 69 | + assert tv2.sec >= tv1.sec; |
| 70 | + assert tv2.sec < some_future_date; |
| 71 | + assert tv2.usec < 1000000u32; |
| 72 | + if tv2.sec == tv1.sec { |
| 73 | + assert tv2.usec >= tv1.usec; |
| 74 | + } |
| 75 | + } |
| 76 | + |
| 77 | + #[test] |
| 78 | + fn test_precise_time() { |
| 79 | + let s0 = precise_time_s(); |
| 80 | + let ns1 = precise_time_ns(); |
| 81 | + |
| 82 | + log(debug, "s0=" + float::to_str(s0, 9u) + " sec"); |
| 83 | + assert s0 > 0.; |
| 84 | + let ns0 = (s0 * 1000000000.) as u64; |
| 85 | + log(debug, "ns0=" + u64::str(ns0) + " ns"); |
| 86 | + |
| 87 | + log(debug, "ns1=" + u64::str(ns1) + " ns"); |
| 88 | + assert ns1 >= ns0; |
| 89 | + |
| 90 | + let ns2 = precise_time_ns(); |
| 91 | + log(debug, "ns2=" + u64::str(ns2) + " ns"); |
| 92 | + assert ns2 >= ns1; |
| 93 | + } |
| 94 | +} |
0 commit comments