summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2011-01-02 12:16:57 +0000
committertrasz <trasz@FreeBSD.org>2011-01-02 12:16:57 +0000
commitf3e31127df86b98116f502ea5ceb0d247f74f7a4 (patch)
tree800d30d73b3c564d9d2632637148ac93d9e615e1 /sys/kern
parente53f353cdccb63721a0678751c6d600432c1a807 (diff)
downloadFreeBSD-src-f3e31127df86b98116f502ea5ceb0d247f74f7a4.zip
FreeBSD-src-f3e31127df86b98116f502ea5ceb0d247f74f7a4.tar.gz
Finishing touches to fork1() - ANSIfy missed function definition, style(9)
fixes, removal of few comments that didn't really make sense and addition of fork_findpid() locking requirements.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_fork.c47
1 files changed, 20 insertions, 27 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index cf71a12..38a8032 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -112,9 +112,7 @@ fork(struct thread *td, struct fork_args *uap)
/* ARGSUSED */
int
-vfork(td, uap)
- struct thread *td;
- struct vfork_args *uap;
+vfork(struct thread *td, struct vfork_args *uap)
{
int error, flags;
struct proc *p2;
@@ -200,7 +198,12 @@ fork_findpid(int flags)
int trypid;
static int pidchecked = 0;
- sx_assert(&allproc_lock, SX_XLOCKED);
+ /*
+ * Requires allproc_lock in order to iterate over the list
+ * of processes, and proctree_lock to access p_pgrp.
+ */
+ sx_assert(&allproc_lock, SX_LOCKED);
+ sx_assert(&proctree_lock, SX_LOCKED);
/*
* Find an unused process ID. We remember a range of unused IDs
@@ -281,7 +284,7 @@ again:
}
static int
-fork_norfproc(struct thread *td, int flags, struct proc **procp)
+fork_norfproc(struct thread *td, int flags)
{
int error;
struct proc *p1;
@@ -289,7 +292,6 @@ fork_norfproc(struct thread *td, int flags, struct proc **procp)
KASSERT((flags & RFPROC) == 0,
("fork_norfproc called with RFPROC set"));
p1 = td->td_proc;
- *procp = NULL;
if (((p1->p_flag & (P_HADTHREADS|P_SYSTEM)) == P_HADTHREADS) &&
(flags & (RFCFDG | RFFDG))) {
@@ -408,14 +410,12 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
} else {
fd = fdshare(p1->p_fd);
if (p1->p_fdtol == NULL)
- p1->p_fdtol =
- filedesc_to_leader_alloc(NULL,
- NULL,
- p1->p_leader);
+ p1->p_fdtol = filedesc_to_leader_alloc(NULL, NULL,
+ p1->p_leader);
if ((flags & RFTHREAD) != 0) {
/*
- * Shared file descriptor table and
- * shared process leaders.
+ * Shared file descriptor table, and shared
+ * process leaders.
*/
fdtol = p1->p_fdtol;
FILEDESC_XLOCK(p1->p_fd);
@@ -423,12 +423,11 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
FILEDESC_XUNLOCK(p1->p_fd);
} else {
/*
- * Shared file descriptor table, and
- * different process leaders
+ * Shared file descriptor table, and different
+ * process leaders.
*/
fdtol = filedesc_to_leader_alloc(p1->p_fdtol,
- p1->p_fd,
- p2);
+ p1->p_fd, p2);
}
}
/*
@@ -492,7 +491,7 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
PROC_UNLOCK(p1);
PROC_UNLOCK(p2);
- /* Bump references to the text vnode (for procfs) */
+ /* Bump references to the text vnode (for procfs). */
if (p2->p_textvp)
vref(p2->p_textvp);
@@ -622,7 +621,6 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
/*
* Both processes are set up, now check if any loadable modules want
* to adjust anything.
- * What if they have an error? XXX
*/
EVENTHANDLER_INVOKE(process_fork, p1, p2, flags);
@@ -682,7 +680,6 @@ do_fork(struct thread *td, int flags, struct proc *p2, struct thread *td2,
while (p2->p_flag & P_PPWAIT)
cv_wait(&p2->p_pwait, &p2->p_mtx);
PROC_UNLOCK(p2);
-
}
int
@@ -708,14 +705,10 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
* Here we don't create a new process, but we divorce
* certain parts of a process from itself.
*/
- if ((flags & RFPROC) == 0)
- return (fork_norfproc(td, flags, procp));
-
- /*
- * XXX
- * We did have single-threading code here
- * however it proved un-needed and caused problems
- */
+ if ((flags & RFPROC) == 0) {
+ *procp = NULL;
+ return (fork_norfproc(td, flags));
+ }
mem_charged = 0;
vm2 = NULL;
OpenPOWER on IntegriCloud