summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-15 17:24:54 +0000
committerrsc <rsc>2006-07-15 17:24:54 +0000
commit643b122b4a721dbdb208ec5f8d15e56b63ac58d5 (patch)
tree4a45e90f51b9b9b2fb172f289caad30ac57789fe
parent3497670122cd0561661a0a2e617ec9ece789c2f0 (diff)
downloadxv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.tar.gz
xv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.tar.bz2
xv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.zip
move everything having to do with proc_table_lock into proc.c
-rw-r--r--defs.h2
-rw-r--r--picirq.c2
-rw-r--r--proc.c50
-rw-r--r--syscall.c55
4 files changed, 62 insertions, 47 deletions
diff --git a/defs.h b/defs.h
index 3a07ed2..dc8a831 100644
--- a/defs.h
+++ b/defs.h
@@ -19,6 +19,8 @@ void sleep(void *, struct spinlock *);
void wakeup(void *);
void scheduler(void);
void proc_exit(void);
+int proc_kill(int);
+int proc_wait(void);
void yield(void);
void cli(void);
void sti(void);
diff --git a/picirq.c b/picirq.c
index 9c3ea0c..19c4f88 100644
--- a/picirq.c
+++ b/picirq.c
@@ -53,7 +53,7 @@ pic_init(void)
outb(IO_PIC2+1, IRQ_SLAVE); // ICW3
// NB Automatic EOI mode doesn't tend to work on the slave.
// Linux source code says it's "to be investigated".
- outb(IO_PIC2+1, 0x3); // ICW4
+ outb(IO_PIC2+1, 0x1); // ICW4
// OCW3: 0ef01prs
// ef: 0x = NOP, 10 = clear specific mask, 11 = set specific mask
diff --git a/proc.c b/proc.c
index e69f1d1..76ec64e 100644
--- a/proc.c
+++ b/proc.c
@@ -281,6 +281,56 @@ proc_exit()
panic("a zombie revived");
}
+int
+proc_wait(void)
+{
+ struct proc *p;
+ struct proc *cp = curproc[cpu()];
+ int any, pid;
+
+ acquire(&proc_table_lock);
+
+ while(1){
+ any = 0;
+ for(p = proc; p < &proc[NPROC]; p++){
+ if(p->state == ZOMBIE && p->ppid == cp->pid){
+ kfree(p->mem, p->sz);
+ kfree(p->kstack, KSTACKSIZE);
+ pid = p->pid;
+ p->state = UNUSED;
+ release(&proc_table_lock);
+ return pid;
+ }
+ if(p->state != UNUSED && p->ppid == cp->pid)
+ any = 1;
+ }
+ if(any == 0){
+ release(&proc_table_lock);
+ return -1;
+ }
+ sleep(cp, &proc_table_lock);
+ }
+}
+
+int
+proc_kill(int pid)
+{
+ struct proc *p;
+
+ acquire(&proc_table_lock);
+ for(p = proc; p < &proc[NPROC]; p++){
+ if(p->pid == pid && p->state != UNUSED){
+ p->killed = 1;
+ if(p->state == WAITING)
+ p->state = RUNNABLE;
+ release(&proc_table_lock);
+ return 0;
+ }
+ }
+ release(&proc_table_lock);
+ return -1;
+}
+
// disable interrupts
void
cli(void)
diff --git a/syscall.c b/syscall.c
index 0b49ff9..e03901d 100644
--- a/syscall.c
+++ b/syscall.c
@@ -162,38 +162,22 @@ int
sys_exit(void)
{
proc_exit();
- return 0;
+ return 0; // not reached
}
int
sys_wait(void)
{
- struct proc *p;
- struct proc *cp = curproc[cpu()];
- int any, pid;
+ return proc_wait();
+}
- acquire(&proc_table_lock);
+int
+sys_kill(void)
+{
+ int pid;
- while(1){
- any = 0;
- for(p = proc; p < &proc[NPROC]; p++){
- if(p->state == ZOMBIE && p->ppid == cp->pid){
- kfree(p->mem, p->sz);
- kfree(p->kstack, KSTACKSIZE);
- pid = p->pid;
- p->state = UNUSED;
- release(&proc_table_lock);
- return pid;
- }
- if(p->state != UNUSED && p->ppid == cp->pid)
- any = 1;
- }
- if(any == 0){
- release(&proc_table_lock);
- return -1;
- }
- sleep(cp, &proc_table_lock);
- }
+ fetcharg(0, &pid);
+ return proc_kill(pid);
}
int
@@ -232,27 +216,6 @@ sys_block(void)
}
int
-sys_kill(void)
-{
- int pid;
- struct proc *p;
-
- fetcharg(0, &pid);
- acquire(&proc_table_lock);
- for(p = proc; p < &proc[NPROC]; p++){
- if(p->pid == pid && p->state != UNUSED){
- p->killed = 1;
- if(p->state == WAITING)
- p->state = RUNNABLE;
- release(&proc_table_lock);
- return 0;
- }
- }
- release(&proc_table_lock);
- return -1;
-}
-
-int
sys_panic(void)
{
struct proc *p = curproc[cpu()];