From ceb3a2216fed5f405aa77c358328f71f44ed3303 Mon Sep 17 00:00:00 2001 From: Mathieu Bain Date: Thu, 15 Mar 2012 18:26:43 -0400 Subject: [PATCH] displaying closed files Display the files that cannot be seen because they were closed Signed-off-by: Mathieu Bain Signed-off-by: Julien Desfossez --- src/common.c | 10 +++- src/cursesdisplay.c | 10 ++++ src/iostreamtop.c | 142 ++++++++++++++++++++++++++++++++++++++++---- src/iostreamtop.h | 2 + src/lttngtop.c | 8 ++- src/lttngtoptypes.h | 1 + 6 files changed, 157 insertions(+), 16 deletions(-) diff --git a/src/common.c b/src/common.c index df2ef7a..7c67264 100644 --- a/src/common.c +++ b/src/common.c @@ -17,6 +17,7 @@ #include #include +#include #include #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); diff --git a/src/cursesdisplay.c b/src/cursesdisplay.c index 81db0af..d6befea 100644 --- a/src/cursesdisplay.c +++ b/src/cursesdisplay.c @@ -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() diff --git a/src/iostreamtop.c b/src/iostreamtop.c index e3a6434..71843cb 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -28,15 +28,50 @@ 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(<tngtop, 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(<tngtop, 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; +} +*/ diff --git a/src/iostreamtop.h b/src/iostreamtop.h index e809eba..2c80d49 100644 --- a/src/iostreamtop.h +++ b/src/iostreamtop.h @@ -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 */ diff --git a/src/lttngtop.c b/src/lttngtop.c index cc0ca88..e98785a 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -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) diff --git a/src/lttngtoptypes.h b/src/lttngtoptypes.h index 683bc30..d228f27 100644 --- a/src/lttngtoptypes.h +++ b/src/lttngtoptypes.h @@ -103,6 +103,7 @@ struct files { int oldfd; int device; int openmode; + int flag; unsigned long openedat; unsigned long closedat; unsigned long lastaccess; -- 2.34.1