summaryrefslogtreecommitdiff
path: root/sys/src/libdtracy/prog.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-12-08 15:07:53 +0000
committeraiju <devnull@localhost>2018-12-08 15:07:53 +0000
commit58fa29447b845f91dfc2a6734f525ed47375393b (patch)
treee2ee80e7728e26bc74e1f667ea48968b11a24fc6 /sys/src/libdtracy/prog.c
parent03e60450c2acc20866867cc5d3649aaed07d0326 (diff)
dtracy: add support for aggregations
Diffstat (limited to 'sys/src/libdtracy/prog.c')
-rw-r--r--sys/src/libdtracy/prog.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/sys/src/libdtracy/prog.c b/sys/src/libdtracy/prog.c
index 2c294068b..dfc670a67 100644
--- a/sys/src/libdtracy/prog.c
+++ b/sys/src/libdtracy/prog.c
@@ -80,7 +80,7 @@ invalid:
}
int
-dtgverify(DTActGr *g)
+dtgverify(DTChan *, DTActGr *g)
{
int i;
@@ -96,6 +96,26 @@ dtgverify(DTActGr *g)
if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > DTRECMAX)
return -1;
break;
+ case ACTAGGKEY:
+ if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > 8)
+ return -1;
+ if(i == g->nact - 1 || g->acts[i+1].type != ACTAGGVAL || g->acts[i+1].agg.id != g->acts[i].agg.id)
+ return -1;
+ break;
+ case ACTAGGVAL:
+ if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0 || (uint)g->acts[i].size > 8)
+ return -1;
+ if(i == 0 || g->acts[i-1].type != ACTAGGKEY)
+ return -1;
+ if(dtaunpackid(&g->acts[i].agg) < 0)
+ return -1;
+ break;
+ case ACTCANCEL:
+ if(g->acts[i].p == nil || dteverify(g->acts[i].p) < 0)
+ return -1;
+ if(i != g->nact - 1)
+ return -1;
+ break;
default:
return -1;
}
@@ -225,6 +245,7 @@ dtgexec(DTActGr *g, ExecInfo *info)
DTBuf *b;
u8int *bp;
s64int v;
+ uchar aggkey[8];
int i, j;
b = g->chan->wrbufs[info->machno];
@@ -240,6 +261,8 @@ dtgexec(DTActGr *g, ExecInfo *info)
PUT4(info->epid);
PUT8(info->ts);
for(i = 0; i < g->nact; i++){
+ if(g->acts[i].type == ACTCANCEL)
+ return 0;
if(dteexec(g->acts[i].p, info, &v) < 0)
return -1;
switch(g->acts[i].type){
@@ -256,6 +279,15 @@ dtgexec(DTActGr *g, ExecInfo *info)
}
bp += g->acts[i].size;
break;
+ case ACTAGGKEY:
+ for(j = 0; j < g->acts[i].size; j++){
+ aggkey[j] = v;
+ v >>= 8;
+ }
+ break;
+ case ACTAGGVAL:
+ dtarecord(g->chan, info->machno, &g->acts[i].agg, aggkey, g->acts[i-1].size, v);
+ break;
}
}
assert(bp - b->data - b->wr == g->reclen);