/*PRINTFLIKE1*/ static void dfatal(const char *fmt, ...) { va_list ap; va_start(ap, fmt); (void) fprintf(stderr, "%s: ", g_pname); if (fmt != NULL) (void) vfprintf(stderr, fmt, ap); va_end(ap); if (fmt != NULL && fmt[strlen(fmt) - 1] != '\n') { (void) fprintf(stderr, ": %s\n", dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); } else if (fmt == NULL) { (void) fprintf(stderr, "%s\n", dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); } if (g_pr != NULL) { dtrace_proc_continue(g_dtp, g_pr); dtrace_proc_release(g_dtp, g_pr); } exit(E_ERROR); }
/*PRINTFLIKE1*/ static void fatal(const char *fmt, ...) { va_list ap; va_start(ap, fmt); verror(fmt, ap); va_end(ap); if (g_pr != NULL && g_dtp != NULL) dtrace_proc_release(g_dtp, g_pr); exit(E_ERROR); }
/*ARGSUSED*/ static int process_aggregate(const dtrace_aggdata_t **aggsdata, int naggvars, void *arg) { const dtrace_recdesc_t *rec; uintptr_t lock; uint64_t *stack; caddr_t data; pid_t pid; struct ps_prochandle *P; char buf[256]; int i, j; uint64_t sum, count, avg; if ((*(uint_t *)arg)++ >= g_nent) return (DTRACE_AGGWALK_NEXT); rec = aggsdata[0]->dtada_desc->dtagd_rec; data = aggsdata[0]->dtada_data; /*LINTED - alignment*/ lock = (uintptr_t)*(uint64_t *)(data + rec[1].dtrd_offset); /*LINTED - alignment*/ stack = (uint64_t *)(data + rec[2].dtrd_offset); if (!g_opt_s) { /*LINTED - alignment*/ sum = *(uint64_t *)(aggsdata[1]->dtada_data + aggsdata[1]->dtada_desc->dtagd_rec[3].dtrd_offset); /*LINTED - alignment*/ count = *(uint64_t *)(aggsdata[2]->dtada_data + aggsdata[2]->dtada_desc->dtagd_rec[3].dtrd_offset); } else { uint64_t *a; /*LINTED - alignment*/ a = (uint64_t *)(aggsdata[1]->dtada_data + aggsdata[1]->dtada_desc->dtagd_rec[3].dtrd_offset); print_bar(); print_legend(); for (count = sum = 0, i = DTRACE_QUANTIZE_ZEROBUCKET, j = 0; i < DTRACE_QUANTIZE_NBUCKETS; i++, j++) { count += a[i]; sum += a[i] << (j - 64); } } avg = sum / count; (void) printf("%5llu %8llu ", (u_longlong_t)count, (u_longlong_t)avg); pid = stack[0]; P = dtrace_proc_grab(g_dtp, pid, PGRAB_RDONLY); (void) getsym(P, lock, buf, sizeof (buf), 0); (void) printf("%-28s ", buf); for (i = 2; i <= 5; i++) { if (getsym(P, stack[i], buf, sizeof (buf), 1) == 0) break; } (void) printf("%s\n", buf); if (g_opt_s) { int stack_done = 0; int quant_done = 0; int first_bin, last_bin; uint64_t bin_size, *a; /*LINTED - alignment*/ a = (uint64_t *)(aggsdata[1]->dtada_data + aggsdata[1]->dtada_desc->dtagd_rec[3].dtrd_offset); print_histogram_header(); for (first_bin = DTRACE_QUANTIZE_ZEROBUCKET; a[first_bin] == 0; first_bin++) continue; for (last_bin = DTRACE_QUANTIZE_ZEROBUCKET + 63; a[last_bin] == 0; last_bin--) continue; for (i = 0; !stack_done || !quant_done; i++) { if (!stack_done) { (void) getsym(P, stack[i + 2], buf, sizeof (buf), 0); } else { buf[0] = '\0'; } if (!quant_done) { bin_size = a[first_bin]; (void) printf("%10llu |%-24.*s| %5llu %s\n", 1ULL << (first_bin - DTRACE_QUANTIZE_ZEROBUCKET), (int)(24.0 * bin_size / count), "@@@@@@@@@@@@@@@@@@@@@@@@@@", (u_longlong_t)bin_size, buf); } else { (void) printf("%43s %s\n", "", buf); } if (i + 1 >= g_nframes || stack[i + 3] == 0) stack_done = 1; if (first_bin++ == last_bin) quant_done = 1; } } dtrace_proc_release(g_dtp, P); return (DTRACE_AGGWALK_NEXT); }
/* :nodoc: */ void dtrace_process_release(dtrace_process_t *process) { dtrace_proc_release(process->handle, process->proc); free(process); }