MFV illumos

4471 DTrace count() with histogram
4472 DTrace full width distribution histograms
4473 DTrace frequency trails

MFC after:	2 weeks
This commit is contained in:
rpaulo 2014-06-26 23:24:59 +00:00
commit da67e0c76e
19 changed files with 2283 additions and 39 deletions

View File

@ -0,0 +1,32 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option quiet
#pragma D option encoding=utf8
#pragma D option aggzoom
tick-1ms
/i++ < 320/
{
@ = lquantize(i, 0, 640, 1, i);
@ = lquantize(641 - i, 0, 640, 1, i);
}
tick-1ms
/i == 320/
{
printa(@);
exit(0);
}

View File

@ -0,0 +1,646 @@
value ------------- Distribution ------------- count
0 | 0
1 | 1
2 |▏ 2
3 |▎ 3
4 |▍ 4
5 |▌ 5
6 |▋ 6
7 |▊ 7
8 |▉ 8
9 |█ 9
10 |█▏ 10
11 |█▎ 11
12 |█▍ 12
13 |█▌ 13
14 |█▋ 14
15 |█▊ 15
16 |█▉ 16
17 |██ 17
18 |██▏ 18
19 |██▎ 19
20 |██▍ 20
21 |██▍ 21
22 |██▌ 22
23 |██▋ 23
24 |██▊ 24
25 |██▉ 25
26 |███ 26
27 |███▏ 27
28 |███▎ 28
29 |███▍ 29
30 |███▌ 30
31 |███▋ 31
32 |███▊ 32
33 |███▉ 33
34 |████ 34
35 |████▏ 35
36 |████▎ 36
37 |████▍ 37
38 |████▌ 38
39 |████▋ 39
40 |████▊ 40
41 |████▊ 41
42 |████▉ 42
43 |█████ 43
44 |█████▏ 44
45 |█████▎ 45
46 |█████▍ 46
47 |█████▌ 47
48 |█████▋ 48
49 |█████▊ 49
50 |█████▉ 50
51 |██████ 51
52 |██████▏ 52
53 |██████▎ 53
54 |██████▍ 54
55 |██████▌ 55
56 |██████▋ 56
57 |██████▊ 57
58 |██████▉ 58
59 |███████ 59
60 |███████▏ 60
61 |███████▏ 61
62 |███████▎ 62
63 |███████▍ 63
64 |███████▌ 64
65 |███████▋ 65
66 |███████▊ 66
67 |███████▉ 67
68 |████████ 68
69 |████████▏ 69
70 |████████▎ 70
71 |████████▍ 71
72 |████████▌ 72
73 |████████▋ 73
74 |████████▊ 74
75 |████████▉ 75
76 |█████████ 76
77 |█████████▏ 77
78 |█████████▎ 78
79 |█████████▍ 79
80 |█████████▌ 80
81 |█████████▌ 81
82 |█████████▋ 82
83 |█████████▊ 83
84 |█████████▉ 84
85 |██████████ 85
86 |██████████▏ 86
87 |██████████▎ 87
88 |██████████▍ 88
89 |██████████▌ 89
90 |██████████▋ 90
91 |██████████▊ 91
92 |██████████▉ 92
93 |███████████ 93
94 |███████████▏ 94
95 |███████████▎ 95
96 |███████████▍ 96
97 |███████████▌ 97
98 |███████████▋ 98
99 |███████████▊ 99
100 |███████████▉ 100
101 |███████████▉ 101
102 |████████████ 102
103 |████████████▏ 103
104 |████████████▎ 104
105 |████████████▍ 105
106 |████████████▌ 106
107 |████████████▋ 107
108 |████████████▊ 108
109 |████████████▉ 109
110 |█████████████ 110
111 |█████████████▏ 111
112 |█████████████▎ 112
113 |█████████████▍ 113
114 |█████████████▌ 114
115 |█████████████▋ 115
116 |█████████████▊ 116
117 |█████████████▉ 117
118 |██████████████ 118
119 |██████████████▏ 119
120 |██████████████▎ 120
121 |██████████████▎ 121
122 |██████████████▍ 122
123 |██████████████▌ 123
124 |██████████████▋ 124
125 |██████████████▊ 125
126 |██████████████▉ 126
127 |███████████████ 127
128 |███████████████▏ 128
129 |███████████████▎ 129
130 |███████████████▍ 130
131 |███████████████▌ 131
132 |███████████████▋ 132
133 |███████████████▊ 133
134 |███████████████▉ 134
135 |████████████████ 135
136 |████████████████▏ 136
137 |████████████████▎ 137
138 |████████████████▍ 138
139 |████████████████▌ 139
140 |████████████████▋ 140
141 |████████████████▋ 141
142 |████████████████▊ 142
143 |████████████████▉ 143
144 |█████████████████ 144
145 |█████████████████▏ 145
146 |█████████████████▎ 146
147 |█████████████████▍ 147
148 |█████████████████▌ 148
149 |█████████████████▋ 149
150 |█████████████████▊ 150
151 |█████████████████▉ 151
152 |██████████████████ 152
153 |██████████████████▏ 153
154 |██████████████████▎ 154
155 |██████████████████▍ 155
156 |██████████████████▌ 156
157 |██████████████████▋ 157
158 |██████████████████▊ 158
159 |██████████████████▉ 159
160 |███████████████████ 160
161 |███████████████████ 161
162 |███████████████████▏ 162
163 |███████████████████▎ 163
164 |███████████████████▍ 164
165 |███████████████████▌ 165
166 |███████████████████▋ 166
167 |███████████████████▊ 167
168 |███████████████████▉ 168
169 |████████████████████ 169
170 |████████████████████▏ 170
171 |████████████████████▎ 171
172 |████████████████████▍ 172
173 |████████████████████▌ 173
174 |████████████████████▋ 174
175 |████████████████████▊ 175
176 |████████████████████▉ 176
177 |█████████████████████ 177
178 |█████████████████████▏ 178
179 |█████████████████████▎ 179
180 |█████████████████████▍ 180
181 |█████████████████████▍ 181
182 |█████████████████████▌ 182
183 |█████████████████████▋ 183
184 |█████████████████████▊ 184
185 |█████████████████████▉ 185
186 |██████████████████████ 186
187 |██████████████████████▏ 187
188 |██████████████████████▎ 188
189 |██████████████████████▍ 189
190 |██████████████████████▌ 190
191 |██████████████████████▋ 191
192 |██████████████████████▊ 192
193 |██████████████████████▉ 193
194 |███████████████████████ 194
195 |███████████████████████▏ 195
196 |███████████████████████▎ 196
197 |███████████████████████▍ 197
198 |███████████████████████▌ 198
199 |███████████████████████▋ 199
200 |███████████████████████▊ 200
201 |███████████████████████▊ 201
202 |███████████████████████▉ 202
203 |████████████████████████ 203
204 |████████████████████████▏ 204
205 |████████████████████████▎ 205
206 |████████████████████████▍ 206
207 |████████████████████████▌ 207
208 |████████████████████████▋ 208
209 |████████████████████████▊ 209
210 |████████████████████████▉ 210
211 |█████████████████████████ 211
212 |█████████████████████████▏ 212
213 |█████████████████████████▎ 213
214 |█████████████████████████▍ 214
215 |█████████████████████████▌ 215
216 |█████████████████████████▋ 216
217 |█████████████████████████▊ 217
218 |█████████████████████████▉ 218
219 |██████████████████████████ 219
220 |██████████████████████████▏ 220
221 |██████████████████████████▏ 221
222 |██████████████████████████▎ 222
223 |██████████████████████████▍ 223
224 |██████████████████████████▌ 224
225 |██████████████████████████▋ 225
226 |██████████████████████████▊ 226
227 |██████████████████████████▉ 227
228 |███████████████████████████ 228
229 |███████████████████████████▏ 229
230 |███████████████████████████▎ 230
231 |███████████████████████████▍ 231
232 |███████████████████████████▌ 232
233 |███████████████████████████▋ 233
234 |███████████████████████████▊ 234
235 |███████████████████████████▉ 235
236 |████████████████████████████ 236
237 |████████████████████████████▏ 237
238 |████████████████████████████▎ 238
239 |████████████████████████████▍ 239
240 |████████████████████████████▌ 240
241 |████████████████████████████▌ 241
242 |████████████████████████████▋ 242
243 |████████████████████████████▊ 243
244 |████████████████████████████▉ 244
245 |█████████████████████████████ 245
246 |█████████████████████████████▏ 246
247 |█████████████████████████████▎ 247
248 |█████████████████████████████▍ 248
249 |█████████████████████████████▌ 249
250 |█████████████████████████████▋ 250
251 |█████████████████████████████▊ 251
252 |█████████████████████████████▉ 252
253 |██████████████████████████████ 253
254 |██████████████████████████████▏ 254
255 |██████████████████████████████▎ 255
256 |██████████████████████████████▍ 256
257 |██████████████████████████████▌ 257
258 |██████████████████████████████▋ 258
259 |██████████████████████████████▊ 259
260 |██████████████████████████████▉ 260
261 |██████████████████████████████▉ 261
262 |███████████████████████████████ 262
263 |███████████████████████████████▏ 263
264 |███████████████████████████████▎ 264
265 |███████████████████████████████▍ 265
266 |███████████████████████████████▌ 266
267 |███████████████████████████████▋ 267
268 |███████████████████████████████▊ 268
269 |███████████████████████████████▉ 269
270 |████████████████████████████████ 270
271 |████████████████████████████████▏ 271
272 |████████████████████████████████▎ 272
273 |████████████████████████████████▍ 273
274 |████████████████████████████████▌ 274
275 |████████████████████████████████▋ 275
276 |████████████████████████████████▊ 276
277 |████████████████████████████████▉ 277
278 |█████████████████████████████████ 278
279 |█████████████████████████████████▏ 279
280 |█████████████████████████████████▎ 280
281 |█████████████████████████████████▎ 281
282 |█████████████████████████████████▍ 282
283 |█████████████████████████████████▌ 283
284 |█████████████████████████████████▋ 284
285 |█████████████████████████████████▊ 285
286 |█████████████████████████████████▉ 286
287 |██████████████████████████████████ 287
288 |██████████████████████████████████▏ 288
289 |██████████████████████████████████▎ 289
290 |██████████████████████████████████▍ 290
291 |██████████████████████████████████▌ 291
292 |██████████████████████████████████▋ 292
293 |██████████████████████████████████▊ 293
294 |██████████████████████████████████▉ 294
295 |███████████████████████████████████ 295
296 |███████████████████████████████████▏ 296
297 |███████████████████████████████████▎ 297
298 |███████████████████████████████████▍ 298
299 |███████████████████████████████████▌ 299
300 |███████████████████████████████████▋ 300
301 |███████████████████████████████████▋ 301
302 |███████████████████████████████████▊ 302
303 |███████████████████████████████████▉ 303
304 |████████████████████████████████████ 304
305 |████████████████████████████████████▏ 305
306 |████████████████████████████████████▎ 306
307 |████████████████████████████████████▍ 307
308 |████████████████████████████████████▌ 308
309 |████████████████████████████████████▋ 309
310 |████████████████████████████████████▊ 310
311 |████████████████████████████████████▉ 311
312 |█████████████████████████████████████ 312
313 |█████████████████████████████████████▏ 313
314 |█████████████████████████████████████▎ 314
315 |█████████████████████████████████████▍ 315
316 |█████████████████████████████████████▌ 316
317 |█████████████████████████████████████▋ 317
318 |█████████████████████████████████████▊ 318
319 |█████████████████████████████████████▉ 319
320 |██████████████████████████████████████ 320
321 |██████████████████████████████████████ 320
322 |█████████████████████████████████████▉ 319
323 |█████████████████████████████████████▊ 318
324 |█████████████████████████████████████▋ 317
325 |█████████████████████████████████████▌ 316
326 |█████████████████████████████████████▍ 315
327 |█████████████████████████████████████▎ 314
328 |█████████████████████████████████████▏ 313
329 |█████████████████████████████████████ 312
330 |████████████████████████████████████▉ 311
331 |████████████████████████████████████▊ 310
332 |████████████████████████████████████▋ 309
333 |████████████████████████████████████▌ 308
334 |████████████████████████████████████▍ 307
335 |████████████████████████████████████▎ 306
336 |████████████████████████████████████▏ 305
337 |████████████████████████████████████ 304
338 |███████████████████████████████████▉ 303
339 |███████████████████████████████████▊ 302
340 |███████████████████████████████████▋ 301
341 |███████████████████████████████████▋ 300
342 |███████████████████████████████████▌ 299
343 |███████████████████████████████████▍ 298
344 |███████████████████████████████████▎ 297
345 |███████████████████████████████████▏ 296
346 |███████████████████████████████████ 295
347 |██████████████████████████████████▉ 294
348 |██████████████████████████████████▊ 293
349 |██████████████████████████████████▋ 292
350 |██████████████████████████████████▌ 291
351 |██████████████████████████████████▍ 290
352 |██████████████████████████████████▎ 289
353 |██████████████████████████████████▏ 288
354 |██████████████████████████████████ 287
355 |█████████████████████████████████▉ 286
356 |█████████████████████████████████▊ 285
357 |█████████████████████████████████▋ 284
358 |█████████████████████████████████▌ 283
359 |█████████████████████████████████▍ 282
360 |█████████████████████████████████▎ 281
361 |█████████████████████████████████▎ 280
362 |█████████████████████████████████▏ 279
363 |█████████████████████████████████ 278
364 |████████████████████████████████▉ 277
365 |████████████████████████████████▊ 276
366 |████████████████████████████████▋ 275
367 |████████████████████████████████▌ 274
368 |████████████████████████████████▍ 273
369 |████████████████████████████████▎ 272
370 |████████████████████████████████▏ 271
371 |████████████████████████████████ 270
372 |███████████████████████████████▉ 269
373 |███████████████████████████████▊ 268
374 |███████████████████████████████▋ 267
375 |███████████████████████████████▌ 266
376 |███████████████████████████████▍ 265
377 |███████████████████████████████▎ 264
378 |███████████████████████████████▏ 263
379 |███████████████████████████████ 262
380 |██████████████████████████████▉ 261
381 |██████████████████████████████▉ 260
382 |██████████████████████████████▊ 259
383 |██████████████████████████████▋ 258
384 |██████████████████████████████▌ 257
385 |██████████████████████████████▍ 256
386 |██████████████████████████████▎ 255
387 |██████████████████████████████▏ 254
388 |██████████████████████████████ 253
389 |█████████████████████████████▉ 252
390 |█████████████████████████████▊ 251
391 |█████████████████████████████▋ 250
392 |█████████████████████████████▌ 249
393 |█████████████████████████████▍ 248
394 |█████████████████████████████▎ 247
395 |█████████████████████████████▏ 246
396 |█████████████████████████████ 245
397 |████████████████████████████▉ 244
398 |████████████████████████████▊ 243
399 |████████████████████████████▋ 242
400 |████████████████████████████▌ 241
401 |████████████████████████████▌ 240
402 |████████████████████████████▍ 239
403 |████████████████████████████▎ 238
404 |████████████████████████████▏ 237
405 |████████████████████████████ 236
406 |███████████████████████████▉ 235
407 |███████████████████████████▊ 234
408 |███████████████████████████▋ 233
409 |███████████████████████████▌ 232
410 |███████████████████████████▍ 231
411 |███████████████████████████▎ 230
412 |███████████████████████████▏ 229
413 |███████████████████████████ 228
414 |██████████████████████████▉ 227
415 |██████████████████████████▊ 226
416 |██████████████████████████▋ 225
417 |██████████████████████████▌ 224
418 |██████████████████████████▍ 223
419 |██████████████████████████▎ 222
420 |██████████████████████████▏ 221
421 |██████████████████████████▏ 220
422 |██████████████████████████ 219
423 |█████████████████████████▉ 218
424 |█████████████████████████▊ 217
425 |█████████████████████████▋ 216
426 |█████████████████████████▌ 215
427 |█████████████████████████▍ 214
428 |█████████████████████████▎ 213
429 |█████████████████████████▏ 212
430 |█████████████████████████ 211
431 |████████████████████████▉ 210
432 |████████████████████████▊ 209
433 |████████████████████████▋ 208
434 |████████████████████████▌ 207
435 |████████████████████████▍ 206
436 |████████████████████████▎ 205
437 |████████████████████████▏ 204
438 |████████████████████████ 203
439 |███████████████████████▉ 202
440 |███████████████████████▊ 201
441 |███████████████████████▊ 200
442 |███████████████████████▋ 199
443 |███████████████████████▌ 198
444 |███████████████████████▍ 197
445 |███████████████████████▎ 196
446 |███████████████████████▏ 195
447 |███████████████████████ 194
448 |██████████████████████▉ 193
449 |██████████████████████▊ 192
450 |██████████████████████▋ 191
451 |██████████████████████▌ 190
452 |██████████████████████▍ 189
453 |██████████████████████▎ 188
454 |██████████████████████▏ 187
455 |██████████████████████ 186
456 |█████████████████████▉ 185
457 |█████████████████████▊ 184
458 |█████████████████████▋ 183
459 |█████████████████████▌ 182
460 |█████████████████████▍ 181
461 |█████████████████████▍ 180
462 |█████████████████████▎ 179
463 |█████████████████████▏ 178
464 |█████████████████████ 177
465 |████████████████████▉ 176
466 |████████████████████▊ 175
467 |████████████████████▋ 174
468 |████████████████████▌ 173
469 |████████████████████▍ 172
470 |████████████████████▎ 171
471 |████████████████████▏ 170
472 |████████████████████ 169
473 |███████████████████▉ 168
474 |███████████████████▊ 167
475 |███████████████████▋ 166
476 |███████████████████▌ 165
477 |███████████████████▍ 164
478 |███████████████████▎ 163
479 |███████████████████▏ 162
480 |███████████████████ 161
481 |███████████████████ 160
482 |██████████████████▉ 159
483 |██████████████████▊ 158
484 |██████████████████▋ 157
485 |██████████████████▌ 156
486 |██████████████████▍ 155
487 |██████████████████▎ 154
488 |██████████████████▏ 153
489 |██████████████████ 152
490 |█████████████████▉ 151
491 |█████████████████▊ 150
492 |█████████████████▋ 149
493 |█████████████████▌ 148
494 |█████████████████▍ 147
495 |█████████████████▎ 146
496 |█████████████████▏ 145
497 |█████████████████ 144
498 |████████████████▉ 143
499 |████████████████▊ 142
500 |████████████████▋ 141
501 |████████████████▋ 140
502 |████████████████▌ 139
503 |████████████████▍ 138
504 |████████████████▎ 137
505 |████████████████▏ 136
506 |████████████████ 135
507 |███████████████▉ 134
508 |███████████████▊ 133
509 |███████████████▋ 132
510 |███████████████▌ 131
511 |███████████████▍ 130
512 |███████████████▎ 129
513 |███████████████▏ 128
514 |███████████████ 127
515 |██████████████▉ 126
516 |██████████████▊ 125
517 |██████████████▋ 124
518 |██████████████▌ 123
519 |██████████████▍ 122
520 |██████████████▎ 121
521 |██████████████▎ 120
522 |██████████████▏ 119
523 |██████████████ 118
524 |█████████████▉ 117
525 |█████████████▊ 116
526 |█████████████▋ 115
527 |█████████████▌ 114
528 |█████████████▍ 113
529 |█████████████▎ 112
530 |█████████████▏ 111
531 |█████████████ 110
532 |████████████▉ 109
533 |████████████▊ 108
534 |████████████▋ 107
535 |████████████▌ 106
536 |████████████▍ 105
537 |████████████▎ 104
538 |████████████▏ 103
539 |████████████ 102
540 |███████████▉ 101
541 |███████████▉ 100
542 |███████████▊ 99
543 |███████████▋ 98
544 |███████████▌ 97
545 |███████████▍ 96
546 |███████████▎ 95
547 |███████████▏ 94
548 |███████████ 93
549 |██████████▉ 92
550 |██████████▊ 91
551 |██████████▋ 90
552 |██████████▌ 89
553 |██████████▍ 88
554 |██████████▎ 87
555 |██████████▏ 86
556 |██████████ 85
557 |█████████▉ 84
558 |█████████▊ 83
559 |█████████▋ 82
560 |█████████▌ 81
561 |█████████▌ 80
562 |█████████▍ 79
563 |█████████▎ 78
564 |█████████▏ 77
565 |█████████ 76
566 |████████▉ 75
567 |████████▊ 74
568 |████████▋ 73
569 |████████▌ 72
570 |████████▍ 71
571 |████████▎ 70
572 |████████▏ 69
573 |████████ 68
574 |███████▉ 67
575 |███████▊ 66
576 |███████▋ 65
577 |███████▌ 64
578 |███████▍ 63
579 |███████▎ 62
580 |███████▏ 61
581 |███████▏ 60
582 |███████ 59
583 |██████▉ 58
584 |██████▊ 57
585 |██████▋ 56
586 |██████▌ 55
587 |██████▍ 54
588 |██████▎ 53
589 |██████▏ 52
590 |██████ 51
591 |█████▉ 50
592 |█████▊ 49
593 |█████▋ 48
594 |█████▌ 47
595 |█████▍ 46
596 |█████▎ 45
597 |█████▏ 44
598 |█████ 43
599 |████▉ 42
600 |████▊ 41
601 |████▊ 40
602 |████▋ 39
603 |████▌ 38
604 |████▍ 37
605 |████▎ 36
606 |████▏ 35
607 |████ 34
608 |███▉ 33
609 |███▊ 32
610 |███▋ 31
611 |███▌ 30
612 |███▍ 29
613 |███▎ 28
614 |███▏ 27
615 |███ 26
616 |██▉ 25
617 |██▊ 24
618 |██▋ 23
619 |██▌ 22
620 |██▍ 21
621 |██▍ 20
622 |██▎ 19
623 |██▏ 18
624 |██ 17
625 |█▉ 16
626 |█▊ 15
627 |█▋ 14
628 |█▌ 13
629 |█▍ 12
630 |█▎ 11
631 |█▏ 10
632 |█ 9
633 |▉ 8
634 |▊ 7
635 |▋ 6
636 |▌ 5
637 |▍ 4
638 |▎ 3
639 |▏ 2
>= 640 | 1

View File

@ -0,0 +1,46 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option agghist
#pragma D option quiet
BEGIN
{
@["demerit"] = sum(-10);
@["wtf"] = sum(10);
@["bot"] = sum(20);
@bagnoogle["SOAP/XML"] = sum(1);
@bagnoogle["XACML store"] = sum(5);
@bagnoogle["SAML token"] = sum(6);
@stalloogle["breakfast"] = sum(-5);
@stalloogle["non-diet pepsi"] = sum(-20);
@stalloogle["parrot"] = sum(-100);
printa(@);
printa(@bagnoogle);
printa(@stalloogle);
printf("\nzoomed:");
setopt("aggzoom");
printa(@);
printa(@bagnoogle);
printa(@stalloogle);
exit(0);
}

View File

@ -0,0 +1,38 @@
key ------------- Distribution ------------- count
demerit @@@@@| -10
wtf |@@@@@ 10
bot |@@@@@@@@@@ 20
key ------------- Distribution ------------- count
SOAP/XML |@@@ 1
XACML store |@@@@@@@@@@@@@@@@@ 5
SAML token |@@@@@@@@@@@@@@@@@@@@ 6
key ------------- Distribution ------------- count
parrot @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -100
non-diet pepsi @@@@@@| -20
breakfast @@| -5
zoomed:
key ------------- Distribution ------------- count
demerit @@@@@@@@@@| -10
wtf |@@@@@@@@@@ 10
bot |@@@@@@@@@@@@@@@@@@@ 20
key ------------- Distribution ------------- count
SOAP/XML |@@@@@@@ 1
XACML store |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5
SAML token |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 6
key ------------- Distribution ------------- count
parrot @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| -100
non-diet pepsi @@@@@@@@| -20
breakfast @@| -5

View File

@ -0,0 +1,53 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option aggpack
#pragma D option encoding=ascii
#pragma D option quiet
BEGIN
{
@x = quantize(1 << 32);
@y[1] = quantize(1);
@z["mumble"] = quantize(1);
@xx["foo", (char)1, (short)2, (long)3] = quantize(1);
@neg = lquantize(-10, -10, 20, 1, -1);
@neg = lquantize(-5, -10, 20, 1, 1);
@neg = lquantize(0, -10, 20, 1, 1);
i = 0;
}
tick-1ms
{
@a[i] = quantize(0, i);
@a[i] = quantize(1, 100 - i);
i++;
}
tick-1ms
/i > 100/
{
exit(0);
}
END
{
setopt("aggzoom", "true");
printa(@neg);
setopt("aggzoom", "false");
printa(@neg);
}

View File

@ -0,0 +1,124 @@
min .--------------------------------. max | count
< -10 : V X X : >= 20 | 1
min .--------------------------------. max | count
< -10 : v x x : >= 20 | 1
min .---. max | count
2147483648 : X : 8589934592 | 1
key min .---. max | count
1 0 : X : 2 | 1
key min .---. max | count
mumble 0 : X : 2 | 1
key min .---. max | count
foo 1 2 3 0 : X : 2 | 1
key min .---. max | count
100 0 :X : 2 | 100
99 0 :X_ : 2 | 100
98 0 :X_ : 2 | 100
97 0 :X_ : 2 | 100
96 0 :X_ : 2 | 100
95 0 :X_ : 2 | 100
94 0 :X_ : 2 | 100
93 0 :X_ : 2 | 100
92 0 :X_ : 2 | 100
91 0 :X_ : 2 | 100
90 0 :X_ : 2 | 100
89 0 :X_ : 2 | 100
88 0 :X_ : 2 | 100
87 0 :X_ : 2 | 100
86 0 :X_ : 2 | 100
85 0 :X_ : 2 | 100
84 0 :X_ : 2 | 100
83 0 :X_ : 2 | 100
82 0 :X_ : 2 | 100
81 0 :X_ : 2 | 100
80 0 :X_ : 2 | 100
79 0 :X_ : 2 | 100
78 0 :xx : 2 | 100
77 0 :xx : 2 | 100
76 0 :xx : 2 | 100
75 0 :xx : 2 | 100
74 0 :xx : 2 | 100
73 0 :xx : 2 | 100
72 0 :xx : 2 | 100
71 0 :xx : 2 | 100
70 0 :xx : 2 | 100
69 0 :xx : 2 | 100
68 0 :xx : 2 | 100
67 0 :xx : 2 | 100
66 0 :xx : 2 | 100
65 0 :xx : 2 | 100
64 0 :xx : 2 | 100
63 0 :xx : 2 | 100
62 0 :xx : 2 | 100
61 0 :xx : 2 | 100
60 0 :xx : 2 | 100
59 0 :xx : 2 | 100
58 0 :xx : 2 | 100
57 0 :xx : 2 | 100
56 0 :xx : 2 | 100
55 0 :xx : 2 | 100
54 0 :xx : 2 | 100
53 0 :xx : 2 | 100
52 0 :xx : 2 | 100
51 0 :xx : 2 | 100
50 0 :xx : 2 | 100
49 0 :xx : 2 | 100
48 0 :xx : 2 | 100
47 0 :xx : 2 | 100
46 0 :xx : 2 | 100
45 0 :xx : 2 | 100
44 0 :xx : 2 | 100
43 0 :xx : 2 | 100
42 0 :xx : 2 | 100
41 0 :xx : 2 | 100
40 0 :xx : 2 | 100
39 0 :xx : 2 | 100
38 0 :xx : 2 | 100
37 0 :xx : 2 | 100
36 0 :xx : 2 | 100
35 0 :xx : 2 | 100
34 0 :xx : 2 | 100
33 0 :xx : 2 | 100
32 0 :xx : 2 | 100
31 0 :xx : 2 | 100
30 0 :xx : 2 | 100
29 0 :xx : 2 | 100
28 0 :xx : 2 | 100
27 0 :xx : 2 | 100
26 0 :xx : 2 | 100
25 0 :xx : 2 | 100
24 0 :xx : 2 | 100
23 0 :xx : 2 | 100
22 0 :xx : 2 | 100
21 0 :_X : 2 | 100
20 0 :_X : 2 | 100
19 0 :_X : 2 | 100
18 0 :_X : 2 | 100
17 0 :_X : 2 | 100
16 0 :_X : 2 | 100
15 0 :_X : 2 | 100
14 0 :_X : 2 | 100
13 0 :_X : 2 | 100
12 0 :_X : 2 | 100
11 0 :_X : 2 | 100
10 0 :_X : 2 | 100
9 0 :_X : 2 | 100
8 0 :_X : 2 | 100
7 0 :_X : 2 | 100
6 0 :_X : 2 | 100
5 0 :_X : 2 | 100
4 0 :_X : 2 | 100
3 0 :_X : 2 | 100
2 0 :_X : 2 | 100
1 0 :_X : 2 | 100
0 0 : X : 2 | 100

View File

@ -0,0 +1,75 @@
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright (c) 2013 Joyent, Inc. All rights reserved.
#
let width=8
function outputchar
{
banner $3 | /bin/nawk -v line=$1 -v pos=$2 -v width=$width '{ \
for (i = 1; i <= length($0); i++) { \
if (substr($0, i, 1) == " ") \
continue; \
printf("\t@letter%d[%d] = lquantize(%d, 0, 40, 1);\n", \
line, NR, i + (pos * width));
} \
}'
}
function outputstr
{
let pos=0;
let line=0
printf "#pragma D option aggpack\n#pragma D option aggsortkey\n"
printf "BEGIN\n{\n"
for c in `echo "$1" | /bin/nawk '{ \
for (i = 1; i <= length($0); i++) { \
c = substr($0, i, 1); \
printf("%s\n", c == " " ? "space" : \
c == "\n" ? "newline" : c); \
} \
}'`; do
if [[ "$c" == "space" ]]; then
let line=line+1
let pos=0
continue
fi
outputchar $line $pos $c
let pos=pos+1
done
let i=0
while [[ $i -le $line ]]; do
printf "\tprinta(@letter%d);\n" $i
let i=i+1
done
printf "\texit(0);\n}\n"
}
dtrace -qs /dev/stdin -x encoding=utf8 <<EOF
`outputstr "why must i do this"`
EOF
dtrace -qs /dev/stdin -x encoding=ascii -x aggzoom <<EOF
`outputstr "i am not well"`
EOF
dtrace -qs /dev/stdin -x encoding=utf8 -x aggzoom <<EOF
`outputstr "send help"`
EOF

View File

@ -0,0 +1,102 @@
key min .------------------------------------------. max | count
2 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
3 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
4 < 0 : ▂ ▂ ▂▂▂▂▂▂ ▂ : >= 40 | 9
5 < 0 : ▂ ▂▂ ▂ ▂ ▂ ▂ : >= 40 | 7
6 < 0 : ▂▂ ▂▂ ▂ ▂ ▂ : >= 40 | 7
7 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
key min .------------------------------------------. max | count
2 < 0 : ▂ ▂ ▂ ▂ ▂▂▂▂ ▂▂▂▂▂ : >= 40 | 13
3 < 0 : ▂▂ ▂▂ ▂ ▂ ▂ ▂ : >= 40 | 8
4 < 0 : ▂ ▂▂ ▂ ▂ ▂ ▂▂▂▂ ▂ : >= 40 | 11
5 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
6 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 7
7 < 0 : ▂ ▂ ▂▂▂▂ ▂▂▂▂ ▂ : >= 40 | 11
key min .------------------------------------------. max | count
2 < 0 : █ : >= 40 | 1
3 < 0 : █ : >= 40 | 1
4 < 0 : █ : >= 40 | 1
5 < 0 : █ : >= 40 | 1
6 < 0 : █ : >= 40 | 1
7 < 0 : █ : >= 40 | 1
key min .------------------------------------------. max | count
2 < 0 : ▂▂▂▂▂ ▂▂▂▂ : >= 40 | 9
3 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
4 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
5 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
6 < 0 : ▃ ▃ ▃ ▃ : >= 40 | 4
7 < 0 : ▂▂▂▂▂ ▂▂▂▂ : >= 40 | 9
key min .------------------------------------------. max | count
2 < 0 : ▂▂▂▂▂ ▂ ▂ ▂ ▂▂▂▂ : >= 40 | 12
3 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
4 < 0 : ▂ ▂▂▂▂▂▂ ▂ ▂▂▂▂ : >= 40 | 12
5 < 0 : ▂ ▂ ▂ ▂ ▂ : >= 40 | 5
6 < 0 : ▂ ▂ ▂ ▂ ▂ ▂ : >= 40 | 6
7 < 0 : ▂ ▂ ▂ ▂ ▂▂▂▂ : >= 40 | 8
key min .------------------------------------------. max | count
2 < 0 : X : >= 40 | 1
3 < 0 : X : >= 40 | 1
4 < 0 : X : >= 40 | 1
5 < 0 : X : >= 40 | 1
6 < 0 : X : >= 40 | 1
7 < 0 : X : >= 40 | 1
key min .------------------------------------------. max | count
2 < 0 : XX X X : >= 40 | 4
3 < 0 : X X XX XX : >= 40 | 6
4 < 0 : X X X XX X : >= 40 | 6
5 < 0 : XXXXXX X X : >= 40 | 8
6 < 0 : X X X X : >= 40 | 4
7 < 0 : X X X X : >= 40 | 4
key min .------------------------------------------. max | count
2 < 0 : X X XXXX XXXXX : >= 40 | 11
3 < 0 : XX X X X X : >= 40 | 6
4 < 0 : X X X X X X : >= 40 | 6
5 < 0 : X X X X X X : >= 40 | 6
6 < 0 : X XX X X X : >= 40 | 6
7 < 0 : X X XXXX X : >= 40 | 7
key min .------------------------------------------. max | count
2 < 0 : X X XXXXXX X X : >= 40 | 10
3 < 0 : X X X X X : >= 40 | 5
4 < 0 : X X XXXXX X X : >= 40 | 9
5 < 0 : X XX X X X X : >= 40 | 7
6 < 0 : XX XX X X X : >= 40 | 7
7 < 0 : X X XXXXXX XXXXXX XXXXXX : >= 40 | 20
key min .------------------------------------------. max | count
2 < 0 : ████ ██████ █ █ █████ : >= 40 | 17
3 < 0 : █ █ ██ █ █ █ : >= 40 | 7
4 < 0 : ████ █████ █ █ █ █ █ : >= 40 | 14
5 < 0 : █ █ █ █ █ █ █ : >= 40 | 7
6 < 0 : █ █ █ █ ██ █ █ : >= 40 | 8
7 < 0 : ████ ██████ █ █ █████ : >= 40 | 17
key min .------------------------------------------. max | count
2 < 0 : █ █ ██████ █ █████ : >= 40 | 14
3 < 0 : █ █ █ █ █ █ : >= 40 | 6
4 < 0 : ██████ █████ █ █ █ : >= 40 | 14
5 < 0 : █ █ █ █ █████ : >= 40 | 9
6 < 0 : █ █ █ █ █ : >= 40 | 5
7 < 0 : █ █ ██████ ██████ █ : >= 40 | 15

View File

@ -0,0 +1,43 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option encoding=ascii
#pragma D option quiet
tick-1ms
/i++ < 30/
{
@[1] = lquantize(i, 0, 40, 1, 1000);
@[2] = lquantize(i, 0, 40, 1, 1000);
@[3] = lquantize(i, 0, 40, 1, 1000);
}
tick-1ms
/i == 40/
{
@[1] = lquantize(0, 0, 40, 1, 1);
@[1] = lquantize(i, 0, 40, 1, 2000);
@[2] = lquantize(0, 0, 40, 1, 1);
@[2] = lquantize(i, 0, 40, 1, 2000);
@[3] = lquantize(0, 0, 40, 1, 1);
@[3] = lquantize(i, 0, 40, 1, 2000);
printa(@);
setopt("aggpack");
printa(@);
setopt("aggzoom");
printa(@);
exit(0);
}

View File

@ -0,0 +1,149 @@
1
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
2
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
3
value ------------- Distribution ------------- count
< 0 | 0
0 | 1
1 |@ 1000
2 |@ 1000
3 |@ 1000
4 |@ 1000
5 |@ 1000
6 |@ 1000
7 |@ 1000
8 |@ 1000
9 |@ 1000
10 |@ 1000
11 |@ 1000
12 |@ 1000
13 |@ 1000
14 |@ 1000
15 |@ 1000
16 |@ 1000
17 |@ 1000
18 |@ 1000
19 |@ 1000
20 |@ 1000
21 |@ 1000
22 |@ 1000
23 |@ 1000
24 |@ 1000
25 |@ 1000
26 |@ 1000
27 |@ 1000
28 |@ 1000
29 |@ 1000
30 |@ 1000
31 | 0
32 | 0
33 | 0
34 | 0
35 | 0
36 | 0
37 | 0
38 | 0
39 | 0
>= 40 |@@ 2000
key min .------------------------------------------. max | count
1 < 0 : _______________________________ _: >= 40 | 32001
2 < 0 : _______________________________ _: >= 40 | 32001
3 < 0 : _______________________________ _: >= 40 | 32001
key min .------------------------------------------. max | count
1 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001
2 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001
3 < 0 : _xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X: >= 40 | 32001

View File

@ -0,0 +1,35 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
#pragma D option encoding=ascii
#pragma D option quiet
tick-1ms
/i++ < 90/
{
@ = lquantize(i, 0, 100, 1, 1000);
}
tick-1ms
/i == 100/
{
@ = lquantize(i++, 0, 100, 1, 2000);
@ = lquantize(i++, 0, 100, 1, 3000);
printa(@);
setopt("aggzoom");
printa(@);
exit(0);
}

View File

@ -0,0 +1,211 @@
value ------------- Distribution ------------- count
0 | 0
1 | 1000
2 | 1000
3 | 1000
4 | 1000
5 | 1000
6 | 1000
7 | 1000
8 | 1000
9 | 1000
10 | 1000
11 | 1000
12 | 1000
13 | 1000
14 | 1000
15 | 1000
16 | 1000
17 | 1000
18 | 1000
19 | 1000
20 | 1000
21 | 1000
22 | 1000
23 | 1000
24 | 1000
25 | 1000
26 | 1000
27 | 1000
28 | 1000
29 | 1000
30 | 1000
31 | 1000
32 | 1000
33 | 1000
34 | 1000
35 | 1000
36 | 1000
37 | 1000
38 | 1000
39 | 1000
40 | 1000
41 | 1000
42 | 1000
43 | 1000
44 | 1000
45 | 1000
46 | 1000
47 | 1000
48 | 1000
49 | 1000
50 | 1000
51 | 1000
52 | 1000
53 | 1000
54 | 1000
55 | 1000
56 | 1000
57 | 1000
58 | 1000
59 | 1000
60 | 1000
61 | 1000
62 | 1000
63 | 1000
64 | 1000
65 | 1000
66 | 1000
67 | 1000
68 | 1000
69 | 1000
70 | 1000
71 | 1000
72 | 1000
73 | 1000
74 | 1000
75 | 1000
76 | 1000
77 | 1000
78 | 1000
79 | 1000
80 | 1000
81 | 1000
82 | 1000
83 | 1000
84 | 1000
85 | 1000
86 | 1000
87 | 1000
88 | 1000
89 | 1000
90 | 1000
91 | 0
92 | 0
93 | 0
94 | 0
95 | 0
96 | 0
97 | 0
98 | 0
99 | 0
>= 100 |@@ 5000
value ------------- Distribution ------------- count
0 | 0
1 |@@@@@@@@ 1000
2 |@@@@@@@@ 1000
3 |@@@@@@@@ 1000
4 |@@@@@@@@ 1000
5 |@@@@@@@@ 1000
6 |@@@@@@@@ 1000
7 |@@@@@@@@ 1000
8 |@@@@@@@@ 1000
9 |@@@@@@@@ 1000
10 |@@@@@@@@ 1000
11 |@@@@@@@@ 1000
12 |@@@@@@@@ 1000
13 |@@@@@@@@ 1000
14 |@@@@@@@@ 1000
15 |@@@@@@@@ 1000
16 |@@@@@@@@ 1000
17 |@@@@@@@@ 1000
18 |@@@@@@@@ 1000
19 |@@@@@@@@ 1000
20 |@@@@@@@@ 1000
21 |@@@@@@@@ 1000
22 |@@@@@@@@ 1000
23 |@@@@@@@@ 1000
24 |@@@@@@@@ 1000
25 |@@@@@@@@ 1000
26 |@@@@@@@@ 1000
27 |@@@@@@@@ 1000
28 |@@@@@@@@ 1000
29 |@@@@@@@@ 1000
30 |@@@@@@@@ 1000
31 |@@@@@@@@ 1000
32 |@@@@@@@@ 1000
33 |@@@@@@@@ 1000
34 |@@@@@@@@ 1000
35 |@@@@@@@@ 1000
36 |@@@@@@@@ 1000
37 |@@@@@@@@ 1000
38 |@@@@@@@@ 1000
39 |@@@@@@@@ 1000
40 |@@@@@@@@ 1000
41 |@@@@@@@@ 1000
42 |@@@@@@@@ 1000
43 |@@@@@@@@ 1000
44 |@@@@@@@@ 1000
45 |@@@@@@@@ 1000
46 |@@@@@@@@ 1000
47 |@@@@@@@@ 1000
48 |@@@@@@@@ 1000
49 |@@@@@@@@ 1000
50 |@@@@@@@@ 1000
51 |@@@@@@@@ 1000
52 |@@@@@@@@ 1000
53 |@@@@@@@@ 1000
54 |@@@@@@@@ 1000
55 |@@@@@@@@ 1000
56 |@@@@@@@@ 1000
57 |@@@@@@@@ 1000
58 |@@@@@@@@ 1000
59 |@@@@@@@@ 1000
60 |@@@@@@@@ 1000
61 |@@@@@@@@ 1000
62 |@@@@@@@@ 1000
63 |@@@@@@@@ 1000
64 |@@@@@@@@ 1000
65 |@@@@@@@@ 1000
66 |@@@@@@@@ 1000
67 |@@@@@@@@ 1000
68 |@@@@@@@@ 1000
69 |@@@@@@@@ 1000
70 |@@@@@@@@ 1000
71 |@@@@@@@@ 1000
72 |@@@@@@@@ 1000
73 |@@@@@@@@ 1000
74 |@@@@@@@@ 1000
75 |@@@@@@@@ 1000
76 |@@@@@@@@ 1000
77 |@@@@@@@@ 1000
78 |@@@@@@@@ 1000
79 |@@@@@@@@ 1000
80 |@@@@@@@@ 1000
81 |@@@@@@@@ 1000
82 |@@@@@@@@ 1000
83 |@@@@@@@@ 1000
84 |@@@@@@@@ 1000
85 |@@@@@@@@ 1000
86 |@@@@@@@@ 1000
87 |@@@@@@@@ 1000
88 |@@@@@@@@ 1000
89 |@@@@@@@@ 1000
90 |@@@@@@@@ 1000
91 | 0
92 | 0
93 | 0
94 | 0
95 | 0
96 | 0
97 | 0
98 | 0
99 | 0
>= 100 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 5000

View File

@ -25,7 +25,7 @@
*/
/*
* Copyright (c) 2011, Joyent, Inc. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -1300,6 +1300,231 @@ dtrace_aggregate_walk(dtrace_hdl_t *dtp, dtrace_aggregate_f *func, void *arg)
return (0);
}
static int
dt_aggregate_total(dtrace_hdl_t *dtp, boolean_t clear)
{
dt_ahashent_t *h;
dtrace_aggdata_t **total;
dtrace_aggid_t max = DTRACE_AGGVARIDNONE, id;
dt_aggregate_t *agp = &dtp->dt_aggregate;
dt_ahash_t *hash = &agp->dtat_hash;
uint32_t tflags;
tflags = DTRACE_A_TOTAL | DTRACE_A_HASNEGATIVES | DTRACE_A_HASPOSITIVES;
/*
* If we need to deliver per-aggregation totals, we're going to take
* three passes over the aggregate: one to clear everything out and
* determine our maximum aggregation ID, one to actually total
* everything up, and a final pass to assign the totals to the
* individual elements.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
if ((id = dt_aggregate_aggvarid(h)) > max)
max = id;
aggdata->dtada_total = 0;
aggdata->dtada_flags &= ~tflags;
}
if (clear || max == DTRACE_AGGVARIDNONE)
return (0);
total = dt_zalloc(dtp, (max + 1) * sizeof (dtrace_aggdata_t *));
if (total == NULL)
return (-1);
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
dtrace_recdesc_t *rec;
caddr_t data;
int64_t val, *addr;
rec = &agg->dtagd_rec[agg->dtagd_nrecs - 1];
data = aggdata->dtada_data;
addr = (int64_t *)(uintptr_t)(data + rec->dtrd_offset);
switch (rec->dtrd_action) {
case DTRACEAGG_STDDEV:
val = dt_stddev((uint64_t *)addr, 1);
break;
case DTRACEAGG_SUM:
case DTRACEAGG_COUNT:
val = *addr;
break;
case DTRACEAGG_AVG:
val = addr[0] ? (addr[1] / addr[0]) : 0;
break;
default:
continue;
}
if (total[agg->dtagd_varid] == NULL) {
total[agg->dtagd_varid] = aggdata;
aggdata->dtada_flags |= DTRACE_A_TOTAL;
} else {
aggdata = total[agg->dtagd_varid];
}
if (val > 0)
aggdata->dtada_flags |= DTRACE_A_HASPOSITIVES;
if (val < 0) {
aggdata->dtada_flags |= DTRACE_A_HASNEGATIVES;
val = -val;
}
if (dtp->dt_options[DTRACEOPT_AGGZOOM] != DTRACEOPT_UNSET) {
val = (int64_t)((long double)val *
(1 / DTRACE_AGGZOOM_MAX));
if (val > aggdata->dtada_total)
aggdata->dtada_total = val;
} else {
aggdata->dtada_total += val;
}
}
/*
* And now one final pass to set everyone's total.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data, *t;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
if ((t = total[agg->dtagd_varid]) == NULL || aggdata == t)
continue;
aggdata->dtada_total = t->dtada_total;
aggdata->dtada_flags |= (t->dtada_flags & tflags);
}
dt_free(dtp, total);
return (0);
}
static int
dt_aggregate_minmaxbin(dtrace_hdl_t *dtp, boolean_t clear)
{
dt_ahashent_t *h;
dtrace_aggdata_t **minmax;
dtrace_aggid_t max = DTRACE_AGGVARIDNONE, id;
dt_aggregate_t *agp = &dtp->dt_aggregate;
dt_ahash_t *hash = &agp->dtat_hash;
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
if ((id = dt_aggregate_aggvarid(h)) > max)
max = id;
aggdata->dtada_minbin = 0;
aggdata->dtada_maxbin = 0;
aggdata->dtada_flags &= ~DTRACE_A_MINMAXBIN;
}
if (clear || max == DTRACE_AGGVARIDNONE)
return (0);
minmax = dt_zalloc(dtp, (max + 1) * sizeof (dtrace_aggdata_t *));
if (minmax == NULL)
return (-1);
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
dtrace_recdesc_t *rec;
caddr_t data;
int64_t *addr;
int minbin = -1, maxbin = -1, i;
int start = 0, size;
rec = &agg->dtagd_rec[agg->dtagd_nrecs - 1];
size = rec->dtrd_size / sizeof (int64_t);
data = aggdata->dtada_data;
addr = (int64_t *)(uintptr_t)(data + rec->dtrd_offset);
switch (rec->dtrd_action) {
case DTRACEAGG_LQUANTIZE:
/*
* For lquantize(), we always display the entire range
* of the aggregation when aggpack is set.
*/
start = 1;
minbin = start;
maxbin = size - 1 - start;
break;
case DTRACEAGG_QUANTIZE:
for (i = start; i < size; i++) {
if (!addr[i])
continue;
if (minbin == -1)
minbin = i - start;
maxbin = i - start;
}
if (minbin == -1) {
/*
* If we have no data (e.g., due to a clear()
* or negative increments), we'll use the
* zero bucket as both our min and max.
*/
minbin = maxbin = DTRACE_QUANTIZE_ZEROBUCKET;
}
break;
default:
continue;
}
if (minmax[agg->dtagd_varid] == NULL) {
minmax[agg->dtagd_varid] = aggdata;
aggdata->dtada_flags |= DTRACE_A_MINMAXBIN;
aggdata->dtada_minbin = minbin;
aggdata->dtada_maxbin = maxbin;
continue;
}
if (minbin < minmax[agg->dtagd_varid]->dtada_minbin)
minmax[agg->dtagd_varid]->dtada_minbin = minbin;
if (maxbin > minmax[agg->dtagd_varid]->dtada_maxbin)
minmax[agg->dtagd_varid]->dtada_maxbin = maxbin;
}
/*
* And now one final pass to set everyone's minbin and maxbin.
*/
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall) {
dtrace_aggdata_t *aggdata = &h->dtahe_data, *mm;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
if ((mm = minmax[agg->dtagd_varid]) == NULL || aggdata == mm)
continue;
aggdata->dtada_minbin = mm->dtada_minbin;
aggdata->dtada_maxbin = mm->dtada_maxbin;
aggdata->dtada_flags |= DTRACE_A_MINMAXBIN;
}
dt_free(dtp, minmax);
return (0);
}
static int
dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
dtrace_aggregate_f *func, void *arg,
@ -1309,6 +1534,23 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
dt_ahashent_t *h, **sorted;
dt_ahash_t *hash = &agp->dtat_hash;
size_t i, nentries = 0;
int rval = -1;
agp->dtat_flags &= ~(DTRACE_A_TOTAL | DTRACE_A_MINMAXBIN);
if (dtp->dt_options[DTRACEOPT_AGGHIST] != DTRACEOPT_UNSET) {
agp->dtat_flags |= DTRACE_A_TOTAL;
if (dt_aggregate_total(dtp, B_FALSE) != 0)
return (-1);
}
if (dtp->dt_options[DTRACEOPT_AGGPACK] != DTRACEOPT_UNSET) {
agp->dtat_flags |= DTRACE_A_MINMAXBIN;
if (dt_aggregate_minmaxbin(dtp, B_FALSE) != 0)
return (-1);
}
for (h = hash->dtah_all; h != NULL; h = h->dtahe_nextall)
nentries++;
@ -1316,7 +1558,7 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
sorted = dt_alloc(dtp, nentries * sizeof (dt_ahashent_t *));
if (sorted == NULL)
return (-1);
goto out;
for (h = hash->dtah_all, i = 0; h != NULL; h = h->dtahe_nextall)
sorted[i++] = h;
@ -1340,14 +1582,20 @@ dt_aggregate_walk_sorted(dtrace_hdl_t *dtp,
for (i = 0; i < nentries; i++) {
h = sorted[i];
if (dt_aggwalk_rval(dtp, h, func(&h->dtahe_data, arg)) == -1) {
dt_free(dtp, sorted);
return (-1);
}
if (dt_aggwalk_rval(dtp, h, func(&h->dtahe_data, arg)) == -1)
goto out;
}
rval = 0;
out:
if (agp->dtat_flags & DTRACE_A_TOTAL)
(void) dt_aggregate_total(dtp, B_TRUE);
if (agp->dtat_flags & DTRACE_A_MINMAXBIN)
(void) dt_aggregate_minmaxbin(dtp, B_TRUE);
dt_free(dtp, sorted);
return (0);
return (rval);
}
int
@ -1870,6 +2118,8 @@ dtrace_aggregate_print(dtrace_hdl_t *dtp, FILE *fp,
{
dt_print_aggdata_t pd;
bzero(&pd, sizeof (pd));
pd.dtpa_dtp = dtp;
pd.dtpa_fp = fp;
pd.dtpa_allunprint = 1;

View File

@ -24,7 +24,7 @@
*/
/*
* Copyright (c) 2011, Joyent, Inc. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -59,6 +59,25 @@ dt_fabsl(long double x)
return (x);
}
static int
dt_ndigits(long long val)
{
int rval = 1;
long long cmp = 10;
if (val < 0) {
val = val == INT64_MIN ? INT64_MAX : -val;
rval++;
}
while (val > cmp && cmp > 0) {
rval++;
cmp *= 10;
}
return (rval < 4 ? 4 : rval);
}
/*
* 128-bit arithmetic functions needed to support the stddev() aggregating
* action.
@ -487,7 +506,125 @@ dt_nullrec()
return (DTRACE_CONSUME_NEXT);
}
int
static void
dt_quantize_total(dtrace_hdl_t *dtp, int64_t datum, long double *total)
{
long double val = dt_fabsl((long double)datum);
if (dtp->dt_options[DTRACEOPT_AGGZOOM] == DTRACEOPT_UNSET) {
*total += val;
return;
}
/*
* If we're zooming in on an aggregation, we want the height of the
* highest value to be approximately 95% of total bar height -- so we
* adjust up by the reciprocal of DTRACE_AGGZOOM_MAX when comparing to
* our highest value.
*/
val *= 1 / DTRACE_AGGZOOM_MAX;
if (*total < val)
*total = val;
}
static int
dt_print_quanthdr(dtrace_hdl_t *dtp, FILE *fp, int width)
{
return (dt_printf(dtp, fp, "\n%*s %41s %-9s\n",
width ? width : 16, width ? "key" : "value",
"------------- Distribution -------------", "count"));
}
static int
dt_print_quanthdr_packed(dtrace_hdl_t *dtp, FILE *fp, int width,
const dtrace_aggdata_t *aggdata, dtrace_actkind_t action)
{
int min = aggdata->dtada_minbin, max = aggdata->dtada_maxbin;
int minwidth, maxwidth, i;
assert(action == DTRACEAGG_QUANTIZE || action == DTRACEAGG_LQUANTIZE);
if (action == DTRACEAGG_QUANTIZE) {
if (min != 0 && min != DTRACE_QUANTIZE_ZEROBUCKET)
min--;
if (max < DTRACE_QUANTIZE_NBUCKETS - 1)
max++;
minwidth = dt_ndigits(DTRACE_QUANTIZE_BUCKETVAL(min));
maxwidth = dt_ndigits(DTRACE_QUANTIZE_BUCKETVAL(max));
} else {
maxwidth = 8;
minwidth = maxwidth - 1;
max++;
}
if (dt_printf(dtp, fp, "\n%*s %*s .",
width, width > 0 ? "key" : "", minwidth, "min") < 0)
return (-1);
for (i = min; i <= max; i++) {
if (dt_printf(dtp, fp, "-") < 0)
return (-1);
}
return (dt_printf(dtp, fp, ". %*s | count\n", -maxwidth, "max"));
}
/*
* We use a subset of the Unicode Block Elements (U+2588 through U+258F,
* inclusive) to represent aggregations via UTF-8 -- which are expressed via
* 3-byte UTF-8 sequences.
*/
#define DTRACE_AGGUTF8_FULL 0x2588
#define DTRACE_AGGUTF8_BASE 0x258f
#define DTRACE_AGGUTF8_LEVELS 8
#define DTRACE_AGGUTF8_BYTE0(val) (0xe0 | ((val) >> 12))
#define DTRACE_AGGUTF8_BYTE1(val) (0x80 | (((val) >> 6) & 0x3f))
#define DTRACE_AGGUTF8_BYTE2(val) (0x80 | ((val) & 0x3f))
static int
dt_print_quantline_utf8(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
uint64_t normal, long double total)
{
uint_t len = 40, i, whole, partial;
long double f = (dt_fabsl((long double)val) * len) / total;
const char *spaces = " ";
whole = (uint_t)f;
partial = (uint_t)((f - (long double)(uint_t)f) *
(long double)DTRACE_AGGUTF8_LEVELS);
if (dt_printf(dtp, fp, "|") < 0)
return (-1);
for (i = 0; i < whole; i++) {
if (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(DTRACE_AGGUTF8_FULL),
DTRACE_AGGUTF8_BYTE1(DTRACE_AGGUTF8_FULL),
DTRACE_AGGUTF8_BYTE2(DTRACE_AGGUTF8_FULL)) < 0)
return (-1);
}
if (partial != 0) {
partial = DTRACE_AGGUTF8_BASE - (partial - 1);
if (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(partial),
DTRACE_AGGUTF8_BYTE1(partial),
DTRACE_AGGUTF8_BYTE2(partial)) < 0)
return (-1);
i++;
}
return (dt_printf(dtp, fp, "%s %-9lld\n", spaces + i,
(long long)val / normal));
}
static int
dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
uint64_t normal, long double total, char positives, char negatives)
{
@ -505,6 +642,11 @@ dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
if (!negatives) {
if (positives) {
if (dtp->dt_encoding == DT_ENCODING_UTF8) {
return (dt_print_quantline_utf8(dtp, fp, val,
normal, total));
}
f = (dt_fabsl((long double)val) * len) / total;
depth = (uint_t)(f + 0.5);
} else {
@ -547,6 +689,73 @@ dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
}
}
/*
* As with UTF-8 printing of aggregations, we use a subset of the Unicode
* Block Elements (U+2581 through U+2588, inclusive) to represent our packed
* aggregation.
*/
#define DTRACE_AGGPACK_BASE 0x2581
#define DTRACE_AGGPACK_LEVELS 8
static int
dt_print_packed(dtrace_hdl_t *dtp, FILE *fp,
long double datum, long double total)
{
static boolean_t utf8_checked = B_FALSE;
static boolean_t utf8;
char *ascii = "__xxxxXX";
char *neg = "vvvvVV";
unsigned int len;
long double val;
if (!utf8_checked) {
char *term;
/*
* We want to determine if we can reasonably emit UTF-8 for our
* packed aggregation. To do this, we will check for terminals
* that are known to be primitive to emit UTF-8 on these.
*/
utf8_checked = B_TRUE;
if (dtp->dt_encoding == DT_ENCODING_ASCII) {
utf8 = B_FALSE;
} else if (dtp->dt_encoding == DT_ENCODING_UTF8) {
utf8 = B_TRUE;
} else if ((term = getenv("TERM")) != NULL &&
(strcmp(term, "sun") == 0 ||
strcmp(term, "sun-color") == 0) ||
strcmp(term, "dumb") == 0) {
utf8 = B_FALSE;
} else {
utf8 = B_TRUE;
}
}
if (datum == 0)
return (dt_printf(dtp, fp, " "));
if (datum < 0) {
len = strlen(neg);
val = dt_fabsl(datum * (len - 1)) / total;
return (dt_printf(dtp, fp, "%c", neg[(uint_t)(val + 0.5)]));
}
if (utf8) {
int block = DTRACE_AGGPACK_BASE + (unsigned int)(((datum *
(DTRACE_AGGPACK_LEVELS - 1)) / total) + 0.5);
return (dt_printf(dtp, fp, "%c%c%c",
DTRACE_AGGUTF8_BYTE0(block),
DTRACE_AGGUTF8_BYTE1(block),
DTRACE_AGGUTF8_BYTE2(block)));
}
len = strlen(ascii);
val = (datum * (len - 1)) / total;
return (dt_printf(dtp, fp, "%c", ascii[(uint_t)(val + 0.5)]));
}
int
dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -564,9 +773,9 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
if (first_bin == DTRACE_QUANTIZE_NBUCKETS - 1) {
/*
* There isn't any data. This is possible if (and only if)
* negative increment values have been used. In this case,
* we'll print the buckets around 0.
* There isn't any data. This is possible if the aggregation
* has been clear()'d or if negative increment values have been
* used. Regardless, we'll print the buckets around 0.
*/
first_bin = DTRACE_QUANTIZE_ZEROBUCKET - 1;
last_bin = DTRACE_QUANTIZE_ZEROBUCKET + 1;
@ -584,11 +793,10 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
"------------- Distribution -------------", "count") < 0)
if (dt_print_quanthdr(dtp, fp, 0) < 0)
return (-1);
for (i = first_bin; i <= last_bin; i++) {
@ -604,6 +812,48 @@ dt_print_quantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
return (0);
}
int
dt_print_quantize_packed(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, const dtrace_aggdata_t *aggdata)
{
const int64_t *data = addr;
long double total = 0, count = 0;
int min = aggdata->dtada_minbin, max = aggdata->dtada_maxbin, i;
int64_t minval, maxval;
if (size != DTRACE_QUANTIZE_NBUCKETS * sizeof (uint64_t))
return (dt_set_errno(dtp, EDT_DMISMATCH));
if (min != 0 && min != DTRACE_QUANTIZE_ZEROBUCKET)
min--;
if (max < DTRACE_QUANTIZE_NBUCKETS - 1)
max++;
minval = DTRACE_QUANTIZE_BUCKETVAL(min);
maxval = DTRACE_QUANTIZE_BUCKETVAL(max);
if (dt_printf(dtp, fp, " %*lld :", dt_ndigits(minval),
(long long)minval) < 0)
return (-1);
for (i = min; i <= max; i++) {
dt_quantize_total(dtp, data[i], &total);
count += data[i];
}
for (i = min; i <= max; i++) {
if (dt_print_packed(dtp, fp, data[i], total) < 0)
return (-1);
}
if (dt_printf(dtp, fp, ": %*lld | %lld\n",
-dt_ndigits(maxval), (long long)maxval, (long long)count) < 0)
return (-1);
return (0);
}
int
dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -651,7 +901,7 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
@ -663,8 +913,7 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
int err;
if (i == 0) {
(void) snprintf(c, sizeof (c), "< %d",
base / (uint32_t)normal);
(void) snprintf(c, sizeof (c), "< %d", base);
err = dt_printf(dtp, fp, "%16s ", c);
} else if (i == levels + 1) {
(void) snprintf(c, sizeof (c), ">= %d",
@ -683,6 +932,59 @@ dt_print_lquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
return (0);
}
/*ARGSUSED*/
int
dt_print_lquantize_packed(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, const dtrace_aggdata_t *aggdata)
{
const int64_t *data = addr;
long double total = 0, count = 0;
int min, max, base, err;
uint64_t arg;
uint16_t step, levels;
char c[32];
unsigned int i;
if (size < sizeof (uint64_t))
return (dt_set_errno(dtp, EDT_DMISMATCH));
arg = *data++;
size -= sizeof (uint64_t);
base = DTRACE_LQUANTIZE_BASE(arg);
step = DTRACE_LQUANTIZE_STEP(arg);
levels = DTRACE_LQUANTIZE_LEVELS(arg);
if (size != sizeof (uint64_t) * (levels + 2))
return (dt_set_errno(dtp, EDT_DMISMATCH));
min = 0;
max = levels + 1;
if (min == 0) {
(void) snprintf(c, sizeof (c), "< %d", base);
err = dt_printf(dtp, fp, "%8s :", c);
} else {
err = dt_printf(dtp, fp, "%8d :", base + (min - 1) * step);
}
if (err < 0)
return (-1);
for (i = min; i <= max; i++) {
dt_quantize_total(dtp, data[i], &total);
count += data[i];
}
for (i = min; i <= max; i++) {
if (dt_print_packed(dtp, fp, data[i], total) < 0)
return (-1);
}
(void) snprintf(c, sizeof (c), ">= %d", base + (levels * step));
return (dt_printf(dtp, fp, ": %-8s | %lld\n", c, (long long)count));
}
int
dt_print_llquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
size_t size, uint64_t normal)
@ -740,7 +1042,7 @@ dt_print_llquantize(dtrace_hdl_t *dtp, FILE *fp, const void *addr,
for (i = first_bin; i <= last_bin; i++) {
positives |= (data[i] > 0);
negatives |= (data[i] < 0);
total += dt_fabsl((long double)data[i]);
dt_quantize_total(dtp, data[i], &total);
}
if (dt_printf(dtp, fp, "\n%16s %41s %-9s\n", "value",
@ -823,7 +1125,7 @@ dt_print_stddev(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
}
/*ARGSUSED*/
int
static int
dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
size_t nbytes, int width, int quiet, int forceraw)
{
@ -876,10 +1178,12 @@ dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
if (j != nbytes)
break;
if (quiet)
if (quiet) {
return (dt_printf(dtp, fp, "%s", c));
else
return (dt_printf(dtp, fp, " %-*s", width, c));
} else {
return (dt_printf(dtp, fp, " %s%*s",
width < 0 ? " " : "", width, c));
}
}
break;
@ -1793,10 +2097,83 @@ dt_trunc(dtrace_hdl_t *dtp, caddr_t base, dtrace_recdesc_t *rec)
static int
dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
caddr_t addr, size_t size, uint64_t normal)
caddr_t addr, size_t size, const dtrace_aggdata_t *aggdata,
uint64_t normal, dt_print_aggdata_t *pd)
{
int err;
int err, width;
dtrace_actkind_t act = rec->dtrd_action;
boolean_t packed = pd->dtpa_agghist || pd->dtpa_aggpack;
dtrace_aggdesc_t *agg = aggdata->dtada_desc;
static struct {
size_t size;
int width;
int packedwidth;
} *fmt, fmttab[] = {
{ sizeof (uint8_t), 3, 3 },
{ sizeof (uint16_t), 5, 5 },
{ sizeof (uint32_t), 8, 8 },
{ sizeof (uint64_t), 16, 16 },
{ 0, -50, 16 }
};
if (packed && pd->dtpa_agghisthdr != agg->dtagd_varid) {
dtrace_recdesc_t *r;
width = 0;
/*
* To print our quantization header for either an agghist or
* aggpack aggregation, we need to iterate through all of our
* of our records to determine their width.
*/
for (r = rec; !DTRACEACT_ISAGG(r->dtrd_action); r++) {
for (fmt = fmttab; fmt->size &&
fmt->size != r->dtrd_size; fmt++)
continue;
width += fmt->packedwidth + 1;
}
if (pd->dtpa_agghist) {
if (dt_print_quanthdr(dtp, fp, width) < 0)
return (-1);
} else {
if (dt_print_quanthdr_packed(dtp, fp,
width, aggdata, r->dtrd_action) < 0)
return (-1);
}
pd->dtpa_agghisthdr = agg->dtagd_varid;
}
if (pd->dtpa_agghist && DTRACEACT_ISAGG(act)) {
char positives = aggdata->dtada_flags & DTRACE_A_HASPOSITIVES;
char negatives = aggdata->dtada_flags & DTRACE_A_HASNEGATIVES;
int64_t val;
assert(act == DTRACEAGG_SUM || act == DTRACEAGG_COUNT);
val = (long long)*((uint64_t *)addr);
if (dt_printf(dtp, fp, " ") < 0)
return (-1);
return (dt_print_quantline(dtp, fp, val, normal,
aggdata->dtada_total, positives, negatives));
}
if (pd->dtpa_aggpack && DTRACEACT_ISAGG(act)) {
switch (act) {
case DTRACEAGG_QUANTIZE:
return (dt_print_quantize_packed(dtp,
fp, addr, size, aggdata));
case DTRACEAGG_LQUANTIZE:
return (dt_print_lquantize_packed(dtp,
fp, addr, size, aggdata));
default:
break;
}
}
switch (act) {
case DTRACEACT_STACK:
@ -1839,28 +2216,33 @@ dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
break;
}
for (fmt = fmttab; fmt->size && fmt->size != size; fmt++)
continue;
width = packed ? fmt->packedwidth : fmt->width;
switch (size) {
case sizeof (uint64_t):
err = dt_printf(dtp, fp, " %16lld",
err = dt_printf(dtp, fp, " %*lld", width,
/* LINTED - alignment */
(long long)*((uint64_t *)addr) / normal);
break;
case sizeof (uint32_t):
/* LINTED - alignment */
err = dt_printf(dtp, fp, " %8d", *((uint32_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint32_t *)addr) /
(uint32_t)normal);
break;
case sizeof (uint16_t):
/* LINTED - alignment */
err = dt_printf(dtp, fp, " %5d", *((uint16_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint16_t *)addr) /
(uint32_t)normal);
break;
case sizeof (uint8_t):
err = dt_printf(dtp, fp, " %3d", *((uint8_t *)addr) /
err = dt_printf(dtp, fp, " %*d", width, *((uint8_t *)addr) /
(uint32_t)normal);
break;
default:
err = dt_print_bytes(dtp, fp, addr, size, 50, 0, 0);
err = dt_print_bytes(dtp, fp, addr, size, width, 0, 0);
break;
}
@ -1881,6 +2263,9 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
caddr_t addr;
size_t size;
pd->dtpa_agghist = (aggdata->dtada_flags & DTRACE_A_TOTAL);
pd->dtpa_aggpack = (aggdata->dtada_flags & DTRACE_A_MINMAXBIN);
/*
* Iterate over each record description in the key, printing the traced
* data, skipping the first datum (the tuple member created by the
@ -1897,7 +2282,8 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
break;
}
if (dt_print_datum(dtp, fp, rec, addr, size, 1) < 0)
if (dt_print_datum(dtp, fp, rec, addr,
size, aggdata, 1, pd) < 0)
return (-1);
if (dt_buffered_flush(dtp, NULL, rec, aggdata,
@ -1920,7 +2306,8 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
assert(DTRACEACT_ISAGG(act));
normal = aggdata->dtada_normal;
if (dt_print_datum(dtp, fp, rec, addr, size, normal) < 0)
if (dt_print_datum(dtp, fp, rec, addr,
size, aggdata, normal, pd) < 0)
return (-1);
if (dt_buffered_flush(dtp, NULL, rec, aggdata,
@ -1931,8 +2318,10 @@ dt_print_aggs(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg)
agg->dtagd_flags |= DTRACE_AGD_PRINTED;
}
if (dt_printf(dtp, fp, "\n") < 0)
return (-1);
if (!pd->dtpa_agghist && !pd->dtpa_aggpack) {
if (dt_printf(dtp, fp, "\n") < 0)
return (-1);
}
if (dt_buffered_flush(dtp, NULL, NULL, aggdata,
DTRACE_BUFDATA_AGGFORMAT | DTRACE_BUFDATA_AGGLAST) < 0)
@ -2401,7 +2790,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu,
}
n = dt_print_bytes(dtp, fp, addr,
tracememsize, 33, quiet, 1);
tracememsize, -33, quiet, 1);
tracememsize = 0;
@ -2434,7 +2823,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu,
break;
default:
n = dt_print_bytes(dtp, fp, addr,
rec->dtrd_size, 33, quiet, 0);
rec->dtrd_size, -33, quiet, 0);
break;
}

View File

@ -193,6 +193,9 @@ typedef struct dt_print_aggdata {
dtrace_aggvarid_t dtpa_id; /* aggregation variable of interest */
FILE *dtpa_fp; /* file pointer */
int dtpa_allunprint; /* print only unprinted aggregations */
int dtpa_agghist; /* print aggregation as histogram */
int dtpa_agghisthdr; /* aggregation histogram hdr printed */
int dtpa_aggpack; /* pack quantized aggregations */
} dt_print_aggdata_t;
typedef struct dt_dirpath {
@ -287,6 +290,7 @@ struct dtrace_hdl {
uint_t dt_linktype; /* dtrace link output file type (see below) */
uint_t dt_xlatemode; /* dtrace translator linking mode (see below) */
uint_t dt_stdcmode; /* dtrace stdc compatibility mode (see below) */
uint_t dt_encoding; /* dtrace output encoding (see below) */
uint_t dt_treedump; /* dtrace tree debug bitmap (see below) */
uint64_t dt_options[DTRACEOPT_MAX]; /* dtrace run-time options */
int dt_version; /* library version requested by client */
@ -377,6 +381,14 @@ struct dtrace_hdl {
#define DT_STDC_XS 2 /* K&R C: __STDC__ not defined */
#define DT_STDC_XT 3 /* ISO C + K&R C compat with ISO: __STDC__=0 */
/*
* Values for the dt_encoding property, which is used to force a particular
* character encoding (overriding default behavior and/or automatic detection).
*/
#define DT_ENCODING_UNSET 0
#define DT_ENCODING_ASCII 1
#define DT_ENCODING_UTF8 2
/*
* Macro to test whether a given pass bit is set in the dt_treedump bit-vector.
* If the bit for pass 'p' is set, the D compiler displays the parse tree for

View File

@ -125,8 +125,9 @@
#define DT_VERS_1_10 DT_VERSION_NUMBER(1, 10, 0)
#define DT_VERS_1_11 DT_VERSION_NUMBER(1, 11, 0)
#define DT_VERS_1_12 DT_VERSION_NUMBER(1, 12, 0)
#define DT_VERS_LATEST DT_VERS_1_12
#define DT_VERS_STRING "Sun D 1.12"
#define DT_VERS_1_12_1 DT_VERSION_NUMBER(1, 12, 1)
#define DT_VERS_LATEST DT_VERS_1_12_1
#define DT_VERS_STRING "Sun D 1.12.1"
const dt_version_t _dtrace_versions[] = {
DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */
@ -151,6 +152,7 @@ const dt_version_t _dtrace_versions[] = {
DT_VERS_1_10, /* D API 1.10 */
DT_VERS_1_11, /* D API 1.11 */
DT_VERS_1_12, /* D API 1.12 */
DT_VERS_1_12_1, /* D API 1.12.1 */
0
};
@ -1156,6 +1158,7 @@ dt_vopen(int version, int flags, int *errp,
dtp->dt_linktype = DT_LTYP_ELF;
dtp->dt_xlatemode = DT_XL_STATIC;
dtp->dt_stdcmode = DT_STDC_XA;
dtp->dt_encoding = DT_ENCODING_UNSET;
dtp->dt_version = version;
dtp->dt_fd = dtfd;
dtp->dt_ftfd = ftfd;

View File

@ -25,6 +25,7 @@
*/
/*
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
*/
@ -336,6 +337,23 @@ dt_opt_linktype(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
return (0);
}
/*ARGSUSED*/
static int
dt_opt_encoding(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
{
if (arg == NULL)
return (dt_set_errno(dtp, EDT_BADOPTVAL));
if (strcmp(arg, "ascii") == 0)
dtp->dt_encoding = DT_ENCODING_ASCII;
else if (strcmp(arg, "utf8") == 0)
dtp->dt_encoding = DT_ENCODING_UTF8;
else
return (dt_set_errno(dtp, EDT_BADOPTVAL));
return (0);
}
/*ARGSUSED*/
static int
dt_opt_evaltime(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
@ -928,6 +946,7 @@ static const dt_option_t _dtrace_ctoptions[] = {
{ "define", dt_opt_cpp_opts, (uintptr_t)"-D" },
{ "droptags", dt_opt_droptags },
{ "empty", dt_opt_cflags, DTRACE_C_EMPTY },
{ "encoding", dt_opt_encoding },
{ "errtags", dt_opt_cflags, DTRACE_C_ETAGS },
{ "evaltime", dt_opt_evaltime },
{ "incdir", dt_opt_cpp_opts, (uintptr_t)"-I" },
@ -988,11 +1007,14 @@ static const dt_option_t _dtrace_rtoptions[] = {
* Dynamic run-time options.
*/
static const dt_option_t _dtrace_drtoptions[] = {
{ "agghist", dt_opt_runtime, DTRACEOPT_AGGHIST },
{ "aggpack", dt_opt_runtime, DTRACEOPT_AGGPACK },
{ "aggrate", dt_opt_rate, DTRACEOPT_AGGRATE },
{ "aggsortkey", dt_opt_runtime, DTRACEOPT_AGGSORTKEY },
{ "aggsortkeypos", dt_opt_runtime, DTRACEOPT_AGGSORTKEYPOS },
{ "aggsortpos", dt_opt_runtime, DTRACEOPT_AGGSORTPOS },
{ "aggsortrev", dt_opt_runtime, DTRACEOPT_AGGSORTREV },
{ "aggzoom", dt_opt_runtime, DTRACEOPT_AGGZOOM },
{ "flowindent", dt_opt_runtime, DTRACEOPT_FLOWINDENT },
{ "quiet", dt_opt_runtime, DTRACEOPT_QUIET },
{ "rawbytes", dt_opt_runtime, DTRACEOPT_RAWBYTES },

View File

@ -357,6 +357,12 @@ extern int dtrace_handle_setopt(dtrace_hdl_t *,
#define DTRACE_A_PERCPU 0x0001
#define DTRACE_A_KEEPDELTA 0x0002
#define DTRACE_A_ANONYMOUS 0x0004
#define DTRACE_A_TOTAL 0x0008
#define DTRACE_A_MINMAXBIN 0x0010
#define DTRACE_A_HASNEGATIVES 0x0020
#define DTRACE_A_HASPOSITIVES 0x0040
#define DTRACE_AGGZOOM_MAX 0.95 /* height of max bar */
#define DTRACE_AGGWALK_ERROR -1 /* error while processing */
#define DTRACE_AGGWALK_NEXT 0 /* proceed to next element */
@ -377,6 +383,10 @@ struct dtrace_aggdata {
caddr_t dtada_delta; /* delta data, if available */
caddr_t *dtada_percpu; /* per CPU data, if avail */
caddr_t *dtada_percpu_delta; /* per CPU delta, if avail */
int64_t dtada_total; /* per agg total, if avail */
uint16_t dtada_minbin; /* minimum bin, if avail */
uint16_t dtada_maxbin; /* maximum bin, if avail */
uint32_t dtada_flags; /* flags */
};
typedef int dtrace_aggregate_f(const dtrace_aggdata_t *, void *);

View File

@ -1034,7 +1034,11 @@ typedef struct dtrace_fmtdesc {
#define DTRACEOPT_AGGSORTPOS 25 /* agg. position to sort on */
#define DTRACEOPT_AGGSORTKEYPOS 26 /* agg. key position to sort on */
#define DTRACEOPT_TEMPORAL 27 /* temporally ordered output */
#define DTRACEOPT_MAX 28 /* number of options */
#define DTRACEOPT_AGGHIST 28 /* histogram aggregation output */
#define DTRACEOPT_AGGPACK 29 /* packed aggregation output */
#define DTRACEOPT_AGGZOOM 30 /* zoomed aggregation scaling */
#define DTRACEOPT_ZONE 31 /* zone in which to enable probes */
#define DTRACEOPT_MAX 32 /* number of options */
#define DTRACEOPT_UNSET (dtrace_optval_t)-2 /* unset option */