summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1999-06-30 15:33:41 +0000
committerPeter Wemm <peter@FreeBSD.org>1999-06-30 15:33:41 +0000
commitdf8abd0bb91dd5686111bc0d6ac9f65aa3e66af9 (patch)
tree7c1e229a108aab7fe47d2d054255fefea6d2bacf
parentfbf8dd228ae7d65979bdd20a19d36d4b3c340c12 (diff)
Notes
-rw-r--r--sys/kern/init_main.c13
-rw-r--r--sys/kern/kern_fork.c82
-rw-r--r--sys/kern/kern_linker.c13
-rw-r--r--sys/kern/vfs_aio.c5
-rw-r--r--sys/sys/proc.h6
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 *));