/* To print the solution in gantt chart like format */ void print_graph(solution_t *soln) { job_t *jobs = soln->jobs; int *jobs_order = soln->jobs_order; int i, j, job_id; int current_pos; for(i=0; i<numnodes+1; i++) { current_pos = 0; job_id = jobs_order[i]; printf("Job ID %d:\t", job_id); /* Print the release date */ for(j=0; j<(int) node_tw[job_id][0]; j++) { current_pos++; printf(" "); } printf("["); /* Print the underscore ( _ ) to represent the time before the start of the job */ for(j=current_pos; j<(int)(get_start_time(job_id, soln)); j++) { current_pos++; if(current_pos == (int) node_tw[job_id][1]) printf("*"); else if(current_pos > (int) node_tw[job_id][0]) printf("_"); } /* Print the duration of the job */ for(j=0; j<(int)(get_duration(job_id, soln)); j++) { current_pos++; if(current_pos == (int) node_tw[job_id][1]) printf("*"); else printf("|"); } /* Print the due date if it is not yet passed */ if(current_pos < (int) node_tw[job_id][1]) { for(j=current_pos; j < (int)node_tw[job_id][1]; j++) printf("_"); printf("]"); } printf("\n"); } print_legend(); }
/*ARGSUSED*/ static int chewrec(const dtrace_probedata_t *data, const dtrace_recdesc_t *rec, void *arg) { dtrace_eprobedesc_t *epd = data->dtpda_edesc; dtrace_aggvarid_t aggvars[2]; const void *buf; int i, nagv; /* * A NULL rec indicates that we've processed the last record. */ if (rec == NULL) return (DTRACE_CONSUME_NEXT); buf = data->dtpda_data - rec->dtrd_offset; switch (rec->dtrd_action) { case DTRACEACT_DIFEXPR: (void) printf("\n%s\n\n", (char *)buf + rec->dtrd_offset); if (!g_opt_s) { print_legend(); print_bar(); } return (DTRACE_CONSUME_NEXT); case DTRACEACT_PRINTA: for (nagv = 0, i = 0; i < epd->dtepd_nrecs - 1; i++) { const dtrace_recdesc_t *nrec = &rec[i]; if (nrec->dtrd_uarg != rec->dtrd_uarg) break; /*LINTED - alignment*/ aggvars[nagv++] = *(dtrace_aggvarid_t *)((caddr_t)buf + nrec->dtrd_offset); } if (nagv == (g_opt_s ? 1 : 2)) { uint_t nent = 0; if (dtrace_aggregate_walk_joined(g_dtp, aggvars, nagv, process_aggregate, &nent) != 0) dfatal("failed to walk aggregate"); } return (DTRACE_CONSUME_NEXT); } return (DTRACE_CONSUME_THIS); }
/*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); }