From 8f12c20f6c37989bd2d4e78f9763db606a64005b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= Date: Sun, 11 Mar 2001 18:52:10 +0000 Subject: [PATCH] rfork() masks RFSTOPPED out of the flags it passes to fork1(), so we have to call fork1() directly if we don't want out process queued right away. This has the serendipitous side effect of saving us a call to pfind(). This makes threaded Linux apps (such as Opera) work again. --- sys/i386/linux/linux_machdep.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c index 6c1ddeeff80a..aaa5cac019dc 100644 --- a/sys/i386/linux/linux_machdep.c +++ b/sys/i386/linux/linux_machdep.c @@ -222,7 +222,6 @@ linux_clone(struct proc *p, struct linux_clone_args *args) struct proc *p2; int exit_signal; vm_offset_t start; - struct rfork_args rf_args; #ifdef DEBUG if (ldebug(clone)) { @@ -256,14 +255,9 @@ linux_clone(struct proc *p, struct linux_clone_args *args) error = 0; start = 0; - rf_args.flags = ff; - if ((error = rfork(p, &rf_args)) != 0) + if ((error = fork1(p, ff, &p2)) != 0) return (error); - p2 = pfind(p->p_retval[0]); - if (p2 == NULL) - return (ESRCH); - PROC_LOCK(p2); p2->p_sigparent = exit_signal; PROC_UNLOCK(p2); @@ -283,6 +277,8 @@ linux_clone(struct proc *p, struct linux_clone_args *args) setrunqueue(p2); mtx_unlock_spin(&sched_lock); + p->p_retval[0] = p2->p_pid; + p->p_retval[1] = 0; return (0); }