Add a new API to iterate through the tasks file to get
the list of all the tasks in a cgroup.

Signed-off-by: Dhaval Giani <[email protected]>
Acked-by: Balbir Singh <[email protected]>
Acked-by: Bharata B Rao <[email protected]>

---
 include/libcgroup.h |   19 ++++++++++++++
 src/api.c           |   68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/libcgroup.map   |    6 ++++
 3 files changed, 93 insertions(+)

Index: libcg/include/libcgroup.h
===================================================================
--- libcg.orig/include/libcgroup.h
+++ libcg/include/libcgroup.h
@@ -274,6 +274,25 @@ int cgroup_read_stats_next(void **handle
 
 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);
 /* The wrappers for filling libcg structures */
 
 struct cgroup *cgroup_new_cgroup(const char *name);
Index: libcg/src/api.c
===================================================================
--- libcg.orig/src/api.c
+++ libcg/src/api.c
@@ -2407,3 +2407,71 @@ int cgroup_read_stats_begin(char *contro
        *handle = fp;
        return ret;
 }
+
+int cgroup_get_task_end(void **handle)
+{
+       if (!cgroup_initialized)
+               return ECGROUPNOTINITIALIZED;
+
+       if (!*handle)
+               return ECGINVAL;
+
+       fclose((FILE *) *handle);
+       *handle = NULL;
+
+       return 0;
+}
+
+int cgroup_get_task_next(void *handle, pid_t *pid)
+{
+       int ret;
+
+       if (!cgroup_initialized)
+               return ECGROUPNOTINITIALIZED;
+
+       if (!handle)
+               return ECGINVAL;
+
+       ret = fscanf((FILE *) handle, "%u", pid);
+
+       if (ret != 1) {
+               if (ret == EOF)
+                       return ECGEOF;
+               last_errno = errno;
+               return ECGOTHER;
+       }
+
+       return 0;
+}
+
+int cgroup_get_task_begin(char *cgroup, char *controller, void **handle,
+                                                               pid_t *pid)
+{
+       int ret = 0;
+       char path[FILENAME_MAX];
+       char *fullpath = NULL;
+
+       if (!cgroup_initialized)
+               return ECGROUPNOTINITIALIZED;
+
+       if (!cg_build_path(cgroup, path, controller))
+               return ECGOTHER;
+
+       ret = asprintf(&fullpath, "%s/tasks", path);
+
+       if (ret < 0) {
+               last_errno = errno;
+               return ECGOTHER;
+       }
+
+       *handle = (void *) fopen(fullpath, "r");
+       free(fullpath);
+
+       if (!*handle) {
+               last_errno = errno;
+               return ECGOTHER;
+       }
+       ret = cgroup_get_task_next(*handle, pid);
+
+       return ret;
+}
Index: libcg/src/libcgroup.map
===================================================================
--- libcg.orig/src/libcgroup.map
+++ libcg/src/libcgroup.map
@@ -57,3 +57,9 @@ global:
        cgroup_read_stats_end;
 } CGROUP_0.32.1;
 
+CGROUP_0.34 {
+global:
+       cgroup_get_task_begin;
+       cgroup_get_task_end;
+       cgroup_get_task_next;
+} CGROUP_0.33;



------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and 
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today. 
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to