part of the series to convert to a thread aware as opposed to a
thread safe model.

Signed-off-by: Dhaval Giani <[email protected]>
---
 include/libcgroup/deprecated.h |   12 +++++++
 include/libcgroup/error.h      |    1 
 include/libcgroup/groups.h     |    3 -
 src/api.c                      |   66 +++++++++++++++++++++++++----------------
 src/libcgroup.map              |    1 
 5 files changed, 55 insertions(+), 28 deletions(-)

Index: libcg/src/api.c
===================================================================
--- libcg.orig/src/api.c
+++ libcg/src/api.c
@@ -1331,15 +1331,28 @@ int cgroup_create_cgroup(struct cgroup *
        int error = 0;
        int retval = 0;
        int ret;
-
-       if (!cgroup_initialized)
-               return ECGROUPNOTINITIALIZED;
+       struct cgroup_context_s *cg_context;
+       int deprecated = 0;
 
        if (!cgroup)
                return ECGROUPNOTALLOWED;
 
+       if (!cgroup->context) {
+               pthread_rwlock_rdlock(&cg_mount_table_lock);
+               cgroup->context = cgroup_context;
+               deprecated = 1;
+               cgroup_dbg("WARNING: This is deprecated. Please utilize the " \
+                                       "new context aware interfaces\n");
+       }
+
+       if (!cgroup->context->size)
+               return ECGROUPINVALCONTEXT;
+
+       cg_context = cgroup->context;
+
        for (i = 0; i < cgroup->index;  i++) {
-               if (!cgroup_test_subsys_mounted(cgroup->controller[i]->name))
+               if (!cgroup_test_subsys_context(cg_context,
+                                       cgroup->controller[i]->name))
                        return ECGROUPSUBSYSNOTMOUNTED;
        }
 
@@ -1348,6 +1361,7 @@ int cgroup_create_cgroup(struct cgroup *
                last_errno = errno;
                return ECGOTHER;
        }
+
        fts_path[1] = NULL;
        path = fts_path[0];
 
@@ -1357,7 +1371,7 @@ int cgroup_create_cgroup(struct cgroup *
         * data structure. If not, we fail.
         */
        for (k = 0; k < cgroup->index; k++) {
-               if (!cg_build_path(cgroup->name, path,
+               if (!cg_build_path_context(cg_context, cgroup->name, path,
                                cgroup->controller[k]->name))
                        continue;
 
@@ -1366,19 +1380,16 @@ int cgroup_create_cgroup(struct cgroup *
                        goto err;
 
                base = strdup(path);
-
                if (!base) {
                        last_errno = errno;
                        error = ECGOTHER;
                        goto err;
                }
 
-               if (!ignore_ownership) {
-                       cgroup_dbg("Changing ownership of %s\n", fts_path[0]);
-                       error = cg_chown_recursive(fts_path,
-                               cgroup->control_uid, cgroup->control_gid);
-               }
+               cgroup_dbg("Changing ownership of %s\n", fts_path[0]);
 
+               error = cg_chown_recursive(fts_path,
+                       cgroup->control_uid, cgroup->control_gid);
                if (error)
                        goto err;
 
@@ -1392,6 +1403,7 @@ int cgroup_create_cgroup(struct cgroup *
                                error = ECGOTHER;
                                goto err;
                        }
+
                        error = cg_set_control_value(path,
                                cgroup->controller[k]->values[j]->value);
                        /*
@@ -1409,26 +1421,30 @@ int cgroup_create_cgroup(struct cgroup *
                        }
                }
 
-               if (!ignore_ownership) {
-                       ret = snprintf(path, FILENAME_MAX, "%s/tasks", base);
-                       if (ret < 0 || ret >= FILENAME_MAX) {
-                               last_errno = errno;
-                               error = ECGOTHER;
-                               goto err;
-                       }
-                       error = chown(path, cgroup->tasks_uid,
-                                                       cgroup->tasks_gid);
-                       if (error) {
-                               last_errno = errno;
-                               error = ECGOTHER;
-                               goto err;
-                       }
+               ret = snprintf(path, FILENAME_MAX, "%s/tasks", base);
+               if (ret < 0 || ret >= FILENAME_MAX) {
+                       last_errno = errno;
+                       error = ECGOTHER;
+                       goto err;
                }
+
+               error = chown(path, cgroup->tasks_uid, cgroup->tasks_gid);
+               if (error) {
+                       last_errno = errno;
+                       error = ECGOTHER;
+                       goto err;
+               }
+
                free(base);
                base = NULL;
        }
 
 err:
+       if(deprecated) {
+               cgroup->context = NULL;
+               pthread_rwlock_unlock(&cg_mount_table_lock);
+       }
+
        if (path)
                free(path);
        if (base)
Index: libcg/include/libcgroup/error.h
===================================================================
--- libcg.orig/include/libcgroup/error.h
+++ libcg/include/libcgroup/error.h
@@ -71,6 +71,7 @@ enum {
        ECGNAMESPACEPATHS,
        ECGNAMESPACECONTROLLER,
        ECGMOUNTNAMESPACE,
+       ECGROUPINVALCONTEXT,
 };
 
 /**
Index: libcg/include/libcgroup/deprecated.h
===================================================================
--- libcg.orig/include/libcgroup/deprecated.h
+++ libcg/include/libcgroup/deprecated.h
@@ -21,6 +21,18 @@ __BEGIN_DECLS
  */
 int cgroup_init(void);
 
+/**
+ * Physically create a control group in kernel. The group is created in all
+ * hierarchies, which cover controllers added by cgroup_add_controller().
+ * All parameters set by cgroup_add_value_* functions are written.
+ * The created groups has owner which was set by cgroup_set_uid_gid().
+ * @param cgroup
+ * @param ignore_ownership When nozero, all errors are ignored when setting
+ *     owner of the group and/or its tasks file.
+ *     @todo what is ignore_ownership good for?
+ */
+int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership);
+
 __END_DECLS
 
 #endif
Index: libcg/include/libcgroup/groups.h
===================================================================
--- libcg.orig/include/libcgroup/groups.h
+++ libcg/include/libcgroup/groups.h
@@ -172,9 +172,6 @@ void cgroup_free_controllers(struct cgro
  * All parameters set by cgroup_add_value_* functions are written.
  * The created groups has owner which was set by cgroup_set_uid_gid().
  * @param cgroup
- * @param ignore_ownership When nozero, all errors are ignored when setting
- *     owner of the group and/or its tasks file.
- *     @todo what is ignore_ownership good for?
  */
 int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership);
 
Index: libcg/src/libcgroup.map
===================================================================
--- libcg.orig/src/libcgroup.map
+++ libcg/src/libcgroup.map
@@ -93,4 +93,5 @@ CGROUP_0.37 {
        cgroup_get_procs;
        cgroup_init_context;
        cgroup_free_context;
+       cgroup_create_cgroup_context;
 } CGROUP_0.36;



------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share 
of $1 Million in cash or HP Products. Visit us here for more details:
http://ad.doubleclick.net/clk;226879339;13503038;l?
http://clk.atdmt.com/CRS/go/247765532/direct/01/
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to