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);
if (file != NULL) {
file->flag = __NR_close;
lttngtop.nbfiles--;
+ if (file->name) {
+ free(file->name);
+ file->name = NULL;
+ }
}
lttngtop.nbclosedfiles++;
}
}
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) {
g_free(tmp->syscall_info);
tmp->syscall_info = NULL;
}
+
+end:
return err;
}
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)
}
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;
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;
- char *procname;
+ char *procname, *hostname;
int fd;
timestamp = bt_ctf_get_timestamp(call_data);
cpu_id = get_cpu_id(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);
goto error;
}
- tmp = get_proc(<tngtop, tid, procname, 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:
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;
char *procname;
int fd;
+ char *hostname;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
cpu_id = get_cpu_id(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);
goto error;
}
- tmp = get_proc(<tngtop, tid, procname, 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;
- char *procname;
+ char *procname, *hostname;
char *file;
timestamp = bt_ctf_get_timestamp(call_data);
cpu_id = get_cpu_id(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);
goto error;
}
- tmp = get_proc(<tngtop, tid, procname, 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;
+ 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)
tid = get_context_tid(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);
goto error;
}
- tmp = get_proc(<tngtop, tid, procname, timestamp);
+ tmp = get_proc(<tngtop, tid, procname, timestamp, hostname);
+ if (!tmp)
+ goto end;
close_file(tmp, fd);
+end:
return BT_CB_OK;
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);
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: