mirror of https://github.com/red-prig/fpPS4.git
95 lines
1.8 KiB
Plaintext
95 lines
1.8 KiB
Plaintext
unit kern_mtx;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
type
|
|
p_mtx=^mtx;
|
|
mtx=packed record
|
|
n:PChar;
|
|
c:TRTLCriticalSection;
|
|
end;
|
|
|
|
const
|
|
//Flags for lockinit().
|
|
LK_INIT_MASK =$0000FF;
|
|
LK_CANRECURSE=$000001;
|
|
LK_NODUP =$000002;
|
|
LK_NOPROFILE =$000004;
|
|
LK_NOSHARE =$000008;
|
|
LK_NOWITNESS =$000010;
|
|
LK_QUIET =$000020;
|
|
LK_ADAPTIVE =$000040;
|
|
|
|
//Additional attributes to be used in lockmgr().
|
|
LK_EATTR_MASK=$00FF00;
|
|
LK_INTERLOCK =$000100;
|
|
LK_NOWAIT =$000200;
|
|
LK_RETRY =$000400;
|
|
LK_SLEEPFAIL =$000800;
|
|
LK_TIMELOCK =$001000;
|
|
|
|
//Operations for lockmgr().
|
|
LK_TYPE_MASK =$FF0000;
|
|
LK_DOWNGRADE =$010000;
|
|
LK_DRAIN =$020000;
|
|
LK_EXCLOTHER =$040000;
|
|
LK_EXCLUSIVE =$080000;
|
|
LK_RELEASE =$100000;
|
|
LK_SHARED =$200000;
|
|
LK_UPGRADE =$400000;
|
|
LK_TRYUPGRADE=$800000;
|
|
|
|
LK_TOTAL_MASK=(LK_INIT_MASK or LK_EATTR_MASK or LK_TYPE_MASK);
|
|
|
|
procedure mtx_init (var m:mtx;name:PChar);
|
|
procedure mtx_destroy(var m:mtx);
|
|
procedure mtx_lock (var m:mtx);
|
|
function mtx_trylock(var m:mtx):Boolean;
|
|
procedure mtx_unlock (var m:mtx);
|
|
function mtx_owned (var m:mtx):Boolean;
|
|
procedure mtx_assert (var m:mtx);
|
|
|
|
implementation
|
|
|
|
procedure mtx_init(var m:mtx;name:PChar); inline;
|
|
begin
|
|
m.n:=name;
|
|
InitCriticalSection(m.c);
|
|
end;
|
|
|
|
procedure mtx_destroy(var m:mtx); inline;
|
|
begin
|
|
DoneCriticalSection(m.c);
|
|
end;
|
|
|
|
procedure mtx_lock(var m:mtx); inline;
|
|
begin
|
|
EnterCriticalSection(m.c);
|
|
end;
|
|
|
|
function mtx_trylock(var m:mtx):Boolean; inline;
|
|
begin
|
|
Result:=TryEnterCriticalSection(m.c)<>0;
|
|
end;
|
|
|
|
procedure mtx_unlock(var m:mtx); inline;
|
|
begin
|
|
LeaveCriticalSection(m.c);
|
|
end;
|
|
|
|
function mtx_owned(var m:mtx):Boolean; inline;
|
|
begin
|
|
Result:=m.c.OwningThread=GetCurrentThreadId;
|
|
end;
|
|
|
|
procedure mtx_assert(var m:mtx); inline;
|
|
begin
|
|
Assert(mtx_owned(m));
|
|
end;
|
|
|
|
end.
|
|
|