FPPS4/sys/fs/fdescfs/fdescfs.pas

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.