print syscall origin on exit_syscall
[lttngtop.git] / src / lttngtop.c
index 6b41e65049615b77d242d0c36edc5026e1217990..e9f240bed29cf67d9e63ba3f265db1e5f17b8d6f 100644 (file)
@@ -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,6 +238,8 @@ 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) {
@@ -263,41 +267,47 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat
 
        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:
This page took 0.02308 seconds and 4 git commands to generate.