diff options
author | aiju <devnull@localhost> | 2018-12-08 15:07:53 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-12-08 15:07:53 +0000 |
commit | 58fa29447b845f91dfc2a6734f525ed47375393b (patch) | |
tree | e2ee80e7728e26bc74e1f667ea48968b11a24fc6 /sys/src/libdtracy/prog.c | |
parent | 03e60450c2acc20866867cc5d3649aaed07d0326 (diff) |
dtracy: add support for aggregations
Diffstat (limited to 'sys/src/libdtracy/prog.c')
-rw-r--r-- | sys/src/libdtracy/prog.c | 34 |
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); |