* Dhaval Giani <[email protected]> [2009-05-18 14:17:43]: > Introduce a cgroup_tree_handle structure so that we can track flags for > the walk_tree operation. In a number of cases we would prefer to walk the > tree in postorder as opposed to pre-order which is the current default. > This patch does the addition. > > Changes since V1: > 1. Added checks for !handle as suggested by Bharata > > Signed-off-by: Dhaval Giani <[email protected]> > > --- > include/libcgroup.h | 10 +++++++ > src/api.c | 60 > +++++++++++++++++++++++++++++++++++++++-------- > src/libcgroup-internal.h | 9 +++++++ > 3 files changed, 69 insertions(+), 10 deletions(-) > > Index: libcg/src/libcgroup-internal.h > =================================================================== > --- libcg.orig/src/libcgroup-internal.h > +++ libcg/src/libcgroup-internal.h > @@ -19,8 +19,11 @@ > __BEGIN_DECLS > > #include "config.h" > +#include <fts.h> > #include <libcgroup.h> > #include <limits.h> > +#include <sys/stat.h> > +#include <sys/types.h> > > #define CGRULES_CONF_FILE "/etc/cgrules.conf" > #define CGRULES_MAX_FIELDS_PER_LINE 3 > @@ -87,6 +90,12 @@ struct cgroup_rule_list { > int len; > }; > > +/*The walk_tree handle */ > +struct cgroup_tree_handle { > + FTS *fts; > + int flags; > +}; > + > > /* Internal API */ > char *cg_build_path(char *name, char *path, char *type); > Index: libcg/src/api.c > =================================================================== > --- libcg.orig/src/api.c > +++ libcg/src/api.c > @@ -2241,7 +2241,7 @@ int cgroup_walk_tree_next(const int dept > struct cgroup_file_info *info, int base_level) > { > int ret = 0; > - FTS *fts = *(FTS **)handle; > + struct cgroup_tree_handle *entry; > FTSENT *ent; > > if (!cgroup_initialized) > @@ -2249,26 +2249,34 @@ int cgroup_walk_tree_next(const int dept > > if (!handle) > return ECGINVAL; > - ent = fts_read(fts); > + > + entry = (struct cgroup_tree_handle *) *handle; > + > + ent = fts_read(entry->fts); > if (!ent) > return ECGEOF; > if (!base_level && depth) > base_level = ent->fts_level + depth; > - ret = cg_walk_node(fts, ent, base_level, info); > - *handle = fts; > + ret = cg_walk_node(entry->fts, ent, base_level, info); > + *handle = entry; > return ret; > } > > int cgroup_walk_tree_end(void **handle) > { > - FTS *fts = *(FTS **)handle; > + struct cgroup_tree_handle *entry; > > if (!cgroup_initialized) > return ECGROUPNOTINITIALIZED; > > if (!handle) > return ECGINVAL; > - fts_close(fts); > + > + entry = (struct cgroup_tree_handle *) *handle; > + > + fts_close(entry->fts); > + free(entry); > + *handle = NULL; > return 0; > } > > @@ -2285,31 +2293,63 @@ int cgroup_walk_tree_begin(char *control > char full_path[FILENAME_MAX]; > FTSENT *ent; > FTS *fts; > + struct cgroup_tree_handle *entry; > > if (!cgroup_initialized) > return ECGROUPNOTINITIALIZED; > > + if (!handle) > + return ECGINVAL; > + > if (!cg_build_path(base_path, full_path, controller)) > return ECGOTHER; > > + entry = calloc(sizeof(struct cgroup_tree_handle), 1); > + > + if (!entry) { > + last_errno = errno; > + return ECGOTHER; > + } > + > *base_level = 0; > cg_path[0] = full_path; > cg_path[1] = NULL; > > - fts = fts_open(cg_path, FTS_LOGICAL | FTS_NOCHDIR | > + entry->fts = fts_open(cg_path, FTS_LOGICAL | FTS_NOCHDIR | > FTS_NOSTAT, NULL); > - ent = fts_read(fts); > + ent = fts_read(entry->fts); > if (!ent) { > cgroup_dbg("fts_read failed\n"); > return ECGINVAL; > } > if (!*base_level && depth) > *base_level = ent->fts_level + depth; > - ret = cg_walk_node(fts, ent, *base_level, info); > - *handle = fts; > + ret = cg_walk_node(entry->fts, ent, *base_level, info); > + *handle = entry; > return ret; > } > > +int cgroup_walk_tree_set_flags(void **handle, int flags) > +{ > + struct cgroup_tree_handle *entry; > + > + if (!cgroup_initialized) > + return ECGROUPNOTINITIALIZED; > + > + if (!handle) > + return ECGINVAL; > + > + if ((flags & CGROUP_WALK_TYPE_PRE_DIR) && > + (flags & CGROUP_WALK_TYPE_POST_DIR)) > + return ECGINVAL; > + > + entry = (struct cgroup_tree_handle *) *handle; > + entry->flags = flags; > + > + *handle = entry; > + return 0; > +} > + > /* > * This parses a stat line which is in the form of (name value) pair > * separated by a space. > Index: libcg/include/libcgroup.h > =================================================================== > --- libcg.orig/include/libcgroup.h > +++ libcg/include/libcgroup.h > @@ -256,6 +256,16 @@ int cgroup_walk_tree_next(const int dept > int cgroup_walk_tree_end(void **handle); > > /** > + * This API is used to set the flags for walk_tree API. Currently availble > + * flags are > + * > + * CGROUP_WALK_TYPE_PRE_DIR > + * CGROUP_WALK_TYPE_POST_DIR > + * > + */ > +int cgroup_walk_tree_set_flags(void **handle, int flags); > + > +/** > * Read the statistics values for the specified controller > * @controller: Name of the controller for which stats are requested. > * @path: cgroup path. > > >
Looks good Acked-by: Balbir Singh <[email protected]> -- Balbir ------------------------------------------------------------------------------ Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT is a gathering of tech-side developers & brand creativity professionals. Meet the minds behind Google Creative Lab, Visual Complexity, Processing, & iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian Group, R/GA, & Big Spaceship. http://www.creativitycat.com _______________________________________________ Libcg-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/libcg-devel
