VFS object auto cleanup
This commit is contained in:
@ -194,6 +194,13 @@ void proc_reaper(void) {
|
|||||||
|
|
||||||
LL_REMOVE(PROCS.procs, zombie);
|
LL_REMOVE(PROCS.procs, zombie);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < zombie->vobjcnt; i++) {
|
||||||
|
if (zombie->vobjs[i] != NULL) {
|
||||||
|
vfs_close(zombie->vobjs[i]);
|
||||||
|
zombie->vobjs[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pmm_free((uintptr_t)(zombie->platformdata.kstack - PROC_STACKSIZE), PROC_STACKBLOCKS);
|
pmm_free((uintptr_t)(zombie->platformdata.kstack - PROC_STACKSIZE), PROC_STACKBLOCKS);
|
||||||
|
|
||||||
if (!zombie->kern) {
|
if (!zombie->kern) {
|
||||||
|
@ -55,6 +55,11 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
spinlock_release(&PROCS.spinlock);
|
spinlock_release(&PROCS.spinlock);
|
||||||
} break;
|
} break;
|
||||||
case IOCTL_CLOSEF: {
|
case IOCTL_CLOSEF: {
|
||||||
|
if (ioh >= PROC_VFSHANDLES_MAX) {
|
||||||
|
ret = E_INVALIDARGUMENT;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
spinlock_acquire(&PROCS.spinlock);
|
spinlock_acquire(&PROCS.spinlock);
|
||||||
Proc *proc = PROCS.current;
|
Proc *proc = PROCS.current;
|
||||||
VfsObj *vobj = proc->vobjs[ioh];
|
VfsObj *vobj = proc->vobjs[ioh];
|
||||||
@ -65,7 +70,15 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
for (; i < PROC_VFSHANDLES_MAX; i++) {
|
||||||
|
if (proc->vobjs[i] == vobj) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
vfs_close(vobj);
|
vfs_close(vobj);
|
||||||
|
proc->vobjs[i] = NULL;
|
||||||
ret = E_OK;
|
ret = E_OK;
|
||||||
} break;
|
} break;
|
||||||
case IOCTL_WRITE: {
|
case IOCTL_WRITE: {
|
||||||
|
Reference in New Issue
Block a user