X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=inline;f=src%2Fshared%2Fxprofiler.pas;h=35b70df8263c385d53324afd0ed0f9cc9b9778e5;hb=f4fc3b435118e5d9e4085da37014436d2e063259;hp=e335e3fc8ee1c0abd2fd4cb361e6082f7cd61a4e;hpb=9d2405d500b579d36f6e2330762a6cd51fbce581;p=d2df-sdl.git diff --git a/src/shared/xprofiler.pas b/src/shared/xprofiler.pas index e335e3f..35b70df 100644 --- a/src/shared/xprofiler.pas +++ b/src/shared/xprofiler.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,12 +22,15 @@ interface uses SysUtils, - {$IF DEFINED(LINUX)} + {$IF DEFINED(LINUX) OR DEFINED(ANDROID)} {$DEFINE STOPWATCH_IS_HERE} unixtype, linux {$ELSEIF DEFINED(WINDOWS)} {$DEFINE STOPWATCH_IS_HERE} Windows + {$ELSEIF DEFINED(HAIKU)} + {$DEFINE STOPWATCH_IS_HERE} + unixtype {$ELSE} {$IFDEF STOPWATCH_IS_HERE} {$UNDEF STOPWATCH_IS_HERE} @@ -143,6 +146,10 @@ type end; +function getTimeMicro (): UInt64; inline; +function getTimeMilli (): UInt64; inline; + + implementation {$IF DEFINED(LINUX)} @@ -169,7 +176,7 @@ begin if not mHasHPTimer then raise Exception.Create('profiler error: hires timer is not available'); mFrequency := 1; // just a flag if (r.tv_nsec <> 0) then mFrequency := 1000000000000000000 div r.tv_nsec; -{$ELSE} +{$ELSEIF DEFINED(WINDOWS)} mHasHPTimer := QueryPerformanceFrequency(r); if not mHasHPTimer then raise Exception.Create('profiler error: hires timer is not available'); mFrequency := r; @@ -178,21 +185,27 @@ begin end; -function curTimeMicro (): UInt64; inline; +function getTimeMicro (): UInt64; inline; var r: THPTimeType; begin - if (mFrequency = 0) then initTimerIntr(); + //if (mFrequency = 0) then initTimerIntr(); {$IF DEFINED(LINUX)} clock_gettime(CLOCK_MONOTONIC, @r); result := UInt64(r.tv_sec)*1000000+UInt64(r.tv_nsec) div 1000; // microseconds - {$ELSE} + {$ELSEIF DEFINED(WINDOWS)} QueryPerformanceCounter(r); result := UInt64(r)*1000000 div mFrequency; {$ENDIF} end; +function getTimeMilli (): UInt64; inline; +begin + result := getTimeMicro div 1000; +end; + + // ////////////////////////////////////////////////////////////////////////// // class function TStopWatch.Create (): TStopWatch; begin @@ -211,7 +224,7 @@ procedure TStopWatch.updateElapsed (); var e: UInt64; begin - e := curTimeMicro(); + e := getTimeMicro(); if (mStartPosition > e) then mStartPosition := e; Inc(mElapsed, e-mStartPosition); mStartPosition := e; @@ -243,7 +256,7 @@ end; procedure TStopWatch.start (reset: Boolean=true); begin if mRunning and not reset then exit; // nothing to do - mStartPosition := curTimeMicro(); + mStartPosition := getTimeMicro(); mRunning := true; if (reset) then mElapsed := 0; end; @@ -455,8 +468,8 @@ begin begin if (xpsecs[idx].name = aName) then begin - if (idx = xpscur) then raise Exception.Create('profiler error(0): dobule resume: "'+aName+'"'); - if (xpsecs[idx].prevAct <> -1) then raise Exception.Create('profiler error(1): dobule resume: "'+aName+'"'); + if (idx = xpscur) then raise Exception.Create('profiler error(0): double resume: "'+aName+'"'); + if (xpsecs[idx].prevAct <> -1) then raise Exception.Create('profiler error(1): double resume: "'+aName+'"'); xpsecs[idx].prevAct := xpscur; xpscur := idx; xpsecs[idx].timer.resume(); @@ -486,4 +499,6 @@ begin end; +begin + initTimerIntr(); end.