static void notify_ui_callback (int type, const char *data) { switch (type) { case NOTIFY_LOG_DIR: ansi_magenta (stdout); printf ("%s: remote log directory location: ", getprogname ()); ansi_red (stdout); fputs (data, stdout); ansi_restore (stdout); putchar ('\n'); break; case NOTIFY_REMOTE_MESSAGE: printf ("%s", data); break; case NOTIFY_STATUS: ansi_magenta (stdout); printf ("%s: %s", getprogname (), data); ansi_restore (stdout); putchar ('\n'); break; default: ansi_red (stdout); printf ("%s: unknown message during conversion: type=%d data=%s", getprogname (), type, data); ansi_restore (stdout); putchar ('\n'); } fflush (stdout); }
static void print_analysis (void) { double t = -1; /* Current time. */ /* Which columns contain activities that we are displaying now? * -1 == unused column, else index of an activity */ CLEANUP_FREE ssize_t *columns = NULL; const size_t nr_columns = nr_activities; size_t last_free_column = 0; size_t i, j; double last_t, smallest_next_t; const double MAX_T = 1e20; columns = malloc (nr_columns * sizeof (ssize_t)); if (columns == NULL) error (EXIT_FAILURE, errno, "malloc"); for (j = 0; j < nr_columns; ++j) columns[j] = -1; for (;;) { /* Find the next significant time to display, which is a time when * some activity started or ended. */ smallest_next_t = MAX_T; for (i = 0; i < nr_activities; ++i) { if (t < activities[i].t && activities[i].t < smallest_next_t) smallest_next_t = activities[i].t; else if (t < activities[i].end_t && activities[i].end_t < smallest_next_t) smallest_next_t = activities[i].end_t; } if (smallest_next_t == MAX_T) break; /* Finished. */ last_t = t; t = smallest_next_t; /* Draw a spacer line, but only if last_t -> t is a large jump. */ if (t - last_t >= 1000000 /* ns */) { printf (" "); ansi_magenta (); for (j = 0; j < last_free_column; ++j) { if (columns[j] >= 0 && activities[columns[j]].end_t != last_t /* !▼ */) printf ("│ "); else printf (" "); } ansi_restore (); printf ("\n"); } /* If there are any activities that ended before this time, drop * them from the columns list. */ for (i = 0; i < nr_activities; ++i) { if (activities[i].end_t < t) { for (j = 0; j < nr_columns; ++j) if (columns[j] == (ssize_t) i) { columns[j] = -1; break; } } } /* May need to adjust last_free_column after previous operation. */ while (last_free_column > 0 && columns[last_free_column-1] == -1) last_free_column--; /* If there are any activities starting at this time, add them to * the right hand end of the columns list. */ for (i = 0; i < nr_activities; ++i) { if (activities[i].t == t) columns[last_free_column++] = i; } /* Draw the line. */ ansi_blue (); printf ("%6.1fms: ", t / 1000000); ansi_magenta (); for (j = 0; j < last_free_column; ++j) { if (columns[j] >= 0) { if (activities[columns[j]].t == t) printf ("▲ "); else if (activities[columns[j]].end_t == t) printf ("▼ "); else printf ("│ "); } else printf (" "); } ansi_restore (); for (j = 0; j < last_free_column; ++j) { if (columns[j] >= 0 && activities[columns[j]].t == t) /* ▲ */ print_activity (&activities[columns[j]]); } printf ("\n"); } }