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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -74,6 +74,7 @@ function mkdir(path:PChar;mode:Integer):Integer;
function rmdir(path:PChar):Integer; function rmdir(path:PChar):Integer;
function utimes(path:PChar;tptr:Pointer):Integer; function utimes(path:PChar;tptr:Pointer):Integer;
function adjtime(delta,olddelta:Pointer):Integer; function adjtime(delta,olddelta:Pointer):Integer;
function kqueueex(name:PChar):Integer;
function setsid():Integer; function setsid():Integer;
function sysarch(op:Integer;parms:Pointer):Integer; function sysarch(op:Integer;parms:Pointer):Integer;
function rtprio(func,pid:Integer;rtp: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 sigwaitinfo(oset,info:Pointer):Integer;
function getresuid(ruid,euid,suid:PInteger):Integer; function getresuid(ruid,euid,suid:PInteger):Integer;
function getresgid(rgid,egid,sgid: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 nmount(iovp:Pointer;iovcnt:DWORD;flags:QWORD):Integer;
function lchflags(path:PChar;flags:Integer):Integer; function lchflags(path:PChar;flags:Integer):Integer;
function uuidgen(store:Pointer;count:Integer):Integer; function uuidgen(store:Pointer;count:Integer):Integer;
@ -676,6 +679,13 @@ asm
jmp cerror jmp cerror
end; end;
function kqueueex(name:PChar):Integer; assembler; nostackframe;
asm
movq $141,%rax
call fast_syscall
jmp cerror
end;
function setsid():Integer; assembler; nostackframe; function setsid():Integer; assembler; nostackframe;
asm asm
movq $147,%rax movq $147,%rax
@ -1012,6 +1022,20 @@ asm
jmp cerror jmp cerror
end; 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; function nmount(iovp:Pointer;iovcnt:DWORD;flags:QWORD):Integer; assembler; nostackframe;
asm asm
movq $378,%rax movq $378,%rax

View File

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