FPPS4/sys/vfs/vselect.pas

70 lines
1.4 KiB
Plaintext

unit vselect;
{$mode ObjFPC}{$H+}
{$CALLING SysV_ABI_CDecl}
interface
type
pp_fd_mask=^p_fd_mask;
p_fd_mask=^fd_mask;
fd_mask=QWORD;
{
* Select uses bit masks of file descriptors in longs. These macros
* manipulate such bit fields (the filesystem macros use chars).
* FD_SETSIZE may be defined by the user, but the default here should
* be enough for most uses.
}
const
FD_SETSIZE=1024;
NFDBITS =(sizeof(fd_mask) * 8); { bits per mask }
type
p_fd_set=^t_fd_set;
t_fd_set=packed record
fds_bits:array[0..((FD_SETSIZE + (NFDBITS - 1)) div NFDBITS)-1] of fd_mask;
end;
procedure FD_CLR(n:Integer;p:p_fd_set);
procedure FD_COPY(f,t:p_fd_set);
function FD_ISSET(n:Integer;p:p_fd_set):Boolean;
procedure FD_SET(n:Integer;p:p_fd_set);
procedure FD_ZERO(p:p_fd_set);
implementation
function __fdset_mask(n:Integer):fd_mask; inline;
begin
Result:=fd_mask(1) shl (n mod NFDBITS);
end;
procedure FD_CLR(n:Integer;p:p_fd_set);
begin
p^.fds_bits[n div NFDBITS]:=p^.fds_bits[n div NFDBITS] and (not __fdset_mask(n));
end;
procedure FD_COPY(f,t:p_fd_set);
begin
f^:=t^;
end;
function FD_ISSET(n:Integer;p:p_fd_set):Boolean;
begin
Result:=(p^.fds_bits[n div NFDBITS] and __fdset_mask(n))<>0;
end;
procedure FD_SET(n:Integer;p:p_fd_set);
begin
p^.fds_bits[n div NFDBITS]:=p^.fds_bits[n div NFDBITS] or __fdset_mask(n);
end;
procedure FD_ZERO(p:p_fd_set);
begin
p^:=Default(t_fd_set);
end;
end.