summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorAustin Clements <[email protected]>2010-09-02 04:15:17 -0400
committerAustin Clements <[email protected]>2010-09-02 04:15:17 -0400
commitd8828817d72962a6220cb1fca315cab4bbf6d0a3 (patch)
tree018515d8e7ce0c6681121914fb9d78e9955025b3 /proc.c
parentdd3ecd42cd6c8dee72e5212848cd8037d47f81dd (diff)
downloadxv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.tar.gz
xv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.tar.bz2
xv6-labs-d8828817d72962a6220cb1fca315cab4bbf6d0a3.zip
Rearrange proc.h and proc.c to get our action-packed spreads back (mostly). They also make sense in this order, so it's not just for page layout.
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c172
1 files changed, 86 insertions, 86 deletions
diff --git a/proc.c b/proc.c
index 375b1bb..8197377 100644
--- a/proc.c
+++ b/proc.c
@@ -193,6 +193,92 @@ fork(void)
return pid;
}
+// Exit the current process. Does not return.
+// An exited process remains in the zombie state
+// until its parent calls wait() to find out it exited.
+void
+exit(void)
+{
+ struct proc *p;
+ int fd;
+
+ if(proc == initproc)
+ panic("init exiting");
+
+ // Close all open files.
+ for(fd = 0; fd < NOFILE; fd++){
+ if(proc->ofile[fd]){
+ fileclose(proc->ofile[fd]);
+ proc->ofile[fd] = 0;
+ }
+ }
+
+ iput(proc->cwd);
+ proc->cwd = 0;
+
+ acquire(&ptable.lock);
+
+ // Parent might be sleeping in wait().
+ wakeup1(proc->parent);
+
+ // Pass abandoned children to init.
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
+ if(p->parent == proc){
+ p->parent = initproc;
+ if(p->state == ZOMBIE)
+ wakeup1(initproc);
+ }
+ }
+
+ // Jump into the scheduler, never to return.
+ proc->state = ZOMBIE;
+ sched();
+ panic("zombie exit");
+}
+
+// Wait for a child process to exit and return its pid.
+// Return -1 if this process has no children.
+int
+wait(void)
+{
+ struct proc *p;
+ int havekids, pid;
+
+ acquire(&ptable.lock);
+ for(;;){
+ // Scan through table looking for zombie children.
+ havekids = 0;
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
+ if(p->parent != proc)
+ continue;
+ havekids = 1;
+ if(p->state == ZOMBIE){
+ // Found one.
+ pid = p->pid;
+ kfree(p->kstack);
+ p->kstack = 0;
+ freevm(p->pgdir);
+ p->state = UNUSED;
+ p->pid = 0;
+ p->parent = 0;
+ p->name[0] = 0;
+ p->killed = 0;
+ release(&ptable.lock);
+ return pid;
+ }
+ }
+
+ // No point waiting if we don't have any children.
+ if(!havekids || proc->killed){
+ release(&ptable.lock);
+ return -1;
+ }
+
+ // Wait for children to exit. (See wakeup1 call in proc_exit.)
+ sleep(proc, &ptable.lock); //DOC: wait-sleep
+ }
+}
+
//PAGEBREAK: 42
// Per-CPU process scheduler.
// Each CPU calls scheduler() after setting itself up.
@@ -357,89 +443,3 @@ kill(int pid)
return -1;
}
-// Exit the current process. Does not return.
-// An exited process remains in the zombie state
-// until its parent calls wait() to find out it exited.
-void
-exit(void)
-{
- struct proc *p;
- int fd;
-
- if(proc == initproc)
- panic("init exiting");
-
- // Close all open files.
- for(fd = 0; fd < NOFILE; fd++){
- if(proc->ofile[fd]){
- fileclose(proc->ofile[fd]);
- proc->ofile[fd] = 0;
- }
- }
-
- iput(proc->cwd);
- proc->cwd = 0;
-
- acquire(&ptable.lock);
-
- // Parent might be sleeping in wait().
- wakeup1(proc->parent);
-
- // Pass abandoned children to init.
- for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
- if(p->parent == proc){
- p->parent = initproc;
- if(p->state == ZOMBIE)
- wakeup1(initproc);
- }
- }
-
- // Jump into the scheduler, never to return.
- proc->state = ZOMBIE;
- sched();
- panic("zombie exit");
-}
-
-// Wait for a child process to exit and return its pid.
-// Return -1 if this process has no children.
-int
-wait(void)
-{
- struct proc *p;
- int havekids, pid;
-
- acquire(&ptable.lock);
- for(;;){
- // Scan through table looking for zombie children.
- havekids = 0;
- for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
- if(p->parent != proc)
- continue;
- havekids = 1;
- if(p->state == ZOMBIE){
- // Found one.
- pid = p->pid;
- kfree(p->kstack);
- p->kstack = 0;
- freevm(p->pgdir);
- p->state = UNUSED;
- p->pid = 0;
- p->parent = 0;
- p->name[0] = 0;
- p->killed = 0;
- release(&ptable.lock);
- return pid;
- }
- }
-
- // No point waiting if we don't have any children.
- if(!havekids || proc->killed){
- release(&ptable.lock);
- return -1;
- }
-
- // Wait for children to exit. (See wakeup1 call in proc_exit.)
- sleep(proc, &ptable.lock); //DOC: wait-sleep
- }
-}
-