diff options
author | aiju <devnull@localhost> | 2018-11-10 13:46:16 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-11-10 13:46:16 +0000 |
commit | e6d99771e5c1eef3f69fc847253d4709ffaa84be (patch) | |
tree | 16161401edc25c084ad24533519e094716965635 /sys/src/libdtracy/prov.c | |
parent | 8c097ae84a500eae9c8e4ee21b7b3ea8f8d23259 (diff) |
adding dtracy (crude early version)
Diffstat (limited to 'sys/src/libdtracy/prov.c')
-rw-r--r-- | sys/src/libdtracy/prov.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/src/libdtracy/prov.c b/sys/src/libdtracy/prov.c new file mode 100644 index 000000000..8becbc756 --- /dev/null +++ b/sys/src/libdtracy/prov.c @@ -0,0 +1,76 @@ +#include <u.h> +#include <libc.h> +#include <dtracy.h> + +char * +dtstrdup(char *n) +{ + char *m; + + m = dtmalloc(strlen(n) + 1); + strcpy(m, n); + setmalloctag(m, getcallerpc(&n)); + return m; +} + +DTProbe * +dtpnew(DTName name, DTProvider *prov, void *aux) +{ + DTProbe *p, **pp; + + p = dtmalloc(sizeof(DTProbe)); + p->provider = dtstrdup(name.provider); + p->function = dtstrdup(name.function); + p->name = dtstrdup(name.name); + p->prov = prov; + p->aux = aux; + p->enablist.probnext = p->enablist.probprev = &p->enablist; + for(pp = &prov->probes; *pp != nil; pp = &(*pp)->provnext) + ; + *pp = p; + return p; +} + +int +dtstrmatch(char *a, char *b) +{ + if(a == nil || *a == 0) return 1; + if(b == nil) return 0; + return strcmp(a, b) == 0; +} + +int +dtpmatch(DTName name, DTProbe ***ret) +{ + DTProbe **l; + int nl; + DTProvider **provp, *prov; + DTProbe **pp, *p; + + l = nil; + nl = 0; + for(provp = dtproviders; prov = *provp, prov != nil; provp++){ + if(!dtstrmatch(name.provider, prov->name)) + continue; + for(pp = &prov->probes; p = *pp, p != nil; pp = &p->provnext) + if(dtstrmatch(name.function, p->function) && dtstrmatch(name.name, p->name)){ + if(ret != nil){ + l = dtrealloc(l, (nl + 1) * sizeof(DTProbe *)); + l[nl] = p; + } + nl++; + } + prov->provide(prov, name); + for(; p = *pp, p != nil; pp = &p->provnext) + if(dtstrmatch(name.function, p->function) && dtstrmatch(name.name, p->name)){ + if(ret != nil){ + l = dtrealloc(l, (nl + 1) * sizeof(DTProbe *)); + l[nl] = p; + } + nl++; + } + } + if(ret != nil) + *ret = l; + return nl; +} |