diff options
author | Jan Safranek <jsafrane@redhat.com> | 2010-03-12 16:50:20 +0100 |
---|---|---|
committer | Dhaval Giani <dhaval.giani@gmail.com> | 2010-03-21 22:02:01 +0100 |
commit | ed0881d91408000d6ea5e4f73b49acf2615df9f9 (patch) | |
tree | 86148053ea4208f9299877444283ef89de4a18de /include/libcgroup/iterators.h | |
parent | 4f6e409bad2dfa94a4245f7ea612b91a9baed2b7 (diff) | |
download | libcg-ed0881d91408000d6ea5e4f73b49acf2615df9f9.tar.gz libcg-ed0881d91408000d6ea5e4f73b49acf2615df9f9.tar.xz libcg-ed0881d91408000d6ea5e4f73b49acf2615df9f9.zip |
Split header file III
Changelog:
- since there are no global macros, base.h is gone
- since there is no base.h, all headers need to include <features.h> to get
__BEGIN_DECLS
- new init.h with cgroup_init() and cgroup_get_subsys_mount_point()
- new error.h with error handling enum and related stuff
- use #ifndef _LIBCGROUP_*_H instead _LIBCG_*_H in header guards
- fix few checkpatch complaints (long lines, whitespaces, ...)
The patch includes Makefile and .spec changes. I tested it compiles,
make dist produces tarball with all headers, so does also the rpm.
'make' should automatically catch all changes in new headers and
recompile dependent (=all) sources when any header changes.
libcgroup.h
- does not declare anything, it just includes all the other files. In
future, it might contain base of doxygen documentation (some
introduction etc.)
libcgroup/error.h
- the big enum with errors + error related functions
libcgroup/init.h
- libcgroup_init() and cgroup_get_subsys_mount_point()
libcgroup/config.h
- configuration reading/unloading
libcgroup/groups.h
- group manipulation stuff (create/modify/delete/free, incl. controllers and
get/set values) + definition of struct cgroup (=must be included by
libcgroup/tasks.h, which needs it)
libcgroup/iterators.h
- various walks, *_begin/next/end
libcgroup/tasks.h
- task classification, incl. rules cache manipulation
In addition, I probably removed some #includes, which are not needed now when
looking for the minimal #include set to build the project. I also hope I did not
miss any function declaration or macro...
Signed-off-by: Jan Safranek <jsafrane@redhat.com>
Signed-off-by: Dhaval Giani <dhaval.giani@gmail.com>
Diffstat (limited to 'include/libcgroup/iterators.h')
-rw-r--r-- | include/libcgroup/iterators.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/include/libcgroup/iterators.h b/include/libcgroup/iterators.h new file mode 100644 index 0000000..c724abf --- /dev/null +++ b/include/libcgroup/iterators.h @@ -0,0 +1,170 @@ +#ifndef _LIBCGROUP_ITERATORS_H +#define _LIBCGROUP_ITERATORS_H + +#include <sys/types.h> +#include <stdio.h> +#include <features.h> + +__BEGIN_DECLS + +/* + * 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 */ +}; + +enum cgroup_file_type { + CGROUP_FILE_TYPE_FILE, /* File */ + CGROUP_FILE_TYPE_DIR, /* Directory */ + CGROUP_FILE_TYPE_OTHER, /* Directory */ +}; +struct cgroup_file_info { + enum cgroup_file_type type; + const char *path; + const char *parent; + const char *full_path; + short depth; +}; + +#define CG_VALUE_MAX 100 +struct cgroup_stat { + char name[FILENAME_MAX]; + char value[CG_VALUE_MAX]; +}; + +struct cgroup_mount_point { + char name[FILENAME_MAX]; + char path[FILENAME_MAX]; +}; + +/* + * Detailed information about available controller. + */ + +struct controller_data { +/** Controller name. */ + char name[FILENAME_MAX]; +/** + * Hierarchy ID. Controllers with the same hierarchy ID + * are mounted together as one hierarchy. Controllers with + * ID 0 are not currently used. + */ + int hierarchy; +/** Number of groups. */ + int num_cgroups; +/** Enabled flag */ + int enabled; +}; + +/** + * Walk through the directory tree for the specified controller. + * @controller: Name of the controller, for which we want to walk + * the directory tree + * @base_path: Begin walking from this path + * @depth: The maximum depth to which the function should walk, 0 + * implies all the way down + * @handle: Handle to be used during iteration + * @info: info filled and returned about directory information + */ +int cgroup_walk_tree_begin(char *controller, char *base_path, const int depth, + void **handle, struct cgroup_file_info *info, + int *base_level); +/** + * Get the next element during the walk + * @depth: The maximum depth to which the function should walk, 0 + * implies all the way down + * @handle: Handle to be used during iteration + * @info: info filled and returned about directory information + * + * Returns ECGEOF when we are done walking through the nodes. + */ +int cgroup_walk_tree_next(const int depth, void **handle, + struct cgroup_file_info *info, int base_level); +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. + * @handle: Handle to be used during iteration. + * @stat: Stats values will be filled and returned here. + */ +int cgroup_read_stats_begin(char *controller, char *path, void **handle, + struct cgroup_stat *stat); + +/** + * Read the next stat value. + * @handle: Handle to be used during iteration. + * @stat: Stats values will be filled and returned here. + */ +int cgroup_read_stats_next(void **handle, struct cgroup_stat *stat); + +int cgroup_read_stats_end(void **handle); + +/** + * Read the tasks file to get the list of tasks in a cgroup + * @cgroup: Name of the cgroup + * @controller: Name of the cgroup subsystem + * @handle: Handle to be used in the iteration + * @pid: The pid read from the tasks file. Will be filled in by the API + */ +int cgroup_get_task_begin(char *cgroup, char *controller, void **handle, + pid_t *pid); + +/** + * Read the next task value + * @handle: The handle used for iterating + * @pid: The variable where the value will be stored + * + * return ECGEOF when the iterator finishes getting the list of tasks. + */ +int cgroup_get_task_next(void **handle, pid_t *pid); +int cgroup_get_task_end(void **handle); + +/** + * Read the mount table to give a list where each controller is + * mounted + * @handle: Handle to be used for iteration. + * @name: The variable where the name is stored. Should be freed by caller. + * @path: Te variable where the path to the controller is stored. Should be + * freed by the caller. + */ +int cgroup_get_controller_begin(void **handle, struct cgroup_mount_point *info); +/* + * While walking through the mount table, the controllers will be + * returned in order of their mount points. + */ +int cgroup_get_controller_next(void **handle, struct cgroup_mount_point *info); +int cgroup_get_controller_end(void **handle); + +/** + * Read the list of controllers from /proc/cgroups (not mounted included) + * @param handle: Handle to be used for iteration. + * @param info: The structure which contains all controller data + */ +int cgroup_get_all_controller_begin(void **handle, + struct controller_data *info); +/* + * While walking through the mount table, the controllers will be + * returned in the same order as is in /proc/cgroups file + */ +int cgroup_get_all_controller_next(void **handle, struct controller_data *info); +int cgroup_get_all_controller_end(void **handle); + +__END_DECLS + +#endif /* _LIBCGROUP_ITERATORS_H */ |