[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