summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2022-07-05 15:34:18 +0200
committerEugene Syromyatnikov <evgsyr@gmail.com>2022-07-11 19:08:59 +0200
commita0f7df7d3783074b5aac66ea4e55646524164e70 (patch)
tree950972062b658fecbed466f044916d4ac33b225b
parent5338636cd9ae7f53ed73f1a7909db03189ea2ff3 (diff)
downloadstrace-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.h7
-rw-r--r--src/pathtrace.c4
-rw-r--r--src/strace.c35
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);