X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Flttngtop.c;h=e9f240bed29cf67d9e63ba3f265db1e5f17b8d6f;hp=e9beb0d0aab082dec131fec1422359d6495f769f;hb=1d74c4d1c6aaa6bcad2f2d4b02e720c0a318584d;hpb=6e11e0d0eebdfe842bc7153ad9e28947b3cb3365 diff --git a/src/lttngtop.c b/src/lttngtop.c index e9beb0d..e9f240b 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -83,7 +83,7 @@ GPtrArray *available_snapshots; sem_t metadata_available; int reload_trace = 0; -int last_textdump_print_newline = 1; +uint64_t prev_ts = 0; enum { OPT_NONE = 0, @@ -214,12 +214,14 @@ void print_fields(struct bt_ctf_event *event) enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_data) { unsigned long timestamp; + uint64_t delta; struct tm start; uint64_t ts_nsec_start; - int pid, cpu_id; - int64_t syscall_ret; + int pid, cpu_id, tid; const struct bt_definition *scope; const char *hostname, *procname; + struct cputime *cpu; + char *from_syscall = NULL; timestamp = bt_ctf_get_timestamp(call_data); @@ -236,49 +238,76 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat if (pid == -1ULL && opt_tid) { goto error; } + + tid = get_context_tid(call_data); hostname = get_context_hostname(call_data); - if (opt_tid || opt_hostname) - if (!lookup_filter_tid_list(pid)) - goto end; + if (opt_tid || opt_hostname) { + if (!lookup_filter_tid_list(pid)) { + /* To display when a process of ours in getting scheduled in */ + if (strcmp(bt_ctf_event_name(call_data), "sched_switch") == 0) { + int next_tid; + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + next_tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_next_tid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing next_tid field\n"); + goto error; + } + if (!lookup_filter_tid_list(next_tid)) { + goto end; + } + } else { + goto end; + } + } + } cpu_id = get_cpu_id(call_data); procname = get_context_comm(call_data); - - if ((strcmp(bt_ctf_event_name(call_data), "exit_syscall") == 0) && - !last_textdump_print_newline) { - scope = bt_ctf_get_top_level_scope(call_data, - BT_EVENT_FIELDS); - syscall_ret = bt_ctf_get_int64(bt_ctf_get_field(call_data, - scope, "_ret")); - printf("= %ld\n", syscall_ret); - last_textdump_print_newline = 1; - } else { - /* we might have lost the exit_syscall event, so need to - * print the newline in this case */ - if (last_textdump_print_newline == 0) - printf("\n"); - if (hostname) { - printf("%02d:%02d:%02d.%09" PRIu64 " (%s) (cpu %d) [%s (%d)] %s (", - start.tm_hour, start.tm_min, start.tm_sec, - ts_nsec_start, hostname, cpu_id, procname, pid, - bt_ctf_event_name(call_data)); - } else { - printf("%02d:%02d:%02d.%09" PRIu64 " (cpu %d) [%s (%d)] %s (", - start.tm_hour, start.tm_min, start.tm_sec, - ts_nsec_start, cpu_id, procname, pid, - bt_ctf_event_name(call_data)); - } - print_fields(call_data); - printf(") "); - if (strncmp(bt_ctf_event_name(call_data), "sys_", 4) != 0) { - printf("\n"); - last_textdump_print_newline = 1; - } else { - last_textdump_print_newline = 0; + if (strncmp(bt_ctf_event_name(call_data), "sys_", 4) == 0) { + cpu = get_cpu(cpu_id); + cpu->current_syscall = g_new0(struct syscall, 1); + cpu->current_syscall->name = strdup(bt_ctf_event_name(call_data)); + cpu->current_syscall->ts_start = timestamp; + } else if ((strncmp(bt_ctf_event_name(call_data), "exit_syscall", 12)) == 0) { + struct tm start_ts; + + cpu = get_cpu(cpu_id); + if (cpu->current_syscall) { + delta = timestamp - cpu->current_syscall->ts_start; + start_ts = format_timestamp(cpu->current_syscall->ts_start); + asprintf(&from_syscall, " [from %02d:%02d:%02d.%09" PRIu64 + " (+%" PRIu64 ".%09" PRIu64 ") (cpu %d) %s]\n", + start_ts.tm_hour, start_ts.tm_min, start_ts.tm_sec, + cpu->current_syscall->ts_start % NSEC_PER_SEC, + delta / NSEC_PER_SEC, delta % NSEC_PER_SEC, + cpu_id, cpu->current_syscall->name); + free(cpu->current_syscall->name); + g_free(cpu->current_syscall); + cpu->current_syscall = NULL; } } + if (prev_ts == 0) + prev_ts = timestamp; + delta = timestamp - prev_ts; + prev_ts = timestamp; + + printf("%02d:%02d:%02d.%09" PRIu64 " (+%" PRIu64 ".%09" PRIu64 ") %s%s" + "(cpu %d) [%s (%d/%d)] %s (", + start.tm_hour, start.tm_min, start.tm_sec, + ts_nsec_start, delta / NSEC_PER_SEC, + delta % NSEC_PER_SEC, (hostname) ? hostname : "", + (hostname) ? " ": "", cpu_id, procname, pid, tid, + bt_ctf_event_name(call_data)); + print_fields(call_data); + printf(")%s", (from_syscall) ? from_syscall : "\n"); + + free(from_syscall); + end: return BT_CB_OK; error: