projects
/
lttngtop.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
process list filtering
[lttngtop.git]
/
src
/
iostreamtop.c
diff --git
a/src/iostreamtop.c
b/src/iostreamtop.c
index 71843cb900137a2adb706a5124800c221724f391..d3172f0648a3a8f49e1f6107c9e6d8efb0b75f88 100644
(file)
--- a/
src/iostreamtop.c
+++ b/
src/iostreamtop.c
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (C) 2011 Mathieu Bain <mathieu.bain@polymtl.ca>
+ * Copyright (C) 2011
-2012
Mathieu Bain <mathieu.bain@polymtl.ca>
*
* 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
*
* 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
@@
-29,12
+29,19
@@
void add_file(struct processtop *proc, struct files *file, int fd)
{
struct files *tmp_file;
void add_file(struct processtop *proc, struct files *file, int fd)
{
struct files *tmp_file;
+ struct processtop *parent;
int size;
int size;
+ int i;
size = proc->process_files_table->len;
size = proc->process_files_table->len;
-
+ parent = proc->threadparent;
+ if (parent)
+ insert_file(parent, fd);
if (size <= 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);
g_ptr_array_add(proc->process_files_table, file);
} else {
tmp_file = g_ptr_array_index(proc->process_files_table, fd);
@@
-44,7
+51,7
@@
void add_file(struct processtop *proc, struct files *file, int fd)
if (strcmp(tmp_file->name, file->name) != 0) {
size = proc->process_files_table->len;
g_ptr_array_set_size(proc->process_files_table,
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);
+
size+1);
g_ptr_array_index(proc->process_files_table,
size) = tmp_file;
g_ptr_array_index(proc->process_files_table,
g_ptr_array_index(proc->process_files_table,
size) = tmp_file;
g_ptr_array_index(proc->process_files_table,
@@
-53,39
+60,55
@@
void add_file(struct processtop *proc, struct files *file, int fd)
tmp_file->flag = __NR_open;
}
}
tmp_file->flag = __NR_open;
}
}
- file->fd = fd;
- 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++;
+ }
}
}
-/* TODO */
-/* To be done */
+/*
+ * 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;
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 {
+ if (
fd >= size) {
+
add_file(proc, file, fd)
;
+
}
else {
tmpfile = g_ptr_array_index(proc->process_files_table, fd);
tmpfile = g_ptr_array_index(proc->process_files_table, fd);
- tmpfile->name = strdup(file->name);
- free(file);
+ 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;
}
}
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;
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 {
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);
tmp = g_ptr_array_index(proc->process_files_table, fd);
if (tmp == NULL) {
tmp = g_new0(struct files, 1);
@@
-93,7
+116,17
@@
void insert_file(struct processtop *proc, int fd)
tmp->read = 0;
tmp->write = 0;
tmp->fd = fd;
tmp->read = 0;
tmp->write = 0;
tmp->fd = fd;
+ tmp->flag = -1;
add_file(proc, tmp, fd);
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);
+ }
}
}
}
}
}
}
@@
-102,10
+135,12
@@
void close_file(struct processtop *proc, int fd)
{
struct files *file;
{
struct files *file;
-
file = get_file(proc, fd);
file = get_file(proc, fd);
- if (file != NULL)
+ if (file != NULL)
{
file->flag = __NR_close;
file->flag = __NR_close;
+ lttngtop.nbfiles--;
+ }
+ lttngtop.nbclosedfiles++;
}
struct files *get_file(struct processtop *proc, int fd)
}
struct files *get_file(struct processtop *proc, int fd)
@@
-162,19
+197,25
@@
int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
tmp = get_proc(ctx, tid, comm, timestamp);
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) {
tmp->totalfileread += ret;
tmp->fileread += ret;
tmpfile = get_file(tmp, tmp->syscall_info->fd);
if (tmp->syscall_info != NULL) {
if (tmp->syscall_info->type == __NR_read
&& ret > 0) {
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);
} 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) {
tmpfile = tmp->files_history->file;
} else if (tmp->syscall_info->type == __NR_open
&& ret > 0) {
tmpfile = tmp->files_history->file;
@@
-186,6
+227,8
@@
int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm,
g_free(tmp->syscall_info);
tmp->syscall_info = NULL;
}
g_free(tmp->syscall_info);
tmp->syscall_info = NULL;
}
+
+end:
return err;
}
return err;
}
@@
-213,6
+256,7
@@
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->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;
new_history->file = new_file;
new_history->next = history;
@@
-222,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)
{
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;
unsigned long timestamp;
char *comm;
uint64_t ret, tid;
@@
-264,22
+308,23
@@
error:
enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data,
void *private_data)
{
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;
struct processtop *tmp;
unsigned long timestamp;
uint64_t cpu_id;
- char *comm;
int64_t tid;
int64_t tid;
+ char *procname;
int fd;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
goto error;
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);
tid = get_context_tid(call_data);
cpu_id = get_cpu_id(call_data);
+ procname = get_context_comm(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,
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data,
@@
-289,11
+334,15
@@
enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data,
goto error;
}
goto error;
}
- tmp = get_proc(<tngtop, tid, comm, timestamp);
+ 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);
tmp->syscall_info = create_syscall_info(__NR_write, cpu_id, tid, fd);
insert_file(tmp, fd);
+end:
return BT_CB_OK;
error:
return BT_CB_OK;
error:
@@
-304,21
+353,22
@@
enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data,
void *private_data)
{
struct processtop *tmp;
void *private_data)
{
struct processtop *tmp;
- const struct definition *scope;
+ const struct
bt_
definition *scope;
unsigned long timestamp;
uint64_t cpu_id;
unsigned long timestamp;
uint64_t cpu_id;
- char *comm;
int64_t tid;
int64_t tid;
+ char *procname;
int fd;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
goto error;
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);
tid = get_context_tid(call_data);
cpu_id = get_cpu_id(call_data);
+ procname = get_context_comm(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,
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data,
@@
-328,11
+378,15
@@
enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data,
goto error;
}
goto error;
}
- tmp = get_proc(<tngtop, tid, comm, timestamp);
+ 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);
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_OK;
error:
@@
-345,21
+399,22
@@
enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
{
struct processtop *tmp;
{
struct processtop *tmp;
- const struct definition *scope;
+ const struct
bt_
definition *scope;
unsigned long timestamp;
uint64_t cpu_id;
unsigned long timestamp;
uint64_t cpu_id;
- char *comm;
int64_t tid;
int64_t tid;
+ char *procname;
char *file;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
goto error;
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);
tid = get_context_tid(call_data);
cpu_id = get_cpu_id(call_data);
+ procname = get_context_comm(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 = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
file = bt_ctf_get_string(bt_ctf_get_field(call_data,
@@
-369,11
+424,15
@@
enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data,
goto error;
}
goto error;
}
- tmp = get_proc(<tngtop, tid, comm, timestamp);
+ 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);
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_OK;
error:
@@
-384,20
+443,21
@@
error:
enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
void *private_data)
{
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;
unsigned long timestamp;
int64_t tid;
- struct processtop *tmp;
- char *comm;
+ char *procname;
int fd;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
goto error;
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);
tid = get_context_tid(call_data);
+ procname = get_context_comm(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,
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
fd = bt_ctf_get_uint64(bt_ctf_get_field(call_data,
@@
-407,37
+467,38
@@
enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data,
goto error;
}
goto error;
}
- tmp = get_proc(<tngtop, tid, comm, timestamp);
+ tmp = get_proc(<tngtop, tid, procname, timestamp);
+ if (!tmp)
+ goto end;
close_file(tmp, fd);
close_file(tmp, fd);
+end:
return BT_CB_OK;
error:
return BT_CB_ERROR_STOP;
}
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)
{
enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
void *private_data)
{
- struct definition *scope;
+ const struct bt_definition *scope;
+ struct processtop *parent;
struct files *file;
unsigned long timestamp;
struct files *file;
unsigned long timestamp;
- int64_t tid;
- struct processtop *tmp;
- char *comm, *file_name;
+ int64_t pid;
+ char *file_name;
int fd;
timestamp = bt_ctf_get_timestamp(call_data);
if (timestamp == -1ULL)
goto error;
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);
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
-
tid = bt_ctf_get_u
int64(bt_ctf_get_field(call_data,
- scope, "_
t
id"));
+
pid = bt_ctf_get_
int64(bt_ctf_get_field(call_data,
+ scope, "_
p
id"));
if (bt_ctf_field_get_error()) {
fprintf(stderr, "Missing tid context info\n");
goto error;
if (bt_ctf_field_get_error()) {
fprintf(stderr, "Missing tid context info\n");
goto error;
@@
-445,7
+506,7
@@
enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
scope = bt_ctf_get_top_level_scope(call_data,
BT_EVENT_FIELDS);
- fd = bt_ctf_get_
u
int64(bt_ctf_get_field(call_data,
+ 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");
scope, "_fd"));
if (bt_ctf_field_get_error()) {
fprintf(stderr, "Missing fd context info\n");
@@
-461,17
+522,17
@@
enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data,
goto error;
}
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);
+ parent = get_proc_pid(<tngtop, pid, pid, timestamp);
+ if (!parent)
+ goto end;
- fprintf(stderr, "%lu %s\n", tmp->tid, file_name);
+ 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:
return BT_CB_ERROR_STOP;
}
return BT_CB_OK;
error:
return BT_CB_ERROR_STOP;
}
-*/
This page took
0.027956 seconds
and
4
git commands to generate.