Introduction
Introduction Statistics Contact Development Disclaimer Help
Cache preg entries - smdev - suckless mdev
git clone git://git.suckless.org/smdev
Log
Files
Refs
README
LICENSE
---
commit 9ad57d03f120e0d6f9751bb8105cbd2da19c5bd0
parent 15e7c7796a6d6b8d9739e8215d8b3ab8b8ce5ee1
Author: sin <[email protected]>
Date: Thu, 22 Aug 2013 18:31:56 +0100
Cache preg entries
Diffstat:
M smdev.c | 34 +++++++++++++++++++++++------…
1 file changed, 25 insertions(+), 9 deletions(-)
---
diff --git a/smdev.c b/smdev.c
@@ -32,8 +32,13 @@ enum action {
UNKNOWN_ACTION
};
+static struct pregentry {
+ regex_t preg;
+ int cached;
+} pregcache[LEN(Rules)];
+
static int dohotplug(void);
-static int matchrule(struct Rule *Rule, char *devname);
+static int matchrule(int ruleidx, char *devname);
static void runrule(enum action action, struct Rule *Rule);
static int createdev(struct Event *ev);
static void populatedev(const char *path);
@@ -48,6 +53,7 @@ int
main(int argc, char *argv[])
{
int sflag = 0;
+ int i;
ARGBEGIN {
case 's':
@@ -63,6 +69,11 @@ main(int argc, char *argv[])
else
if (dohotplug() < 0)
eprintf("Environment not set up correctly for hotplugg…
+
+ for (i = 0; i < LEN(pregcache); i++)
+ if (pregcache[i].cached)
+ regfree(&pregcache[i].preg);
+
return 0;
}
@@ -106,18 +117,23 @@ dohotplug(void)
}
static int
-matchrule(struct Rule *Rule, char *devname)
+matchrule(int ruleidx, char *devname)
{
- regex_t match;
+ struct Rule *Rule = &Rules[ruleidx];
+ regex_t *match;
regmatch_t off;
int ret;
- ret = regcomp(&match, Rule->devregex, REG_EXTENDED);
- if (ret < 0)
- eprintf("regcomp:");
+ if (!pregcache[ruleidx].cached) {
+ ret = regcomp(&pregcache[ruleidx].preg,
+ Rule->devregex, REG_EXTENDED);
+ if (ret < 0)
+ eprintf("regcomp:");
+ pregcache[ruleidx].cached = 1;
+ }
+ match = &pregcache[ruleidx].preg;
- ret = regexec(&match, devname, 1, &off, 0);
- regfree(&match);
+ ret = regexec(match, devname, 1, &off, 0);
if (ret || off.rm_so || off.rm_eo != strlen(devname))
return -1;
@@ -166,7 +182,7 @@ createdev(struct Event *ev)
for (i = 0; i < LEN(Rules); i++) {
Rule = &Rules[i];
- if (matchrule(Rule, devname) < 0)
+ if (matchrule(i, devname) < 0)
continue;
if (Rule->path) {
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.