This commit is contained in:
red-prig 2023-06-24 20:42:50 +03:00
parent 694f9c4f47
commit f8b9f12982
8 changed files with 93 additions and 28 deletions

View File

@ -92,6 +92,7 @@ procedure KNOTE_UNLOCKED(list:p_knlist;hint:QWORD);
function M_KNLIST_EMPTY(list:p_knlist):Boolean;
function sys_kqueue():Integer;
function sys_kqueueex(name:PChar):Integer;
function sys_kevent(fd:Integer;
changelist:Pointer;
nchanges:Integer;
@ -753,21 +754,17 @@ begin
end;
end;
function sys_kqueue():Integer;
label
done2;
function kern_kqueue(pfd:PInteger;name:PAnsiChar):Integer;
var
td:p_kthread;
kq:p_kqueue;
fp:p_file;
fd,error:Integer;
begin
td:=curkthread;
if (td=nil) then Exit(-1);
Result:=0;
//fdp:=td^.td_proc^.p_fd;
error:=falloc(@fp, @fd, 0);
if (error<>0) then goto done2;
if (error<>0) then Exit(error);
{ An extra reference on `nfp' has been held for us by falloc(). }
kq:=AllocMem(SizeOf(t_kqueue));
@ -778,6 +775,11 @@ begin
knlist_init_mtx(@kq^.kq_sel.si_note, @kq^.kq_lock);
//TASK_INIT(@kq^.kq_task, 0, kqueue_task, kq);
if (name<>nil) then
begin
kq^.kq_name:=name;
end;
FILEDESC_XLOCK(@fd_table);
TAILQ_INSERT_HEAD(@fd_table.fd_kqlist, kq, @kq^.kq_list);
FILEDESC_XUNLOCK(@fd_table);
@ -785,11 +787,49 @@ begin
finit(fp, FREAD or FWRITE, DTYPE_KQUEUE, kq, @kqueueops);
fdrop(fp);
td^.td_retval[0]:=fd;
done2:
pfd^:=fd;
Exit(error);
end;
function sys_kqueue():Integer;
var
td:p_kthread;
fd:Integer;
begin
td:=curkthread;
if (td=nil) then Exit(-1);
Result:=kern_kqueue(@fd,nil);
if (Result=0) then
begin
td^.td_retval[0]:=fd;
end;
end;
function sys_kqueueex(name:PChar):Integer;
var
td:p_kthread;
fd:Integer;
_name:t_kq_name;
begin
td:=curkthread;
if (td=nil) then Exit(-1);
_name:=Default(t_kq_name);
Result:=copyinstr(name,@_name,SizeOf(t_kq_name),nil);
if (Result<>0) then Exit;
Result:=kern_kqueue(@fd,@_name);
if (Result=0) then
begin
td^.td_retval[0]:=fd;
end;
end;
type
p_kevent_args=^t_kevent_args;
t_kevent_args=record

View File

@ -49,8 +49,7 @@ const
type
p_evf=^t_evf;
t_evf=packed record
desc :t_id_named_desc;
t_evf=packed object(t_id_named_desc)
bitPattern:QWORD;
mtx :mtx;
cv :t_cv;
@ -82,8 +81,8 @@ end;
function evf_init(evf:p_evf;attr:DWORD;initPattern:QWORD):Integer;
begin
evf^.desc.desc.free:=@evf_free;
evf^.desc.objt:=EVF_OBJT;
evf^.desc.free:=@evf_free;
evf^.objt:=EVF_OBJT;
evf^.bitPattern:=initPattern;
mtx_init(evf^.mtx,'evf mtx');
cv_init(@evf^.cv,'evf cv');
@ -558,7 +557,7 @@ begin
if (evf=nil) then Exit(ENOMEM); //EAGAIN
evf_init(evf,attr,initPattern);
evf^.desc.name:=_name;
evf^.name:=_name;
if not id_name_new(@named_table,evf,@key) then
begin

View File

@ -12,7 +12,7 @@ type
t_id_name=array[0..31] of AnsiChar;
p_id_named_desc=^t_id_named_desc;
t_id_named_desc=packed record
t_id_named_desc=packed object
desc:t_id_desc;
objt:Integer;
name:t_id_name;

View File

@ -10,8 +10,7 @@ uses
type
p_namedobj=^t_namedobj;
t_namedobj=packed record
desc:t_id_named_desc;
t_namedobj=packed object(t_id_named_desc)
objp:Pointer;
end;
@ -63,9 +62,9 @@ begin
obj:=AllocMem(SizeOf(t_namedobj));
if (obj=nil) then Exit(ENOMEM);
obj^.desc.desc.free:=@namedobj_free;
obj^.desc.objt:=Word(objt) or NAMED_OBJT;
obj^.desc.name:=name;
obj^.desc.free:=@namedobj_free;
obj^.objt:=Word(objt) or NAMED_OBJT;
obj^.name:=name;
obj^.objp:=objp;
if not id_name_new(@named_table,obj,@key) then

View File

@ -38,8 +38,7 @@ const
type
p_osem=^t_osem;
t_osem=packed record
desc :t_id_named_desc;
t_osem=packed object(t_id_named_desc)
mtx :mtx;
cv :t_cv;
_align :Integer;
@ -72,8 +71,8 @@ end;
function osem_init(sem:p_osem;attr:DWORD;initCount,max_count:Integer):Integer;
begin
sem^.desc.desc.free:=@osem_free;
sem^.desc.objt :=SEMA_OBJT;
sem^.desc.free :=@osem_free;
sem^.objt :=SEMA_OBJT;
sem^.count :=initCount;
sem^.init_count:=initCount;
sem^.max_count :=max_count;
@ -410,7 +409,7 @@ begin
if (sem=nil) then Exit(ENOMEM); //EAGAIN
osem_init(sem,attr,initCount,maxCount);
sem^.desc.name:=_name;
sem^.name:=_name;
if not id_name_new(@named_table,@sem^.desc,@key) then
begin

View File

@ -25,6 +25,8 @@ const
KQ_TASKDRAIN=$40; // waiting for task to drain
type
t_kq_name=array[0..31] of AnsiChar;
pp_kqueue=^p_kqueue;
p_kqueue=^t_kqueue;
t_kqueue=record
@ -42,6 +44,7 @@ type
kq_knhashmask:QWORD; // size of knhash
kq_knhash :p_klist; // hash table for knotes
//kq_task:task;
kq_name :t_kq_name;
end;

View File

@ -74,6 +74,7 @@ function mkdir(path:PChar;mode:Integer):Integer;
function rmdir(path:PChar):Integer;
function utimes(path:PChar;tptr:Pointer):Integer;
function adjtime(delta,olddelta:Pointer):Integer;
function kqueueex(name:PChar):Integer;
function setsid():Integer;
function sysarch(op:Integer;parms:Pointer):Integer;
function rtprio(func,pid:Integer;rtp:Pointer):Integer;
@ -122,6 +123,8 @@ Function sigtimedwait(oset,info,timeout:Pointer):Integer;
Function sigwaitinfo(oset,info:Pointer):Integer;
function getresuid(ruid,euid,suid:PInteger):Integer;
function getresgid(rgid,egid,sgid:PInteger):Integer;
function kqueue():Integer;
function kevent(fd:Integer;changelist:Pointer;nchanges:Integer;eventlist:Pointer;nevents:Integer;timeout:Pointer):Integer;
function nmount(iovp:Pointer;iovcnt:DWORD;flags:QWORD):Integer;
function lchflags(path:PChar;flags:Integer):Integer;
function uuidgen(store:Pointer;count:Integer):Integer;
@ -676,6 +679,13 @@ asm
jmp cerror
end;
function kqueueex(name:PChar):Integer; assembler; nostackframe;
asm
movq $141,%rax
call fast_syscall
jmp cerror
end;
function setsid():Integer; assembler; nostackframe;
asm
movq $147,%rax
@ -1012,6 +1022,20 @@ asm
jmp cerror
end;
function kqueue():Integer; assembler; nostackframe;
asm
movq $362,%rax
call fast_syscall
jmp cerror
end;
function kevent(fd:Integer;changelist:Pointer;nchanges:Integer;eventlist:Pointer;nevents:Integer;timeout:Pointer):Integer; assembler; nostackframe;
asm
movq $363,%rax
call fast_syscall
jmp cerror
end;
function nmount(iovp:Pointer;iovcnt:DWORD;flags:QWORD):Integer; assembler; nostackframe;
asm
movq $378,%rax

View File

@ -21,6 +21,7 @@ uses
kern_uuid,
vfs_cache,
vfs_mount,
kern_event,
kern_synch,
kern_cpuset,
kern_ksched,
@ -754,7 +755,7 @@ const
),
(//[141]
sy_narg:1;
sy_call:nil;
sy_call:@sys_kqueueex;
sy_name:'sys_kqueueex'
),
(//[142]
@ -1859,12 +1860,12 @@ const
),
(//[362]
sy_narg:0;
sy_call:nil;
sy_call:@sys_kqueue;
sy_name:'sys_kqueue'
),
(//[363]
sy_narg:6;
sy_call:nil;
sy_call:@sys_kevent;
sy_name:'sys_kevent'
),
(//[364]