On Mon, Jul 26, 2010 at 2:56 AM, Dhaval Giani <[email protected]> wrote:
>
>
> This patch adds a new API to get a list of procs. This is
> guaranteed to be sorted.
>
> TODO:
> 1. Ensure only unique values make it through
>
> Signed-off-by: Dhaval Giani <[email protected]>
> ---
> include/libcgroup/groups.h | 10 +++++
> src/api.c | 86
> +++++++++++++++++++++++++++++++++++++++++++++
> src/libcgroup.map | 7 +++
> 3 files changed, 103 insertions(+)
>
> Index: libcg/src/api.c
> ===================================================================
> --- libcg.orig/src/api.c
> +++ libcg/src/api.c
> @@ -3386,3 +3386,89 @@ int cgroup_get_all_controller_begin(void
>
> return cgroup_get_all_controller_next(handle, info);
> }
> +
> +static int pid_compare(const void *a, const void *b)
> +{
> + const pid_t *pid1, *pid2;
> +
> + pid1 = (pid_t *) a;
> + pid2 = (pid_t *) b;
> +
> + if (*pid1 < *pid2)
> + return -1;
> +
> + if (*pid1 > *pid2)
> + return 1;
nit-picking: Can't we just return *pid1 - *pid2?
> +
> + return 0;
> +}
> +
> +/*
> + *pids needs to be completely uninitialized so that we can set it up
> + *
> + * Caller must free up pids.
> + */
> +int cgroup_get_procs(char *name, char *controller, pid_t **pids, int *size)
> +{
> + char cgroup_path[FILENAME_MAX];
> + FILE *procs;
> + pid_t *tmp_list;
> + int tot_procs = 1;
I'd recommend lets start with a larger default like 8 or 16, so that
we don't have to do two reallocs for a group with 2 or 5 pids.
> + int n = 0;
> +
> + cg_build_path(name, cgroup_path, controller);
> + strncat(cgroup_path, "/cgroup.procs",
> FILENAME_MAX-strlen(cgroup_path));
> +
> + /*
> + * Read all the procs and then sort them up.
> + */
> +
> + tmp_list = *pids;
> +
> + /*
> + * Keep doubling the memory allocated if needed
> + */
> + tmp_list= malloc(sizeof(pid_t) * tot_procs);
> + if (!tmp_list) {
> + last_errno = errno;
> + return ECGOTHER;
> + }
> +
> + procs = fopen(cgroup_path, "r");
> + if (!procs) {
> + last_errno = errno;
> + return ECGOTHER;
> + }
This typically implies that we are using an older version of the
kernel, could you please add a comment indicating that. I wonder if
ENOTSUPP is a better error to return here
> +
> + while (!feof(procs)) {
> + while (n < tot_procs) {
> + pid_t pid;
> + fscanf(procs, "%u", &pid);
> + tmp_list[n] = pid;
> + n++;
This loop needs a feof() check as well
> + }
> + if (!feof(procs)) {
> + tot_procs *= 2;
> + tmp_list = realloc(tmp_list, sizeof(pid_t) *
> tot_procs);
> + if (!tmp_list) {
> + last_errno = errno;
> + return ECGOTHER;
> + }
> + }
> + }
> +
> + /*
> + * We decrement n because for some reason the last value
> + * gets repeated twice. Still need to investigate why, and
> + * if we are losing the last (sorted?) value, this is the
> + * obvious place to check.
> + */
Please see the comments above
> + n--;
> + *size = n;
> +
> + qsort(tmp_list, n, sizeof(pid_t), &pid_compare);
Is there are reason we qsort here? I though the kernel already sorted
the pids.. no?
> +
> + *pids = tmp_list;
> +
Thanks for working on this
Balbir
------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share
of $1 Million in cash or HP Products. Visit us here for more details:
http://ad.doubleclick.net/clk;226879339;13503038;l?
http://clk.atdmt.com/CRS/go/247765532/direct/01/
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel