Compare commits
2 Commits
c31c00e8cd
...
3b18f56376
Author | SHA1 | Date | |
---|---|---|---|
3b18f56376 | |||
b89882e1cf |
@ -194,6 +194,13 @@ void proc_reaper(void) {
|
||||
|
||||
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);
|
||||
|
||||
if (!zombie->kern) {
|
||||
|
@ -43,29 +43,42 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
||||
}
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
|
||||
Proc *proc = PROCS.current;
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
if (proc->vobjcnt < PROC_VFSHANDLES_MAX) {
|
||||
proc->vobjs[proc->vobjcnt++] = vobj;
|
||||
ret = proc->vobjcnt - 1;
|
||||
} else {
|
||||
ret = E_NOMEMORY;
|
||||
}
|
||||
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
} break;
|
||||
case IOCTL_CLOSEF: {
|
||||
if (ioh >= PROC_VFSHANDLES_MAX) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *proc = PROCS.current;
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
|
||||
if (vobj == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
for (; i < PROC_VFSHANDLES_MAX; i++) {
|
||||
if (proc->vobjs[i] == vobj) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
vfs_close(vobj);
|
||||
proc->vobjs[i] = NULL;
|
||||
ret = E_OK;
|
||||
} break;
|
||||
case IOCTL_WRITE: {
|
||||
@ -88,9 +101,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *proc = PROCS.current;
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
|
||||
if (vobj == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
@ -118,9 +132,10 @@ int32_t SYSCALL3(sys_ioctl, ioh1, cmd1, optsptr1) {
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *proc = PROCS.current;
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
VfsObj *vobj = proc->vobjs[ioh];
|
||||
|
||||
if (vobj == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
|
@ -13,14 +13,14 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) {
|
||||
uint64_t cmd = cmd1;
|
||||
int32_t ret = E_OK;
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
|
||||
if (pid == PID_SELF_MAGIC) {
|
||||
pid = PROCS.current->pid;
|
||||
}
|
||||
|
||||
spinlock_acquire(&PROCS.spinlock);
|
||||
Proc *proc = NULL;
|
||||
LL_FINDPROP(PROCS.procs, proc, pid, pid);
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
|
||||
if (proc == NULL) {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
@ -31,15 +31,12 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, optsptr1) {
|
||||
case PCTL_KILL: {
|
||||
proc_kill(proc);
|
||||
ret = E_DOSCHEDULING;
|
||||
goto done;
|
||||
} break;
|
||||
default: {
|
||||
ret = E_INVALIDARGUMENT;
|
||||
goto done;
|
||||
} break;
|
||||
}
|
||||
|
||||
done:
|
||||
spinlock_release(&PROCS.spinlock);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user