summaryrefslogtreecommitdiff
path: root/sys/src/libdtracy/prov.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-11-10 13:46:16 +0000
committeraiju <devnull@localhost>2018-11-10 13:46:16 +0000
commite6d99771e5c1eef3f69fc847253d4709ffaa84be (patch)
tree16161401edc25c084ad24533519e094716965635 /sys/src/libdtracy/prov.c
parent8c097ae84a500eae9c8e4ee21b7b3ea8f8d23259 (diff)
adding dtracy (crude early version)
Diffstat (limited to 'sys/src/libdtracy/prov.c')
-rw-r--r--sys/src/libdtracy/prov.c76
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;
+}