diff options
author | Peter Wemm <peter@FreeBSD.org> | 1999-06-30 15:33:41 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 1999-06-30 15:33:41 +0000 |
commit | df8abd0bb91dd5686111bc0d6ac9f65aa3e66af9 (patch) | |
tree | 7c1e229a108aab7fe47d2d054255fefea6d2bacf | |
parent | fbf8dd228ae7d65979bdd20a19d36d4b3c340c12 (diff) |
Notes
-rw-r--r-- | sys/kern/init_main.c | 13 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 82 | ||||
-rw-r--r-- | sys/kern/kern_linker.c | 13 | ||||
-rw-r--r-- | sys/kern/vfs_aio.c | 5 | ||||
-rw-r--r-- | sys/sys/proc.h | 6 |
5 files changed, 65 insertions, 54 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index d72737646d87..f98888793c94 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -39,7 +39,7 @@ * SUCH DAMAGE. * * @(#)init_main.c 8.9 (Berkeley) 1/21/94 - * $Id: init_main.c,v 1.121 1999/05/09 20:42:45 peter Exp $ + * $Id: init_main.c,v 1.122 1999/05/11 10:08:10 jb Exp $ */ #include "opt_devfs.h" @@ -180,6 +180,7 @@ mi_startup(framep) register struct sysinit **sipp; /* system initialization*/ register struct sysinit **xipp; /* interior loop of sort*/ register struct sysinit *save; /* bubble*/ + struct proc *p2; /* * Copy the locore.s frame pointer for proc0, this is forked into @@ -227,17 +228,15 @@ restart: case SI_TYPE_KTHREAD: /* kernel thread*/ - if (fork1(&proc0, RFMEM|RFFDG|RFPROC)) + if (fork1(&proc0, RFMEM|RFFDG|RFPROC, &p2)) panic("fork kernel thread"); - cpu_set_fork_handler(pfind(proc0.p_retval[0]), - (*sipp)->func, (*sipp)->udata); + cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); break; case SI_TYPE_KPROCESS: - if (fork1(&proc0, RFFDG|RFPROC)) + if (fork1(&proc0, RFFDG|RFPROC, &p2)) panic("fork kernel process"); - cpu_set_fork_handler(pfind(proc0.p_retval[0]), - (*sipp)->func, (*sipp)->udata); + cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); break; default: diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index d5870b50494d..5ece79a2530c 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 - * $Id: kern_fork.c,v 1.60 1999/04/28 01:04:27 luoqi Exp $ + * $Id: kern_fork.c,v 1.61 1999/04/28 11:36:53 phk Exp $ */ #include "opt_ktrace.h" @@ -92,8 +92,15 @@ fork(p, uap) struct proc *p; struct fork_args *uap; { + int error; + struct proc *p2; - return (fork1(p, RFFDG | RFPROC)); + error = fork1(p, RFFDG | RFPROC, &p2); + if (error == 0) { + p->p_retval[0] = p2->p_pid; + p->p_retval[1] = 0; + } + return error; } /* ARGSUSED */ @@ -102,18 +109,31 @@ vfork(p, uap) struct proc *p; struct vfork_args *uap; { + int error; + struct proc *p2; - return (fork1(p, RFFDG | RFPROC | RFPPWAIT | (fast_vfork ? RFMEM : 0))); + error = fork1(p, RFFDG | RFPROC | RFPPWAIT | RFMEM, &p2); + if (error == 0) { + p->p_retval[0] = p2->p_pid; + p->p_retval[1] = 0; + } + return error; } -/* ARGSUSED */ int rfork(p, uap) struct proc *p; struct rfork_args *uap; { + int error; + struct proc *p2; - return (fork1(p, uap->flags)); + error = fork1(p, uap->flags, &p2); + if (error == 0) { + p->p_retval[0] = p2->p_pid; + p->p_retval[1] = 0; + } + return error; } @@ -121,12 +141,13 @@ int nprocs = 1; /* process 0 */ static int nextpid = 0; int -fork1(p1, flags) - register struct proc *p1; +fork1(p1, flags, procp) + struct proc *p1; int flags; + struct proc **procp; { - register struct proc *p2, *pptr; - register uid_t uid; + struct proc *p2, *pptr; + uid_t uid; struct proc *newproc; int count; static int pidchecked = 0; @@ -213,9 +234,9 @@ fork1(p1, flags) /* Allocate new proc. */ newproc = zalloc(proc_zone); -/* - * Setup linkage for kernel based threading - */ + /* + * Setup linkage for kernel based threading + */ if((flags & RFTHREAD) != 0) { newproc->p_peers = p1->p_peers; p1->p_peers = newproc; @@ -321,31 +342,28 @@ again: struct sigacts *newsigacts; int s; - if (p2->p_procsig->ps_refcnt != 2) - printf ("PID:%d Creating shared sigacts with procsig->ps_refcnt %d\n", - p2->p_pid, p2->p_procsig->ps_refcnt); /* Create the shared sigacts structure */ - MALLOC (newsigacts, struct sigacts *, sizeof (struct sigacts), - M_SUBPROC, M_WAITOK); + MALLOC(newsigacts, struct sigacts *, + sizeof(struct sigacts), M_SUBPROC, M_WAITOK); s = splhigh(); - /* Set p_sigacts to the new shared structure. Note that this - * is updating p1->p_sigacts at the same time, since p_sigacts - * is just a pointer to the shared p_procsig->ps_sigacts. + /* + * Set p_sigacts to the new shared structure. + * Note that this is updating p1->p_sigacts at the + * same time, since p_sigacts is just a pointer to + * the shared p_procsig->ps_sigacts. */ p2->p_sigacts = newsigacts; - /* Copy in the values from the u area */ + bcopy(&p1->p_addr->u_sigacts, p2->p_sigacts, + sizeof(*p2->p_sigacts)); *p2->p_sigacts = p1->p_addr->u_sigacts; - splx (s); + splx(s); } } else { - MALLOC (p2->p_procsig, struct procsig *, sizeof(struct procsig), - M_SUBPROC, M_WAITOK); - bcopy(&p1->p_procsig->ps_begincopy, &p2->p_procsig->ps_begincopy, - (char *)&p1->p_procsig->ps_endcopy - - (char *)&p1->p_procsig->ps_begincopy); + MALLOC(p2->p_procsig, struct procsig *, sizeof(struct procsig), + M_SUBPROC, M_WAITOK); + bcopy(p1->p_procsig, p2->p_procsig, sizeof(*p2->p_procsig)); p2->p_procsig->ps_refcnt = 1; - /* Note that we fill in the values of sigacts in vm_fork */ - p2->p_sigacts = NULL; + p2->p_sigacts = NULL; /* finished in vm_fork() */ } if (flags & RFLINUXTHPN) p2->p_sigparent = SIGUSR1; @@ -467,11 +485,9 @@ again: tsleep(p1, PWAIT, "ppwait", 0); /* - * Return child pid to parent process, - * marking us as parent via p1->p_retval[1]. + * Return child proc pointer to parent. */ - p1->p_retval[0] = p2->p_pid; - p1->p_retval[1] = 0; + *procp = p2; return (0); } diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 61d7aeba4ed8..ce84271080d1 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: kern_linker.c,v 1.31 1999/04/28 01:04:28 luoqi Exp $ + * $Id: kern_linker.c,v 1.32 1999/05/08 13:01:56 peter Exp $ */ #include "opt_ddb.h" @@ -96,6 +96,7 @@ linker_file_sysinit(linker_file_t lf) struct sysinit** sipp; struct sysinit** xipp; struct sysinit* save; + struct proc *p2; const moduledata_t *moddata; int error; @@ -156,18 +157,16 @@ linker_file_sysinit(linker_file_t lf) case SI_TYPE_KTHREAD: /* kernel thread*/ - if (fork1(&proc0, RFFDG|RFPROC|RFMEM)) + if (fork1(&proc0, RFFDG|RFPROC|RFMEM, &p2)) panic("fork kernel thread"); - cpu_set_fork_handler(pfind(proc0.p_retval[0]), - (*sipp)->func, (*sipp)->udata); + cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); break; case SI_TYPE_KPROCESS: /* kernel thread*/ - if (fork1(&proc0, RFFDG|RFPROC)) + if (fork1(&proc0, RFFDG|RFPROC, &p2)) panic("fork kernel process"); - cpu_set_fork_handler(pfind(proc0.p_retval[0]), - (*sipp)->func, (*sipp)->udata); + cpu_set_fork_handler(p2, (*sipp)->func, (*sipp)->udata); break; default: diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index f5f9a20bc734..f1bac7f227a2 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -13,7 +13,7 @@ * bad that happens because of using this software isn't the responsibility * of the author. This software is distributed AS-IS. * - * $Id: vfs_aio.c,v 1.51 1999/06/01 18:56:24 phk Exp $ + * $Id: vfs_aio.c,v 1.52 1999/06/26 02:46:05 mckusick Exp $ */ /* @@ -890,10 +890,9 @@ aio_newproc() struct proc *p, *np; p = &proc0; - error = fork1(p, RFPROC|RFMEM|RFNOWAIT); + error = fork1(p, RFPROC|RFMEM|RFNOWAIT, &np); if (error) return error; - np = pfind(p->p_retval[0]); cpu_set_fork_handler(np, aio_daemon, curproc); /* diff --git a/sys/sys/proc.h b/sys/sys/proc.h index ee4bd34b88a8..dfe1251365e8 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)proc.h 8.15 (Berkeley) 5/19/95 - * $Id: proc.h,v 1.81 1999/04/28 11:38:04 phk Exp $ + * $Id: proc.h,v 1.82 1999/06/28 09:14:18 peter Exp $ */ #ifndef _SYS_PROC_H_ @@ -78,12 +78,10 @@ struct pgrp { }; struct procsig { -#define ps_begincopy ps_sigignore sigset_t ps_sigignore; /* Signals being ignored. */ sigset_t ps_sigcatch; /* Signals being caught by user. */ int ps_flag; struct sigacts *ps_sigacts; -#define ps_endcopy ps_refcnt int ps_refcnt; }; @@ -402,7 +400,7 @@ void exit1 __P((struct proc *, int)) __dead2; void cpu_fork __P((struct proc *, struct proc *)); void cpu_set_fork_handler __P((struct proc *, void (*pc)(const void *), const void *)); -int fork1 __P((struct proc *, int)); +int fork1 __P((struct proc *, int, struct proc **)); int trace_req __P((struct proc *)); void cpu_wait __P((struct proc *)); int cpu_coredump __P((struct proc *, struct vnode *, struct ucred *)); |