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 | 
