prepare the 0.3 release
[lttngtop.git] / src / iostreamtop.c
index 7c1d611af8b74b1a7e6aa1ac566b2fbc5c8b52ad..44fe37b89995aadc722ca5786d3f859a5830b4e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Mathieu Bain <mathieu.bain@polymtl.ca>
+ * Copyright (C) 2011-2012 Mathieu Bain <mathieu.bain@polymtl.ca>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License Version 2 as
@@ -31,20 +31,25 @@ void add_file(struct processtop *proc, struct files *file, int fd)
        struct files *tmp_file;
        struct processtop *parent;
        int size;
+       int i;
 
        size = proc->process_files_table->len;
        parent = proc->threadparent;
        if (parent)
                insert_file(parent, fd);
        if (size <= fd) {
-               g_ptr_array_set_size(proc->process_files_table, fd);
+               /* Add NULL file structures for undefined FDs */
+               for (i = size; i < fd; i++) {
+                       g_ptr_array_add(proc->process_files_table, NULL);
+               }
                g_ptr_array_add(proc->process_files_table, file);
        } else {
                tmp_file = g_ptr_array_index(proc->process_files_table, fd);
                if (tmp_file == NULL)
                        g_ptr_array_index(proc->process_files_table, fd) = file;
                else {
-                       if (strcmp(tmp_file->name, file->name) != 0) {
+                       if (!tmp_file->name ||
+                                       strcmp(tmp_file->name, file->name) != 0) {
                                size = proc->process_files_table->len;
                                g_ptr_array_set_size(proc->process_files_table,
                                                                size+1);
@@ -98,7 +103,7 @@ void insert_file(struct processtop *proc, int fd)
                return;
        if (fd >= proc->process_files_table->len) {
                tmp = g_new0(struct files, 1);
-               tmp->name = "Unknown";
+               tmp->name = NULL;
                tmp->read = 0;
                tmp->write = 0;
                tmp->fd = fd;
@@ -108,7 +113,7 @@ void insert_file(struct processtop *proc, int fd)
                tmp = g_ptr_array_index(proc->process_files_table, fd);
                if (tmp == NULL) {
                        tmp = g_new0(struct files, 1);
-                       tmp->name = "Unknown";
+                       tmp->name = NULL;
                        tmp->read = 0;
                        tmp->write = 0;
                        tmp->fd = fd;
@@ -119,7 +124,7 @@ void insert_file(struct processtop *proc, int fd)
                        if (parent) {
                                tmp_parent = g_ptr_array_index(
                                        parent->process_files_table, fd);
-                               if (tmp_parent &&
+                               if (tmp_parent && tmp->name && tmp_parent->name &&
                                   (strcmp(tmp->name, tmp_parent->name)) != 0)
                                        tmp->name = strdup(tmp_parent->name);
                        }
@@ -135,6 +140,12 @@ void close_file(struct processtop *proc, int fd)
        if (file != NULL) {
                file->flag = __NR_close;
                lttngtop.nbfiles--;
+               /*
+               if (file->name) {
+                       free(file->name);
+                       file->name = NULL;
+               }
+               */
        }
        lttngtop.nbclosedfiles++;
 }
@@ -185,14 +196,19 @@ void show_history(struct file_history *history)
 }
 
 int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
-               unsigned long timestamp, uint64_t cpu_id, int ret)
+               unsigned long timestamp, uint64_t cpu_id, int ret,
+               char *hostname)
 {
        struct processtop *tmp;
        struct files *tmpfile;
        int err = 0;
 
-       tmp = get_proc(ctx, tid, comm, timestamp);
+       tmp = get_proc(ctx, tid, comm, timestamp, hostname);
 
+       if (!tmp) {
+               err = -1;
+               goto end;
+       }
        if (tmp->syscall_info != NULL) {
                if (tmp->syscall_info->type == __NR_read
                        && ret > 0) {
@@ -219,6 +235,8 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
                g_free(tmp->syscall_info);
                tmp->syscall_info = NULL;
        }
+
+end:
        return err;
 }
 
@@ -256,11 +274,12 @@ struct file_history *create_file(struct file_history *history, char *file_name)
 enum bt_cb_ret handle_exit_syscall(struct bt_ctf_event *call_data,
                void *private_data)
 {
-       const struct definition *scope;
+       const struct bt_definition *scope;
        unsigned long timestamp;
        char *comm;
        uint64_t ret, tid;
        uint64_t cpu_id;
+       char *hostname;
 
        timestamp = bt_ctf_get_timestamp(call_data);
        if (timestamp == -1ULL)
@@ -279,13 +298,15 @@ enum bt_cb_ret handle_exit_syscall(struct bt_ctf_event *call_data,
        }
 
        cpu_id = get_cpu_id(call_data);
+       hostname = get_context_hostname(call_data);
 
        /*
         * if we encounter an exit_syscall and
         * it is not for a syscall read or write
         * we just abort the execution of this callback
         */
-       if ((update_iostream_ret(&lttngtop, tid, comm, timestamp, cpu_id, ret)) < 0)
+       if ((update_iostream_ret(&lttngtop, tid, comm, timestamp, cpu_id,
+                                       ret, hostname)) < 0)
                return BT_CB_ERROR_CONTINUE;
 
        return BT_CB_OK;
@@ -298,11 +319,12 @@ error:
 enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data,
                void *private_data)
 {
-       const struct definition *scope;
+       const struct bt_definition *scope;
        struct processtop *tmp;
        unsigned long timestamp;
        uint64_t cpu_id;
-       int64_t tid, pid;
+       int64_t tid;
+       char *procname, *hostname;
        int fd;
 
        timestamp = bt_ctf_get_timestamp(call_data);
@@ -312,7 +334,8 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data,
        tid = get_context_tid(call_data);
        cpu_id = get_cpu_id(call_data);
 
-       pid = get_context_pid(call_data);
+       procname = get_context_comm(call_data);
+       hostname = get_context_hostname(call_data);
 
        scope = bt_ctf_get_top_level_scope(call_data,
                        BT_EVENT_FIELDS);
@@ -323,11 +346,15 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data,
                goto error;
        }
 
-       tmp = get_proc_pid(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, tid, procname, timestamp, hostname);
+       if (!tmp)
+               goto end;
+
        tmp->syscall_info = create_syscall_info(__NR_write, cpu_id, tid, fd);
 
        insert_file(tmp, fd);
 
+end:
        return BT_CB_OK;
 
 error:
@@ -338,11 +365,13 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data,
                void *private_data)
 {
        struct processtop *tmp;
-       const struct definition *scope;
+       const struct bt_definition *scope;
        unsigned long timestamp;
        uint64_t cpu_id;
-       int64_t tid, pid;
+       int64_t tid;
+       char *procname;
        int fd;
+       char *hostname;
 
        timestamp = bt_ctf_get_timestamp(call_data);
        if (timestamp == -1ULL)
@@ -351,7 +380,8 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data,
        tid = get_context_tid(call_data);
        cpu_id = get_cpu_id(call_data);
 
-       pid = get_context_pid(call_data);
+       procname = get_context_comm(call_data);
+       hostname = get_context_hostname(call_data);
 
        scope = bt_ctf_get_top_level_scope(call_data,
                        BT_EVENT_FIELDS);
@@ -362,27 +392,31 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data,
                goto error;
        }
 
-       tmp = get_proc_pid(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, tid, procname, timestamp, hostname);
+       if (!tmp)
+               goto end;
+
        tmp->syscall_info = create_syscall_info(__NR_read, cpu_id, tid, fd);
 
        insert_file(tmp, fd);
 
+end:
        return BT_CB_OK;
 
 error:
        return BT_CB_ERROR_STOP;
 }
 
-
 enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
                void *private_data)
 {
 
        struct processtop *tmp;
-       const struct definition *scope;
+       const struct bt_definition *scope;
        unsigned long timestamp;
        uint64_t cpu_id;
-       int64_t tid, pid;
+       int64_t tid;
+       char *procname, *hostname;
        char *file;
 
        timestamp = bt_ctf_get_timestamp(call_data);
@@ -392,7 +426,8 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
        tid = get_context_tid(call_data);
        cpu_id = get_cpu_id(call_data);
 
-       pid = get_context_pid(call_data);
+       procname = get_context_comm(call_data);
+       hostname = get_context_hostname(call_data);
 
        scope = bt_ctf_get_top_level_scope(call_data,
                        BT_EVENT_FIELDS);
@@ -403,26 +438,69 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
                goto error;
        }
 
-       tmp = get_proc_pid(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, tid, procname, timestamp, hostname);
+       if (!tmp)
+               goto end;
+
        tmp->syscall_info = create_syscall_info(__NR_open, cpu_id, tid, -1);
 
        tmp->files_history = create_file(tmp->files_history, file);
 
+end:
        return BT_CB_OK;
 
 error:
        return BT_CB_ERROR_STOP;
 }
 
+enum bt_cb_ret handle_sys_socket(struct bt_ctf_event *call_data,
+               void *private_data)
+{
+
+       struct processtop *tmp;
+       unsigned long timestamp;
+       uint64_t cpu_id;
+       int64_t tid;
+       char *procname, *hostname;
+       char *file;
+
+       timestamp = bt_ctf_get_timestamp(call_data);
+       if (timestamp == -1ULL)
+               goto error;
+
+       tid = get_context_tid(call_data);
+       cpu_id = get_cpu_id(call_data);
+
+       procname = get_context_comm(call_data);
+       hostname = get_context_hostname(call_data);
+
+       file = strdup("socket");
+
+       tmp = get_proc(&lttngtop, tid, procname, timestamp, hostname);
+       if (!tmp)
+               goto end;
+
+       tmp->syscall_info = create_syscall_info(__NR_open, cpu_id, tid, -1);
+
+       tmp->files_history = create_file(tmp->files_history, file);
+
+end:
+       return BT_CB_OK;
+
+error:
+       return BT_CB_ERROR_STOP;
+}
 
 enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
                void *private_data)
 {
-       const struct definition *scope;
-       unsigned long timestamp;
-       int64_t tid, pid;
+       const struct bt_definition *scope;
        struct processtop *tmp;
+       unsigned long timestamp;
+       int64_t tid;
+       char *procname;
        int fd;
+       char *hostname;
 
        timestamp = bt_ctf_get_timestamp(call_data);
        if (timestamp == -1ULL)
@@ -430,7 +508,8 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
 
        tid = get_context_tid(call_data);
 
-       pid = get_context_pid(call_data);
+       procname = get_context_comm(call_data);
+       hostname = get_context_hostname(call_data);
 
        scope = bt_ctf_get_top_level_scope(call_data,
                        BT_EVENT_FIELDS);
@@ -441,10 +520,13 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
                goto error;
        }
 
-       tmp = get_proc_pid(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, tid, procname, timestamp, hostname);
+       if (!tmp)
+               goto end;
 
        close_file(tmp, fd);
 
+end:
        return BT_CB_OK;
 
 error:
@@ -454,12 +536,12 @@ error:
 enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
                void *private_data)
 {
-       const struct definition *scope;
+       const struct bt_definition *scope;
        struct processtop *parent;
        struct files *file;
        unsigned long timestamp;
        int64_t pid;
-       char *file_name;
+       char *file_name, *hostname;
        int fd;
 
        timestamp = bt_ctf_get_timestamp(call_data);
@@ -492,12 +574,17 @@ enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
                fprintf(stderr, "Missing file name context info\n");
                goto error;
        }
+       hostname = get_context_hostname(call_data);
+
+       parent = get_proc_pid(&lttngtop, pid, pid, timestamp, hostname);
+       if (!parent)
+               goto end;
 
-       parent = get_proc_pid(&lttngtop, pid, pid, timestamp);
        parent->files_history = create_file(parent->files_history, file_name);
        file = parent->files_history->file;
        edit_file(parent, file, fd);
 
+end:
        return BT_CB_OK;
 
 error:
This page took 0.026401 seconds and 4 git commands to generate.