Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Jun 2017 19:06:07 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r319828 - head/etc
Message-ID:  <201706111906.v5BJ676e039387@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Sun Jun 11 19:06:07 2017
New Revision: 319828
URL: https://svnweb.freebsd.org/changeset/base/319828

Log:
  rc.subr: Optimize repeated sourcing.
  
  When /etc/rc runs all /etc/rc.d scripts, it has already loaded /etc/rc.subr
  but each /etc/rc.d script sources it again (since /etc/rc.d scripts must
  also work when started stand-alone).
  
  Therefore, if rc.subr is already loaded, return so sh need not parse the
  rest of the file.
  
  A second effect is that there is no longer a compound command around most of
  rc.subr. This reduces memory usage while sh is loading rc.subr for the first
  time (but this memory is free()d once rc.subr is loaded).
  
  For purposes of porting this to other systems, I do not recommend porting
  this to systems with shells that do not have the change to the return
  special builtin like in r255215 (before FreeBSD 10.0-RELEASE). This change
  ensures that return in the top level of a dot script returns from the dot
  script, even if the dot script was sourced from a function.
  
  A comparison of CPU time on an amd64 bhyve virtual machine from a times
  command added near the end of /etc/rc, all four values summed:
  
  x orig1
  + quickreturn
  +--------------------------------------------------------------------------+
  |  +    +              +                             x    x               x|
  ||______M__A_________|                             |______M___A__________| |
  +--------------------------------------------------------------------------+
      N           Min           Max        Median           Avg        Stddev
  x   3         1.704         1.802         1.726         1.744   0.051419841
  +   3         1.467         1.559         1.487     1.5043333   0.048387326
  Difference at 95.0% confidence
  	-0.239667 +/- 0.113163
  	-13.7424% +/- 6.48873%
  	(Student's t, pooled s = 0.0499266)

Modified:
  head/etc/rc.subr

Modified: head/etc/rc.subr
==============================================================================
--- head/etc/rc.subr	Sun Jun 11 19:05:45 2017	(r319827)
+++ head/etc/rc.subr	Sun Jun 11 19:06:07 2017	(r319828)
@@ -38,7 +38,9 @@
 #	Operating System dependent/independent variables
 #
 
-if [ -z "${_rc_subr_loaded}" ]; then
+if [ -n "${_rc_subr_loaded}" ]; then
+	return
+fi
 
 _rc_subr_loaded="YES"
 
@@ -2126,7 +2128,3 @@ _echoonce()
 if kenv -q rc.debug > /dev/null ; then
 	rc_debug=YES
 fi
-
-fi # [ -z "${_rc_subr_loaded}" ]
-
-_rc_subr_loaded=:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201706111906.v5BJ676e039387>