Balbir Singh wrote: > Feature: Provide new libcgroup walk tree API > > From: Balbir Singh <[email protected]> > > This patch adds the capability to walk cgroups by providing a new API > called cgroup_walk_tree. The API accepts the controller to walk and the > order in which the directories and files must be visited. Everytime > a node is visited, a callback function is invoked that can act or record > the node being visited.
I admit I don't like the callbacks, I'd prefer 'pull' type of interface - something like open_group_iterator, read_group_iterator and close_group_iterator functions (and iterator being some opaque structure). But that's just my personal preference. > libcgroup.map has been updated to reflect the same change and the prototype > is exported in libcgroup.h. > > I've also added test cases (tests/walk_test.c). > > Signed-off-by: Balbir Singh <[email protected]> > --- > > api.c | 90 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > libcgroup.h | 41 ++++++++++++++++++++++++ > libcgroup.map | 6 ++++ > tests/Makefile | 6 +++- > tests/walk_test.c | 63 +++++++++++++++++++++++++++++++++++++ > 5 files changed, 205 insertions(+), 1 deletions(-) > create mode 100644 tests/walk_test.c > > > diff --git a/libcgroup.h b/libcgroup.h > index 4fb99ff..1ea5361 100644 > --- a/libcgroup.h > +++ b/libcgroup.h > @@ -97,6 +97,35 @@ enum cgroup_errors { > ECGSENTINEL, /* Please insert further error codes above this */ > }; > > +/* > + * Don't use CGROUP_WALK_TYPE_FILE right now. It is added here for > + * later refactoring and better implementation. Most users *should* > + * use CGROUP_WALK_TYPE_PRE_DIR. > + */ > +enum cgroup_walk_type { > + CGROUP_WALK_TYPE_PRE_DIR = 0x1, /* Pre Order Directory */ > + CGROUP_WALK_TYPE_POST_DIR = 0x2, /* Post Order Directory */ > + CGROUP_WALK_TYPE_FILE = 0x4, /* Post Order Directory */ > + CGROUP_WALK_TYPE_ALL = 0x5, /* directories (preorder) and files */ > +}; I think with Dhaval's patch set we don't need to return files from here. I'd propose to have the walking api just for directories (i.e. groups) and the Dhaval's cgroup_list_controller_files() for files. > + > +enum cgroup_file_type { > + CGROUP_FILE_TYPE_FILE, /* File */ > + CGROUP_FILE_TYPE_DIR, /* Directory */ > + CGROUP_FILE_TYPE_SL, /* Symbolic Link */ can CGROUP_FILE_TYPE_SL be ever returned? IMHO symbolic links are not supported on cgroup fylesystem (at least not on my Fedora Rawhide). > +}; > + > +struct cgroup_file_info { > + enum cgroup_file_type type; > + const char *path; > + const char *parent; > + const char *full_path; > + short depth; > +}; > + > +typedef void *(*cgroup_walk_callback)(const struct cgroup_file_info *info, > + void *arg); > + > #define CG_NV_MAX 100 > #define CG_CONTROLLER_MAX 100 > #define CG_VALUE_MAX 100 > @@ -195,6 +224,18 @@ int cgroup_get_current_controller_path(pid_t pid, const > char *controller, > */ > char *cgroup_strerror(int code); > > +/** > + * Walk through the directory tree for the specified controller. > + * @controller: Name of the controller, for which we want to walk > + * the directory tree > + * @type: Walk through files or directories, specify walk order as well > + * @cb: Callback, provides information filled by the iterator and > + * allows implementation of customic logic > + * @arg: Custom argument to be used in the callback > + */ > +int cgroup_walk_tree(char *controller, enum cgroup_walk_type type, > + cgroup_walk_callback cb, void *arg); Can I get also base as additional parameter? Someone might want not to start at '/'. Jan ------------------------------------------------------------------------------ Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise -Strategies to boost innovation and cut costs with open source participation -Receive a $600 discount off the registration fee with the source code: SFAD http://p.sf.net/sfu/XcvMzF8H _______________________________________________ Libcg-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/libcg-devel
