X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fiostreamtop.c;h=71843cb900137a2adb706a5124800c221724f391;hp=a1c78a98a63e13329eaafd0b342727f3b5894cdd;hb=ceb3a2216fed5f405aa77c358328f71f44ed3303;hpb=b093de8aa1ac7555d20b3aa4227d4675b39ef008 diff --git a/src/iostreamtop.c b/src/iostreamtop.c index a1c78a9..71843cb 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -10,10 +10,9 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include @@ -29,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) { @@ -46,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 { @@ -62,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; @@ -72,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; } @@ -100,8 +141,20 @@ 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, int cpu_id, int ret) + unsigned long timestamp, uint64_t cpu_id, int ret) { struct processtop *tmp; struct files *tmpfile; @@ -124,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; } @@ -134,7 +189,7 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, return err; } -struct syscalls *create_syscall_info(unsigned int type, unsigned int cpu_id, +struct syscalls *create_syscall_info(unsigned int type, uint64_t cpu_id, unsigned int tid, int fd) { struct syscalls *syscall_info; @@ -167,31 +222,18 @@ 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) { - struct definition *scope; + const struct definition *scope; unsigned long timestamp; char *comm; uint64_t ret, tid; - int64_t cpu_id; + uint64_t cpu_id; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) goto error; - scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_EVENT_CONTEXT); - comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, - scope, "_procname")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing procname context info\n"); - goto error; - } - - tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, - scope, "_tid")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing tid context info\n"); - goto error; - } + comm = get_context_comm(call_data); + tid = get_context_tid(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -202,14 +244,7 @@ enum bt_cb_ret handle_exit_syscall(struct bt_ctf_event *call_data, goto error; } - scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_PACKET_CONTEXT); - cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(call_data, - scope, "cpu_id")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing cpu_id context info\n"); - goto error; - } + cpu_id = get_cpu_id(call_data); /* * if we encounter an exit_syscall and @@ -229,7 +264,7 @@ error: enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, void *private_data) { - struct definition *scope; + const struct definition *scope; struct processtop *tmp; unsigned long timestamp; uint64_t cpu_id; @@ -241,30 +276,9 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, if (timestamp == -1ULL) goto error; - scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_EVENT_CONTEXT); - comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, - scope, "_procname")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing procname context info\n"); - goto error; - } - - tid = bt_ctf_get_int64(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_STREAM_PACKET_CONTEXT); - cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(call_data, - scope, "cpu_id")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing cpu_id context info\n"); - goto error; - } + comm = get_context_comm(call_data); + tid = get_context_tid(call_data); + cpu_id = get_cpu_id(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -290,7 +304,7 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, void *private_data) { struct processtop *tmp; - struct definition *scope; + const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; char *comm; @@ -301,30 +315,9 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, if (timestamp == -1ULL) goto error; - scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_EVENT_CONTEXT); - comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, - scope, "_procname")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing procname context info\n"); - goto error; - } - - tid = bt_ctf_get_int64(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_STREAM_PACKET_CONTEXT); - cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(call_data, - scope, "cpu_id")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing cpu_id context info\n"); - goto error; - } + comm = get_context_comm(call_data); + tid = get_context_tid(call_data); + cpu_id = get_cpu_id(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -352,7 +345,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, { struct processtop *tmp; - struct definition *scope; + const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; char *comm; @@ -363,37 +356,16 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, if (timestamp == -1ULL) goto error; - scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_EVENT_CONTEXT); - comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, - scope, "_procname")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing procname context info\n"); - goto error; - } - - tid = bt_ctf_get_int64(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_STREAM_PACKET_CONTEXT); - cpu_id = bt_ctf_get_uint64(bt_ctf_get_field(call_data, - scope, "cpu_id")); - if (bt_ctf_field_get_error()) { - fprintf(stderr, "Missing cpu_id context info\n"); - goto error; - } + comm = get_context_comm(call_data); + tid = get_context_tid(call_data); + cpu_id = get_cpu_id(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; } @@ -412,7 +384,7 @@ error: enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, void *private_data) { - struct definition *scope; + const struct definition *scope; unsigned long timestamp; int64_t tid; struct processtop *tmp; @@ -423,17 +395,49 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, if (timestamp == -1ULL) goto error; + comm = get_context_comm(call_data); + tid = get_context_tid(call_data); + scope = bt_ctf_get_top_level_scope(call_data, - BT_STREAM_EVENT_CONTEXT); - comm = bt_ctf_get_char_array(bt_ctf_get_field(call_data, - scope, "_procname")); + 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 procname context info\n"); + fprintf(stderr, "Missing fd context info\n"); goto error; } - tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, - scope, "_tid")); + tmp = get_proc(<tngtop, tid, comm, timestamp); + + close_file(tmp, fd); + + return BT_CB_OK; + +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; @@ -448,11 +452,26 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc(<tngtop, tid, comm, timestamp); - close_file(tmp, fd); + 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; } +*/