summaryrefslogtreecommitdiffstats
path: root/bin/sh/var.h
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2012-02-04 23:12:14 +0000
committerjilles <jilles@FreeBSD.org>2012-02-04 23:12:14 +0000
commitc9a60ad55a7cdcf983430853a4bdb15d31340f0b (patch)
treecdf2aa0b0a8655054be3d8275658129bb9b75c99 /bin/sh/var.h
parenta3ada8a47cbcc2eecf9773251384c95d920c9cab (diff)
downloadFreeBSD-src-c9a60ad55a7cdcf983430853a4bdb15d31340f0b.zip
FreeBSD-src-c9a60ad55a7cdcf983430853a4bdb15d31340f0b.tar.gz
sh: Use vfork in a few common cases.
This uses vfork() for simple commands and command substitutions containing a single simple command, invoking an external program under certain conditions (no redirections or variable assignments, non-interactive shell, no job control). These restrictions limit the amount of code executed in a vforked child. There is a large speedup (for example 35%) in microbenchmarks. The difference in buildkernel is smaller (for example 0.5%) but still statistically significant. See http://lists.freebsd.org/pipermail/freebsd-hackers/2012-January/037581.html for some numbers. The use of vfork() can be disabled by setting a variable named SH_DISABLE_VFORK.
Diffstat (limited to 'bin/sh/var.h')
-rw-r--r--bin/sh/var.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/bin/sh/var.h b/bin/sh/var.h
index 347c377..6cdfbfe 100644
--- a/bin/sh/var.h
+++ b/bin/sh/var.h
@@ -79,6 +79,7 @@ extern struct var vppid;
extern struct var vps1;
extern struct var vps2;
extern struct var vps4;
+extern struct var vdisvfork;
#ifndef NO_HISTORY
extern struct var vhistsize;
extern struct var vterm;
@@ -109,6 +110,7 @@ extern int initial_localeisutf8;
#endif
#define mpathset() ((vmpath.flags & VUNSET) == 0)
+#define disvforkset() ((vdisvfork.flags & VUNSET) == 0)
void initvar(void);
void setvar(const char *, const char *, int);
OpenPOWER on IntegriCloud