diff --git a/sys/kern/kern_event.pas b/sys/kern/kern_event.pas index dd9e05d2..13513d69 100644 --- a/sys/kern/kern_event.pas +++ b/sys/kern/kern_event.pas @@ -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 diff --git a/sys/kern/kern_evf.pas b/sys/kern/kern_evf.pas index cfc81749..b7e61cf6 100644 --- a/sys/kern/kern_evf.pas +++ b/sys/kern/kern_evf.pas @@ -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 diff --git a/sys/kern/kern_named_id.pas b/sys/kern/kern_named_id.pas index 68ef0048..6c9e1206 100644 --- a/sys/kern/kern_named_id.pas +++ b/sys/kern/kern_named_id.pas @@ -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; diff --git a/sys/kern/kern_namedobj.pas b/sys/kern/kern_namedobj.pas index fadd1119..5457f04f 100644 --- a/sys/kern/kern_namedobj.pas +++ b/sys/kern/kern_namedobj.pas @@ -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 diff --git a/sys/kern/kern_osem.pas b/sys/kern/kern_osem.pas index 1a31b0d5..5230541e 100644 --- a/sys/kern/kern_osem.pas +++ b/sys/kern/kern_osem.pas @@ -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 diff --git a/sys/sys_eventvar.pas b/sys/sys_eventvar.pas index 82eb1bc3..160c424e 100644 --- a/sys/sys_eventvar.pas +++ b/sys/sys_eventvar.pas @@ -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; diff --git a/sys/syscalls.pas b/sys/syscalls.pas index 460cdb19..ca3f6a0c 100644 --- a/sys/syscalls.pas +++ b/sys/syscalls.pas @@ -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 diff --git a/sys/sysent.pas b/sys/sysent.pas index e5a7bc12..fe6ac750 100644 --- a/sys/sysent.pas +++ b/sys/sysent.pas @@ -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]