diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-11-13 15:15:32 +0100 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-11-24 21:20:27 +0100 |
commit | 7e56639fe33fe39cb3f4da7dc90f547634cb4d2e (patch) | |
tree | 620591119bb7c80bba63d94cb4b3917a4bd27c96 /src/error.c | |
parent | af5dafdd61af5a29043a1d8ae79427caa2136c7d (diff) | |
download | latrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.tar.gz latrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.tar.xz latrace-7e56639fe33fe39cb3f4da7dc90f547634cb4d2e.zip |
changeserror_simulation2
Diffstat (limited to 'src/error.c')
-rw-r--r-- | src/error.c | 54 |
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; } |