diff options
author | rsc <rsc> | 2007-08-21 19:22:08 +0000 |
---|---|---|
committer | rsc <rsc> | 2007-08-21 19:22:08 +0000 |
commit | f32f3638f4c34fbf2fc4398878e6304612bb3283 (patch) | |
tree | cabca9bf9ac8b1465b2c59e27e3dc8020c02e2be /proc.c | |
parent | 2d61a40b2059b9a198e7c4ff04c6ced88cb3ce65 (diff) | |
download | xv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.tar.gz xv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.tar.bz2 xv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.zip |
Various cleanup:
- Got rid of dummy proc[0]. Now proc[0] is init.
- Added initcode.S to exec /init, so that /init is
just a regular binary.
- Moved exec out of sysfile to exec.c
- Moved code dealing with fs guts (like struct inode)
from sysfile.c to fs.c. Code dealing with system call
arguments stays in sysfile.c
- Refactored directory routines in fs.c; should be simpler.
- Changed iget to return *unlocked* inode structure.
This solves the lookup-then-use race in namei
without introducing deadlocks.
It also enabled getting rid of the dummy proc[0].
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 50 |
1 files changed, 23 insertions, 27 deletions
@@ -109,47 +109,43 @@ copyproc(struct proc *p) return 0; } np->pid = next_pid++; - np->ppid = p->pid; release(&proc_table_lock); - // Copy user memory. - np->sz = p->sz; - np->mem = kalloc(np->sz); - if(np->mem == 0){ - np->state = UNUSED; - return 0; - } - memmove(np->mem, p->mem, np->sz); - // Allocate kernel stack. - np->kstack = kalloc(KSTACKSIZE); - if(np->kstack == 0){ - kfree(np->mem, np->sz); - np->mem = 0; + if((np->kstack = kalloc(KSTACKSIZE)) == 0){ np->state = UNUSED; return 0; } - - // Copy trapframe registers from parent. np->tf = (struct trapframe*)(np->kstack + KSTACKSIZE) - 1; - memmove(np->tf, p->tf, sizeof(*np->tf)); - // Clear %eax so that fork system call returns 0 in child. - np->tf->eax = 0; + if(p){ // Copy process state from p. + np->ppid = p->pid; + memmove(np->tf, p->tf, sizeof *np->tf); + + np->sz = p->sz; + if((np->mem = kalloc(np->sz)) == 0){ + kfree(np->kstack, KSTACKSIZE); + np->kstack = 0; + np->state = UNUSED; + return 0; + } + memmove(np->mem, p->mem, np->sz); + + for(i = 0; i < NOFILE; i++){ + np->ofile[i] = p->ofile[i]; + if(np->ofile[i]) + fileincref(np->ofile[i]); + } + np->cwd = iincref(p->cwd); + } // Set up new jmpbuf to start executing at forkret (see below). memset(&np->jmpbuf, 0, sizeof np->jmpbuf); np->jmpbuf.eip = (uint)forkret; np->jmpbuf.esp = (uint)np->tf - 4; - // Copy file descriptors - for(i = 0; i < NOFILE; i++){ - np->ofile[i] = p->ofile[i]; - if(np->ofile[i]) - fileincref(np->ofile[i]); - } - - np->cwd = iincref(p->cwd); + // Clear %eax so that fork system call returns 0 in child. + np->tf->eax = 0; return np; } |