diff options
Diffstat (limited to 'src/kernel/proc')
| -rw-r--r-- | src/kernel/proc/proc.cc | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/kernel/proc/proc.cc b/src/kernel/proc/proc.cc index 5db5f7a..6940a3e 100644 --- a/src/kernel/proc/proc.cc +++ b/src/kernel/proc/proc.cc @@ -152,7 +152,8 @@ void forkret() struct cpu *c = mycpu(); c->runqueue->lock.release(); - Drivers::uart_puts("[Proc] forkret: jumping to user.\n"); + // Debug + // Drivers::uart_puts("[Proc] forkret: jumping to user.\n"); // Enter user mode usertrapret(); @@ -185,6 +186,7 @@ static Proc *allocproc() p->state = USED; p->pid = nextpid++; p->priority = 0; + p->killed = 0; p->cpu = mycpu(); p->cwd = nullptr; for (int i = 0; i < NOFILE; i++) @@ -587,6 +589,34 @@ namespace ProcManager } } + int kill(int pid) + { + Proc* p; + proc_mem_lock.acquire(); + for (p = proc_list_head; p != nullptr; p = p->all_next) + { + if (p->pid == pid) + { + p->killed = 1; + + if (p->state == SLEEPING) + { + p->state = RUNNABLE; + + struct cpu *c = mycpu(); + c->runqueue->lock.acquire(); + c->runqueue->enqueue(p); + c->runqueue->lock.release(); + } + + proc_mem_lock.release(); + return 0; + } + } + proc_mem_lock.release(); + return -1; + } + int growproc(int n) { uint64 sz; |
