On 09/02/2010 12:17 PM, Ivana Hutarova Varekova wrote:
> This patch adds three iterators api function
> cgroup_read_vars_begin
> cgroup_read_vars_next
> cgroup_read_vars_end
>
> They read the values of the given variable for the specified
> controller and control group. The string with the maximal
> length max is returned line is returned per
> cgroup_read_stats_begin() and cgroup_read_stats_next() call.
>
> (there already are _stat_ versions of function which can read only stat
> variables)
>
> Signed-off-by: Ivana Hutarova Varekova<[email protected]>
> ---
>
> include/libcgroup/iterators.h | 38 +++++++++++++++++++++
> src/api.c | 75
> +++++++++++++++++++++++++++++++++++++++++
> src/libcgroup.map | 3 ++
> 3 files changed, 116 insertions(+), 0 deletions(-)
>
> diff --git a/include/libcgroup/iterators.h b/include/libcgroup/iterators.h
> index f572bec..ed4e6de 100644
> --- a/include/libcgroup/iterators.h
> +++ b/include/libcgroup/iterators.h
> @@ -174,6 +174,44 @@ int cgroup_walk_tree_end(void **handle);
> int cgroup_walk_tree_set_flags(void **handle, int flags);
>
> /**
> + * Read the value of the given variable for the specified
> + * controller and control group.
> + * The value is read up to newline character or at most max-1 characters,
> + * whichever comes first (i.e. similar to fgets()).
> + * @param controller Name of the controller for which stats are requested.
> + * @param path Path to control group, relative to hierarchy root.
> + * @param name is variable name.
> + * @param handle Handle to be used during iteration.
> + * @param buffer Buffer to read the value into.
> + * The buffer is always zero-terminated.
> + * @param max Maximal lenght of the buffer
> + * @return #ECGEOF when the stats file is empty.
> + */
> +
> +int cgroup_read_value_begin(const char *controller, const char *path,
> + char *name, void **handle, char *buffer, int max);
> +
> +/**
> + * Read the next string from the given variable handle
> + * which is generated by cgroup_read_stats_begin() function.
> + * the value is read up to newline character or at most max-1 characters,
> + * whichever comes first (i.e. similar to fgets()) per
> + * cgroup_read_stats_next() call
> + * @param handle Handle to be used during iteration.
> + * @param data returned the string.
> + * @param buffer Buffer to read the value into.
> + * The buffer is always zero-terminated.
> + * @param max Maximal lenght of the buffer
> + * @return #ECGEOF when the iterator finishes getting the list of stats.
> + */
> +int cgroup_read_value_next(void **handle, char *buffer, int max);
> +
> +/**
> + * Release the iterator.
> + */
> +int cgroup_read_value_end(void **handle);
> +
> +/**
> * @}
> *
> * @name Read group stats
> diff --git a/src/api.c b/src/api.c
> index 4bd6b46..f547520 100644
> --- a/src/api.c
> +++ b/src/api.c
> @@ -2864,6 +2864,81 @@ out_free:
> return ret;
> }
>
> +
> +int cgroup_read_value_end(void **handle)
> +{
> + FILE *fp;
> +
> + if (!cgroup_initialized)
> + return ECGROUPNOTINITIALIZED;
> +
> + if (!handle)
> + return ECGINVAL;
> +
> + fp = (FILE *)*handle;
IMO it would be nice to add:
if (fp == NULL)
return 0;
> + fclose(fp);
> +
> + return 0;
> +}
> +
> +int cgroup_read_value_next(void **handle, char *buffer, int max)
> +{
> + int ret = 0;
> + char *ret_c;
> + FILE *fp;
> +
> + if (!cgroup_initialized)
> + return ECGROUPNOTINITIALIZED;
> +
> + if (!buffer || !handle)
> + return ECGINVAL;
> +
> + fp = (FILE *)*handle;
> + ret_c = fgets(buffer, max, fp);
> + if (ret_c == NULL)
> + ret = ECGEOF;
> +
> + return ret;
> +}
> +
> +int cgroup_read_value_begin(const char *controller, const char *path,
> + char *name, void **handle, char *buffer, int max)
> +{
> + int ret = 0;
> + char *ret_c = NULL;
> + char stat_file[FILENAME_MAX];
> + char stat_path[FILENAME_MAX];
> + FILE *fp;
> +
> + if (!cgroup_initialized)
> + return ECGROUPNOTINITIALIZED;
> +
> + if (!buffer || !handle)
> + return ECGINVAL;
> +
> + if (!cg_build_path(path, stat_path, controller))
> + return ECGOTHER;
> +
> + snprintf(stat_file, sizeof(stat_file), "%s/%s", stat_path,
> + name);
> + fp = fopen(stat_file, "re");
> + if (!fp) {
> + cgroup_dbg("fopen failed\n");
> + last_errno = errno;
> + *handle = NULL;
> + return ECGOTHER;
> + }
> +
> + ret_c = fgets(buffer, max, fp);
> + if (ret_c == NULL)
> + ret = ECGEOF;
> +
> + *handle = fp;
> + return 0;
> +}
> +
> +
> +
> int cgroup_read_stats_end(void **handle)
> {
> FILE *fp;
> diff --git a/src/libcgroup.map b/src/libcgroup.map
> index 130fc76..60970ca 100644
> --- a/src/libcgroup.map
> +++ b/src/libcgroup.map
> @@ -91,4 +91,7 @@ CGROUP_0.36 {
>
> CGROUP_0.37 {
> cgroup_get_procs;
> + cgroup_read_value_begin;
> + cgroup_read_value_next;
> + cgroup_read_value_end;
> } CGROUP_0.36;
>
>
> ------------------------------------------------------------------------------
> This SF.net Dev2Dev email is sponsored by:
>
> Show off your parallel programming skills.
> Enter the Intel(R) Threading Challenge 2010.
> http://p.sf.net/sfu/intel-thread-sfd
> _______________________________________________
> Libcg-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/libcg-devel
------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:
Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel