accept lasterror must be obtained before the rmasterset
[lcore.git] / btime.pas
index df4f91ec8f301bc59de4912b0fe46f38ba395db4..54deae594e814544942666d88a578dee925a88bd 100644 (file)
--- a/btime.pas
+++ b/btime.pas
@@ -494,7 +494,7 @@ begin
   mmtime_lastresult := result;\r
 end;\r
 \r
   mmtime_lastresult := result;\r
 end;\r
 \r
-{ free pascals tsystemtime is incomaptible with windows api calls\r
+{ free pascals tsystemtime is incompatible with windows api calls\r
  so we declare it ourselves - plugwash\r
 }\r
 {$ifdef fpc}\r
  so we declare it ourselves - plugwash\r
 }\r
 {$ifdef fpc}\r
@@ -553,12 +553,51 @@ begin
   result := mmqpctimefloat;\r
 end;\r
 \r
   result := mmqpctimefloat;\r
 end;\r
 \r
+\r
+\r
+var\r
+  GetSystemTimePreciseAsFileTime:procedure(var v:tfiletime); stdcall;\r
+  win8inited:boolean;\r
+\r
+procedure initwin8;\r
+var\r
+  dllhandle:thandle;\r
+\r
+begin\r
+  win8inited := true;\r
+  dllhandle := loadlibrary('kernel32.dll');\r
+  if (dllhandle <> 0) then begin\r
+    GetSystemTimePreciseAsFileTime := getprocaddress(dllhandle,'GetSystemTimePreciseAsFileTime');\r
+  end;\r
+end;\r
+\r
+\r
+function unixtimefloat_win8:float;\r
+var\r
+  ft:tfiletime;\r
+  i:int64 absolute ft;\r
+begin\r
+  GetSystemTimePreciseAsFileTime(ft);\r
+  {change from windows 1601-01-01 to unix 1970-01-01.\r
+  use integer math for this, to preserve precision}\r
+  dec(i, 116444736000000000);\r
+  result := (i / 10000000);\r
+end;\r
+\r
+\r
+\r
 function unixtimefloat:float;\r
 const\r
   margin = 0.0012;\r
 var\r
   f,g,h:float;\r
 begin\r
 function unixtimefloat:float;\r
 const\r
   margin = 0.0012;\r
 var\r
   f,g,h:float;\r
 begin\r
+  if not win8inited then initwin8;\r
+  if assigned(@GetSystemTimePreciseAsFileTime) then begin\r
+    result := unixtimefloat_win8;\r
+    exit;\r
+  end;\r
+\r
   result := monotimefloat+timefloatbias;\r
   f := result-unixtimefloat_systemtime;\r
   if ((f > ticks_freq2+margin) or (f < -margin)) or (timefloatbias = 0) then begin\r
   result := monotimefloat+timefloatbias;\r
   f := result-unixtimefloat_systemtime;\r
   if ((f > ticks_freq2+margin) or (f < -margin)) or (timefloatbias = 0) then begin\r