1 { Copyright (C) 2005 Bas Steendijk and Peter Green
\r 
   2   For conditions of distribution and use, see copyright notice in zlib_license.txt
\r 
   3   which is included in the package
\r 
   4   ----------------------------------------------------------------------------- }
\r 
  14 {$ifdef CONDITIONALEXPRESSIONS}{$define support_int64}{$endif}    //delphi 6 or later
\r 
  15 {$ifdef fpc}{$define support_int64}{$endif}
\r 
  20       {$IFDEF support_int64}
\r 
  32       {$ifdef linux}linux,{$endif} //for clock_gettime
\r 
  33       {$ifdef freebsd}freebsd,{$endif} //for clock_gettime      
\r 
  34       baseunix,unix,unixutil,sockets;
\r 
  39 procedure tv_add(var tv:ttimeval;msec:integer);
\r 
  40 function tv_compare(const tv1,tv2:ttimeval):boolean;
\r 
  41 procedure tv_subtract(var tv:ttimeval;const tv2:ttimeval);
\r 
  42 procedure msectotimeval(var tv:ttimeval;msec:integer);
\r 
  45 //for internal use by lcore as a replacement for gettimeofday -beware
\r 
  46 procedure gettimemonotonic(var tv:ttimeval);
\r 
  49 //tv_invalidtimebig will always compare as greater than any valid timeval
\r 
  50 //unfortunately unixstuff.inc hasn't worked it's magic yet so we
\r 
  51 //have to ifdef this manually.
\r 
  54     tv_invalidtimebig : ttimeval = (sec:maxlongint;usec:maxlongint);
\r 
  56     tv_invalidtimebig : ttimeval = (tv_sec:maxlongint;tv_usec:maxlongint);
\r 
  63 procedure tv_add(var tv:ttimeval;msec:integer);
\r 
  65   inc(tv.tv_usec,msec*1000);
\r 
  66   inc(tv.tv_sec,tv.tv_usec div 1000000);
\r 
  67   tv.tv_usec := tv.tv_usec mod 1000000;
\r 
  71 function tv_compare(const tv1,tv2:ttimeval):boolean;
\r 
  73   if tv1.tv_sec = tv2.tv_sec then begin
\r 
  74     result := tv1.tv_usec >= tv2.tv_usec;
\r 
  75   end else result := tv1.tv_sec > tv2.tv_sec;
\r 
  78 procedure tv_subtract(var tv:ttimeval;const tv2:ttimeval);
\r 
  80   dec(tv.tv_usec,tv2.tv_usec);
\r 
  81   if tv.tv_usec < 0 then begin
\r 
  82     inc(tv.tv_usec,1000000);
\r 
  85   dec(tv.tv_sec,tv2.tv_sec);
\r 
  88 procedure msectotimeval(var tv:ttimeval;msec:integer);
\r 
  90   tv.tv_sec := msec div 1000;
\r 
  91   tv.tv_usec := (msec mod 1000)*1000;
\r 
  96 {$ifdef linux}{$define have_clock_gettime}{$endif}
\r 
  97 {$ifdef freebsd}{$define have_clock_gettime}{$endif}
\r 
  99 procedure gettimemonotonic(var tv:ttimeval);
\r 
 103   {$ifdef have_clock_gettime}
\r 
 104   if (clock_gettime(CLOCK_MONOTONIC, @ts) = 0) then begin
\r 
 105     tv.tv_sec := ts.tv_sec;
\r 
 106     tv.tv_usec := ts.tv_nsec div 1000;
\r