Merge branch 'riscv' into uvm-perm
This commit is contained in:
commit
ccb7bd14c7
14 changed files with 156 additions and 95 deletions
|
|
@ -259,7 +259,7 @@ userinit(void)
|
|||
int
|
||||
growproc(int n)
|
||||
{
|
||||
uint sz;
|
||||
uint64 sz;
|
||||
struct proc *p = myproc();
|
||||
|
||||
sz = p->sz;
|
||||
|
|
@ -390,7 +390,7 @@ exit(int status)
|
|||
int
|
||||
wait(uint64 addr)
|
||||
{
|
||||
struct proc *np;
|
||||
struct proc *pp;
|
||||
int havekids, pid;
|
||||
struct proc *p = myproc();
|
||||
|
||||
|
|
@ -399,32 +399,32 @@ wait(uint64 addr)
|
|||
for(;;){
|
||||
// Scan through table looking for exited children.
|
||||
havekids = 0;
|
||||
for(np = proc; np < &proc[NPROC]; np++){
|
||||
if(np->parent == p){
|
||||
for(pp = proc; pp < &proc[NPROC]; pp++){
|
||||
if(pp->parent == p){
|
||||
// make sure the child isn't still in exit() or swtch().
|
||||
acquire(&np->lock);
|
||||
acquire(&pp->lock);
|
||||
|
||||
havekids = 1;
|
||||
if(np->state == ZOMBIE){
|
||||
if(pp->state == ZOMBIE){
|
||||
// Found one.
|
||||
pid = np->pid;
|
||||
if(addr != 0 && copyout(p->pagetable, addr, (char *)&np->xstate,
|
||||
sizeof(np->xstate)) < 0) {
|
||||
release(&np->lock);
|
||||
pid = pp->pid;
|
||||
if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate,
|
||||
sizeof(pp->xstate)) < 0) {
|
||||
release(&pp->lock);
|
||||
release(&wait_lock);
|
||||
return -1;
|
||||
}
|
||||
freeproc(np);
|
||||
release(&np->lock);
|
||||
freeproc(pp);
|
||||
release(&pp->lock);
|
||||
release(&wait_lock);
|
||||
return pid;
|
||||
}
|
||||
release(&np->lock);
|
||||
release(&pp->lock);
|
||||
}
|
||||
}
|
||||
|
||||
// No point waiting if we don't have any children.
|
||||
if(!havekids || p->killed){
|
||||
if(!havekids || killed(p)){
|
||||
release(&wait_lock);
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -603,6 +603,25 @@ kill(int pid)
|
|||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
setkilled(struct proc *p)
|
||||
{
|
||||
acquire(&p->lock);
|
||||
p->killed = 1;
|
||||
release(&p->lock);
|
||||
}
|
||||
|
||||
int
|
||||
killed(struct proc *p)
|
||||
{
|
||||
int k;
|
||||
|
||||
acquire(&p->lock);
|
||||
k = p->killed;
|
||||
release(&p->lock);
|
||||
return k;
|
||||
}
|
||||
|
||||
// Copy to either a user address, or kernel address,
|
||||
// depending on usr_dst.
|
||||
// Returns 0 on success, -1 on error.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue