replace internal uses of gettimeofday with monotonic time where appropriate. make...
[lcore.git] / ltimevalstuff.pas
old mode 100755 (executable)
new mode 100644 (file)
index a6a3158..7a10c7a
@@ -3,41 +3,53 @@
   which is included in the package\r
   ----------------------------------------------------------------------------- }\r
 \r
+{$ifdef fpc}\r
+  {$mode delphi}\r
+{$endif}\r
+\r
 unit ltimevalstuff;\r
 interface\r
-
-{$ifdef win32}
-  type
-    ttimeval = record
-      tv_sec : longint; 
-      tv_usec : longint; 
-    end;
-{$else}
-  {$ifdef ver1_0}
-    uses linux;
-  {$else}
-    uses baseunix,unix,unixutil;
-  {$endif}
-{$endif}
-                                
+\r
+{$ifdef mswindows}\r
+  type\r
+    ttimeval = record\r
+      tv_sec : longint; \r
+      tv_usec : longint; \r
+    end;\r
+{$else}\r
+  {$ifdef ver1_0}\r
+    uses linux;\r
+  {$else}\r
+    uses \r
+      {$ifdef linux}linux,{$endif} //for clock_gettime\r
+      {$ifdef freebsd}freebsd,{$endif} //for clock_gettime      \r
+      baseunix,unix,unixutil,sockets;\r
+  {$endif}\r
+{$endif}\r
+                                \r
 \r
 procedure tv_add(var tv:ttimeval;msec:integer);\r
 function tv_compare(const tv1,tv2:ttimeval):boolean;\r
-procedure tv_substract(var tv:ttimeval;const tv2:ttimeval);\r
+procedure tv_subtract(var tv:ttimeval;const tv2:ttimeval);\r
 procedure msectotimeval(var tv:ttimeval;msec:integer);\r
-
+\r
+{$ifdef unix}\r
+//for internal use by lcore as a replacement for gettimeofday -beware\r
+procedure gettimemonotonic(var tv:ttimeval);\r
+{$endif}\r
+\r
 //tv_invalidtimebig will always compare as greater than any valid timeval\r
-//unfortunately unixstuff.inc hasn't worked it's magic yet so we
+//unfortunately unixstuff.inc hasn't worked it's magic yet so we\r
 //have to ifdef this manually.\r
 const\r
-  {$ifdef ver1_0}
+  {$ifdef ver1_0}\r
     tv_invalidtimebig : ttimeval = (sec:maxlongint;usec:maxlongint);\r
-  {$else}
+  {$else}\r
     tv_invalidtimebig : ttimeval = (tv_sec:maxlongint;tv_usec:maxlongint);\r
-  {$endif}
+  {$endif}\r
 implementation\r
-
-{$i unixstuff.inc}
+\r
+{$i unixstuff.inc}\r
 \r
 {add nn msec to tv}\r
 procedure tv_add(var tv:ttimeval;msec:integer);\r
@@ -55,7 +67,7 @@ begin
   end else result := tv1.tv_sec > tv2.tv_sec;\r
 end;\r
 \r
-procedure tv_substract(var tv:ttimeval;const tv2:ttimeval);\r
+procedure tv_subtract(var tv:ttimeval;const tv2:ttimeval);\r
 begin\r
   dec(tv.tv_usec,tv2.tv_usec);\r
   if tv.tv_usec < 0 then begin\r
@@ -71,4 +83,24 @@ begin
   tv.tv_usec := (msec mod 1000)*1000;\r
 end;\r
 \r
-end.
\ No newline at end of file
+\r
+{$ifdef unix}\r
+{$ifdef linux}{$define have_clock_gettime}{$endif}\r
+{$ifdef freebsd}{$define have_clock_gettime}{$endif}\r
+\r
+procedure gettimemonotonic(var tv:ttimeval);\r
+var\r
+  ts:ttimespec;\r
+begin\r
+  {$ifdef have_clock_gettime}\r
+  if (clock_gettime(CLOCK_MONOTONIC, @ts) = 0) then begin\r
+    tv.tv_sec := ts.tv_sec;\r
+    tv.tv_usec := ts.tv_nsec div 1000;\r
+    exit;\r
+  end;\r
+  {$endif}\r
+  gettimeofday(tv);\r
+end;\r
+{$endif}\r
+\r
+end.\r