X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fiostreamtop.c;h=f455e78a20ec0e345c66a713e1ddde3be92f8b43;hp=e3a643478d7e3608cbd54a071feb912c02879ef3;hb=3439955e838cd626b61ca36e37f80a104966a8fe;hpb=3ba84bed69e8eb8e6794a7250da97406dbbe02c2 diff --git a/src/iostreamtop.c b/src/iostreamtop.c index e3a6434..f455e78 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -28,26 +28,83 @@ void add_file(struct processtop *proc, struct files *file, int fd) { - if (proc->process_files_table->len <= fd) { + struct files *tmp_file; + struct processtop *parent; + int size; + + 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); 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; + } + } + /* + * The file may have be created in the parent + */ + if (file->flag == -1) { + file->fd = fd; + file->flag = __NR_open; + lttngtop.nbfiles++; + lttngtop.nbnewfiles++; } - file->fd = fd; } +/* + * Edit the file + * Called by handled_statedump_filename + */ +void edit_file(struct processtop *proc, struct files *file, int fd) +{ + int size = proc->process_files_table->len; + struct files *tmpfile; + + if (fd >= size) { + add_file(proc, file, fd); + } else { + tmpfile = g_ptr_array_index(proc->process_files_table, fd); + if (tmpfile) { + tmpfile->name = strdup(file->name); + free(file); + } else + add_file(proc, file, fd); + } +} void insert_file(struct processtop *proc, int fd) { struct files *tmp; + struct files *tmp_parent; + struct processtop *parent; + if (fd < 0) + return; 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; + tmp->flag = -1; add_file(proc, tmp, fd); } else { - tmp = g_ptr_array_index(proc->process_files_table, fd); if (tmp == NULL) { tmp = g_new0(struct files, 1); @@ -55,14 +112,37 @@ void insert_file(struct processtop *proc, int fd) tmp->read = 0; tmp->write = 0; tmp->fd = fd; + tmp->flag = -1; add_file(proc, tmp, fd); + } else { + parent = proc->threadparent; + if (parent) { + tmp_parent = g_ptr_array_index( + parent->process_files_table, fd); + if (tmp_parent && + (strcmp(tmp->name, tmp_parent->name)) != 0) + tmp->name = strdup(tmp_parent->name); + } } } } void close_file(struct processtop *proc, int fd) +{ + struct files *file; + + file = get_file(proc, fd); + if (file != NULL) { + file->flag = __NR_close; + lttngtop.nbfiles--; + } + lttngtop.nbclosedfiles++; +} + +struct files *get_file(struct processtop *proc, int fd) { int len; + struct files *tmp = NULL; len = proc->process_files_table->len; @@ -71,16 +151,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 +172,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) { @@ -114,16 +199,20 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, tmp->totalfileread += ret; tmp->fileread += ret; tmpfile = get_file(tmp, tmp->syscall_info->fd); - tmpfile->read += ret; + if (tmpfile) + tmpfile->read += ret; } else if (tmp->syscall_info->type == __NR_write && ret > 0) { tmp->totalfilewrite += ret; tmp->filewrite += ret; tmpfile = get_file(tmp, tmp->syscall_info->fd); - tmpfile->write += ret; + if (tmpfile) + 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; } @@ -157,13 +246,14 @@ struct file_history *create_file(struct file_history *history, char *file_name) new_file->name = strdup(file_name); new_file->read = 0; new_file->write = 0; + new_file->flag = -1; new_history->file = new_file; new_history->next = history; return new_history; } -enum bt_cb_ret handle_exit_syscall(struct bt_ctf_event *call_data, +enum bt_cb_ret handle_exit_syscall(struct ctf_event_definition *call_data, void *private_data) { const struct definition *scope; @@ -205,25 +295,25 @@ error: } -enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, +enum bt_cb_ret handle_sys_write(struct ctf_event_definition *call_data, void *private_data) { const struct definition *scope; struct processtop *tmp; unsigned long timestamp; uint64_t cpu_id; - char *comm; - int64_t tid; + int64_t tid, pid; int fd; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; - comm = get_context_comm(call_data); tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); + pid = get_context_pid(call_data); + scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data, @@ -233,7 +323,7 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc(<tngtop, tid, comm, timestamp); + tmp = get_proc_pid(<tngtop, tid, pid, timestamp); tmp->syscall_info = create_syscall_info(__NR_write, cpu_id, tid, fd); insert_file(tmp, fd); @@ -244,25 +334,25 @@ error: return BT_CB_ERROR_STOP; } -enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, +enum bt_cb_ret handle_sys_read(struct ctf_event_definition *call_data, void *private_data) { struct processtop *tmp; const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; - char *comm; - int64_t tid; + int64_t tid, pid; int fd; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; - comm = get_context_comm(call_data); tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); + pid = get_context_pid(call_data); + scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data, @@ -272,7 +362,7 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc(<tngtop, tid, comm, timestamp); + tmp = get_proc_pid(<tngtop, tid, pid, timestamp); tmp->syscall_info = create_syscall_info(__NR_read, cpu_id, tid, fd); insert_file(tmp, fd); @@ -284,7 +374,7 @@ error: } -enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, +enum bt_cb_ret handle_sys_open(struct ctf_event_definition *call_data, void *private_data) { @@ -292,28 +382,28 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; - char *comm; - int64_t tid; + int64_t tid, pid; char *file; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; - comm = get_context_comm(call_data); tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); + pid = get_context_pid(call_data); + scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); 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; } - tmp = get_proc(<tngtop, tid, comm, timestamp); + tmp = get_proc_pid(<tngtop, tid, pid, timestamp); tmp->syscall_info = create_syscall_info(__NR_open, cpu_id, tid, -1); tmp->files_history = create_file(tmp->files_history, file); @@ -325,23 +415,23 @@ error: } -enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, +enum bt_cb_ret handle_sys_close(struct ctf_event_definition *call_data, void *private_data) { const struct definition *scope; unsigned long timestamp; - int64_t tid; + int64_t tid, pid; struct processtop *tmp; - char *comm; int fd; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; - comm = get_context_comm(call_data); tid = get_context_tid(call_data); + pid = get_context_pid(call_data); + scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data, @@ -351,7 +441,8 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc(<tngtop, tid, comm, timestamp); + tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + close_file(tmp, fd); return BT_CB_OK; @@ -359,3 +450,56 @@ 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 ctf_event_definition *call_data, + void *private_data) +{ + const struct definition *scope; + struct processtop *parent; + struct files *file; + unsigned long timestamp; + int64_t pid; + char *file_name; + int fd; + + timestamp = bt_ctf_get_timestamp(call_data); + if (timestamp == -1ULL) + goto error; + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + pid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_pid")); + 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_int64(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; + } + + parent = get_proc_pid(<tngtop, pid, pid, timestamp); + parent->files_history = create_file(parent->files_history, file_name); + file = parent->files_history->file; + edit_file(parent, file, fd); + + return BT_CB_OK; + +error: + return BT_CB_ERROR_STOP; +}