X-Git-Url: https://git.lttng.org/?p=lttngtop.git;a=blobdiff_plain;f=src%2Fiostreamtop.c;h=44fe37b89995aadc722ca5786d3f859a5830b4e8;hp=7c1d611af8b74b1a7e6aa1ac566b2fbc5c8b52ad;hb=54645d5cab414bb3391837ef7acb919cf106c71f;hpb=6f29d91efdaccdce256eb2e35be385da599daa77 diff --git a/src/iostreamtop.c b/src/iostreamtop.c index 7c1d611..44fe37b 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,20 +31,25 @@ 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); if (tmp_file == NULL) g_ptr_array_index(proc->process_files_table, fd) = file; else { - if (strcmp(tmp_file->name, file->name) != 0) { + if (!tmp_file->name || + strcmp(tmp_file->name, file->name) != 0) { size = proc->process_files_table->len; g_ptr_array_set_size(proc->process_files_table, size+1); @@ -98,7 +103,7 @@ void insert_file(struct processtop *proc, int fd) return; if (fd >= proc->process_files_table->len) { tmp = g_new0(struct files, 1); - tmp->name = "Unknown"; + tmp->name = NULL; tmp->read = 0; tmp->write = 0; tmp->fd = fd; @@ -108,7 +113,7 @@ void insert_file(struct processtop *proc, int fd) tmp = g_ptr_array_index(proc->process_files_table, fd); if (tmp == NULL) { tmp = g_new0(struct files, 1); - tmp->name = "Unknown"; + tmp->name = NULL; tmp->read = 0; tmp->write = 0; tmp->fd = fd; @@ -119,7 +124,7 @@ void insert_file(struct processtop *proc, int fd) if (parent) { tmp_parent = g_ptr_array_index( parent->process_files_table, fd); - if (tmp_parent && + if (tmp_parent && tmp->name && tmp_parent->name && (strcmp(tmp->name, tmp_parent->name)) != 0) tmp->name = strdup(tmp_parent->name); } @@ -135,6 +140,12 @@ void close_file(struct processtop *proc, int fd) if (file != NULL) { file->flag = __NR_close; lttngtop.nbfiles--; + /* + if (file->name) { + free(file->name); + file->name = NULL; + } + */ } lttngtop.nbclosedfiles++; } @@ -185,14 +196,19 @@ void show_history(struct file_history *history) } int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, - unsigned long timestamp, uint64_t cpu_id, int ret) + unsigned long timestamp, uint64_t cpu_id, int ret, + char *hostname) { struct processtop *tmp; struct files *tmpfile; int err = 0; - tmp = get_proc(ctx, tid, comm, timestamp); + tmp = get_proc(ctx, tid, comm, timestamp, hostname); + if (!tmp) { + err = -1; + goto end; + } if (tmp->syscall_info != NULL) { if (tmp->syscall_info->type == __NR_read && ret > 0) { @@ -219,6 +235,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,11 +274,12 @@ 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; uint64_t cpu_id; + char *hostname; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) @@ -279,13 +298,15 @@ enum bt_cb_ret handle_exit_syscall(struct bt_ctf_event *call_data, } cpu_id = get_cpu_id(call_data); + hostname = get_context_hostname(call_data); /* * if we encounter an exit_syscall and * it is not for a syscall read or write * we just abort the execution of this callback */ - if ((update_iostream_ret(<tngtop, tid, comm, timestamp, cpu_id, ret)) < 0) + if ((update_iostream_ret(<tngtop, tid, comm, timestamp, cpu_id, + ret, hostname)) < 0) return BT_CB_ERROR_CONTINUE; return BT_CB_OK; @@ -298,11 +319,12 @@ 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; - int64_t tid, pid; + int64_t tid; + char *procname, *hostname; int fd; timestamp = bt_ctf_get_timestamp(call_data); @@ -312,7 +334,8 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); + hostname = get_context_hostname(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -323,11 +346,15 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp, hostname); + 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: @@ -338,11 +365,13 @@ 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, pid; + int64_t tid; + char *procname; int fd; + char *hostname; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) @@ -351,7 +380,8 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); + hostname = get_context_hostname(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -362,27 +392,31 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp, hostname); + 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: return BT_CB_ERROR_STOP; } - enum bt_cb_ret handle_sys_open(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, pid; + int64_t tid; + char *procname, *hostname; char *file; timestamp = bt_ctf_get_timestamp(call_data); @@ -392,7 +426,8 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); + hostname = get_context_hostname(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -403,26 +438,69 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp, hostname); + 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: return BT_CB_ERROR_STOP; } +enum bt_cb_ret handle_sys_socket(struct bt_ctf_event *call_data, + void *private_data) +{ + + struct processtop *tmp; + unsigned long timestamp; + uint64_t cpu_id; + int64_t tid; + char *procname, *hostname; + char *file; + + timestamp = bt_ctf_get_timestamp(call_data); + if (timestamp == -1ULL) + goto error; + + tid = get_context_tid(call_data); + cpu_id = get_cpu_id(call_data); + + procname = get_context_comm(call_data); + hostname = get_context_hostname(call_data); + + file = strdup("socket"); + + tmp = get_proc(<tngtop, tid, procname, timestamp, hostname); + 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: + return BT_CB_ERROR_STOP; +} enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, void *private_data) { - const struct definition *scope; - unsigned long timestamp; - int64_t tid, pid; + const struct bt_definition *scope; struct processtop *tmp; + unsigned long timestamp; + int64_t tid; + char *procname; int fd; + char *hostname; timestamp = bt_ctf_get_timestamp(call_data); if (timestamp == -1ULL) @@ -430,7 +508,8 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); + hostname = get_context_hostname(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -441,10 +520,13 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp, hostname); + if (!tmp) + goto end; close_file(tmp, fd); +end: return BT_CB_OK; error: @@ -454,12 +536,12 @@ 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; int64_t pid; - char *file_name; + char *file_name, *hostname; int fd; timestamp = bt_ctf_get_timestamp(call_data); @@ -492,12 +574,17 @@ enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data, fprintf(stderr, "Missing file name context info\n"); goto error; } + hostname = get_context_hostname(call_data); + + parent = get_proc_pid(<tngtop, pid, pid, timestamp, hostname); + if (!parent) + goto end; - 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); +end: return BT_CB_OK; error: