mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
325e173d22
commit
8220721563
|
@ -87,7 +87,6 @@ function fdesc_allocvp(ftype:fdntype;fd_fd,ix:Integer;mp:p_mount;vpp:pp_vnode):
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
sysutils,
|
|
||||||
errno,
|
errno,
|
||||||
time,
|
time,
|
||||||
vfile,
|
vfile,
|
||||||
|
@ -192,7 +191,9 @@ loop:
|
||||||
VI_LOCK(vp);
|
VI_LOCK(vp);
|
||||||
mtx_unlock(fdesc_hashmtx);
|
mtx_unlock(fdesc_hashmtx);
|
||||||
if (vget(vp, LK_EXCLUSIVE or LK_INTERLOCK)<>0) then
|
if (vget(vp, LK_EXCLUSIVE or LK_INTERLOCK)<>0) then
|
||||||
|
begin
|
||||||
goto loop;
|
goto loop;
|
||||||
|
end;
|
||||||
vpp^:=vp;
|
vpp^:=vp;
|
||||||
Exit(0);
|
Exit(0);
|
||||||
end;
|
end;
|
||||||
|
@ -259,7 +260,9 @@ loop:
|
||||||
vput(vp);
|
vput(vp);
|
||||||
{ If we didn't get it, return no vnode. }
|
{ If we didn't get it, return no vnode. }
|
||||||
if (error<>0) then
|
if (error<>0) then
|
||||||
|
begin
|
||||||
vp2:=nil;
|
vp2:=nil;
|
||||||
|
end;
|
||||||
vpp^:=vp2;
|
vpp^:=vp2;
|
||||||
Exit(error);
|
Exit(error);
|
||||||
end;
|
end;
|
||||||
|
@ -348,7 +351,9 @@ begin
|
||||||
}
|
}
|
||||||
error:=fget(fd, 0, @fp);
|
error:=fget(fd, 0, @fp);
|
||||||
if (error<>0) then
|
if (error<>0) then
|
||||||
|
begin
|
||||||
goto bad;
|
goto bad;
|
||||||
|
end;
|
||||||
|
|
||||||
{ Check if we're looking up ourselves. }
|
{ Check if we're looking up ourselves. }
|
||||||
if (VTOFDESC(dvp)^.fd_ix=FD_DESC + fd) then
|
if (VTOFDESC(dvp)^.fd_ix=FD_DESC + fd) then
|
||||||
|
@ -387,7 +392,9 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (error<>0) then
|
if (error<>0) then
|
||||||
|
begin
|
||||||
goto bad;
|
goto bad;
|
||||||
|
end;
|
||||||
vpp^:=fvp;
|
vpp^:=fvp;
|
||||||
Exit(0);
|
Exit(0);
|
||||||
|
|
||||||
|
@ -483,7 +490,9 @@ begin
|
||||||
* Can't mess with the root vnode
|
* Can't mess with the root vnode
|
||||||
}
|
}
|
||||||
if (VTOFDESC(ap^.a_vp)^.fd_type=_Froot) then
|
if (VTOFDESC(ap^.a_vp)^.fd_type=_Froot) then
|
||||||
|
begin
|
||||||
Exit(EACCES);
|
Exit(EACCES);
|
||||||
|
end;
|
||||||
|
|
||||||
fd:=VTOFDESC(ap^.a_vp)^.fd_fd;
|
fd:=VTOFDESC(ap^.a_vp)^.fd_fd;
|
||||||
|
|
||||||
|
@ -539,7 +548,9 @@ begin
|
||||||
dp:=@d;
|
dp:=@d;
|
||||||
|
|
||||||
if (VTOFDESC(ap^.a_vp)^.fd_type<>_Froot) then
|
if (VTOFDESC(ap^.a_vp)^.fd_type<>_Froot) then
|
||||||
|
begin
|
||||||
Assert(False,'fdesc_readdir: not dir');
|
Assert(False,'fdesc_readdir: not dir');
|
||||||
|
end;
|
||||||
|
|
||||||
if (ap^.a_ncookies<>nil) then
|
if (ap^.a_ncookies<>nil) then
|
||||||
ap^.a_ncookies^:=0;
|
ap^.a_ncookies^:=0;
|
||||||
|
@ -550,7 +561,10 @@ begin
|
||||||
(off < 0) or
|
(off < 0) or
|
||||||
((off mod UIO_MX)<>0) or
|
((off mod UIO_MX)<>0) or
|
||||||
(uio^.uio_resid < UIO_MX) then
|
(uio^.uio_resid < UIO_MX) then
|
||||||
|
begin
|
||||||
Exit(EINVAL);
|
Exit(EINVAL);
|
||||||
|
end;
|
||||||
|
|
||||||
i:=off div UIO_MX;
|
i:=off div UIO_MX;
|
||||||
|
|
||||||
error:=0;
|
error:=0;
|
||||||
|
@ -577,10 +591,12 @@ begin
|
||||||
begin
|
begin
|
||||||
tmp:=fget_unlocked(fcnt); //check exists
|
tmp:=fget_unlocked(fcnt); //check exists
|
||||||
if (tmp=nil) then
|
if (tmp=nil) then
|
||||||
|
begin
|
||||||
goto _break;
|
goto _break;
|
||||||
|
end;
|
||||||
fdrop(tmp);
|
fdrop(tmp);
|
||||||
|
|
||||||
dp^.d_name :=IntToStr(fcnt);
|
Str(fcnt,dp^.d_name);
|
||||||
dp^.d_namlen:=strlen(dp^.d_name);
|
dp^.d_namlen:=strlen(dp^.d_name);
|
||||||
dp^.d_reclen:=UIO_MX;
|
dp^.d_reclen:=UIO_MX;
|
||||||
dp^.d_type :=DT_CHR;
|
dp^.d_type :=DT_CHR;
|
||||||
|
@ -597,7 +613,9 @@ begin
|
||||||
FILEDESC_SUNLOCK(@fd_table);
|
FILEDESC_SUNLOCK(@fd_table);
|
||||||
error:=uiomove(dp, UIO_MX, uio);
|
error:=uiomove(dp, UIO_MX, uio);
|
||||||
if (error<>0) then
|
if (error<>0) then
|
||||||
|
begin
|
||||||
goto done;
|
goto done;
|
||||||
|
end;
|
||||||
FILEDESC_SLOCK(@fd_table);
|
FILEDESC_SLOCK(@fd_table);
|
||||||
end;
|
end;
|
||||||
Inc(i);
|
Inc(i);
|
||||||
|
|
|
@ -24,7 +24,8 @@ uses
|
||||||
vcapability,
|
vcapability,
|
||||||
vselinfo,
|
vselinfo,
|
||||||
vpoll,
|
vpoll,
|
||||||
vstat;
|
vstat,
|
||||||
|
trap;
|
||||||
|
|
||||||
//TASKQUEUE_DEFINE_THREAD(kqueue);
|
//TASKQUEUE_DEFINE_THREAD(kqueue);
|
||||||
|
|
||||||
|
@ -119,7 +120,9 @@ uses
|
||||||
vsys_generic,
|
vsys_generic,
|
||||||
kern_proc,
|
kern_proc,
|
||||||
kern_callout,
|
kern_callout,
|
||||||
kern_timeout;
|
kern_timeout,
|
||||||
|
kern_named_id,
|
||||||
|
kern_namedobj;
|
||||||
|
|
||||||
//static MALLOC_DEFINE(M_KQUEUE, 'kqueue', 'memory for kqueue system');
|
//static MALLOC_DEFINE(M_KQUEUE, 'kqueue', 'memory for kqueue system');
|
||||||
|
|
||||||
|
@ -974,9 +977,11 @@ function kern_kevent(fd:Integer;
|
||||||
label
|
label
|
||||||
done_norel,
|
done_norel,
|
||||||
done;
|
done;
|
||||||
|
type
|
||||||
|
t_keva=array[0..KQ_NEVENTS-1] of t_kevent;
|
||||||
var
|
var
|
||||||
td:p_kthread;
|
td:p_kthread;
|
||||||
keva:array[0..KQ_NEVENTS-1] of t_kevent;
|
keva:t_keva;
|
||||||
kevp,changes:p_kevent;
|
kevp,changes:p_kevent;
|
||||||
kq:p_kqueue;
|
kq:p_kqueue;
|
||||||
fp:p_file;
|
fp:p_file;
|
||||||
|
@ -991,7 +996,20 @@ begin
|
||||||
error:=kqueue_acquire(fp, @kq);
|
error:=kqueue_acquire(fp, @kq);
|
||||||
if (error<>0) then goto done_norel;
|
if (error<>0) then goto done_norel;
|
||||||
|
|
||||||
|
//cache
|
||||||
|
if (kq^.kq_name[0]=#0) and (kq^.kq_name[1]<>#1) then
|
||||||
|
begin
|
||||||
|
get_obj_name(Pointer(fd),$107,@kq^.kq_name);
|
||||||
|
if (kq^.kq_name[0]=#0) then
|
||||||
|
begin
|
||||||
|
kq^.kq_name[1]:=#1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Writeln('kern_kevent:',kq^.kq_name);
|
||||||
|
|
||||||
nerrors:=0;
|
nerrors:=0;
|
||||||
|
keva:=Default(t_keva);
|
||||||
|
|
||||||
while (nchanges > 0) do
|
while (nchanges > 0) do
|
||||||
begin
|
begin
|
||||||
|
@ -1026,6 +1044,7 @@ begin
|
||||||
end;
|
end;
|
||||||
Dec(nchanges,n);
|
Dec(nchanges,n);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (nerrors<>0) then
|
if (nerrors<>0) then
|
||||||
begin
|
begin
|
||||||
td^.td_retval[0]:=nerrors;
|
td^.td_retval[0]:=nerrors;
|
||||||
|
@ -1147,9 +1166,13 @@ begin
|
||||||
|
|
||||||
if (sysfilt_ops[not filt].fop=nil) then
|
if (sysfilt_ops[not filt].fop=nil) then
|
||||||
begin
|
begin
|
||||||
Writeln(stderr,'kqueue_fo_find:',filt);
|
Writeln(stderr,'kqueue filterops not found:',EVFILT_NAME(filt));
|
||||||
sysfilt_ops[not filt].fop:=@null_filtops;
|
sysfilt_ops[not filt].fop:=@null_filtops;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
Writeln('kqueue_fo_find:',EVFILT_NAME(filt));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
mtx_unlock(filterops_lock);
|
mtx_unlock(filterops_lock);
|
||||||
|
|
||||||
Exit(sysfilt_ops[not filt].fop);
|
Exit(sysfilt_ops[not filt].fop);
|
||||||
|
@ -1270,7 +1293,9 @@ findkn:
|
||||||
begin
|
begin
|
||||||
if (kev^.ident=kn^.kn_id) and
|
if (kev^.ident=kn^.kn_id) and
|
||||||
(kev^.filter=kn^.kn_filter) then
|
(kev^.filter=kn^.kn_filter) then
|
||||||
|
begin
|
||||||
break;
|
break;
|
||||||
|
end;
|
||||||
kn:=SLIST_NEXT(kn,@kn^.kn_link);
|
kn:=SLIST_NEXT(kn,@kn^.kn_link);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -1296,7 +1321,7 @@ findkn:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{
|
{
|
||||||
* kn now contains the matching knote, or nil if no match
|
* kn now contains the matching knote, or null if no match
|
||||||
}
|
}
|
||||||
if (kn=nil) then
|
if (kn=nil) then
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -55,6 +55,7 @@ end;
|
||||||
Procedure id_release(d:p_id_desc);
|
Procedure id_release(d:p_id_desc);
|
||||||
begin
|
begin
|
||||||
if (d=nil) then Exit;
|
if (d=nil) then Exit;
|
||||||
|
Assert(d^.refs>0);
|
||||||
if (System.InterlockedDecrement(d^.refs)=0) then
|
if (System.InterlockedDecrement(d^.refs)=0) then
|
||||||
if (d^.free<>nil) then
|
if (d^.free<>nil) then
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -6,11 +6,13 @@ unit kern_namedobj;
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
mqueue,
|
||||||
kern_named_id;
|
kern_named_id;
|
||||||
|
|
||||||
type
|
type
|
||||||
p_namedobj=^t_namedobj;
|
p_namedobj=^t_namedobj;
|
||||||
t_namedobj=packed object(t_id_named_desc)
|
t_namedobj=packed object(t_id_named_desc)
|
||||||
|
link:TAILQ_ENTRY;
|
||||||
objp:Pointer;
|
objp:Pointer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -19,6 +21,8 @@ var
|
||||||
|
|
||||||
procedure named_table_init; //SYSINIT
|
procedure named_table_init; //SYSINIT
|
||||||
|
|
||||||
|
function get_obj_name(objp:Pointer;objt:Integer;name:PChar):Boolean;
|
||||||
|
|
||||||
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
||||||
function sys_namedobj_delete(id,objt:Integer):Integer;
|
function sys_namedobj_delete(id,objt:Integer):Integer;
|
||||||
|
|
||||||
|
@ -31,18 +35,66 @@ implementation
|
||||||
uses
|
uses
|
||||||
errno,
|
errno,
|
||||||
systm,
|
systm,
|
||||||
kern_thr;
|
kern_thr,
|
||||||
|
kern_rwlock;
|
||||||
|
|
||||||
|
var
|
||||||
|
namedobj_list:TAILQ_HEAD=(tqh_first:nil;tqh_last:@namedobj_list.tqh_first);
|
||||||
|
namedobj_lock:Pointer;
|
||||||
|
|
||||||
procedure named_table_init;
|
procedure named_table_init;
|
||||||
begin
|
begin
|
||||||
id_table_init(@named_table,1);
|
id_table_init(@named_table,1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure namedobj_add(data:p_namedobj);
|
||||||
|
begin
|
||||||
|
rw_wlock(namedobj_lock);
|
||||||
|
TAILQ_INSERT_TAIL(@namedobj_list,data,@data^.link);
|
||||||
|
rw_wunlock(namedobj_lock);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure namedobj_rem(data:p_namedobj);
|
||||||
|
begin
|
||||||
|
rw_wlock(namedobj_lock);
|
||||||
|
TAILQ_REMOVE(@namedobj_list,data,@data^.link);
|
||||||
|
rw_wunlock(namedobj_lock);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure namedobj_free(data:pointer);
|
procedure namedobj_free(data:pointer);
|
||||||
begin
|
begin
|
||||||
|
namedobj_rem(data);
|
||||||
FreeMem(data);
|
FreeMem(data);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function get_obj_name(objp:Pointer;objt:Integer;name:PChar):Boolean;
|
||||||
|
var
|
||||||
|
entry:p_namedobj;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
objt:=Word(objt) or NAMED_OBJT;
|
||||||
|
|
||||||
|
rw_rlock(namedobj_lock);
|
||||||
|
|
||||||
|
entry:=TAILQ_FIRST(@namedobj_list);
|
||||||
|
while (entry<>nil) do
|
||||||
|
begin
|
||||||
|
if (entry^.objp=objp) and
|
||||||
|
(entry^.objt=objt) then
|
||||||
|
begin
|
||||||
|
Result:=True;
|
||||||
|
|
||||||
|
copystr(entry^.name,name,SizeOf(entry^.name),nil);
|
||||||
|
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
entry:=TAILQ_NEXT(entry,@entry^.link);
|
||||||
|
end;
|
||||||
|
|
||||||
|
rw_runlock(namedobj_lock);
|
||||||
|
end;
|
||||||
|
|
||||||
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
||||||
var
|
var
|
||||||
td:p_kthread;
|
td:p_kthread;
|
||||||
|
@ -68,11 +120,14 @@ begin
|
||||||
obj^.name:=name;
|
obj^.name:=name;
|
||||||
obj^.objp:=objp;
|
obj^.objp:=objp;
|
||||||
|
|
||||||
|
namedobj_add(obj);
|
||||||
|
|
||||||
if not id_name_new(@named_table,obj,@key) then
|
if not id_name_new(@named_table,obj,@key) then
|
||||||
begin
|
begin
|
||||||
namedobj_free(obj);
|
namedobj_free(obj);
|
||||||
Exit(EAGAIN);
|
Exit(EAGAIN);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
id_release(obj);
|
id_release(obj);
|
||||||
|
|
||||||
td^.td_retval[0]:=key;
|
td^.td_retval[0]:=key;
|
||||||
|
|
|
@ -355,6 +355,16 @@ begin
|
||||||
ipi_sigreturn; //switch
|
ipi_sigreturn; //switch
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure thread0_param(td:p_kthread);
|
||||||
|
begin
|
||||||
|
td^.td_base_user_pri:=700;
|
||||||
|
td^.td_lend_user_pri:=1023;
|
||||||
|
td^.td_base_pri :=68;
|
||||||
|
td^.td_priority :=68;
|
||||||
|
td^.td_pri_class :=10;
|
||||||
|
td^.td_user_pri :=700;
|
||||||
|
end;
|
||||||
|
|
||||||
function create_thread(td :p_kthread; //calling thread
|
function create_thread(td :p_kthread; //calling thread
|
||||||
ctx :p_mcontext_t;
|
ctx :p_mcontext_t;
|
||||||
start_func:Pointer;
|
start_func:Pointer;
|
||||||
|
@ -432,6 +442,8 @@ begin
|
||||||
newtd:=thread_alloc;
|
newtd:=thread_alloc;
|
||||||
if (newtd=nil) then Exit(ENOMEM);
|
if (newtd=nil) then Exit(ENOMEM);
|
||||||
|
|
||||||
|
thread0_param(newtd);
|
||||||
|
|
||||||
//user stack
|
//user stack
|
||||||
newtd^.td_ustack.stack:=stack_base+stack_size;
|
newtd^.td_ustack.stack:=stack_base+stack_size;
|
||||||
newtd^.td_ustack.sttop:=stack_base;
|
newtd^.td_ustack.sttop:=stack_base;
|
||||||
|
@ -563,6 +575,8 @@ begin
|
||||||
newtd:=thread_alloc;
|
newtd:=thread_alloc;
|
||||||
if (newtd=nil) then Exit(ENOMEM);
|
if (newtd=nil) then Exit(ENOMEM);
|
||||||
|
|
||||||
|
thread0_param(newtd);
|
||||||
|
|
||||||
stack.ss_sp :=newtd^.td_kstack.sttop;
|
stack.ss_sp :=newtd^.td_kstack.sttop;
|
||||||
stack.ss_size:=(ptruint(newtd^.td_kstack.stack)-ptruint(newtd^.td_kstack.sttop));
|
stack.ss_size:=(ptruint(newtd^.td_kstack.stack)-ptruint(newtd^.td_kstack.sttop));
|
||||||
|
|
||||||
|
|
|
@ -228,6 +228,7 @@ type
|
||||||
{$IF sizeof(t_kevent_copyops)<>24}{$STOP sizeof(t_kevent_copyops)<>24}{$ENDIF}
|
{$IF sizeof(t_kevent_copyops)<>24}{$STOP sizeof(t_kevent_copyops)<>24}{$ENDIF}
|
||||||
|
|
||||||
procedure EV_SET(kevp:p_kevent;a:PtrUint;b:SmallInt;c:Word;d:DWORD;e:Ptrint;f:Pointer);
|
procedure EV_SET(kevp:p_kevent;a:PtrUint;b:SmallInt;c:Word;d:DWORD;e:Ptrint;f:Pointer);
|
||||||
|
function EVFILT_NAME(i:Integer):RawByteString;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
@ -241,6 +242,36 @@ begin
|
||||||
(kevp)^.udata :=(f);
|
(kevp)^.udata :=(f);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function EVFILT_NAME(i:Integer):RawByteString;
|
||||||
|
begin
|
||||||
|
Result:='';
|
||||||
|
case i of
|
||||||
|
EVFILT_READ :Result:='EVFILT_READ';
|
||||||
|
EVFILT_WRITE :Result:='EVFILT_WRITE';
|
||||||
|
EVFILT_AIO :Result:='EVFILT_AIO';
|
||||||
|
EVFILT_VNODE :Result:='EVFILT_VNODE';
|
||||||
|
EVFILT_PROC :Result:='EVFILT_PROC';
|
||||||
|
EVFILT_SIGNAL :Result:='EVFILT_SIGNAL';
|
||||||
|
EVFILT_TIMER :Result:='EVFILT_TIMER';
|
||||||
|
EVFILT_FS :Result:='EVFILT_FS';
|
||||||
|
EVFILT_LIO :Result:='EVFILT_LIO';
|
||||||
|
EVFILT_USER :Result:='EVFILT_USER';
|
||||||
|
EVFILT_POLLING :Result:='EVFILT_POLLING';
|
||||||
|
EVFILT_DISPLAY :Result:='EVFILT_DISPLAY';
|
||||||
|
EVFILT_GRAPHICS_CORE :Result:='EVFILT_GRAPHICS_CORE';
|
||||||
|
EVFILT_HRTIMER :Result:='EVFILT_HRTIMER';
|
||||||
|
EVFILT_UVD_TRAP :Result:='EVFILT_UVD_TRAP';
|
||||||
|
EVFILT_VCE_TRAP :Result:='EVFILT_VCE_TRAP';
|
||||||
|
EVFILT_SDMA_TRAP :Result:='EVFILT_SDMA_TRAP';
|
||||||
|
EVFILT_REG_EV :Result:='EVFILT_REG_EV';
|
||||||
|
EVFILT_GPU_EXCEPTION :Result:='EVFILT_GPU_EXCEPTION';
|
||||||
|
EVFILT_GPU_SYSTEM_EXCEPTION:Result:='EVFILT_GPU_SYSTEM_EXCEPTION';
|
||||||
|
EVFILT_GPU_DBGGC_EV :Result:='EVFILT_GPU_DBGGC_EV';
|
||||||
|
EVFILT_CPUMODE :Result:='EVFILT_CPUMODE';
|
||||||
|
else
|
||||||
|
Str(i,Result);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
|
@ -1189,6 +1189,7 @@ begin
|
||||||
fp:=AllocMem(SizeOf(t_file));
|
fp:=AllocMem(SizeOf(t_file));
|
||||||
if (fp=nil) then Exit(ENOMEM);
|
if (fp=nil) then Exit(ENOMEM);
|
||||||
|
|
||||||
|
fp^.desc.refs:=1;
|
||||||
fp^.desc.free:=@_fdrop;
|
fp^.desc.free:=@_fdrop;
|
||||||
fp^.f_ops :=@badfileops;
|
fp^.f_ops :=@badfileops;
|
||||||
fp^.f_data :=nil;
|
fp^.f_data :=nil;
|
||||||
|
|
|
@ -913,6 +913,7 @@ begin
|
||||||
|
|
||||||
Exit(error);
|
Exit(error);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
td^.td_dupfd:=0;
|
td^.td_dupfd:=0;
|
||||||
vfslocked:=NDHASGIANT(@nd);
|
vfslocked:=NDHASGIANT(@nd);
|
||||||
NDFREE(@nd, NDF_ONLY_PNBUF);
|
NDFREE(@nd, NDF_ONLY_PNBUF);
|
||||||
|
@ -1006,8 +1007,10 @@ success:
|
||||||
fdrop(fp);
|
fdrop(fp);
|
||||||
td^.td_retval[0]:=indx;
|
td^.td_retval[0]:=indx;
|
||||||
Exit(0);
|
Exit(0);
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
VFS_UNLOCK_GIANT(vfslocked);
|
VFS_UNLOCK_GIANT(vfslocked);
|
||||||
|
|
||||||
bad_unlocked:
|
bad_unlocked:
|
||||||
if (indx<>-1) then
|
if (indx<>-1) then
|
||||||
begin
|
begin
|
||||||
|
|
Loading…
Reference in New Issue