diff options
| author | rsc <rsc> | 2007-11-28 20:47:22 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2007-11-28 20:47:22 +0000 | 
| commit | c2258bf4d249c34f26a4ed3c2d6ced81744c654e (patch) | |
| tree | fefd4d60ed84be5307c1840226d2c95e093f77d4 | |
| parent | 4f06ae0d4252796ee3245ecd83ec5ea105d6a75b (diff) | |
| download | xv6-labs-c2258bf4d249c34f26a4ed3c2d6ced81744c654e.tar.gz xv6-labs-c2258bf4d249c34f26a4ed3c2d6ced81744c654e.tar.bz2 xv6-labs-c2258bf4d249c34f26a4ed3c2d6ced81744c654e.zip | |
fork minibug
| -rw-r--r-- | TRICKS | 24 | ||||
| -rw-r--r-- | sysproc.c | 4 | 
2 files changed, 27 insertions, 1 deletions
| @@ -110,3 +110,27 @@ moves reads down after writes, but the language in  the spec allows it.  There is no telling whether future  processors will need it. +--- + +The code in sys_fork needs to read np->pid before +setting np->state to RUNNABLE.   + +	int +	sys_fork(void) +	{ +	  int pid; +	  struct proc *np; +	 +	  if((np = copyproc(cp)) == 0) +	    return -1; +	  pid = np->pid; +	  np->state = RUNNABLE; +	  return pid; +	} + +After setting np->state to RUNNABLE, some other CPU +might run the process, it might exit, and then it might +get reused for a different process (with a new pid), all +before the return statement.  So it's not safe to just do +"return np->pid;". + @@ -7,12 +7,14 @@  int  sys_fork(void)  { +  int pid;    struct proc *np;    if((np = copyproc(cp)) == 0)      return -1; +  pid = np->pid;    np->state = RUNNABLE; -  return np->pid; +  return pid;  }  int | 
