Author: manu
Date: Thu Nov 28 18:50:33 2019
New Revision: 355184
URL: https://svnweb.freebsd.org/changeset/base/355184

Log:
  MFC r354549-r354550
  
  r354549:
  libpmc: Match on the cpuid with a regex
  
  The CPUID is, or can be, a regex to be matched.
  Use regex from libc instead of strcmp
  
  Tested-by:    gallatin
  
  r354550:
  libpmc: Forgot regex.h
  
  Reported by:  ci
  X-MFC-With:   r354549

Modified:
  stable/12/lib/libpmc/libpmc_pmu_util.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/lib/libpmc/libpmc_pmu_util.c
==============================================================================
--- stable/12/lib/libpmc/libpmc_pmu_util.c      Thu Nov 28 18:44:06 2019        
(r355183)
+++ stable/12/lib/libpmc/libpmc_pmu_util.c      Thu Nov 28 18:50:33 2019        
(r355184)
@@ -34,6 +34,7 @@
 #include <stddef.h>
 #include <stdlib.h>
 #include <limits.h>
+#include <regex.h>
 #include <string.h>
 #include <pmc.h>
 #include <pmclog.h>
@@ -165,8 +166,11 @@ struct pmu_event_desc {
 static const struct pmu_events_map *
 pmu_events_map_get(const char *cpuid)
 {
-       size_t s;
+       regex_t re;
+       regmatch_t pmatch[1];
+       size_t s, len;
        char buf[64];
+       int match;
        const struct pmu_events_map *pme;
 
        if (cpuid != NULL) {
@@ -179,9 +183,20 @@ pmu_events_map_get(const char *cpuid)
                    (void *)NULL, 0) == -1)
                        return (NULL);
        }
-       for (pme = pmu_events_map; pme->cpuid != NULL; pme++)
-               if (strcmp(buf, pme->cpuid) == 0)
-                       return (pme);
+       for (pme = pmu_events_map; pme->cpuid != NULL; pme++) {
+               if (regcomp(&re, pme->cpuid, REG_EXTENDED) != 0) {
+                       printf("regex '%s' failed to compile, ignoring\n",
+                           pme->cpuid);
+                       continue;
+               }
+               match = regexec(&re, buf, 1, pmatch, 0);
+               regfree(&re);
+               if (match == 0) {
+                       len = pmatch[0].rm_eo - pmatch[0].rm_so;
+                       if(len == strlen(buf))
+                               return (pme);
+               }
+       }
        return (NULL);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to