scePthreadBarrierInit and etc

This commit is contained in:
Pavel 2022-12-09 15:45:49 +03:00
parent 5ee6d51ead
commit 703d9426fd
2 changed files with 186 additions and 5 deletions

View File

@ -27,21 +27,93 @@ type
waiters:Integer;
refcount:Integer;
destroying:Integer;
name:array[0..31] of AnsiChar;
end;
const
PTHREAD_BARRIER_SERIAL_THREAD=-1;
function ps4_pthread_barrier_init(bar:p_pthread_barrier_t;attr:p_pthread_barrierattr_t;count:DWORD):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrierattr_init(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrierattr_destroy(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrierattr_getpshared(attr:p_pthread_barrierattr_t;pshared:PInteger):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrierattr_setpshared(attr:p_pthread_barrierattr_t;pshared:Integer):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrier_init(bar:p_pthread_barrier_t;
attr:p_pthread_barrierattr_t;
count:DWORD):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrier_destroy(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrier_wait(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
function ps4_pthread_barrier_setname_np(bar:p_pthread_barrier_t;name:PChar):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierattrInit(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierattrDestroy(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierattrGetpshared(attr:p_pthread_barrierattr_t;pshared:PInteger):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierattrSetpshared(attr:p_pthread_barrierattr_t;pshared:Integer):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierInit(bar:p_pthread_barrier_t;
attr:p_pthread_barrierattr_t;
count:DWORD;
name:PChar):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierDestroy(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
function ps4_scePthreadBarrierWait(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
implementation
uses
atomic,
sys_kernel,
sys_signal;
sys_signal,
sys_pthread;
//
function _pthread_barrierattr_init(attr:p_pthread_barrierattr_t):Integer;
begin
if (attr=nil) then Exit(EINVAL);
_sig_lock;
attr^:=AllocMem(SizeOf(pthread_barrier_attr));
_sig_unlock;
if (attr^=nil) then Exit(ENOMEM);
attr^^.pshared:=PTHREAD_PROCESS_PRIVATE;
Result:=0;
end;
function _pthread_barrierattr_destroy(attr:p_pthread_barrierattr_t):Integer;
begin
if (attr=nil) then Exit(EINVAL);
if (attr^=nil) then Exit(EINVAL);
FreeMem(attr^);
Result:=0;
end;
function _pthread_barrierattr_getpshared(attr:p_pthread_barrierattr_t;pshared:PInteger):Integer;
begin
if (attr=nil) then Exit(EINVAL);
if (pshared=nil) then Exit(EINVAL);
if (attr^=nil) then Exit(EINVAL);
pshared^:=attr^^.pshared;
Result:=0;
end;
function _pthread_barrierattr_setpshared(attr:p_pthread_barrierattr_t;pshared:Integer):Integer;
begin
if (attr=nil) then Exit(EINVAL);
if (attr^=nil) then Exit(EINVAL);
//Only PTHREAD_PROCESS_PRIVATE is supported.
if (pshared<>PTHREAD_PROCESS_PRIVATE) then Exit(EINVAL);
attr^^.pshared:=pshared;
Result:=0;
end;
//
const
LIFE_BAR=$BAB1F00D;
@ -81,7 +153,9 @@ begin
Result:=0;
end;
function _pthread_barrier_init(bar:p_pthread_barrier_t;attr:p_pthread_barrierattr_t;count:DWORD):Integer;
function _pthread_barrier_init(bar:p_pthread_barrier_t;
attr:p_pthread_barrierattr_t;
count:DWORD):Integer;
var
new:pthread_barrier_t;
begin
@ -89,7 +163,7 @@ begin
if (attr<>nil) then
if (attr^<>nil) then
if (attr^^.pshared<>0) then //<>PTHREAD_PROCESS_PRIVATE
if (attr^^.pshared<>PTHREAD_PROCESS_PRIVATE) then
begin
Assert(false,'shared barrier not support!');
Exit(ENOSYS);
@ -196,7 +270,46 @@ begin
end;
end;
function ps4_pthread_barrier_init(bar:p_pthread_barrier_t;attr:p_pthread_barrierattr_t;count:DWORD):Integer; SysV_ABI_CDecl;
function _pthread_barrier_setname_np(bar:p_pthread_barrier_t;name:PChar):Integer;
var
bv:pthread_barrier_t;
begin
Result:=bar_enter(bar,@bv);
if (Result<>0) then Exit;
if (name<>nil) then MoveChar0(name^,bv^.name,32);
ps4_pthread_mutex_unlock(@bv^.mlock);
Result:=0;
end;
//interface
function ps4_pthread_barrierattr_init(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrierattr_init(attr);
end;
function ps4_pthread_barrierattr_destroy(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrierattr_destroy(attr);
end;
function ps4_pthread_barrierattr_getpshared(attr:p_pthread_barrierattr_t;pshared:PInteger):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrierattr_getpshared(attr,pshared);
end;
function ps4_pthread_barrierattr_setpshared(attr:p_pthread_barrierattr_t;pshared:Integer):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrierattr_setpshared(attr,pshared);
end;
//
function ps4_pthread_barrier_init(bar:p_pthread_barrier_t;
attr:p_pthread_barrierattr_t;
count:DWORD):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrier_init(bar,attr,count);
end;
@ -211,5 +324,58 @@ begin
Result:=_pthread_barrier_wait(bar);
end;
function ps4_pthread_barrier_setname_np(bar:p_pthread_barrier_t;name:PChar):Integer; SysV_ABI_CDecl;
begin
Result:=_pthread_barrier_setname_np(bar,name);
end;
//
function ps4_scePthreadBarrierattrInit(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrierattr_init(attr));
end;
function ps4_scePthreadBarrierattrDestroy(attr:p_pthread_barrierattr_t):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrierattr_destroy(attr));
end;
function ps4_scePthreadBarrierattrGetpshared(attr:p_pthread_barrierattr_t;pshared:PInteger):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrierattr_getpshared(attr,pshared));
end;
function ps4_scePthreadBarrierattrSetpshared(attr:p_pthread_barrierattr_t;pshared:Integer):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrierattr_setpshared(attr,pshared));
end;
//
function ps4_scePthreadBarrierInit(bar:p_pthread_barrier_t;
attr:p_pthread_barrierattr_t;
count:DWORD;
name:PChar):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrier_init(bar,attr,count));
if (Result=0) then
begin
_pthread_barrier_setname_np(bar,name);
end;
end;
function ps4_scePthreadBarrierDestroy(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrier_destroy(bar));
end;
function ps4_scePthreadBarrierWait(bar:p_pthread_barrier_t):Integer; SysV_ABI_CDecl;
begin
Result:=px2sce(_pthread_barrier_wait(bar));
end;
end.

View File

@ -957,9 +957,24 @@ begin
//barrier
lib^.set_proc($E27A829CB252BDC9,@ps4_pthread_barrierattr_init);
lib^.set_proc($02C0900984DB7BCD,@ps4_pthread_barrierattr_destroy);
lib^.set_proc($6B92593328C557AF,@ps4_pthread_barrierattr_getpshared);
lib^.set_proc($8EAAC6249C458665,@ps4_pthread_barrierattr_setpshared);
lib^.set_proc($66C5CB16D7768EA4,@ps4_pthread_barrier_init);
lib^.set_proc($F8FAAE6FD1D908FA,@ps4_pthread_barrier_destroy);
lib^.set_proc($09AC1980262A5D69,@ps4_pthread_barrier_wait);
lib^.set_proc($5B04510248630113,@ps4_pthread_barrier_setname_np);
lib^.set_proc($483915F7184834A2,@ps4_scePthreadBarrierattrInit);
lib^.set_proc($A13FE3E03A891D8F,@ps4_scePthreadBarrierattrDestroy);
lib^.set_proc($4A4BAD0ED82A27D8,@ps4_scePthreadBarrierattrGetpshared);
lib^.set_proc($3697E970B7F93D83,@ps4_scePthreadBarrierattrSetpshared);
lib^.set_proc($E5D80E10FB041AAC,@ps4_scePthreadBarrierInit);
lib^.set_proc($1EE741D89BF630F6,@ps4_scePthreadBarrierDestroy);
lib^.set_proc($B7DBD5C93825A874,@ps4_scePthreadBarrierWait);
//barrier