move everything having to do with proc_table_lock into proc.c
This commit is contained in:
parent
3497670122
commit
643b122b4a
2
defs.h
2
defs.h
|
@ -19,6 +19,8 @@ void sleep(void *, struct spinlock *);
|
||||||
void wakeup(void *);
|
void wakeup(void *);
|
||||||
void scheduler(void);
|
void scheduler(void);
|
||||||
void proc_exit(void);
|
void proc_exit(void);
|
||||||
|
int proc_kill(int);
|
||||||
|
int proc_wait(void);
|
||||||
void yield(void);
|
void yield(void);
|
||||||
void cli(void);
|
void cli(void);
|
||||||
void sti(void);
|
void sti(void);
|
||||||
|
|
2
picirq.c
2
picirq.c
|
@ -53,7 +53,7 @@ pic_init(void)
|
||||||
outb(IO_PIC2+1, IRQ_SLAVE); // ICW3
|
outb(IO_PIC2+1, IRQ_SLAVE); // ICW3
|
||||||
// NB Automatic EOI mode doesn't tend to work on the slave.
|
// NB Automatic EOI mode doesn't tend to work on the slave.
|
||||||
// Linux source code says it's "to be investigated".
|
// Linux source code says it's "to be investigated".
|
||||||
outb(IO_PIC2+1, 0x3); // ICW4
|
outb(IO_PIC2+1, 0x1); // ICW4
|
||||||
|
|
||||||
// OCW3: 0ef01prs
|
// OCW3: 0ef01prs
|
||||||
// ef: 0x = NOP, 10 = clear specific mask, 11 = set specific mask
|
// ef: 0x = NOP, 10 = clear specific mask, 11 = set specific mask
|
||||||
|
|
50
proc.c
50
proc.c
|
@ -281,6 +281,56 @@ proc_exit()
|
||||||
panic("a zombie revived");
|
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
|
// disable interrupts
|
||||||
void
|
void
|
||||||
cli(void)
|
cli(void)
|
||||||
|
|
55
syscall.c
55
syscall.c
|
@ -162,38 +162,22 @@ int
|
||||||
sys_exit(void)
|
sys_exit(void)
|
||||||
{
|
{
|
||||||
proc_exit();
|
proc_exit();
|
||||||
return 0;
|
return 0; // not reached
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sys_wait(void)
|
sys_wait(void)
|
||||||
{
|
{
|
||||||
struct proc *p;
|
return proc_wait();
|
||||||
struct proc *cp = curproc[cpu()];
|
}
|
||||||
int any, pid;
|
|
||||||
|
|
||||||
acquire(&proc_table_lock);
|
int
|
||||||
|
sys_kill(void)
|
||||||
|
{
|
||||||
|
int pid;
|
||||||
|
|
||||||
while(1){
|
fetcharg(0, &pid);
|
||||||
any = 0;
|
return proc_kill(pid);
|
||||||
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
|
int
|
||||||
|
@ -231,27 +215,6 @@ sys_block(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
int
|
||||||
sys_panic(void)
|
sys_panic(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue