Cache preg entries - smdev - suckless mdev
 (HTM) git clone git://git.suckless.org/smdev
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 9ad57d03f120e0d6f9751bb8105cbd2da19c5bd0
 (DIR) parent 15e7c7796a6d6b8d9739e8215d8b3ab8b8ce5ee1
 (HTM) Author: sin <sin@2f30.org>
       Date:   Thu, 22 Aug 2013 18:31:56 +0100
       
       Cache preg entries
       
       Diffstat:
         M smdev.c                             |      34 +++++++++++++++++++++++--------
       
       1 file changed, 25 insertions(+), 9 deletions(-)
       ---
 (DIR) 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 hotplugging\n");
       +
       +        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) {