summaryrefslogtreecommitdiffstats
path: root/src/error.c
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-11-13 15:15:32 +0100
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-11-24 21:20:27 +0100
commit7e56639fe33fe39cb3f4da7dc90f547634cb4d2e (patch)
tree620591119bb7c80bba63d94cb4b3917a4bd27c96 /src/error.c
parentaf5dafdd61af5a29043a1d8ae79427caa2136c7d (diff)
downloadlatrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.tar.gz
latrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.tar.xz
latrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.zip
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c54
1 files changed, 44 insertions, 10 deletions
diff --git a/src/error.c b/src/error.c
index ec457be..adf5948 100644
--- a/src/error.c
+++ b/src/error.c
@@ -407,9 +407,9 @@ static int automated_get_all_syms(struct lt_config_app *cfg,
}
lt_list_for_each_entry(ret, &run->head_return, list_run) {
- struct lt_error_app_return_sym *sym;
+ struct lt_error_app_return_sym *sym, *n;
- lt_list_for_each_entry(sym, &ret->head_sym, list) {
+ lt_list_for_each_entry_safe(sym, n, &ret->head_sym, list) {
lt_list_move_tail(&sym->list, sym_all);
count++;
}
@@ -475,24 +475,33 @@ static int process_run_automated_cb(struct lt_config_app *cfg,
char *symname;
long index;
+ PRINT_VERBOSE(cfg, 1, "type %d\n", mbase->type);
+
if (mbase->type != LT_FIFO_MTYPE_EXIT)
return 0;
index = automated_get_index(cfg, mbase);
error_config = cfg->error_config;
- if (cfg->error_automated_symbol_index < error_config->sym_cnt) {
+ PRINT_VERBOSE(cfg, 1, "index %d, error_automated_symbol_index %d, sym_cnt %d\n",
+ index, cfg->error_automated_symbol_index, error_config->sym_cnt);
+
+ symname = automated_get_symname(cfg, mbase);
+ PRINT_VERBOSE(cfg, 1, "symname %s\n", symname);
+
+ if (cfg->error_automated_symbol_index < (error_config->sym_cnt - 1)) {
if (index != -1)
- BUG_ON((cfg->error_automated_symbol_index + 1) != index);
cfg->error_automated_symbol_index = index;
+
return 0;
}
- symname = automated_get_symname(cfg, mbase);
sym = automated_find_symbol_all(cfg, symname);
if (!sym)
return 0;
+ PRINT_VERBOSE(cfg, 1, "added %s\n", symname);
+
if (automated_add_symbol_current(cfg, sym))
return -1;
@@ -557,8 +566,6 @@ static int prepare_config_error_automated(struct lt_config_app *cfg,
lt_list_for_each_entry(sym, sym_current, list)
sym_cnt++;
- BUG_ON(sym_cnt);
-
PRINT_VERBOSE(cfg, 1, "number of symbols %d\n", sym_cnt);
cfg_err = malloc(sizeof(*cfg_err) +
@@ -580,11 +587,12 @@ static int prepare_config_error_automated(struct lt_config_app *cfg,
cfg_sym->keep = sym->keep;
cfg_sym->handle_sigsegv = sym->handle_sigsegv;
- PRINT_VERBOSE(cfg, 1, "symbol %s, ret %s\n",
- sym->name, cfg_sym->ret);
+ PRINT_VERBOSE(cfg, 1, "symbol %s, keep %d, ret %llu\n",
+ cfg_sym->symbol, cfg_sym->keep, cfg_sym->ret);
}
cfg->error_config = cfg_err;
+ cfg->error_automated_symbol_index = -1;
return 0;
}
@@ -644,6 +652,8 @@ static int process_run_automated(struct lt_config_app *cfg,
return -1;
while(1) {
+ printf("round %d\n", n);
+
if (dir_run(cfg, dir, dir_base, run, n))
break;
@@ -671,7 +681,7 @@ static int process_go_automated(struct lt_config_app *cfg, char *dir,
{
struct lt_error_app_run *run;
- if (!automated_get_all_syms(cfg, go) <= 0)
+ if (automated_get_all_syms(cfg, go) <= 0)
return -1;
run = lt_list_first_entry(&go->head_run, struct lt_error_app_run, list_go);
@@ -1044,6 +1054,8 @@ int lt_error_app_init(struct lt_error_app *app)
int lt_error_config_write(struct lt_config_app *cfg, int fd)
{
+ struct lt_list_head *sym_all = &cfg->error_symbols_all;
+ struct lt_error_app_return_sym *sym;
struct lt_error_config *cfg_err = cfg->error_config;
int size = sizeof(struct lt_error_config);
@@ -1051,10 +1063,32 @@ int lt_error_config_write(struct lt_config_app *cfg, int fd)
size += cfg_err->sym_cnt * sizeof(struct lt_error_config_sym);
+ PRINT_VERBOSE(cfg, 1, "sym_cnt %d\n", cfg_err->sym_cnt);
+
if (size != write(fd, cfg_err, size)) {
perror("write failed");
return -1;
}
+ if (!cfg_err->automated)
+ return 0;
+
+ PRINT_VERBOSE(cfg, 1, "writing automated list info\n");
+
+ lt_list_for_each_entry(sym, sym_all, list) {
+ char symbol[LT_MAXNAME];
+ int len;
+
+ len = snprintf(symbol, LT_MAXNAME, "%s", sym->name);
+ if (len != write(fd, symbol, len)) {
+ perror("write failed");
+ return -1;
+ }
+ len = 0;
+ write(fd, &len, 1);
+ }
+
+ PRINT_VERBOSE(cfg, 1, "OK\n");
+
return 0;
}