Implement waiting for process, CE add command cancelation, rctx many cpus
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m27s

This commit is contained in:
2026-03-01 22:59:04 +01:00
parent 858e55118b
commit 9043c4f9ec
18 changed files with 308 additions and 89 deletions

View File

@@ -105,12 +105,17 @@ DEFINE_SYSCALL (sys_clone) {
}
/* void* argument_ptr (void) */
DEFINE_SYSCALL (sys_argument_ptr) { return proc->uvaddr_argument; }
DEFINE_SYSCALL (sys_argument_ptr) {
spin_lock (&proc->lock);
uintptr_t p = proc->uvaddr_argument;
spin_unlock (&proc->lock);
return p;
}
/* int sched (void) */
DEFINE_SYSCALL (sys_sched) {
rctx->reschedule = true;
rctx->cpu = thiscpu;
rctx_insert_cpu (rctx, thiscpu);
return SYSRESULT (ST_OK);
}
@@ -121,7 +126,11 @@ DEFINE_SYSCALL (sys_mutex_create) {
if (mutex_resource == NULL)
return SYSRESULT (-ST_OOM_ERROR);
return SYSRESULT (mutex_resource->rid);
spin_lock (&mutex_resource->lock);
int rid = mutex_resource->rid;
spin_unlock (&mutex_resource->lock);
return SYSRESULT (rid);
}
/* int mutex_delete (int mutex_rid) */
@@ -425,7 +434,18 @@ DEFINE_SYSCALL (sys_get_procgroup) {
if (target_proc == NULL)
return SYSRESULT (-ST_NOT_FOUND);
return SYSRESULT (target_proc->procgroup->pgid);
spin_lock (&target_proc->lock);
if (target_proc->state == PROC_DEAD) {
spin_unlock (&target_proc->lock);
return SYSRESULT (-ST_NOT_FOUND);
}
int pgid = target_proc->procgroup->pgid;
spin_unlock (&target_proc->lock);
return SYSRESULT (pgid);
}
/* int read_dir_entry (char* path, struct dir_entry* entry, size_t entry_num) */
@@ -516,7 +536,60 @@ DEFINE_SYSCALL (sys_write_file) {
}
/* int get_exec_pid (void) */
DEFINE_SYSCALL (sys_get_exec_pid) { return SYSRESULT (proc->exec_pid); }
DEFINE_SYSCALL (sys_get_exec_pid) {
spin_lock (&proc->lock);
int exec_pid = proc->exec_pid;
spin_unlock (&proc->lock);
return SYSRESULT (exec_pid);
}
/* wait_for_pid (int pid) */
DEFINE_SYSCALL (sys_wait_for_pid) {
int pid = (int)a1;
struct proc* wait_proc = proc_find_pid (pid);
if (wait_proc == NULL)
return SYSRESULT (-ST_NOT_FOUND);
spin_lock (&wait_proc->lock);
if (wait_proc->state == PROC_DEAD) {
spin_unlock (&wait_proc->lock);
return SYSRESULT (-ST_NOT_FOUND);
}
spin_unlock (&wait_proc->lock);
proc_wait_for (proc, rctx, wait_proc);
return SYSRESULT (ST_OK);
}
/* int kill (int pid) */
DEFINE_SYSCALL (sys_kill) {
int pid = (int)a1;
struct proc* target_proc = proc_find_pid (pid);
if (target_proc == NULL)
return SYSRESULT (-ST_NOT_FOUND);
spin_lock (&target_proc->lock);
if (target_proc->state == PROC_DEAD) {
spin_unlock (&target_proc->lock);
return SYSRESULT (-ST_NOT_FOUND);
}
spin_unlock (&target_proc->lock);
proc_kill (target_proc, rctx);
return ST_OK;
}
static syscall_handler_func_t handler_table[] = {
[SYS_QUIT] = &sys_quit,
@@ -543,6 +616,8 @@ static syscall_handler_func_t handler_table[] = {
[SYS_READ_DIR_ENTRY] = &sys_read_dir_entry,
[SYS_CREATE_FILE] = &sys_create_file,
[SYS_WRITE_FILE] = &sys_write_file,
[SYS_WAIT_FOR_PID] = &sys_wait_for_pid,
[SYS_KILL] = &sys_kill,
};
syscall_handler_func_t syscall_find_handler (int syscall_num) {