displaying closed files
authorMathieu Bain <mathieu.bain@polymtl.ca>
Thu, 15 Mar 2012 22:26:43 +0000 (18:26 -0400)
committerJulien Desfossez <julien.desfossez@efficios.com>
Fri, 16 Mar 2012 16:20:44 +0000 (12:20 -0400)
Display the files that cannot be seen because they were closed

Signed-off-by: Mathieu Bain <mathieu.bain@polymtl.ca>
Signed-off-by: Julien Desfossez <julien.desfossez@efficios.com>
src/common.c
src/cursesdisplay.c
src/iostreamtop.c
src/iostreamtop.h
src/lttngtop.c
src/lttngtoptypes.h

index df2ef7a4d376a395587815939dc224fa1926cab9..7c67264ebba1fdc652a1890c82aaee3266260a89 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <babeltrace/ctf/events.h>
 #include <stdlib.h>
+#include <linux/unistd.h>
 #include <string.h>
 #include "common.h"
 
@@ -125,8 +126,7 @@ struct processtop* add_proc(struct lttngtop *ctx, int tid, char *comm,
                newproc->tid = tid;
                newproc->birth = timestamp;
                newproc->process_files_table = g_ptr_array_new();
-               newproc->files_history = g_new0(struct file_history, 1);
-               newproc->files_history->next = NULL;
+               newproc->files_history = NULL;
                newproc->totalfileread = 0;
                newproc->totalfilewrite = 0;
                newproc->fileread = 0;
@@ -287,6 +287,11 @@ void cleanup_processtop()
                        if (tmpf != NULL) {
                                tmpf->read = 0;
                                tmpf->write = 0;
+
+                               if (tmpf->flag == __NR_close)
+                                       g_ptr_array_index(
+                                               tmp->process_files_table, j
+                                       ) = NULL;
                        }
                }
        }
@@ -320,6 +325,7 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end)
                new->threads = g_ptr_array_new();
                new->comm = strdup(tmp->comm);
                new->process_files_table = g_ptr_array_new();
+               new->files_history = tmp->files_history;
                new->perf = g_hash_table_new(g_str_hash, g_str_equal);
                g_hash_table_foreach(tmp->perf, copy_perf_counter, new->perf);
 
index 81db0af99d04b1fff3d2868cc1599b7649c8f8f9..d6befea5be042fe34f7d9647ed7b61c9eca94085 100644 (file)
@@ -422,6 +422,7 @@ void update_process_details()
        double maxcputime;
        struct processtop *tmp = find_process_tid(data, selected_tid, selected_comm);
        struct files *file_tmp;
+       struct file_history *history = tmp->files_history;
        int i, j = 0;
 
        set_window_title(center, "Process details");
@@ -462,6 +463,15 @@ void update_process_details()
                        j++;
                }
        }
+/*
+       print_key_title("----------- Files History -----------",8+j);
+       j = 0;
+       while (history != NULL) {
+               file_tmp = history->file;
+               wprintw(center, "fd = %d\n", file_tmp->fd);//, file_tmp->fd);
+               history = history->next;
+       }
+*/
 }
 
 void update_perf()
index e3a643478d7e3608cbd54a071feb912c02879ef3..71843cb900137a2adb706a5124800c221724f391 100644 (file)
 
 void add_file(struct processtop *proc, struct files *file, int fd)
 {
-       if (proc->process_files_table->len <= fd) {
+       struct files *tmp_file;
+       int size;
+
+       size = proc->process_files_table->len;
+
+       if (size <= fd) {
                g_ptr_array_set_size(proc->process_files_table, fd);
                g_ptr_array_add(proc->process_files_table, file);
        } else {
-               g_ptr_array_index(proc->process_files_table, fd) = file;
+               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) {
+                               size = proc->process_files_table->len;
+                               g_ptr_array_set_size(proc->process_files_table,
+                                                       size+1);
+                               g_ptr_array_index(proc->process_files_table,
+                                                       size) = tmp_file;
+                               g_ptr_array_index(proc->process_files_table,
+                                                       fd) = file;
+                       } else
+                               tmp_file->flag = __NR_open;
+               }
        }
        file->fd = fd;
+       file->flag = __NR_open;
 }
 
+/* TODO */
+/* To be done */
+void edit_file(struct processtop *proc, struct files *file, int fd)
+{
+       int size = proc->process_files_table->len;
+       struct files *tmpfile;
+
+       if (size <= fd)
+               return;
+       else {
+               tmpfile = g_ptr_array_index(proc->process_files_table, fd);
+               tmpfile->name = strdup(file->name);
+               free(file);
+       }
+}
 
 void insert_file(struct processtop *proc, int fd)
 {
@@ -45,6 +80,9 @@ void insert_file(struct processtop *proc, int fd)
        if (fd >= proc->process_files_table->len) {
                tmp = g_new0(struct files, 1);
                tmp->name = "Unknown";
+               tmp->read = 0;
+               tmp->write = 0;
+               tmp->fd = fd;
                add_file(proc, tmp, fd);
        } else {
 
@@ -61,8 +99,19 @@ void insert_file(struct processtop *proc, int fd)
 }
 
 void close_file(struct processtop *proc, int fd)
+{
+       struct files *file;
+
+
+       file = get_file(proc, fd);
+       if (file != NULL)
+               file->flag = __NR_close;
+}
+
+struct files *get_file(struct processtop *proc, int fd)
 {
        int len;
+       struct files *tmp = NULL;
 
        len = proc->process_files_table->len;
 
@@ -71,16 +120,9 @@ void close_file(struct processtop *proc, int fd)
         * and its fd could be greater than all of the others fd
         * used by the process
         */
-       if (fd < len) {
-               g_ptr_array_remove_index_fast(proc->process_files_table, fd);
-               g_ptr_array_set_size(proc->process_files_table, len + 1);
-       }
-}
+       if (fd < len && fd >= 0)
+               tmp = g_ptr_array_index(proc->process_files_table, fd);
 
-struct files *get_file(struct processtop *proc, int fd)
-{
-       struct files *tmp;
-       tmp = g_ptr_array_index(proc->process_files_table, fd);
        return tmp;
 }
 
@@ -99,6 +141,18 @@ void show_table(GPtrArray *tab)
        fprintf(stderr, "]\n\n");
 }
 
+void show_history(struct file_history *history)
+{
+       struct file_history *tmp = history;
+
+       while (tmp != NULL) {
+               fprintf(stderr, "fd = %d, name = %s\n", tmp->file->fd,
+                                       tmp->file->name);
+               tmp = tmp->next;
+       }
+
+}
+
 int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
                unsigned long timestamp, uint64_t cpu_id, int ret)
 {
@@ -123,7 +177,9 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
                        tmpfile->write += ret;
                } else if (tmp->syscall_info->type == __NR_open
                        && ret > 0) {
-                       add_file(tmp, tmp->files_history->file, ret);
+                       tmpfile = tmp->files_history->file;
+                       add_file(tmp, tmpfile, ret);
+                       tmpfile->fd = ret;
                } else {
                        err = -1;
                }
@@ -309,7 +365,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
        file = bt_ctf_get_string(bt_ctf_get_field(call_data,
                                scope, "_filename"));
        if (bt_ctf_field_get_error()) {
-               fprintf(stderr, "Missing fd context info\n");
+               fprintf(stderr, "Missing file name context info\n");
                goto error;
        }
 
@@ -352,6 +408,7 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
        }
 
        tmp = get_proc(&lttngtop, tid, comm, timestamp);
+
        close_file(tmp, fd);
 
        return BT_CB_OK;
@@ -359,3 +416,62 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
 error:
        return BT_CB_ERROR_STOP;
 }
+/*
+enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
+               void *private_data)
+{
+       struct definition *scope;
+       struct files *file;
+       unsigned long timestamp;
+       int64_t tid;
+       struct processtop *tmp;
+       char *comm, *file_name;
+       int fd;
+
+       timestamp = bt_ctf_get_timestamp(call_data);
+       if (timestamp == -1ULL)
+               goto error;
+
+       comm = get_context_comm(call_data);
+
+       scope = bt_ctf_get_top_level_scope(call_data,
+                        BT_EVENT_FIELDS);
+       tid = bt_ctf_get_uint64(bt_ctf_get_field(call_data,
+                            scope, "_tid"));
+       if (bt_ctf_field_get_error()) {
+               fprintf(stderr, "Missing tid context info\n");
+               goto error;
+       }
+
+       scope = bt_ctf_get_top_level_scope(call_data,
+                       BT_EVENT_FIELDS);
+       fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data,
+                               scope, "_fd"));
+       if (bt_ctf_field_get_error()) {
+               fprintf(stderr, "Missing fd context info\n");
+               goto error;
+       }
+
+       scope = bt_ctf_get_top_level_scope(call_data,
+                       BT_EVENT_FIELDS);
+       file_name = bt_ctf_get_string(bt_ctf_get_field(call_data,
+                               scope, "_filename"));
+       if (bt_ctf_field_get_error()) {
+               fprintf(stderr, "Missing file name context info\n");
+               goto error;
+       }
+
+       file = g_new0(struct files, 1);
+       file->name = strdup(file_name);
+       file->fd = fd;
+       tmp = find_process_tid(&lttngtop, tid, comm);
+       edit_file(tmp, file, fd);
+
+       fprintf(stderr, "%lu %s\n", tmp->tid, file_name);
+
+       return BT_CB_OK;
+
+error:
+       return BT_CB_ERROR_STOP;
+}
+*/
index e809ebada65c9eb90b9c4b586a74f683ba3c1595..2c80d49526b07d6b3afa1b122c26737836d4ce39 100644 (file)
@@ -37,5 +37,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
                void *private_data);
 enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
                void *private_data);
+enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
+               void *private_data);
 
 #endif /* _IOSTREAMTOP_H */
index cc0ca882c80b2e5a2ebf4064563df4506569564c..e98785a8cfe5e3c06cb65affcc2fa7ff1ecaaf0a 100644 (file)
@@ -421,10 +421,16 @@ void iter_trace(struct bt_context *bt_ctx)
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("sys_open"),
                        NULL, 0, handle_sys_open, NULL, NULL, NULL);
-
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("sys_close"),
                        NULL, 0, handle_sys_close, NULL, NULL, NULL);
+/*
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string(
+                                       "lttng_statedump_file_descriptor"),
+                       NULL, 0, handle_statedump_file_descriptor,
+                       NULL, NULL, NULL);
+*/
        while ((event = bt_ctf_iter_read_event(iter)) != NULL) {
                ret = bt_iter_next(bt_ctf_get_iter(iter));
                if (ret < 0)
index 683bc302e1b8980e9daec4e78b6f4899ad92ac60..d228f277c0b0c442eecc5d7d9207c809518b6177 100644 (file)
@@ -103,6 +103,7 @@ struct files {
        int oldfd;
        int device;
        int openmode;
+       int flag;
        unsigned long openedat;
        unsigned long closedat;
        unsigned long lastaccess;
This page took 0.028645 seconds and 4 git commands to generate.