diff options
author | jhb <jhb@FreeBSD.org> | 2003-04-18 20:54:41 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2003-04-18 20:54:41 +0000 |
commit | 85d7526d963b421bd1c63ee5609e74174c02bbed (patch) | |
tree | 3f5ac99254970e6707b143c76f335a0f3d4e707e | |
parent | 543c59f2fd99a5268f613ada6b324420ebc3039e (diff) | |
download | FreeBSD-src-85d7526d963b421bd1c63ee5609e74174c02bbed.zip FreeBSD-src-85d7526d963b421bd1c63ee5609e74174c02bbed.tar.gz |
Synchronize the two linux_clone() implementations which includes a few
minor cleanups in both.
-rw-r--r-- | sys/alpha/linux/linux_machdep.c | 9 | ||||
-rw-r--r-- | sys/i386/linux/linux_machdep.c | 44 |
2 files changed, 25 insertions, 28 deletions
diff --git a/sys/alpha/linux/linux_machdep.c b/sys/alpha/linux/linux_machdep.c index 3ba455a..851ac83 100644 --- a/sys/alpha/linux/linux_machdep.c +++ b/sys/alpha/linux/linux_machdep.c @@ -129,7 +129,6 @@ linux_clone(struct thread *td, struct linux_clone_args *args) struct proc *p2; struct thread *td2; int exit_signal; - vm_offset_t start; #ifdef DEBUG if (ldebug(clone)) { @@ -158,10 +157,8 @@ linux_clone(struct thread *td, struct linux_clone_args *args) if (!(args->flags & CLONE_FILES)) ff |= RFFDG; - error = 0; - start = 0; - - if ((error = fork1(td, ff, 0, &p2)) != 0) + error = fork1(td, ff, 0, &p2); + if (error) return (error); PROC_LOCK(p2); @@ -181,7 +178,7 @@ linux_clone(struct thread *td, struct linux_clone_args *args) */ mtx_lock_spin(&sched_lock); TD_SET_CAN_RUN(td2); - setrunqueue(FIRST_THREAD_IN_PROC(p2)); + setrunqueue(td2); mtx_unlock_spin(&sched_lock); td->td_retval[0] = p2->p_pid; diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c index 6eb0e5c..4a875f1 100644 --- a/sys/i386/linux/linux_machdep.c +++ b/sys/i386/linux/linux_machdep.c @@ -313,6 +313,7 @@ linux_clone(struct thread *td, struct linux_clone_args *args) { int error, ff = RFPROC | RFSTOPPED; struct proc *p2; + struct thread *td2; int exit_signal; #ifdef DEBUG @@ -341,35 +342,34 @@ linux_clone(struct thread *td, struct linux_clone_args *args) if (!(args->flags & CLONE_FILES)) ff |= RFFDG; - mtx_lock(&Giant); error = fork1(td, ff, 0, &p2); - if (error == 0) { - td->td_retval[0] = p2->p_pid; - td->td_retval[1] = 0; + if (error) + return (error); + - PROC_LOCK(p2); - p2->p_sigparent = exit_signal; - FIRST_THREAD_IN_PROC(p2)->td_frame->tf_esp = - (unsigned int)args->stack; + PROC_LOCK(p2); + p2->p_sigparent = exit_signal; + PROC_UNLOCK(p2); + td2 = FIRST_THREAD_IN_PROC(p2); + td2->td_frame->tf_esp = (unsigned int)args->stack; #ifdef DEBUG - if (ldebug(clone)) - printf(LMSG("clone: successful rfork to %ld"), - (long)p2->p_pid); + if (ldebug(clone)) + printf(LMSG("clone: successful rfork to %ld, stack %p sig = %d"), + (long)p2->p_pid, args->stack, exit_signal); #endif - /* - * Make this runnable after we are finished with it. - */ - mtx_lock_spin(&sched_lock); - TD_SET_CAN_RUN(FIRST_THREAD_IN_PROC(p2)); - setrunqueue(FIRST_THREAD_IN_PROC(p2)); - mtx_unlock_spin(&sched_lock); - PROC_UNLOCK(p2); - } - mtx_unlock(&Giant); + /* + * Make this runnable after we are finished with it. + */ + mtx_lock_spin(&sched_lock); + TD_SET_CAN_RUN(td2); + setrunqueue(td2); + mtx_unlock_spin(&sched_lock); - return (error); + td->td_retval[0] = p2->p_pid; + td->td_retval[1] = 0; + return (0); } /* XXX move */ |