This commit is contained in:
red-prig 2022-09-12 19:59:56 +03:00
parent 5377533b0b
commit 5c7092adb1
1 changed files with 55 additions and 35 deletions

View File

@ -118,6 +118,32 @@ begin
Result:=t1-t2; Result:=t1-t2;
end; end;
function SwGetProcessTime(var ut:QWORD):Boolean;
var
ct,et,kt:TFileTime;
begin
QWORD(ct):=0;
QWORD(et):=0;
QWORD(kt):=0;
ut:=0;
_sig_lock;
Result:=GetProcessTimes(GetCurrentProcess,ct,et,kt,TFileTime(ut));
_sig_unlock;
end;
function SwGetThreadTime(var ut:QWORD):Boolean;
var
ct,et,kt:TFileTime;
begin
QWORD(ct):=0;
QWORD(et):=0;
QWORD(kt):=0;
ut:=0;
_sig_lock;
Result:=GetThreadTimes(GetCurrentProcess,ct,et,kt,TFileTime(ut));
_sig_unlock;
end;
function ps4_gettimeofday(tv:Ptimeval;tz:Ptimezone):Integer; SysV_ABI_CDecl; function ps4_gettimeofday(tv:Ptimeval;tz:Ptimezone):Integer; SysV_ABI_CDecl;
Var Var
tp:timespec; tp:timespec;
@ -212,7 +238,6 @@ end;
function ps4_clock_gettime(clock_id:Integer;tp:Ptimespec):Integer; SysV_ABI_CDecl; function ps4_clock_gettime(clock_id:Integer;tp:Ptimespec):Integer; SysV_ABI_CDecl;
var var
ct,et,kt,ut:TFILETIME;
pc,pf:QWORD; pc,pf:QWORD;
begin begin
@ -222,10 +247,12 @@ begin
case clock_id of case clock_id of
CLOCK_SECOND: CLOCK_SECOND:
begin begin
GetSystemTimeAsFileTime(ct); _sig_lock;
QWORD(ct):=QWORD(ct)-DELTA_EPOCH_IN_100NS; GetSystemTimeAsFileTime(TFILETIME(pc));
tp^.tv_sec :=QWORD(ct) div POW10_7; _sig_unlock;
//tp^.tv_nsec:=(QWORD(ct) mod POW10_7)*100; pc:=pc-DELTA_EPOCH_IN_100NS;
tp^.tv_sec :=pc div POW10_7;
//tp^.tv_nsec:=(QWORD(pc) mod POW10_7)*100;
tp^.tv_nsec:=0; tp^.tv_nsec:=0;
end; end;
@ -233,10 +260,12 @@ begin
CLOCK_REALTIME_PRECISE, CLOCK_REALTIME_PRECISE,
CLOCK_REALTIME_FAST: CLOCK_REALTIME_FAST:
begin begin
GetSystemTimeAsFileTime(ct); _sig_lock;
QWORD(ct):=QWORD(ct)-DELTA_EPOCH_IN_100NS; GetSystemTimeAsFileTime(TFILETIME(pc));
tp^.tv_sec :=QWORD(ct) div POW10_7; _sig_unlock;
tp^.tv_nsec:=(QWORD(ct) mod POW10_7)*100; pc:=pc-DELTA_EPOCH_IN_100NS;
tp^.tv_sec :=(pc div POW10_7);
tp^.tv_nsec:=(pc mod POW10_7)*100;
end; end;
CLOCK_EXT_NETWORK , CLOCK_EXT_NETWORK ,
@ -286,27 +315,25 @@ begin
CLOCK_PROCTIME: CLOCK_PROCTIME:
begin begin
_sig_lock; if SwGetProcessTime(pc) then
if not GetProcessTimes(GetCurrentProcess,ct,et,kt,ut) then Result:=_set_errno(EINVAL);
_sig_unlock;
if (Result=0) then
begin begin
QWORD(ct) :=QWORD(kt)+QWORD(ut); tp^.tv_sec :=(pc div POW10_7);
tp^.tv_sec :=QWORD(ct) div POW10_7; tp^.tv_nsec:=(pc mod POW10_7)*100;
tp^.tv_nsec:=(QWORD(ct) mod POW10_7)*100; end else
begin
Result:=_set_errno(EINVAL);
end; end;
end; end;
CLOCK_THREAD_CPUTIME_ID: CLOCK_THREAD_CPUTIME_ID:
begin begin
_sig_lock; if SwGetThreadTime(pc) then
if not GetThreadTimes(GetCurrentProcess,ct,et,kt,ut) then Result:=_set_errno(EINVAL);
_sig_unlock;
if (Result=0) then
begin begin
QWORD(ct) :=QWORD(kt)+QWORD(ut); tp^.tv_sec :=(pc div POW10_7);
tp^.tv_sec :=QWORD(ct) div POW10_7; tp^.tv_nsec:=(pc mod POW10_7)*100;
tp^.tv_nsec:=(QWORD(ct) mod POW10_7)*100; end else
begin
Result:=_set_errno(EINVAL);
end; end;
end end
@ -340,19 +367,15 @@ begin
end; end;
function ps4_sceKernelGetProcessTime:QWORD; SysV_ABI_CDecl; //microseconds function ps4_sceKernelGetProcessTime:QWORD; SysV_ABI_CDecl; //microseconds
var
ct,et,kt,ut:TFileTime;
begin begin
_sig_lock; if SwGetProcessTime(Result) then
if GetProcessTimes(GetCurrentProcess,ct,et,kt,ut) then
begin begin
Result:=({QWORD(kt)+}QWORD(ut)) div 10; Result:=Result div 10;
end else end else
begin begin
_set_errno(EINVAL); _set_errno(EINVAL);
Result:=0; Result:=0;
end; end;
_sig_unlock;
end; end;
function ps4_sceKernelGetProcessTimeCounterFrequency:QWORD; SysV_ABI_CDecl; //microseconds*10 function ps4_sceKernelGetProcessTimeCounterFrequency:QWORD; SysV_ABI_CDecl; //microseconds*10
@ -361,18 +384,15 @@ begin
end; end;
function ps4_sceKernelGetProcessTimeCounter:QWORD; SysV_ABI_CDecl; //microseconds*10 function ps4_sceKernelGetProcessTimeCounter:QWORD; SysV_ABI_CDecl; //microseconds*10
var
ct,et,kt,ut:TFileTime;
begin begin
_sig_lock; if SwGetProcessTime(Result) then
if GetProcessTimes(GetCurrentProcess,ct,et,kt,ut) then
begin begin
Result:=({QWORD(kt)+}QWORD(ut)); //
end else end else
begin begin
_set_errno(EINVAL);
Result:=0; Result:=0;
end; end;
_sig_unlock;
end; end;
//1sec=10 000 000 //1sec=10 000 000