mirror of https://github.com/red-prig/fpPS4.git
86 lines
1.4 KiB
Plaintext
86 lines
1.4 KiB
Plaintext
unit fdescfs;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
mqueue,
|
|
vmount,
|
|
vnode,
|
|
kern_mtx,
|
|
subr_hash;
|
|
|
|
const
|
|
{ Private mount flags for fdescfs. }
|
|
FMNT_UNMOUNTF=$01;
|
|
FD_ROOT=1;
|
|
FD_DESC=3;
|
|
|
|
type
|
|
p_fdescmount=^t_fdescmount;
|
|
t_fdescmount=packed record
|
|
f_root:p_vnode; { Root node }
|
|
flags:Integer;
|
|
end;
|
|
|
|
fdntype=(_Froot,_Fdesc);
|
|
|
|
p_fdescnode=^t_fdescnode;
|
|
t_fdescnode=packed record
|
|
fd_hash :LIST_ENTRY; { Hash list }
|
|
fd_vnode:p_vnode; { Back ptr to vnode }
|
|
fd_type :fdntype; { Type of this node }
|
|
fd_fd :Integer; { Fd to be dup'ed }
|
|
fd_ix :Integer; { filesystem index }
|
|
end;
|
|
|
|
function fdesc_init(vfsp:p_vfsconf):Integer;
|
|
function fdesc_uninit(vfsp:p_vfsconf):Integer;
|
|
function FD_NHASH(ix:Integer):Pointer;
|
|
|
|
const
|
|
NFDCACHE=4;
|
|
|
|
type
|
|
p_fdhashhead=^t_fdhashhead;
|
|
t_fdhashhead=LIST_HEAD; //fdescnode
|
|
|
|
var
|
|
fdesc_hashmtx:mtx;
|
|
|
|
fdhashtbl:p_fdhashhead=nil;
|
|
fdhash :QWORD=0;
|
|
|
|
implementation
|
|
|
|
{
|
|
* Initialise cache headers
|
|
}
|
|
function fdesc_init(vfsp:p_vfsconf):Integer;
|
|
begin
|
|
mtx_init(fdesc_hashmtx, 'fdescfs_hash');
|
|
fdhashtbl:=hashinit(NFDCACHE, @fdhash);
|
|
Exit(0);
|
|
end;
|
|
|
|
{
|
|
* Uninit ready for unload.
|
|
}
|
|
function fdesc_uninit(vfsp:p_vfsconf):Integer;
|
|
begin
|
|
hashdestroy(fdhashtbl, fdhash);
|
|
mtx_destroy(fdesc_hashmtx);
|
|
Exit(0);
|
|
end;
|
|
|
|
function FD_NHASH(ix:Integer):Pointer;
|
|
begin
|
|
Result:=@fdhashtbl[ix and fdhash];
|
|
end;
|
|
|
|
|
|
end.
|
|
|