static void update(struct VSM_data *vd) { int w = COLS / HIST_RANGE; int n = w * HIST_RANGE; unsigned bm[n], bh[n]; unsigned max; int i, j, scale; erase(); /* Draw horizontal axis */ w = COLS / HIST_RANGE; n = w * HIST_RANGE; for (i = 0; i < n; ++i) (void)mvaddch(LINES - 2, i, '-'); for (i = 0, j = HIST_LOW; i < HIST_RANGE; ++i, ++j) { (void)mvaddch(LINES - 2, w * i, '+'); mvprintw(LINES - 1, w * i, "|1e%d", j); } mvprintw(0, 0, "%*s", COLS - 1, VSM_Name(vd)); /* count our flock */ for (i = 0; i < n; ++i) bm[i] = bh[i] = 0; for (i = 0, max = 1; i < HIST_BUCKETS; ++i) { j = i * n / HIST_BUCKETS; bm[j] += bucket_miss[i]; bh[j] += bucket_hit[i]; if (bm[j] + bh[j] > max) max = bm[j] + bh[j]; } /* scale */ for (i = 0; max / scales[i] > LINES - 3; ++i) /* nothing */ ; scale = scales[i]; mvprintw(0, 0, "1:%d, n = %d", scale, nhist); /* show them */ for (i = 0; i < n; ++i) { for (j = 0; j < bm[i] / scale; ++j) (void)mvaddch(LINES - 3 - j, i, '#'); for (; j < (bm[i] + bh[i]) / scale; ++j) (void)mvaddch(LINES - 3 - j, i, '|'); } refresh(); }
static void update(const struct VSM_data *vd, int period) { struct top *tp, *tp2; int l, len; double t = 0; static time_t last = 0; static unsigned n; time_t now; now = time(NULL); if (now == last) return; last = now; l = 1; if (n < period) n++; AC(erase()); AC(mvprintw(0, 0, "%*s", COLS - 1, VSM_Name(vd))); AC(mvprintw(0, 0, "list length %u", ntop)); for (tp = VRB_MIN(top_tree, &top_tree_head); tp != NULL; tp = tp2) { tp2 = VRB_NEXT(top_tree, &top_tree_head, tp); if (++l < LINES) { len = tp->clen; if (len > COLS - 20) len = COLS - 20; AC(mvprintw(l, 0, "%9.2f %-*.*s %*.*s\n", tp->count, maxfieldlen, maxfieldlen, VSL_tags[tp->tag], len, len, tp->rec_data)); t = tp->count; } tp->count += (1.0/3.0 - tp->count) / (double)n; if (tp->count * 10 < t || l > LINES * 10) { VRB_REMOVE(top_tree, &top_tree_head, tp); free(tp->rec_data); free(tp); ntop--; } } AC(refresh()); }
static void update(void) { char t[VTIM_FORMAT_SIZE]; unsigned w = COLS / hist_range; unsigned n = w * hist_range; unsigned bm[n], bh[n]; unsigned max; unsigned i, j, scale; int k, l; erase(); /* Draw horizontal axis */ for (i = 0; i < n; ++i) (void)mvaddch(LINES - 2, i, '-'); for (k = 0, l = hist_low; k < hist_range; ++k, ++l) { (void)mvaddch(LINES - 2, w * k, '+'); mvprintw(LINES - 1, w * k, "|1e%d", l); } if (end_of_file) mvprintw(0, 0, "%*s", COLS - 1, "EOF"); else mvprintw(0, 0, "%*s", COLS - 1, VSM_Name(VUT.vsm)); /* count our flock */ for (i = 0; i < n; ++i) bm[i] = bh[i] = 0; for (k = 0, max = 1; k < hist_buckets; ++k) { l = k * n / hist_buckets; bm[l] += bucket_miss[k]; bh[l] += bucket_hit[k]; if (bm[l] + bh[l] > max) max = bm[l] + bh[l]; } /* scale,time */ assert(LINES - 3 >= 0); for (i = 0; max / scales[i] > (unsigned)(LINES - 3); ++i) /* nothing */ ; scale = scales[i]; if (vsl_t0 > 0) { VTIM_format(vsl_ts, t); mvprintw(0, 0, "1:%d, n = %d, d = %g @ %s x %g", scale, nhist, delay, t, timebend); } else mvprintw(0, 0, "1:%d, n = %d, d = %g", scale, nhist, delay); for (j = 2; j < LINES - 3; j += 5) mvprintw(j, 0, "%d_", (LINES - 3 - j) * scale); /* show them */ for (i = 0; i < n; ++i) { for (j = 0; j < bm[i] / scale; ++j) (void)mvaddch(LINES - 3 - j, i, '#'); for (; j < (bm[i] + bh[i]) / scale; ++j) (void)mvaddch(LINES - 3 - j, i, '|'); } refresh(); }
void VUT_Setup(void) { struct VSL_cursor *c; double t_start; int i; AN(VUT.vsl); AZ(VUT.vsm); AZ(VUT.vslq); /* Check input arguments */ if ((VUT.n_arg == NULL ? 0 : 1) + (VUT.N_arg == NULL ? 0 : 1) + (VUT.r_arg == NULL ? 0 : 1) > 1) VUT_Error(1, "Only one of -n, -N and -r options may be used"); /* Create and validate the query expression */ VUT.vslq = VSLQ_New(VUT.vsl, NULL, VUT.g_arg, VUT.q_arg); if (VUT.vslq == NULL) VUT_Error(1, "Query expression error:\n%s", VSL_Error(VUT.vsl)); /* Setup input */ if (VUT.r_arg) { REPLACE(VUT.name, VUT.r_arg); c = VSL_CursorFile(VUT.vsl, VUT.r_arg, 0); if (c == NULL) VUT_Error(1, "Can't open log file (%s)", VSL_Error(VUT.vsl)); } else { VUT.vsm = VSM_New(); AN(VUT.vsm); if (VUT.n_arg && VSM_n_Arg(VUT.vsm, VUT.n_arg) <= 0) VUT_Error(1, "%s", VSM_Error(VUT.vsm)); if (VUT.N_arg && VSM_N_Arg(VUT.vsm, VUT.N_arg) <= 0) VUT_Error(1, "%s", VSM_Error(VUT.vsm)); REPLACE(VUT.name, VSM_Name(VUT.vsm)); t_start = NAN; c = NULL; while (1) { i = VSM_Open(VUT.vsm); if (!i) c = VSL_CursorVSM(VUT.vsl, VUT.vsm, (VUT.d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL) | VSL_COPT_BATCH); if (c) break; if (isnan(t_start) && VUT.t_arg > 0.) { VUT_Error(0, "Can't open log -" " retrying for %.0f seconds", VUT.t_arg); t_start = VTIM_real(); } VSM_Close(VUT.vsm); if (VUT.t_arg <= 0.) break; if (VTIM_real() - t_start > VUT.t_arg) break; VSM_ResetError(VUT.vsm); VSL_ResetError(VUT.vsl); VTIM_sleep(0.5); } if (VUT.t_arg >= 0. && (i || !c)) { if (i) VUT_Error(1, "Can't open VSM file (%s)", VSM_Error(VUT.vsm)); else VUT_Error(1, "Can't open log (%s)", VSL_Error(VUT.vsl)); } else if (!isnan(t_start)) VUT_Error(0, "Log opened"); } if (c) VSLQ_SetCursor(VUT.vslq, &c); AZ(c); /* Signal handlers */ (void)signal(SIGHUP, vut_sighup); (void)signal(SIGINT, vut_sigint); (void)signal(SIGTERM, vut_sigint); (void)signal(SIGUSR1, vut_sigusr1); /* Open PID file */ if (VUT.P_arg) { AZ(VUT.pfh); VUT.pfh = VPF_Open(VUT.P_arg, 0644, NULL); if (VUT.pfh == NULL) VUT_Error(1, "%s: %s", VUT.P_arg, strerror(errno)); } /* Daemon mode */ if (VUT.D_opt && varnish_daemon(0, 0) == -1) VUT_Error(1, "Daemon mode: %s", strerror(errno)); /* Write PID and setup exit handler */ if (VUT.pfh != NULL) { VPF_Write(VUT.pfh); AZ(atexit(vut_vpf_remove)); } }