From 7dc7b6f47aefdf4793c364b2e3402f9cec0524ec Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Fri, 5 Aug 2022 00:47:10 +0900 Subject: [PATCH] lsfd: add a helper function to get 'struct proc' object for given pid Signed-off-by: Masatake YAMATO --- misc-utils/lsfd.c | 28 ++++++++++++++++++++++++++++ misc-utils/lsfd.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c index b0896979a9..dd38dc2a9f 100644 --- a/misc-utils/lsfd.c +++ b/misc-utils/lsfd.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -307,6 +308,25 @@ struct lsfd_control { struct lsfd_counter **counters; /* NULL terminated array. */ }; +static void *proc_tree; /* for tsearch/tfind */ + +static int proc_tree_compare(const void *a, const void *b) +{ + if (((struct proc *)a)->pid < ((struct proc *)b)->pid) + return -1; + if (((struct proc *)a)->pid > ((struct proc *)b)->pid) + return 1; + return 0; +} + +struct proc *get_proc(pid_t pid) +{ + struct proc **node = tfind(&pid, &proc_tree, proc_tree_compare); + if (node) + return *node; + return NULL; +} + static int column_name_to_id(const char *name, size_t namesz) { size_t i; @@ -959,6 +979,12 @@ static void convert(struct list_head *procs, struct lsfd_control *ctl) static void delete(struct list_head *procs, struct lsfd_control *ctl) { + struct list_head *p; + + list_for_each (p, procs) { + struct proc *proc = list_entry(p, struct proc, procs); + tdelete(proc, &proc_tree, proc_tree_compare); + } list_free(procs, struct proc, procs, free_proc); scols_unref_table(ctl->tb); @@ -1231,6 +1257,8 @@ static void read_process(struct lsfd_control *ctl, struct path_cxt *pc, collect_fd_files(pc, proc); list_add_tail(&proc->procs, &ctl->procs); + if (tsearch(proc, &proc_tree, proc_tree_compare) == NULL) + errx(EXIT_FAILURE, _("failed to allocate memory")); /* The tasks collecting overwrites @pc by /proc//. Keep it as * the last path based operation in read_process() diff --git a/misc-utils/lsfd.h b/misc-utils/lsfd.h index b6c533b4ab..617fefb061 100644 --- a/misc-utils/lsfd.h +++ b/misc-utils/lsfd.h @@ -104,6 +104,8 @@ struct proc { unsigned int kthread: 1; }; +struct proc *get_proc(pid_t pid); + /* * File class */ -- 2.47.3