summaryrefslogtreecommitdiff
path: root/src/kernel/proc/proc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/proc/proc.cc')
-rw-r--r--src/kernel/proc/proc.cc32
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;