[Midnightbsd-cvs] src [8896] trunk/sbin/devd: improve devd startup time, by tweaking some string handling routines that are heavily used when parsing config files.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Mon Sep 26 18:34:10 EDT 2016


Revision: 8896
          http://svnweb.midnightbsd.org/src/?rev=8896
Author:   laffer1
Date:     2016-09-26 18:34:09 -0400 (Mon, 26 Sep 2016)
Log Message:
-----------
improve devd startup time, by tweaking some string handling routines that are heavily used when parsing config files.

Modified Paths:
--------------
    trunk/sbin/devd/devd.cc
    trunk/sbin/devd/devd.hh

Modified: trunk/sbin/devd/devd.cc
===================================================================
--- trunk/sbin/devd/devd.cc	2016-09-26 22:33:28 UTC (rev 8895)
+++ trunk/sbin/devd/devd.cc	2016-09-26 22:34:09 UTC (rev 8896)
@@ -137,7 +137,7 @@
 
 event_proc::event_proc() : _prio(-1)
 {
-	// nothing
+	_epsvec.reserve(4);
 }
 
 event_proc::~event_proc()
@@ -241,7 +241,7 @@
 bool
 action::do_action(config &c)
 {
-	string s = c.expand_string(_cmd);
+	string s = c.expand_string(_cmd.c_str());
 	if (Dflag)
 		fprintf(stderr, "Executing '%s'\n", s.c_str());
 	my_system(s.c_str());
@@ -248,18 +248,11 @@
 	return (true);
 }
 
-match::match(config &c, const char *var, const char *re)
-	: _var(var), _re("^")
+match::match(config &c, const char *var, const char *re) :
+	_inv(re[0] == '!'),
+	_var(var),
+	_re(c.expand_string(_inv ? re + 1 : re, "^", "$"))
 {
-	if (!c.expand_string(string(re)).empty() &&
-	    c.expand_string(string(re)).at(0) == '!') {
-		_re.append(c.expand_string(string(re)).substr(1));
-		_inv = 1;
-	} else {
-		_re.append(c.expand_string(string(re)));
-		_inv = 0;
-	}
-	_re.append("$");
 	regcomp(&_regex, _re.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE);
 }
 
@@ -625,25 +618,38 @@
 	do {
 		buffer.append(src++, 1);
 	} while (is_id_char(*src));
-	buffer.append("", 1);
 	dst.append(get_variable(buffer.c_str()));
 }
 
 const string
-config::expand_string(const string &s)
+config::expand_string(const char *src, const char *prepend, const char *append)
 {
-	const char *src;
+	const char *var_at;
 	string dst;
 
-	src = s.c_str();
-	while (*src) {
-		if (*src == '$')
-			expand_one(src, dst);
-		else
-			dst.append(src++, 1);
+	/*
+	 * 128 bytes is enough for 2427 of 2438 expansions that happen
+	 * while parsing config files, as tested on 2013-01-30.
+	 */
+	dst.reserve(128);
+
+	if (prepend != NULL)
+		dst = prepend;
+
+	for (;;) {
+		var_at = strchr(src, '$');
+		if (var_at == NULL) {
+			dst.append(src);
+			break;
+		}
+		dst.append(src, var_at - src);
+		src = var_at;
+		expand_one(src, dst);
 	}
-	dst.append("", 1);
 
+	if (append != NULL)
+		dst.append(append);
+
 	return (dst);
 }
 

Modified: trunk/sbin/devd/devd.hh
===================================================================
--- trunk/sbin/devd/devd.hh	2016-09-26 22:33:28 UTC (rev 8895)
+++ trunk/sbin/devd/devd.hh	2016-09-26 22:34:09 UTC (rev 8896)
@@ -90,9 +90,9 @@
 	virtual bool do_match(config &);
 	virtual bool do_action(config &) { return true; }
 private:
+	bool _inv;
 	std::string _var;
 	std::string _re;
-	bool _inv;
 	regex_t _regex;
 };
 
@@ -162,7 +162,8 @@
 	void pop_var_table();
 	void set_variable(const char *var, const char *val);
 	const std::string &get_variable(const std::string &var);
-	const std::string expand_string(const std::string &var);
+	const std::string expand_string(const char * var, 
+	    const char * prepend = NULL, const char * append = NULL);
 	char *set_vars(char *);
 	void find_and_execute(char);
 protected:



More information about the Midnightbsd-cvs mailing list