X-Git-Url: http://www.lcore.org/git/lcore.git/blobdiff_plain/9763940f8849e5c807566157829a1e6d2c9172ee..1c8b91ca0f6891a397357c7cf7d77af18c15937d:/ltimevalstuff.pas

diff --git a/ltimevalstuff.pas b/ltimevalstuff.pas
index 7054ea9..7a10c7a 100644
--- a/ltimevalstuff.pas
+++ b/ltimevalstuff.pas
@@ -20,7 +20,10 @@ interface
   {$ifdef ver1_0}
     uses linux;
   {$else}
-    uses baseunix,unix,unixutil,sockets;
+    uses 
+      {$ifdef linux}linux,{$endif} //for clock_gettime
+      {$ifdef freebsd}freebsd,{$endif} //for clock_gettime      
+      baseunix,unix,unixutil,sockets;
   {$endif}
 {$endif}
                                 
@@ -30,6 +33,11 @@ function tv_compare(const tv1,tv2:ttimeval):boolean;
 procedure tv_subtract(var tv:ttimeval;const tv2:ttimeval);
 procedure msectotimeval(var tv:ttimeval;msec:integer);
 
+{$ifdef unix}
+//for internal use by lcore as a replacement for gettimeofday -beware
+procedure gettimemonotonic(var tv:ttimeval);
+{$endif}
+
 //tv_invalidtimebig will always compare as greater than any valid timeval
 //unfortunately unixstuff.inc hasn't worked it's magic yet so we
 //have to ifdef this manually.
@@ -75,4 +83,24 @@ begin
   tv.tv_usec := (msec mod 1000)*1000;
 end;
 
-end.
\ No newline at end of file
+
+{$ifdef unix}
+{$ifdef linux}{$define have_clock_gettime}{$endif}
+{$ifdef freebsd}{$define have_clock_gettime}{$endif}
+
+procedure gettimemonotonic(var tv:ttimeval);
+var
+  ts:ttimespec;
+begin
+  {$ifdef have_clock_gettime}
+  if (clock_gettime(CLOCK_MONOTONIC, @ts) = 0) then begin
+    tv.tv_sec := ts.tv_sec;
+    tv.tv_usec := ts.tv_nsec div 1000;
+    exit;
+  end;
+  {$endif}
+  gettimeofday(tv);
+end;
+{$endif}
+
+end.