X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fiostreamtop.c;h=d3172f0648a3a8f49e1f6107c9e6d8efb0b75f88;hp=33b901938b9356e65690694c297f403483edd84b;hb=96aa77debf3aee00361101fb2e76781c65f02ba9;hpb=928f18a6c02cf1eaafb7b60cb72860ed68d7456b diff --git a/src/iostreamtop.c b/src/iostreamtop.c index 33b9019..d3172f0 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Mathieu Bain + * Copyright (C) 2011-2012 Mathieu Bain * * 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,13 +31,17 @@ 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); @@ -193,6 +197,10 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, tmp = get_proc(ctx, tid, comm, timestamp); + if (!tmp) { + err = -1; + goto end; + } if (tmp->syscall_info != NULL) { if (tmp->syscall_info->type == __NR_read && ret > 0) { @@ -219,6 +227,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,7 +266,7 @@ 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; @@ -298,7 +308,7 @@ 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; @@ -325,10 +335,14 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + 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: @@ -339,7 +353,7 @@ 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; @@ -365,10 +379,14 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + 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: @@ -381,7 +399,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, { struct processtop *tmp; - const struct definition *scope; + const struct bt_definition *scope; unsigned long timestamp; uint64_t cpu_id; int64_t tid; @@ -407,10 +425,14 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + 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: @@ -421,7 +443,7 @@ error: enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, void *private_data) { - const struct definition *scope; + const struct bt_definition *scope; struct processtop *tmp; unsigned long timestamp; int64_t tid; @@ -446,9 +468,12 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + if (!tmp) + goto end; close_file(tmp, fd); +end: return BT_CB_OK; error: @@ -458,7 +483,7 @@ 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; @@ -498,10 +523,14 @@ enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data, } parent = get_proc_pid(<tngtop, pid, pid, timestamp); + if (!parent) + goto end; + 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: