summaryrefslogtreecommitdiffstats
path: root/include/libcgroup/iterators.h
diff options
context:
space:
mode:
authorJan Safranek <jsafrane@redhat.com>2010-03-12 16:50:20 +0100
committerDhaval Giani <dhaval.giani@gmail.com>2010-03-21 22:02:01 +0100
commited0881d91408000d6ea5e4f73b49acf2615df9f9 (patch)
tree86148053ea4208f9299877444283ef89de4a18de /include/libcgroup/iterators.h
parent4f6e409bad2dfa94a4245f7ea612b91a9baed2b7 (diff)
downloadlibcg-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.h170
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 */