From owner-p4-projects@FreeBSD.ORG Mon Jun 30 06:54:11 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3062B1065672; Mon, 30 Jun 2008 06:54:11 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E5EF41065670 for ; Mon, 30 Jun 2008 06:54:10 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id D4CAD8FC19 for ; Mon, 30 Jun 2008 06:54:10 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m5U6sA7g000666 for ; Mon, 30 Jun 2008 06:54:10 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m5U6sAvp000664 for perforce@freebsd.org; Mon, 30 Jun 2008 06:54:10 GMT (envelope-from jb@freebsd.org) Date: Mon, 30 Jun 2008 06:54:10 GMT Message-Id: <200806300654.m5U6sAvp000664@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 144347 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Jun 2008 06:54:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=144347 Change 144347 by jb@freebsd3 on 2008/06/30 06:53:39 Use vfork() rather than fork() because we intend to execvp() anyway. Add provision for the caller to specify a callback to be called after vfork, but before execvp() so that the child process can do a few things. Affected files ... .. //depot/projects/dtrace/src/lib/libproc/libproc.h#6 edit .. //depot/projects/dtrace/src/lib/libproc/proc_create.c#6 edit Differences ... ==== //depot/projects/dtrace/src/lib/libproc/libproc.h#6 (text+ko) ==== @@ -33,6 +33,8 @@ struct proc_handle; +typedef void (*proc_child_func)(void *); + /* Values returned by proc_state(). */ #define PS_IDLE 1 #define PS_STOP 2 @@ -55,7 +57,8 @@ int proc_attach(pid_t pid, int flags, struct proc_handle **pphdl); int proc_continue(struct proc_handle *); int proc_clearflags(struct proc_handle *, int); -int proc_create(const char *, char * const *, struct proc_handle **); +int proc_create(const char *, char * const *, proc_child_func *, void *, + struct proc_handle **); int proc_detach(struct proc_handle *); int proc_getflags(struct proc_handle *); int proc_name2sym(struct proc_handle *, const char *, const char *, GElf_Sym *); ==== //depot/projects/dtrace/src/lib/libproc/proc_create.c#6 (text+ko) ==== @@ -90,7 +90,8 @@ } int -proc_create(const char *file, char * const *argv, struct proc_handle **pphdl) +proc_create(const char *file, char * const *argv, proc_child_func *pcf, + void *child_arg, struct proc_handle **pphdl) { struct proc_handle *phdl; struct kevent kev; @@ -106,13 +107,16 @@ return (ENOMEM); /* Fork a new process. */ - if ((pid = fork()) == -1) + if ((pid = vfork()) == -1) error = errno; else if (pid == 0) { /* The child expects to be traced. */ if (ptrace(PT_TRACE_ME, 0, 0, 0) != 0) _exit(1); + if (pcf != NULL) + (*pcf)(child_arg); + /* Execute the specified file: */ execvp(file, argv);