Implement waiting for process, CE add command cancelation, rctx many cpus
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m27s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m27s
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user