diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-07-05 15:34:18 +0200 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-07-11 19:08:59 +0200 |
commit | a0f7df7d3783074b5aac66ea4e55646524164e70 (patch) | |
tree | 950972062b658fecbed466f044916d4ac33b225b | |
parent | 5338636cd9ae7f53ed73f1a7909db03189ea2ff3 (diff) | |
download | strace-a0f7df7d3783074b5aac66ea4e55646524164e70.tar.gz |
pathtrace, strace: refactor path trace options parsing and storing
In preparation for further changes.
* src/defs.h (struct path_set_item): New type.
(struct path_set): Use struct path_set_item for storing paths_selected.
* src/pathtrace.c (pathmatch, storepath): Access specific paths using
"path" field.
* src/strace.c (struct pathtrace): New type.
(add_path_trace): New function.
(init): Replace pathtrace_paths, pathtrace_size, and pathtrace_count
variables with pathtrace variable.
(init) <case 'P'>: Call add_path_trace instead of open-coded
pathtrace_paths array update.
(init): Access pathtrace "paths" and "count" fields instead
of pathtrace_paths and pathtrace_count, respectively.
-rw-r--r-- | src/defs.h | 7 | ||||
-rw-r--r-- | src/pathtrace.c | 4 | ||||
-rw-r--r-- | src/strace.c | 35 |
3 files changed, 31 insertions, 15 deletions
diff --git a/src/defs.h b/src/defs.h index 884b65b61..0b438c0c5 100644 --- a/src/defs.h +++ b/src/defs.h @@ -513,9 +513,13 @@ extern int Tflag_width; extern bool iflag; extern bool count_wallclock; +struct path_set_item { + const char *path; +}; + /* are we filtering traces based on paths? */ extern struct path_set { - const char **paths_selected; + struct path_set_item *paths_selected; size_t num_selected; size_t size; } global_path_set; @@ -770,6 +774,7 @@ extern long getrval2(struct tcb *); extern const char *signame(const int); extern const char *sprintsigname(const int); + extern void pathtrace_select_set(const char *, struct path_set *); extern bool pathtrace_match_set(struct tcb *, struct path_set *); diff --git a/src/pathtrace.c b/src/pathtrace.c index ee3aa4420..f0b2f4ebd 100644 --- a/src/pathtrace.c +++ b/src/pathtrace.c @@ -28,7 +28,7 @@ static bool pathmatch(const char *path, struct path_set *set) { for (unsigned int i = 0; i < set->num_selected; ++i) { - if (strcmp(path, set->paths_selected[i]) == 0) + if (strcmp(path, set->paths_selected[i].path) == 0) return true; } return false; @@ -74,7 +74,7 @@ storepath(const char *path, struct path_set *set) xgrowarray(set->paths_selected, &set->size, sizeof(set->paths_selected[0])); - set->paths_selected[set->num_selected++] = path; + set->paths_selected[set->num_selected++].path = path; } int diff --git a/src/strace.c b/src/strace.c index 67997aae5..3f5a00a0a 100644 --- a/src/strace.c +++ b/src/strace.c @@ -2130,6 +2130,24 @@ increase_version_verbosity(void) version_verbosity++; } +struct pathtrace { + struct path_set_item *paths; + size_t size; + size_t count; +}; + +static void +add_path_trace(struct pathtrace *pt, const char *path) +{ + if (pt->count >= pt->size) { + pt->paths = xgrowarray(pt->paths, &pt->size, + sizeof(pt->paths[0])); + } + + pt->paths[pt->count].path = path; + pt->count++; +} + /* * Initialization part of main() was eating much stack (~0.5k), * which was unused after init. @@ -2171,9 +2189,7 @@ init(int argc, char *argv[]) * after the successful backend initialisation, iterate over it * in order to add them to global_path_set. */ - const char **pathtrace_paths = NULL; - size_t pathtrace_size = 0; - size_t pathtrace_count = 0; + struct pathtrace pathtrace = { NULL }; /** * Storage for environment changes requested for command. They @@ -2419,12 +2435,7 @@ init(int argc, char *argv[]) process_opt_p_list(optarg); break; case 'P': - if (pathtrace_count >= pathtrace_size) - pathtrace_paths = xgrowarray(pathtrace_paths, - &pathtrace_size, - sizeof(pathtrace_paths[0])); - - pathtrace_paths[pathtrace_count++] = optarg; + add_path_trace(&pathtrace, optarg); break; case 'q': qflag_short++; @@ -2757,9 +2768,9 @@ init(int argc, char *argv[]) "take effect. " "See status qualifier for more complex filters."); - for (size_t cnt = 0; cnt < pathtrace_count; ++cnt) - pathtrace_select(pathtrace_paths[cnt]); - free(pathtrace_paths); + for (size_t cnt = 0; cnt < pathtrace.count; ++cnt) + pathtrace_select(pathtrace.paths[cnt].path); + free(pathtrace.paths); acolumn_spaces = xmalloc(acolumn + 1); memset(acolumn_spaces, ' ', acolumn); |