xv6

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit c2258bf4d249c34f26a4ed3c2d6ced81744c654e
parent 4f06ae0d4252796ee3245ecd83ec5ea105d6a75b
Author: rsc <rsc>
Date:   Wed, 28 Nov 2007 20:47:22 +0000

fork minibug

Diffstat:
MTRICKS | 24++++++++++++++++++++++++
Msysproc.c | 4+++-
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/TRICKS b/TRICKS @@ -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;". + diff --git a/sysproc.c b/sysproc.c @@ -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