diff options
author | rsc <rsc> | 2009-05-31 00:38:51 +0000 |
---|---|---|
committer | rsc <rsc> | 2009-05-31 00:38:51 +0000 |
commit | 215738336aec0d5118a90a79d380c41910f6ee4b (patch) | |
tree | 87fa465103f5d024a2e0292db2dddbb3ac54816a | |
parent | dae9b0d48a94683c0a49e88e4b739482788d7175 (diff) | |
download | xv6-labs-215738336aec0d5118a90a79d380c41910f6ee4b.tar.gz xv6-labs-215738336aec0d5118a90a79d380c41910f6ee4b.tar.bz2 xv6-labs-215738336aec0d5118a90a79d380c41910f6ee4b.zip |
move fork into proc.c
-rw-r--r-- | defs.h | 7 | ||||
-rw-r--r-- | proc.c | 34 | ||||
-rw-r--r-- | sysproc.c | 12 |
3 files changed, 25 insertions, 28 deletions
@@ -94,6 +94,7 @@ int pipewrite(struct pipe*, char*, int); // proc.c struct proc* copyproc(struct proc*); void exit(void); +int fork(void); int growproc(int); int kill(int); void pinit(void); @@ -146,9 +147,9 @@ void tvinit(void); extern struct spinlock tickslock; // uart.c -void uartinit(void); -void uartintr(void); -void uartputc(int); +void uartinit(void); +void uartintr(void); +void uartputc(int); // number of elements in fixed-size array @@ -130,34 +130,40 @@ usegment(void) // Create a new process copying p as the parent. // Sets up stack to return as if from system call. // Caller must set state of returned proc to RUNNABLE. -struct proc* -copyproc(struct proc *p) +int +fork(void) { - int i; + int i, pid; struct proc *np; // Allocate process. if((np = allocproc()) == 0) - return 0; + return -1; // Copy process state from p. - np->sz = p->sz; + np->sz = cp->sz; if((np->mem = kalloc(np->sz)) == 0){ kfree(np->kstack, KSTACKSIZE); np->kstack = 0; np->state = UNUSED; - return 0; + return -1; } - memmove(np->mem, p->mem, np->sz); - np->parent = p; - *np->tf = *p->tf; + memmove(np->mem, cp->mem, np->sz); + np->parent = cp; + *np->tf = *cp->tf; - for(i = 0; i < NOFILE; i++) - if(p->ofile[i]) - np->ofile[i] = filedup(p->ofile[i]); - np->cwd = idup(p->cwd); + // Clear %eax so that fork returns 0 in the child. + np->tf->eax = 0; - return np; + for(i = 0; i < NOFILE; i++) + if(cp->ofile[i]) + np->ofile[i] = filedup(cp->ofile[i]); + np->cwd = idup(cp->cwd); + + pid = np->pid; + np->state = RUNNABLE; + + return pid; } // Set up first user process. @@ -8,17 +8,7 @@ int sys_fork(void) { - int pid; - struct proc *np; - - if((np = copyproc(cp)) == 0) - return -1; - pid = np->pid; - - // Clear %eax so that fork returns 0 in the child. - np->tf->eax = 0; - np->state = RUNNABLE; - return pid; + return fork(); } int |