Commit fdebe38fa3

tgschultz <tgschultz@gmail.com>
2018-04-19 02:48:19
Added notes regarding CLOCK_MONOTONIC_RAW and made it easy to change our mind in the future. Updated std.os imported tests' block with lazy declaration workaround and added time.zig. Corrected some incorrect comments.
1 parent 5c83d27
Changed files (2)
std/os/index.zig
@@ -1710,18 +1710,21 @@ fn testWindowsCmdLine(input_cmd_line: &const u8, expected_args: []const []const
     assert(it.next(debug.global_allocator) == null);
 }
 
-test "std.os" {
-    _ = @import("child_process.zig");
-    _ = @import("darwin_errno.zig");
-    _ = @import("darwin.zig");
-    _ = @import("get_user_id.zig");
-    _ = @import("linux/errno.zig");
-    //_ = @import("linux_i386.zig");
-    _ = @import("linux/x86_64.zig");
-    _ = @import("linux/index.zig");
-    _ = @import("path.zig");
-    _ = @import("windows/index.zig");
-    _ = @import("test.zig");
+comptime {
+    if(builtin.is_test) {
+        _ = @import("child_process.zig");
+        _ = @import("darwin_errno.zig");
+        _ = @import("darwin.zig");
+        _ = @import("get_user_id.zig");
+        _ = @import("linux/errno.zig");
+        //_ = @import("linux_i386.zig");
+        _ = @import("linux/x86_64.zig");
+        _ = @import("linux/index.zig");
+        _ = @import("path.zig");
+        _ = @import("time.zig");
+        _ = @import("windows/index.zig");
+        _ = @import("test.zig");
+    }
 }
 
 
std/os/time.zig
@@ -4,6 +4,7 @@ const Os = builtin.Os;
 const debug = std.debug;
 
 const windows = std.os.windows;
+const linux = std.os.linux;
 const darwin = std.os.darwin;
 const posix = std.os.posix;
 
@@ -119,8 +120,8 @@ pub const s_per_week = s_per_day * 7;
 pub const Timer = struct {
     
     //if we used resolution's value when performing the
-    //  performance counter calc on windows, it would be
-    //  less precise
+    //  performance counter calc on windows/darwin, it would
+    //  be less precise
     frequency: switch(builtin.os) {
         Os.windows => u64,
         Os.macosx, Os.ios => darwin.mach_timebase_info_data,
@@ -129,9 +130,20 @@ pub const Timer = struct {
     resolution: u64,
     start_time: u64,
     
+    
+    //At some point we may change our minds on RAW, but for now we're
+    //  sticking with posix standard MONOTONIC. For more information, see: 
+    //  https://github.com/zig-lang/zig/pull/933
+    //
+    //const monotonic_clock_id = switch(builtin.os) {
+    //    Os.linux => linux.CLOCK_MONOTONIC_RAW,
+    //    else => posix.CLOCK_MONOTONIC,
+    //};
+    const monotonic_clock_id = posix.CLOCK_MONOTONIC;
+    
     //Initialize the timer structure.
     //This gives us an oportunity to grab the counter frequency in windows.
-    //On Windows: QueryPerformanceCounter will succeed on anything > XP.
+    //On Windows: QueryPerformanceCounter will succeed on anything >= XP/2000.
     //On Posix: CLOCK_MONOTONIC will only fail if the monotonic counter is not 
     //  supported, or if the timespec pointer is out of bounds, which should be 
     //  impossible here barring cosmic rays or other such occurances of
@@ -154,14 +166,14 @@ pub const Timer = struct {
             },
             Os.linux => {
                 var ts: posix.timespec = undefined;
-                var result = posix.clock_getres(posix.CLOCK_MONOTONIC, &ts);
+                var result = posix.clock_getres(monotonic_clock_id, &ts);
                 switch(posix.getErrno(result)) {
                     0 => {},
                     posix.EINVAL => return error.TimerUnsupported,
                     else => unreachable,
                 }
                 self.resolution = u64(ts.tv_sec * ns_per_s + ts.tv_nsec);
-                _ = posix.clock_gettime(posix.CLOCK_MONOTONIC, &ts);
+                _ = posix.clock_gettime(monotonic_clock_id, &ts);
                 self.start_time = u64(ts.tv_sec * ns_per_s + ts.tv_nsec);
             },
             Os.macosx, Os.ios => {
@@ -220,7 +232,7 @@ pub const Timer = struct {
     
     fn clockLinux() u64 {
         var ts: posix.timespec = undefined;
-        var result = posix.clock_gettime(posix.CLOCK_MONOTONIC, &ts);
+        var result = posix.clock_gettime(monotonic_clock_id, &ts);
         debug.assert(posix.getErrno(result) == 0);
         return u64(ts.tv_sec * ns_per_s + ts.tv_nsec);
     }