mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
e3f6c2c752
commit
a5ec2be201
|
@ -1228,8 +1228,12 @@ begin
|
|||
lib^.set_proc($7E0C6731E4CD52D6,@ps4_sceKernelGetProcessTimeCounter);
|
||||
|
||||
lib^.set_proc($C92F14D931827B50,@ps4_nanosleep);
|
||||
lib^.set_proc($42FB19C689AF507B,@ps4_sceKernelNanosleep);
|
||||
|
||||
lib^.set_proc($41CB5E4706EC9D5D,@ps4_usleep);
|
||||
lib^.set_proc($D637D72D15738AC7,@ps4_sceKernelUsleep);
|
||||
|
||||
lib^.set_proc($D30BB7DE1BA735D1,@ps4_sleep);
|
||||
lib^.set_proc($FD947E846EDA0C7C,@ps4_sceKernelSleep);
|
||||
|
||||
lib^.set_proc($FE8E6E103A4DFA86,@ps4_sceKernelConvertUtcToLocaltime);
|
||||
|
|
|
@ -50,10 +50,14 @@ function ps4_sceKernelGetProcessTime:QWORD; SysV_ABI_CDecl; //microseconds
|
|||
function ps4_sceKernelGetProcessTimeCounterFrequency:QWORD; SysV_ABI_CDecl; //microseconds*10
|
||||
function ps4_sceKernelGetProcessTimeCounter:QWORD; SysV_ABI_CDecl; //microseconds*10
|
||||
|
||||
function ps4_nanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl;
|
||||
function ps4_nanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl; //nanoseconds
|
||||
function ps4_sceKernelNanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl; //nanoseconds
|
||||
|
||||
function ps4_usleep(usec:DWORD):Integer; SysV_ABI_CDecl; //microseconds
|
||||
function ps4_sceKernelUsleep(usec:DWORD):Integer; SysV_ABI_CDecl; //microseconds
|
||||
function ps4_sceKernelSleep(sec:Integer):Integer; SysV_ABI_CDecl;
|
||||
|
||||
function ps4_sleep(sec:DWORD):DWORD; SysV_ABI_CDecl; //second
|
||||
function ps4_sceKernelSleep(sec:DWORD):DWORD; SysV_ABI_CDecl; //second
|
||||
|
||||
type
|
||||
ptimesec=^timesec;
|
||||
|
@ -398,12 +402,13 @@ end;
|
|||
//lpUserTime/ 10 000 000 *1 000 000
|
||||
//lpUserTime/ 10 *1
|
||||
|
||||
function ps4_nanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl;
|
||||
function _nanosleep(req,rem:Ptimespec):Integer;
|
||||
var
|
||||
timeout:Int64;
|
||||
passed :Int64;
|
||||
START:QWORD;
|
||||
begin
|
||||
//test_cancel
|
||||
if (req=nil) then Exit(EINVAL);
|
||||
|
||||
timeout:=_time_in_ns_from_timespec(req^);
|
||||
|
@ -414,6 +419,7 @@ begin
|
|||
|
||||
timeout:=-((timeout+99) div 100); //in 100ns
|
||||
|
||||
START:=0;
|
||||
if (rem<>nil) then
|
||||
begin
|
||||
SwSaveTime(START);
|
||||
|
@ -422,7 +428,7 @@ begin
|
|||
Case SwDelayExecution(True,@timeout) of
|
||||
STATUS_USER_APC,
|
||||
STATUS_KERNEL_APC,
|
||||
STATUS_ALERTED:
|
||||
STATUS_ALERTED: //signal interrupt
|
||||
begin
|
||||
if (rem<>nil) then
|
||||
begin
|
||||
|
@ -441,7 +447,7 @@ begin
|
|||
end;
|
||||
|
||||
end;
|
||||
Result:=_set_errno(EINVAL);
|
||||
Result:=EINTR;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
|
@ -453,44 +459,132 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
//test_cancel
|
||||
end;
|
||||
|
||||
function ps4_nanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl; //nanoseconds
|
||||
begin
|
||||
Result:=_set_errno(_nanosleep(req,rem));
|
||||
end;
|
||||
|
||||
function ps4_sceKernelNanosleep(req,rem:Ptimespec):Integer; SysV_ABI_CDecl; //nanoseconds
|
||||
var
|
||||
tmp:timespec;
|
||||
begin
|
||||
tmp:=Default(timespec);
|
||||
|
||||
repeat
|
||||
Result:=_nanosleep(req,@tmp);
|
||||
_set_errno(Result);
|
||||
|
||||
if (Result=0) then
|
||||
begin
|
||||
if (rem<>nil) then
|
||||
begin
|
||||
rem^:=tmp;
|
||||
end;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
req:=@tmp;
|
||||
until (Result<>EINTR);
|
||||
|
||||
Result:=px2sce(Result);
|
||||
end;
|
||||
|
||||
function ps4_usleep(usec:DWORD):Integer; SysV_ABI_CDecl; //microseconds
|
||||
var
|
||||
ft:TLargeInteger;
|
||||
time:timespec;
|
||||
begin
|
||||
//usec:=((usec+99999) div 100000)*100000;
|
||||
//
|
||||
ft:=-(10*usec); //in 100ns
|
||||
Case SwDelayExecution(True,@ft) of
|
||||
STATUS_USER_APC,
|
||||
STATUS_KERNEL_APC,
|
||||
STATUS_ALERTED:
|
||||
//test_cancel
|
||||
time.tv_sec :=usec div 1000000;
|
||||
time.tv_nsec:=((usec mod 1000000)*1000);
|
||||
Result:=_set_errno(_nanosleep(@time,nil));
|
||||
//test_cancel
|
||||
end;
|
||||
|
||||
function ps4_sceKernelUsleep(usec:DWORD):Integer; SysV_ABI_CDecl; //microseconds
|
||||
var
|
||||
req,rem:timespec;
|
||||
begin
|
||||
rem:=Default(timespec);
|
||||
|
||||
req.tv_sec :=usec div 1000000;
|
||||
req.tv_nsec:=((usec mod 1000000)*1000);
|
||||
|
||||
repeat
|
||||
Result:=_nanosleep(@req,@rem);
|
||||
_set_errno(Result);
|
||||
|
||||
if (Result=0) then Exit;
|
||||
|
||||
req:=rem;
|
||||
until (Result<>EINTR);
|
||||
|
||||
Result:=px2sce(Result);
|
||||
end;
|
||||
|
||||
function _sleep(sec:DWORD):DWORD;
|
||||
var
|
||||
req,rem:timespec;
|
||||
ret,rsec:DWORD;
|
||||
begin
|
||||
rem:=Default(timespec);
|
||||
|
||||
if (Integer(sec)<0) then
|
||||
begin
|
||||
req.tv_sec :=$7fffffff;
|
||||
req.tv_nsec:=0;
|
||||
|
||||
ret:=_nanosleep(@req,@rem);
|
||||
_set_errno(ret);
|
||||
|
||||
rsec:=0;
|
||||
if (ret<>0) then
|
||||
begin
|
||||
if (ret=EINTR) then
|
||||
begin
|
||||
Result:=_set_errno(EINVAL);
|
||||
rsec:=(Integer(rem.tv_sec)+1)-DWORD(rem.tv_nsec=0);
|
||||
end;
|
||||
else
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
Result:=sec+$80000001+rsec;
|
||||
end else
|
||||
begin
|
||||
req.tv_sec :=sec;
|
||||
req.tv_nsec:=0;
|
||||
|
||||
ret:=_nanosleep(@req,@rem);
|
||||
_set_errno(ret);
|
||||
|
||||
Result:=0;
|
||||
if (ret<>0) then
|
||||
begin
|
||||
Result:=sec;
|
||||
if (ret=EINTR) then
|
||||
begin
|
||||
Result:=(Integer(rem.tv_sec)+1)-DWORD(rem.tv_nsec=0);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function ps4_sceKernelUsleep(usec:DWORD):Integer; SysV_ABI_CDecl;
|
||||
var
|
||||
ft:TLargeInteger;
|
||||
function ps4_sleep(sec:DWORD):DWORD; SysV_ABI_CDecl; //second
|
||||
begin
|
||||
//usec:=((usec+99999) div 100000)*100000;
|
||||
//
|
||||
ft:=-(10*usec); //in 100ns
|
||||
SwDelayExecution(False,@ft);
|
||||
Result:=0;
|
||||
//test_cancel
|
||||
Result:=_sleep(sec);
|
||||
//test_cancel
|
||||
end;
|
||||
|
||||
function ps4_sceKernelSleep(sec:Integer):Integer; SysV_ABI_CDecl;
|
||||
var
|
||||
ft:TLargeInteger;
|
||||
function ps4_sceKernelSleep(sec:DWORD):DWORD; SysV_ABI_CDecl; //second
|
||||
begin
|
||||
ft:=-(10000000*sec); //in 100ns
|
||||
SwDelayExecution(False,@ft);
|
||||
repeat
|
||||
//test_cancel
|
||||
sec:=_sleep(sec);
|
||||
//test_cancel
|
||||
until (sec=0);
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
|
|
Loading…
Reference in New Issue